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 22dc89a89f)
(cherry picked from commit 66b6a8cc17d3c2f4d7d3a09369f7538633c43259)
This commit is contained in:
Yan Han
2021-08-02 14:46:46 +02:00
parent b370ca080a
commit 62eafa258a
2 changed files with 21 additions and 0 deletions

View File

@@ -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();
}
}
}
}

View File

@@ -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(