Loading services/core/java/com/android/server/hdmi/HdmiCecNetwork.java +24 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -517,6 +519,10 @@ class HdmiCecNetwork { case Constants.MESSAGE_SET_OSD_NAME: handleSetOsdName(message); break; case Constants.MESSAGE_DEVICE_VENDOR_ID: handleDeviceVendorId(message); break; } } Loading Loading @@ -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); } Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java +49 −0 Original line number Diff line number Diff line Loading @@ -284,6 +284,27 @@ public class HdmiCecNetworkTest { HdmiControlManager.POWER_STATUS_UNKNOWN); } @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; Loading @@ -291,6 +312,7 @@ public class HdmiCecNetworkTest { int type = HdmiDeviceInfo.DEVICE_PLAYBACK; int powerStatus = HdmiControlManager.POWER_STATUS_ON; String osdName = "Test Device"; int vendorId = 1234; mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress, Loading @@ -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); Loading @@ -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); } Loading Loading @@ -381,6 +406,30 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(updatedOsdName); } @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; Loading Loading
services/core/java/com/android/server/hdmi/HdmiCecNetwork.java +24 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -517,6 +519,10 @@ class HdmiCecNetwork { case Constants.MESSAGE_SET_OSD_NAME: handleSetOsdName(message); break; case Constants.MESSAGE_DEVICE_VENDOR_ID: handleDeviceVendorId(message); break; } } Loading Loading @@ -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); } Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java +49 −0 Original line number Diff line number Diff line Loading @@ -284,6 +284,27 @@ public class HdmiCecNetworkTest { HdmiControlManager.POWER_STATUS_UNKNOWN); } @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; Loading @@ -291,6 +312,7 @@ public class HdmiCecNetworkTest { int type = HdmiDeviceInfo.DEVICE_PLAYBACK; int powerStatus = HdmiControlManager.POWER_STATUS_ON; String osdName = "Test Device"; int vendorId = 1234; mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress, Loading @@ -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); Loading @@ -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); } Loading Loading @@ -381,6 +406,30 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(updatedOsdName); } @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; Loading