From 22dc89a89f869335df3879c09e7337c5b3967e85 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 --- .../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 d3aa3fabd3e53..0c55138aa0c83 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -681,6 +681,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 270430838fd4e..6492e0f127abb 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; @@ -321,6 +324,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(