diff options
| author | 2021-11-25 18:41:19 +0100 | |
|---|---|---|
| committer | 2022-03-31 07:58:53 +0000 | |
| commit | 6304e44df4099aa4317d3b1014956d4d487324cc (patch) | |
| tree | 9b62e3d9b533910fbdc1ee186c38585abf22a757 | |
| parent | 3f31afd1cf0f0bba44d7ab3afbd033e9fdd81c34 (diff) | |
Set device type on first message received
When receiving the first message from a new device, deduce its device
type from its logical address if possible and store it in the network.
Bug: 205082572
Test: atest HdmiCecNetworkTest
Change-Id: I66b0969347e7d292f8222efb250156e0421e60ca
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecNetwork.java | 33 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java | 16 |
2 files changed, 42 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java b/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java index 185eaa92d511..90ff507d0347 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java @@ -360,10 +360,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; } /** @@ -489,6 +491,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. @@ -502,6 +532,7 @@ public class HdmiCecNetwork { HdmiDeviceInfo newDevice = HdmiDeviceInfo.cecDeviceBuilder() .setLogicalAddress(sourceAddress) .setDisplayName(HdmiUtils.getDefaultDeviceName(sourceAddress)) + .setDeviceType(logicalAddressToDeviceType(sourceAddress)) .build(); 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 42fa32cabc06..2a8a5ed79067 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java @@ -102,6 +102,8 @@ public class HdmiCecNetworkTest { new HdmiPortInfo(5, HdmiPortInfo.PORT_OUTPUT, 0x0000, true, false, false); mNativeWrapper.setPortInfo(mHdmiPortInfo); mHdmiCecNetwork.initPortInfo(); + + mHdmiCecNetwork = mHdmiControlService.getHdmiCecNetwork(); } @Test @@ -143,6 +145,7 @@ public class HdmiCecNetworkTest { @Test public void localDevices_verifyOne_tv() { + mHdmiCecNetwork.clearLocalDevices(); mHdmiCecNetwork.addLocalDevice(HdmiDeviceInfo.DEVICE_TV, new HdmiCecLocalDeviceTv(mHdmiControlService)); @@ -155,6 +158,7 @@ public class HdmiCecNetworkTest { @Test public void localDevices_verifyOne_playback() { + mHdmiCecNetwork.clearLocalDevices(); mHdmiCecNetwork.addLocalDevice(HdmiDeviceInfo.DEVICE_PLAYBACK, new HdmiCecLocalDevicePlayback(mHdmiControlService)); @@ -177,7 +181,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.VENDOR_ID_UNKNOWN); @@ -259,7 +263,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.VENDOR_ID_UNKNOWN); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); @@ -280,7 +284,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.VENDOR_ID_UNKNOWN); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName); assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo( @@ -300,7 +304,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); @@ -431,7 +435,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); @@ -472,7 +476,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.VENDOR_ID_UNKNOWN); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo( HdmiUtils.getDefaultDeviceName(logicalAddress)); |