diff options
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecNetwork.java | 24 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java | 49 |
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( |