diff options
| author | 2025-02-25 18:37:53 +0000 | |
|---|---|---|
| committer | 2025-02-25 11:24:24 -0800 | |
| commit | c896be22da2a3b2712986b9cb40a9d947140bf58 (patch) | |
| tree | 2d0d748232121d3d07a66c84d30890e81f81871a | |
| parent | 45e5a0e85cf34143dcaed1b9e276bfb421026980 (diff) | |
HDMI: Cancel pending ActiveSourceAction on active source lost
Bug: 380164765
Test: atest
Flag: EXEMPT bugfix
Change-Id: I046bf9a816805b62ebd9c1ec1ae6fdfcd07ad5cd
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java | 2 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java | 41 |
2 files changed, 42 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index 6157402279a9..69a2a1c4e453 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -197,6 +197,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { boolean wasActiveSource = isActiveSource(); super.setActiveSource(logicalAddress, physicalAddress, caller); if (wasActiveSource && !isActiveSource()) { + // Prevent focus stealing when losing active source. + removeAction(ActiveSourceAction.class); onActiveSourceLost(); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java index 6d863015231c..715c1d56bc94 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java @@ -57,17 +57,19 @@ public class ActiveSourceActionTest { private TestLooper mTestLooper = new TestLooper(); private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); private int mPhysicalAddress; + private boolean mIsPowerStandby; @Before public void setUp() throws Exception { mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); + mIsPowerStandby = false; FakeAudioFramework audioFramework = new FakeAudioFramework(); mHdmiControlService = new HdmiControlService(mContextSpy, Collections.emptyList(), audioFramework.getAudioManager(), audioFramework.getAudioDeviceVolumeManager()) { @Override boolean isPowerStandby() { - return false; + return mIsPowerStandby; } @Override @@ -145,4 +147,41 @@ public class ActiveSourceActionTest { assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress); assertThat(playbackDevice.isActiveSource()).isTrue(); } + + @Test + public void onActiveSourceLost_removePendingActiveSourceAction() { + HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback( + mHdmiControlService); + playbackDevice.init(); + mLocalDevices.add(playbackDevice); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + mIsPowerStandby = true; + mTestLooper.dispatchAll(); + + mNativeWrapper.clearResultMessages(); + mTestLooper.dispatchAll(); + + int otherPlaybackLogicalAddress = playbackDevice.getDeviceInfo().getLogicalAddress() + == Constants.ADDR_PLAYBACK_2 + ? Constants.ADDR_PLAYBACK_1 : Constants.ADDR_PLAYBACK_2; + HdmiCecMessage activeSourceFromOtherDevice = + HdmiCecMessageBuilder.buildActiveSource( + otherPlaybackLogicalAddress, 0x2200); + HdmiCecMessage activeSourceFromDevice = + HdmiCecMessageBuilder.buildActiveSource( + playbackDevice.getDeviceInfo().getLogicalAddress(), mPhysicalAddress); + + HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction( + playbackDevice, ADDR_TV); + playbackDevice.addAndStartAction(action); + mTestLooper.dispatchAll(); + + assertThat(playbackDevice.getActions(ActiveSourceAction.class)).hasSize(1); + playbackDevice.handleActiveSource(activeSourceFromOtherDevice); + mTestLooper.dispatchAll(); + + // Action is removed + assertThat(playbackDevice.getActions(ActiveSourceAction.class)).hasSize(0); + assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSourceFromDevice); + } } |