summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yan Han <yanha@google.com> 2021-11-25 18:41:19 +0100
committer Nathalie Le Clair <lcnathalie@google.com> 2022-03-31 07:58:53 +0000
commit6304e44df4099aa4317d3b1014956d4d487324cc (patch)
tree9b62e3d9b533910fbdc1ee186c38585abf22a757
parent3f31afd1cf0f0bba44d7ab3afbd033e9fdd81c34 (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.java33
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java16
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));