Merge "DO NOT MERGE CEC: Queue actions for starting later when not ready" into lmp-dev

This commit is contained in:
Jinsuk Kim
2014-10-15 05:10:58 +00:00
committed by Android (Google) Code Review
5 changed files with 35 additions and 6 deletions

View File

@@ -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);
} }

View File

@@ -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) {

View File

@@ -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

View File

@@ -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

View File

@@ -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);
} }