summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathalie Le Clair <lcnathalie@google.com>2021-05-03 17:21:49 +0200
committerNathalie Le Clair <lcnathalie@google.com>2021-05-04 10:05:18 +0200
commitab9bdf0f9cee03b363dbd04486d857f2ce0bd4da (patch)
tree723140abb819fe67f962c19879e70bf2014a6e48
parent1d92fd8123416adb447db3082431617c544de547 (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
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java37
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;