From 62eafa258a2eab102beb4f376a25dd4d000192cb Mon Sep 17 00:00:00 2001 From: Yan Han Date: Mon, 2 Aug 2021 14:46:46 +0200 Subject: [PATCH] Fix stuck HDMI-CEC actions after boot Ensures that all queued actions on local devices are started after boot. Previously, an unstarted SendKeyAction could stick around after boot, blocking any future SendKeyAction from being created. Bug: 193188675 Test: atest HdmiControlServiceTest#normalBoot_queuedActionsStartedAfterBoot manual test: spam volume up on boot with IR volume control enabled Change-Id: I0050ca927bdba939b0b0030a6aa2f6235b11ff5c Merged-In: I0050ca927bdba939b0b0030a6aa2f6235b11ff5c (cherry picked from commit 22dc89a89f869335df3879c09e7337c5b3967e85) (cherry picked from commit 66b6a8cc17d3c2f4d7d3a09369f7538633c43259) --- .../android/server/hdmi/HdmiControlService.java | 6 ++++++ .../server/hdmi/HdmiControlServiceTest.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index fac8cfe4ab867..e5a8a17df5250 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -634,6 +634,12 @@ public class HdmiControlService extends SystemService { // on boot, if device is interactive, set HDMI CEC state as powered on as well if (mPowerManager.isInteractive() && isPowerStandbyOrTransient()) { mPowerStatusController.setPowerStatus(HdmiControlManager.POWER_STATUS_ON); + // Start all actions that were queued because the device was in standby + if (mAddressAllocated) { + for (HdmiCecLocalDevice localDevice : getAllLocalDevices()) { + localDevice.startQueuedActions(); + } + } } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index d03b67480b725..01bd04c6f06bc 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -33,6 +33,8 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; @@ -59,6 +61,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.util.ArrayList; @@ -320,6 +323,18 @@ public class HdmiControlServiceTest { assertThat(mNativeWrapper.getResultMessages()).doesNotContain(reportPowerStatus); } + @Test + public void normalBoot_queuedActionsStartedAfterBoot() { + Mockito.clearInvocations(mAudioSystemDeviceSpy); + Mockito.clearInvocations(mPlaybackDeviceSpy); + + mHdmiControlServiceSpy.onBootPhase(PHASE_BOOT_COMPLETED); + mTestLooper.dispatchAll(); + + verify(mAudioSystemDeviceSpy, times(1)).startQueuedActions(); + verify(mPlaybackDeviceSpy, times(1)).startQueuedActions(); + } + @Test public void initialPowerStatus_normalBoot_goToStandby_broadcastsPowerStatus_2_0() { mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(