Merge "DO NOT MERGE CEC: Queue actions for starting later when not ready" into lmp-dev
This commit is contained in:
@@ -73,8 +73,9 @@ abstract class HdmiCecFeatureAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called right after the action is created. Initialization or first step to take
|
* Called after the action is created. Initialization or first step to take
|
||||||
* for the action can be done in this method.
|
* for the action can be done in this method. Shall update {@code mState} to
|
||||||
|
* indicate that the action has started.
|
||||||
*
|
*
|
||||||
* @return true if the operation is successful; otherwise false.
|
* @return true if the operation is successful; otherwise false.
|
||||||
*/
|
*/
|
||||||
@@ -162,6 +163,10 @@ abstract class HdmiCecFeatureAction {
|
|||||||
mActionTimer.sendTimerMessage(state, delayMillis);
|
mActionTimer.sendTimerMessage(state, delayMillis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean started() {
|
||||||
|
return mState != STATE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
protected final void sendCommand(HdmiCecMessage cmd) {
|
protected final void sendCommand(HdmiCecMessage cmd) {
|
||||||
mService.sendCecCommand(cmd);
|
mService.sendCecCommand(cmd);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -617,14 +617,25 @@ abstract class HdmiCecLocalDevice {
|
|||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
void addAndStartAction(final HdmiCecFeatureAction action) {
|
void addAndStartAction(final HdmiCecFeatureAction action) {
|
||||||
assertRunOnServiceThread();
|
assertRunOnServiceThread();
|
||||||
|
mActions.add(action);
|
||||||
if (mService.isPowerStandbyOrTransient()) {
|
if (mService.isPowerStandbyOrTransient()) {
|
||||||
Slog.w(TAG, "Skip the action during Standby: " + action);
|
Slog.i(TAG, "Not ready to start action. Queued for deferred start:" + action);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mActions.add(action);
|
|
||||||
action.start();
|
action.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ServiceThreadOnly
|
||||||
|
void startQueuedActions() {
|
||||||
|
assertRunOnServiceThread();
|
||||||
|
for (HdmiCecFeatureAction action : mActions) {
|
||||||
|
if (!action.started()) {
|
||||||
|
Slog.i(TAG, "Starting queued action:" + action);
|
||||||
|
action.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// See if we have an action of a given type in progress.
|
// See if we have an action of a given type in progress.
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
<T extends HdmiCecFeatureAction> boolean hasAction(final Class<T> clazz) {
|
<T extends HdmiCecFeatureAction> boolean hasAction(final Class<T> clazz) {
|
||||||
|
|||||||
@@ -38,12 +38,19 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
|
|||||||
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
|
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void init() {
|
||||||
|
super.init();
|
||||||
|
mIsActiveSource = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
protected void onAddressAllocated(int logicalAddress, int reason) {
|
protected void onAddressAllocated(int logicalAddress, int reason) {
|
||||||
assertRunOnServiceThread();
|
assertRunOnServiceThread();
|
||||||
mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
|
mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
|
||||||
mAddress, mService.getPhysicalAddress(), mDeviceType));
|
mAddress, mService.getPhysicalAddress(), mDeviceType));
|
||||||
|
startQueuedActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
|
|||||||
launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC &&
|
launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC &&
|
||||||
reason != HdmiControlService.INITIATED_BY_BOOT_UP);
|
reason != HdmiControlService.INITIATED_BY_BOOT_UP);
|
||||||
launchDeviceDiscovery();
|
launchDeviceDiscovery();
|
||||||
|
startQueuedActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -415,12 +415,17 @@ public final class HdmiControlService extends SystemService {
|
|||||||
assertRunOnServiceThread();
|
assertRunOnServiceThread();
|
||||||
// A container for [Device type, Local device info].
|
// A container for [Device type, Local device info].
|
||||||
ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
|
ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
|
||||||
clearLocalDevices();
|
|
||||||
for (int type : mLocalDevices) {
|
for (int type : mLocalDevices) {
|
||||||
final HdmiCecLocalDevice localDevice = HdmiCecLocalDevice.create(this, type);
|
HdmiCecLocalDevice localDevice = mCecController.getLocalDevice(type);
|
||||||
|
if (localDevice == null) {
|
||||||
|
localDevice = HdmiCecLocalDevice.create(this, type);
|
||||||
|
}
|
||||||
localDevice.init();
|
localDevice.init();
|
||||||
localDevices.add(localDevice);
|
localDevices.add(localDevice);
|
||||||
}
|
}
|
||||||
|
// It's now safe to flush existing local devices from mCecController since they were
|
||||||
|
// already moved to 'localDevices'.
|
||||||
|
clearLocalDevices();
|
||||||
allocateLogicalAddress(localDevices, initiatedBy);
|
allocateLogicalAddress(localDevices, initiatedBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user