diff options
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecNetwork.java | 34 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java | 16 |
2 files changed, 42 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java b/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java index 7ceaa959212e..180bcdbe7546 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java @@ -370,10 +370,12 @@ public class HdmiCecNetwork { // This only applies to TV devices. // Returns true if the policy is set to true, and the device to check does not have // a parent CEC device (which should be the CEC-enabled switch) in the list. + // Devices with an invalid physical address are assumed to NOT be connected to a legacy switch. private boolean hideDevicesBehindLegacySwitch(HdmiDeviceInfo info) { return isLocalDeviceAddress(Constants.ADDR_TV) && HdmiConfig.HIDE_DEVICES_BEHIND_LEGACY_SWITCH - && !isConnectedToCecSwitch(info.getPhysicalAddress(), getCecSwitches()); + && !isConnectedToCecSwitch(info.getPhysicalAddress(), getCecSwitches()) + && info.getPhysicalAddress() != HdmiDeviceInfo.PATH_INVALID; } /** @@ -498,6 +500,34 @@ public class HdmiCecNetwork { } /** + * Attempts to deduce the device type of a device given its logical address. + * If multiple types are possible, returns {@link HdmiDeviceInfo#DEVICE_RESERVED}. + */ + private static int logicalAddressToDeviceType(int logicalAddress) { + switch (logicalAddress) { + case Constants.ADDR_TV: + return HdmiDeviceInfo.DEVICE_TV; + case Constants.ADDR_RECORDER_1: + case Constants.ADDR_RECORDER_2: + case Constants.ADDR_RECORDER_3: + return HdmiDeviceInfo.DEVICE_RECORDER; + case Constants.ADDR_TUNER_1: + case Constants.ADDR_TUNER_2: + case Constants.ADDR_TUNER_3: + case Constants.ADDR_TUNER_4: + return HdmiDeviceInfo.DEVICE_TUNER; + case Constants.ADDR_PLAYBACK_1: + case Constants.ADDR_PLAYBACK_2: + case Constants.ADDR_PLAYBACK_3: + return HdmiDeviceInfo.DEVICE_PLAYBACK; + case Constants.ADDR_AUDIO_SYSTEM: + return HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM; + default: + return HdmiDeviceInfo.DEVICE_RESERVED; + } + } + + /** * Passively listen to incoming CEC messages. * * This shall not result in any CEC messages being sent. @@ -510,7 +540,7 @@ public class HdmiCecNetwork { if (getCecDeviceInfo(sourceAddress) == null) { HdmiDeviceInfo newDevice = new HdmiDeviceInfo(sourceAddress, HdmiDeviceInfo.PATH_INVALID, HdmiDeviceInfo.PORT_INVALID, - HdmiDeviceInfo.DEVICE_RESERVED, Constants.UNKNOWN_VENDOR_ID, + logicalAddressToDeviceType(sourceAddress), Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(sourceAddress)); addCecDevice(newDevice); } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java index b1998f55c72e..c478c2343361 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java @@ -100,6 +100,8 @@ public class HdmiCecNetworkTest { new HdmiPortInfo(5, HdmiPortInfo.PORT_OUTPUT, 0x0000, true, false, false); mNativeWrapper.setPortInfo(mHdmiPortInfo); mHdmiCecNetwork.initPortInfo(); + + mHdmiCecNetwork = mHdmiControlService.getHdmiCecNetwork(); } @Test @@ -141,6 +143,7 @@ public class HdmiCecNetworkTest { @Test public void localDevices_verifyOne_tv() { + mHdmiCecNetwork.clearLocalDevices(); mHdmiCecNetwork.addLocalDevice(HdmiDeviceInfo.DEVICE_TV, new HdmiCecLocalDeviceTv(mHdmiControlService)); @@ -153,6 +156,7 @@ public class HdmiCecNetworkTest { @Test public void localDevices_verifyOne_playback() { + mHdmiCecNetwork.clearLocalDevices(); mHdmiCecNetwork.addLocalDevice(HdmiDeviceInfo.DEVICE_PLAYBACK, new HdmiCecLocalDevicePlayback(mHdmiControlService)); @@ -175,7 +179,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo( Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED); + assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_PLAYBACK); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(Constants.UNKNOWN_VENDOR_ID); @@ -257,7 +261,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo( Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED); + assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_PLAYBACK); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(Constants.UNKNOWN_VENDOR_ID); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); @@ -278,7 +282,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo( Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED); + assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_PLAYBACK); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(Constants.UNKNOWN_VENDOR_ID); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName); assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo( @@ -298,7 +302,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo( Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED); + assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_PLAYBACK); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(vendorId); @@ -429,7 +433,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo( Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED); + assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_PLAYBACK); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(updatedVendorId); @@ -470,7 +474,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo( Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED); + assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_PLAYBACK); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(Constants.UNKNOWN_VENDOR_ID); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); |