diff options
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java | 12 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java | 58 |
2 files changed, 70 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index ba4d320df38c..731c78e20c7a 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -514,6 +514,18 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { protected int handleRoutingInformation(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); + HdmiDeviceInfo sourceDevice = mService.getHdmiCecNetwork() + .getCecDeviceInfo(message.getSource()); + // Ignore <Routing Information> messages pointing to the same physical address as the + // message sender. In this case, we shouldn't consider the sender to be the active source. + // See more b/321771821#comment7. + if (sourceDevice != null + && sourceDevice.getLogicalAddress() != Constants.ADDR_TV + && sourceDevice.getPhysicalAddress() == physicalAddress) { + Slog.d(TAG, "<Routing Information> is ignored, it is pointing to the same physical" + + " address as the message sender"); + return Constants.HANDLED; + } handleRoutingChangeAndInformation(physicalAddress, message); return Constants.HANDLED; } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index 543fa5727f19..3b7ec45a487b 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -659,6 +659,64 @@ public class HdmiCecLocalDevicePlaybackTest { mTestLooper.dispatchAll(); assertThat(mActiveMediaSessionsPaused).isFalse(); } + @Test + public void handleRoutingInformation_physicalAddressOfSender_Tv_activeSourceChange() { + mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( + HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, + HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); + mPowerManager.setInteractive(true); + // Physical address reported in this message is the same as message sender's (TV) physical + // address. + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(Constants.ADDR_TV, 0x0000); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)) + .isEqualTo(Constants.HANDLED); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + 0x0000); + // Active source's logical address is invalidated. + // See {@link HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation}. + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_INVALID); + assertThat(mPowerManager.isInteractive()).isFalse(); + } + + @Test + public void handleRoutingInformation_physicalAddressOfSender_notTv_noActiveSourceChange() { + mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( + HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, + HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); + // Add a device to the network and assert that this device is included in the list of + // devices. + HdmiDeviceInfo infoPlayback = HdmiDeviceInfo.cecDeviceBuilder() + .setLogicalAddress(Constants.ADDR_PLAYBACK_3) + .setPhysicalAddress(0x1000) + .setPortId(PORT_1) + .setDeviceType(HdmiDeviceInfo.DEVICE_PLAYBACK) + .setVendorId(0x1000) + .setDisplayName("Playback 3") + .build(); + mHdmiControlService.getHdmiCecNetwork().addCecDevice(infoPlayback); + mPowerManager.setInteractive(true); + // Physical address reported in this message is the same as message sender's (Playback_3) + // physical address. + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(Constants.ADDR_PLAYBACK_3, 0x1000); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)) + .isEqualTo(Constants.HANDLED); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + mPlaybackLogicalAddress); + assertThat(mPowerManager.isInteractive()).isTrue(); + } @Test public void handleSetStreamPath() { |