diff options
| author | 2022-06-28 06:25:58 +0000 | |
|---|---|---|
| committer | 2022-06-28 06:25:58 +0000 | |
| commit | ca29d4cbff8ed24dd3ad301f21c95cf2cc7f9cbe (patch) | |
| tree | 1559596314e51340724bece60bdeaa58003b1a17 | |
| parent | 6b8d265575fee5cd39e15d10491117cb3b70b5b2 (diff) | |
| parent | 78b3dd9f9bc6b9f556b3daf6a5f5b578ba74b360 (diff) | |
Merge changes I8715af82,I547c47a3
* changes:
Only wake up at the start of OneTouchPlayAction
Remove ActiveSourceAction immediately on standby
3 files changed, 57 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 16bffd9a597b..1de1a7a5e1e5 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -1262,6 +1262,7 @@ abstract class HdmiCecLocalDevice { boolean initiatedByCec, final PendingActionClearedCallback originalCallback) { removeAction(AbsoluteVolumeAudioStatusAction.class); removeAction(SetAudioVolumeLevelDiscoveryAction.class); + removeAction(ActiveSourceAction.class); mPendingActionClearedCallback = new PendingActionClearedCallback() { diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java index 3dcf72eb38d6..30a4f3134ffd 100644 --- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java +++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java @@ -91,7 +91,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { boolean is20TargetOnBefore = mIsCec20 && getTargetDevicePowerStatus(mSource, mTargetAddress, HdmiControlManager.POWER_STATUS_UNKNOWN) == HdmiControlManager.POWER_STATUS_ON; - broadcastActiveSource(); + // Make the device the active source. + setAndBroadcastActiveSource(); // If the device is not an audio system itself, request the connected audio system to // turn on. if (shouldTurnOnConnectedAudioSystem()) { @@ -108,9 +109,11 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { queryDevicePowerStatus(); } else if (targetPowerStatus == HdmiControlManager.POWER_STATUS_ON) { if (!is20TargetOnBefore) { + // If the device is still the active source, send the <Active Source> message + // again. // Suppress 2nd <Active Source> message if the target device was already on when // the 1st one was sent. - broadcastActiveSource(); + maySendActiveSource(); } finishWithCallback(HdmiControlManager.RESULT_SUCCESS); return true; @@ -121,7 +124,9 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { return true; } - private void broadcastActiveSource() { + private void setAndBroadcastActiveSource() { + // If the device wasn´t the active source yet, + // this makes it the active source and wakes it up. mSource.mService.setAndBroadcastActiveSourceFromOneDeviceType( mTargetAddress, getSourcePath(), "OneTouchPlayAction#broadcastActiveSource()"); // When OneTouchPlay is called, client side should be responsible to send out the intent @@ -135,6 +140,11 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { mSource.setLocalActivePort(Constants.CEC_SWITCH_HOME); } + private void maySendActiveSource() { + // Only send <Active Source> if the device is already the active source at this time. + mSource.maySendActiveSource(mTargetAddress); + } + private void queryDevicePowerStatus() { sendCommand(HdmiCecMessageBuilder.buildGiveDevicePowerStatus(getSourceAddress(), mTargetAddress)); @@ -149,7 +159,9 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) { int status = cmd.getParams()[0]; if (status == HdmiControlManager.POWER_STATUS_ON) { - broadcastActiveSource(); + // If the device is still the active source, send the <Active Source> message + // again. + maySendActiveSource(); finishWithCallback(HdmiControlManager.RESULT_SUCCESS); } return true; diff --git a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java index 46a4e862c300..1fa3871347f8 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java @@ -628,6 +628,46 @@ public class OneTouchPlayActionTest { assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage); } + @Test + public void noWakeUpOnReportPowerStatus() throws Exception { + setUp(true); + + HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback( + mHdmiControlService); + playbackDevice.init(); + mLocalDevices.add(playbackDevice); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + mTestLooper.dispatchAll(); + + mNativeWrapper.setPollAddressResponse(ADDR_TV, SendMessageResult.SUCCESS); + mHdmiControlService.getHdmiCecNetwork().addCecDevice(INFO_TV); + mTestLooper.dispatchAll(); + mNativeWrapper.clearResultMessages(); + + TestActionTimer actionTimer = new TestActionTimer(); + TestCallback callback = new TestCallback(); + OneTouchPlayAction action = createOneTouchPlayAction(playbackDevice, actionTimer, callback, + false); + playbackDevice.addAndStartAction(action); + mTestLooper.dispatchAll(); + + assertThat(mPowerManager.isInteractive()).isTrue(); + mPowerManager.setInteractive(false); + mTestLooper.dispatchAll(); + + HdmiCecMessage reportPowerStatusOn = + HdmiCecMessage.build( + ADDR_TV, + playbackDevice.getDeviceInfo().getLogicalAddress(), + Constants.MESSAGE_REPORT_POWER_STATUS, + POWER_ON); + action.processCommand(reportPowerStatusOn); + mTestLooper.dispatchAll(); + + assertThat(mPowerManager.isInteractive()).isFalse(); + assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS); + } + private static class TestActionTimer implements ActionTimer { private int mState; |