diff options
| author | Nathalie Le Clair <lcnathalie@google.com> | 2021-05-03 17:21:49 +0200 |
|---|---|---|
| committer | Nathalie Le Clair <lcnathalie@google.com> | 2021-05-04 10:05:18 +0200 |
| commit | ab9bdf0f9cee03b363dbd04486d857f2ce0bd4da (patch) | |
| tree | 723140abb819fe67f962c19879e70bf2014a6e48 | |
| parent | 1d92fd8123416adb447db3082431617c544de547 (diff) | |
Remove actions that delay standby flow
Before this change: disableDevice() gives all actions 5 seconds to finish, before removing the remaining actions and disabling the device. Since OneTouchPlayAction has many retries, it will easily run into this time-out and effectively delay the standby flow by up to 5 seconds.
After this change: disableDevice() removes OneTouchPlayAction and
DevicePowerStatusAction right away, since these actions are no longer useful at this time.
Applies to all source devices, since those can initiate both actions.
Bug: 184939731
Test: atest
Change-Id: Iba5c5212f2c55a2507298e3773d22e1e17142fd0
5 files changed, 59 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index f89594f3288f..702f85404868 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -296,6 +296,15 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } + @Override + @ServiceThreadOnly + protected void disableDevice(boolean initiatedByCec, PendingActionClearedCallback callback) { + removeAction(OneTouchPlayAction.class); + removeAction(DevicePowerStatusAction.class); + + super.disableDevice(initiatedByCec, callback); + } + // Update the power status of the devices connected to the current device. // This only works if the current device is a switch and keeps tracking the device info // of the device connected to it. diff --git a/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java index 011b8f899753..4f97c2660ba7 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java @@ -282,4 +282,17 @@ public class DevicePowerStatusActionTest { verify(mCallbackMock).onComplete(HdmiControlManager.POWER_STATUS_STANDBY); } + + @Test + public void pendingActionDoesNotBlockSendingStandby() throws Exception { + mPlaybackDevice.addAndStartAction(mDevicePowerStatusAction); + mTestLooper.dispatchAll(); + mNativeWrapper.clearResultMessages(); + + mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); + mTestLooper.dispatchAll(); + HdmiCecMessage standbyMessage = HdmiCecMessageBuilder.buildStandby( + mPlaybackDevice.mAddress, ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage); + } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index a29a76b438df..1ac01509bb6f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -1046,10 +1046,6 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); // 4. DUT turned off. mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); - // TODO(b/184939731): remove waiting times once pending actions no longer block <Standby> - mTestLooper.moveTimeForward(TIMEOUT_MS); - mTestLooper.dispatchAll(); - mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.dispatchAll(); HdmiCecMessage standbyMessageBroadcast = HdmiCecMessageBuilder.buildStandby( mHdmiCecLocalDevicePlayback.mAddress, ADDR_BROADCAST); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java index c7a508a9d626..8ee983f7375f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java @@ -295,10 +295,6 @@ public class HdmiCecLocalDeviceTvTest { HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED); mTestLooper.dispatchAll(); mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); - // TODO(184939731): remove waiting times once pending actions no longer block <Standby> - mTestLooper.moveTimeForward(TIMEOUT_MS); - mTestLooper.dispatchAll(); - mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.dispatchAll(); HdmiCecMessage standby = HdmiCecMessageBuilder.buildStandby(ADDR_TV, ADDR_BROADCAST); assertThat(mNativeWrapper.getResultMessages()).contains(standby); 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 48931739d9cf..826438fc8ddf 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java @@ -526,6 +526,43 @@ public class OneTouchPlayActionTest { assertThat(playbackDevice.isActiveSource()).isTrue(); } + @Test + public void pendingActionDoesNotBlockSendingStandby_Cec14b() throws Exception { + setUp(true); + + mHdmiControlService.getHdmiCecNetwork().addCecDevice(INFO_TV); + HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback( + mHdmiControlService); + playbackDevice.init(); + mLocalDevices.add(playbackDevice); + playbackDevice.mService.getHdmiCecConfig().setStringValue( + HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE, + HdmiControlManager.POWER_CONTROL_MODE_TV); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + 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(actionTimer.getState()).isEqualTo(STATE_WAITING_FOR_REPORT_POWER_STATUS); + for (int i = 0; i < 5; ++i) { + action.handleTimerEvent(STATE_WAITING_FOR_REPORT_POWER_STATUS); + mTestLooper.dispatchAll(); + } + mNativeWrapper.clearResultMessages(); + + mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); + mTestLooper.dispatchAll(); + HdmiCecMessage standbyMessage = HdmiCecMessageBuilder.buildStandby( + playbackDevice.mAddress, ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage); + } + private static class TestActionTimer implements ActionTimer { private int mState; |
