diff options
| -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); + } } |