summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Paul Colta <donpaul@google.com> 2025-02-25 18:37:53 +0000
committer Paul Colta <donpaul@google.com> 2025-02-25 11:24:24 -0800
commitc896be22da2a3b2712986b9cb40a9d947140bf58 (patch)
tree2d0d748232121d3d07a66c84d30890e81f81871a
parent45e5a0e85cf34143dcaed1b9e276bfb421026980 (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.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java41
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);
+ }
}