summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-10-27 08:56:43 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-10-27 08:56:43 +0000
commit200cb303343c3a131c132d52bb7cf9c905f326bc (patch)
treeb36527717fbd3e5a9aa5d41b348acdf41d6e9e12
parentc32a9421a296f2c48e6dcfb97d8fa7337b67d666 (diff)
parent2ce0803a80c9ac9bde7c30172e2683720d8e55f8 (diff)
Merge "Handle <Device Vendor ID> messages in HdmiCecNetwork"
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecNetwork.java24
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java49
2 files changed, 73 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java b/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java
index 416302419a71..5d75a63d0c8d 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecNetwork.java
@@ -18,6 +18,7 @@ package com.android.server.hdmi;
import static com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
+import android.annotation.Nullable;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.HdmiPortInfo;
@@ -242,6 +243,7 @@ class HdmiCecNetwork {
* Returns null if no logical address matched
*/
@ServiceThreadOnly
+ @Nullable
HdmiDeviceInfo getCecDeviceInfo(int logicalAddress) {
assertRunOnServiceThread();
return mDeviceInfos.get(HdmiDeviceInfo.idForCecDevice(logicalAddress));
@@ -517,6 +519,10 @@ class HdmiCecNetwork {
case Constants.MESSAGE_SET_OSD_NAME:
handleSetOsdName(message);
break;
+ case Constants.MESSAGE_DEVICE_VENDOR_ID:
+ handleDeviceVendorId(message);
+ break;
+
}
}
@@ -582,6 +588,24 @@ class HdmiCecNetwork {
deviceInfo.getDevicePowerStatus()));
}
+ @ServiceThreadOnly
+ private void handleDeviceVendorId(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ int logicalAddress = message.getSource();
+ int vendorId = HdmiUtils.threeBytesToInt(message.getParams());
+
+ HdmiDeviceInfo deviceInfo = getCecDeviceInfo(logicalAddress);
+ if (deviceInfo == null) {
+ Slog.i(TAG, "Unknown source device info for <Device Vendor ID> " + message);
+ } else {
+ HdmiDeviceInfo updatedDeviceInfo = new HdmiDeviceInfo(deviceInfo.getLogicalAddress(),
+ deviceInfo.getPhysicalAddress(),
+ deviceInfo.getPortId(), deviceInfo.getDeviceType(), vendorId,
+ deviceInfo.getDisplayName(), deviceInfo.getDevicePowerStatus());
+ updateCecDevice(updatedDeviceInfo);
+ }
+ }
+
void addCecSwitch(int physicalAddress) {
mCecSwitches.add(physicalAddress);
}
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 4f18582bf83f..080b52bbbc6a 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java
@@ -285,12 +285,34 @@ public class HdmiCecNetworkTest {
}
@Test
+ public void cecDevices_tracking_reportVendorId() {
+ int logicalAddress = Constants.ADDR_PLAYBACK_1;
+ int vendorId = 1234;
+ mHdmiCecNetwork.handleCecMessage(
+ HdmiCecMessageBuilder.buildDeviceVendorIdCommand(logicalAddress, vendorId));
+
+ assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1);
+
+ HdmiDeviceInfo cecDeviceInfo = mHdmiCecNetwork.getCecDeviceInfo(logicalAddress);
+ assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress);
+ assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(
+ Constants.INVALID_PHYSICAL_ADDRESS);
+ assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED);
+ assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(
+ HdmiUtils.getDefaultDeviceName(logicalAddress));
+ assertThat(cecDeviceInfo.getVendorId()).isEqualTo(vendorId);
+ assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(
+ HdmiControlManager.POWER_STATUS_UNKNOWN);
+ }
+
+ @Test
public void cecDevices_tracking_updatesDeviceInfo() {
int logicalAddress = Constants.ADDR_PLAYBACK_1;
int physicalAddress = 0x1000;
int type = HdmiDeviceInfo.DEVICE_PLAYBACK;
int powerStatus = HdmiControlManager.POWER_STATUS_ON;
String osdName = "Test Device";
+ int vendorId = 1234;
mHdmiCecNetwork.handleCecMessage(
HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress,
@@ -301,6 +323,8 @@ public class HdmiCecNetworkTest {
mHdmiCecNetwork.handleCecMessage(
HdmiCecMessageBuilder.buildSetOsdNameCommand(logicalAddress,
Constants.ADDR_BROADCAST, osdName));
+ mHdmiCecNetwork.handleCecMessage(
+ HdmiCecMessageBuilder.buildDeviceVendorIdCommand(logicalAddress, vendorId));
assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1);
@@ -309,6 +333,7 @@ public class HdmiCecNetworkTest {
assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(physicalAddress);
assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(type);
assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName);
+ assertThat(cecDeviceInfo.getVendorId()).isEqualTo(vendorId);
assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(powerStatus);
}
@@ -382,6 +407,30 @@ public class HdmiCecNetworkTest {
}
@Test
+ public void cecDevices_tracking_updatesVendorId() {
+ int logicalAddress = Constants.ADDR_PLAYBACK_1;
+ int vendorId = 1234;
+ int updatedVendorId = 12345;
+ mHdmiCecNetwork.handleCecMessage(
+ HdmiCecMessageBuilder.buildDeviceVendorIdCommand(logicalAddress, vendorId));
+ mHdmiCecNetwork.handleCecMessage(
+ HdmiCecMessageBuilder.buildDeviceVendorIdCommand(logicalAddress, updatedVendorId));
+
+ assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1);
+
+ HdmiDeviceInfo cecDeviceInfo = mHdmiCecNetwork.getCecDeviceInfo(logicalAddress);
+ assertThat(cecDeviceInfo.getLogicalAddress()).isEqualTo(logicalAddress);
+ assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(
+ Constants.INVALID_PHYSICAL_ADDRESS);
+ assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(HdmiDeviceInfo.DEVICE_RESERVED);
+ assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(
+ HdmiUtils.getDefaultDeviceName(logicalAddress));
+ assertThat(cecDeviceInfo.getVendorId()).isEqualTo(updatedVendorId);
+ assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(
+ HdmiControlManager.POWER_STATUS_UNKNOWN);
+ }
+
+ @Test
public void cecDevices_tracking_clearDevices() {
int logicalAddress = Constants.ADDR_PLAYBACK_1;
mHdmiCecNetwork.handleCecMessage(