diff options
| author | 2014-10-15 05:10:58 +0000 | |
|---|---|---|
| committer | 2014-10-15 05:11:00 +0000 | |
| commit | 5873c3e862b83fb0c64b52b86bdd8f26ff8ffb5f (patch) | |
| tree | aae01def9d376362db927e8b3f04ff8b78ef6632 | |
| parent | 9797880808320e3a7bae1f59bc7e0c5a13189e5f (diff) | |
| parent | eaab72ac4198fcc02090da11b1e942e6e338696a (diff) | |
Merge "DO NOT MERGE CEC: Queue actions for starting later when not ready" into lmp-dev
5 files changed, 35 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java index b2300a6f50c0..fc53c50c3fcb 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java @@ -73,8 +73,9 @@ abstract class HdmiCecFeatureAction { } /** - * Called right after the action is created. Initialization or first step to take - * for the action can be done in this method. + * Called after the action is created. Initialization or first step to take + * 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. */ @@ -162,6 +163,10 @@ abstract class HdmiCecFeatureAction { mActionTimer.sendTimerMessage(state, delayMillis); } + boolean started() { + return mState != STATE_NONE; + } + protected final void sendCommand(HdmiCecMessage cmd) { mService.sendCecCommand(cmd); } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 41ac589ff5b8..8f9af61980a3 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -617,14 +617,25 @@ abstract class HdmiCecLocalDevice { @ServiceThreadOnly void addAndStartAction(final HdmiCecFeatureAction action) { assertRunOnServiceThread(); + mActions.add(action); 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; } - mActions.add(action); 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. @ServiceThreadOnly <T extends HdmiCecFeatureAction> boolean hasAction(final Class<T> clazz) { diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index b0ddf2ac22bd..780d54bb98b4 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -39,11 +39,18 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { } @Override + void init() { + super.init(); + mIsActiveSource = false; + } + + @Override @ServiceThreadOnly protected void onAddressAllocated(int logicalAddress, int reason) { assertRunOnServiceThread(); mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand( mAddress, mService.getPhysicalAddress(), mDeviceType)); + startQueuedActions(); } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index bd9f04bf5834..0fb4b480a80f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -142,6 +142,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC && reason != HdmiControlService.INITIATED_BY_BOOT_UP); launchDeviceDiscovery(); + startQueuedActions(); } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 4d9b4e9055d5..60d152005e5c 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -415,12 +415,17 @@ public final class HdmiControlService extends SystemService { assertRunOnServiceThread(); // A container for [Device type, Local device info]. ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>(); - clearLocalDevices(); 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(); 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); } |