Loading services/core/java/com/android/server/hdmi/HdmiCecNetwork.java +24 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.hdmi; import static com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import static com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import android.annotation.Nullable; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.HdmiPortInfo; Loading Loading @@ -242,6 +243,7 @@ class HdmiCecNetwork { * Returns null if no logical address matched * Returns null if no logical address matched */ */ @ServiceThreadOnly @ServiceThreadOnly @Nullable HdmiDeviceInfo getCecDeviceInfo(int logicalAddress) { HdmiDeviceInfo getCecDeviceInfo(int logicalAddress) { assertRunOnServiceThread(); assertRunOnServiceThread(); return mDeviceInfos.get(HdmiDeviceInfo.idForCecDevice(logicalAddress)); return mDeviceInfos.get(HdmiDeviceInfo.idForCecDevice(logicalAddress)); Loading Loading @@ -517,6 +519,10 @@ class HdmiCecNetwork { case Constants.MESSAGE_SET_OSD_NAME: case Constants.MESSAGE_SET_OSD_NAME: handleSetOsdName(message); handleSetOsdName(message); break; break; case Constants.MESSAGE_DEVICE_VENDOR_ID: handleDeviceVendorId(message); break; } } } } Loading Loading @@ -582,6 +588,24 @@ class HdmiCecNetwork { deviceInfo.getDevicePowerStatus())); 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) { void addCecSwitch(int physicalAddress) { mCecSwitches.add(physicalAddress); mCecSwitches.add(physicalAddress); } } Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java +49 −0 Original line number Original line Diff line number Diff line Loading @@ -284,6 +284,27 @@ public class HdmiCecNetworkTest { HdmiControlManager.POWER_STATUS_UNKNOWN); 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 @Test public void cecDevices_tracking_updatesDeviceInfo() { public void cecDevices_tracking_updatesDeviceInfo() { int logicalAddress = Constants.ADDR_PLAYBACK_1; int logicalAddress = Constants.ADDR_PLAYBACK_1; Loading @@ -291,6 +312,7 @@ public class HdmiCecNetworkTest { int type = HdmiDeviceInfo.DEVICE_PLAYBACK; int type = HdmiDeviceInfo.DEVICE_PLAYBACK; int powerStatus = HdmiControlManager.POWER_STATUS_ON; int powerStatus = HdmiControlManager.POWER_STATUS_ON; String osdName = "Test Device"; String osdName = "Test Device"; int vendorId = 1234; mHdmiCecNetwork.handleCecMessage( mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress, HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress, Loading @@ -301,6 +323,8 @@ public class HdmiCecNetworkTest { mHdmiCecNetwork.handleCecMessage( mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildSetOsdNameCommand(logicalAddress, HdmiCecMessageBuilder.buildSetOsdNameCommand(logicalAddress, Constants.ADDR_BROADCAST, osdName)); Constants.ADDR_BROADCAST, osdName)); mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildDeviceVendorIdCommand(logicalAddress, vendorId)); assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1); assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1); Loading @@ -309,6 +333,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(physicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(physicalAddress); assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(type); assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(type); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(vendorId); assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(powerStatus); assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(powerStatus); } } Loading Loading @@ -381,6 +406,30 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(updatedOsdName); 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 @Test public void cecDevices_tracking_clearDevices() { public void cecDevices_tracking_clearDevices() { int logicalAddress = Constants.ADDR_PLAYBACK_1; int logicalAddress = Constants.ADDR_PLAYBACK_1; Loading Loading
services/core/java/com/android/server/hdmi/HdmiCecNetwork.java +24 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.hdmi; import static com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import static com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import android.annotation.Nullable; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.HdmiPortInfo; Loading Loading @@ -242,6 +243,7 @@ class HdmiCecNetwork { * Returns null if no logical address matched * Returns null if no logical address matched */ */ @ServiceThreadOnly @ServiceThreadOnly @Nullable HdmiDeviceInfo getCecDeviceInfo(int logicalAddress) { HdmiDeviceInfo getCecDeviceInfo(int logicalAddress) { assertRunOnServiceThread(); assertRunOnServiceThread(); return mDeviceInfos.get(HdmiDeviceInfo.idForCecDevice(logicalAddress)); return mDeviceInfos.get(HdmiDeviceInfo.idForCecDevice(logicalAddress)); Loading Loading @@ -517,6 +519,10 @@ class HdmiCecNetwork { case Constants.MESSAGE_SET_OSD_NAME: case Constants.MESSAGE_SET_OSD_NAME: handleSetOsdName(message); handleSetOsdName(message); break; break; case Constants.MESSAGE_DEVICE_VENDOR_ID: handleDeviceVendorId(message); break; } } } } Loading Loading @@ -582,6 +588,24 @@ class HdmiCecNetwork { deviceInfo.getDevicePowerStatus())); 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) { void addCecSwitch(int physicalAddress) { mCecSwitches.add(physicalAddress); mCecSwitches.add(physicalAddress); } } Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecNetworkTest.java +49 −0 Original line number Original line Diff line number Diff line Loading @@ -284,6 +284,27 @@ public class HdmiCecNetworkTest { HdmiControlManager.POWER_STATUS_UNKNOWN); 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 @Test public void cecDevices_tracking_updatesDeviceInfo() { public void cecDevices_tracking_updatesDeviceInfo() { int logicalAddress = Constants.ADDR_PLAYBACK_1; int logicalAddress = Constants.ADDR_PLAYBACK_1; Loading @@ -291,6 +312,7 @@ public class HdmiCecNetworkTest { int type = HdmiDeviceInfo.DEVICE_PLAYBACK; int type = HdmiDeviceInfo.DEVICE_PLAYBACK; int powerStatus = HdmiControlManager.POWER_STATUS_ON; int powerStatus = HdmiControlManager.POWER_STATUS_ON; String osdName = "Test Device"; String osdName = "Test Device"; int vendorId = 1234; mHdmiCecNetwork.handleCecMessage( mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress, HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(logicalAddress, Loading @@ -301,6 +323,8 @@ public class HdmiCecNetworkTest { mHdmiCecNetwork.handleCecMessage( mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildSetOsdNameCommand(logicalAddress, HdmiCecMessageBuilder.buildSetOsdNameCommand(logicalAddress, Constants.ADDR_BROADCAST, osdName)); Constants.ADDR_BROADCAST, osdName)); mHdmiCecNetwork.handleCecMessage( HdmiCecMessageBuilder.buildDeviceVendorIdCommand(logicalAddress, vendorId)); assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1); assertThat(mHdmiCecNetwork.getSafeCecDevicesLocked()).hasSize(1); Loading @@ -309,6 +333,7 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(physicalAddress); assertThat(cecDeviceInfo.getPhysicalAddress()).isEqualTo(physicalAddress); assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(type); assertThat(cecDeviceInfo.getDeviceType()).isEqualTo(type); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName); assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(osdName); assertThat(cecDeviceInfo.getVendorId()).isEqualTo(vendorId); assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(powerStatus); assertThat(cecDeviceInfo.getDevicePowerStatus()).isEqualTo(powerStatus); } } Loading Loading @@ -381,6 +406,30 @@ public class HdmiCecNetworkTest { assertThat(cecDeviceInfo.getDisplayName()).isEqualTo(updatedOsdName); 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 @Test public void cecDevices_tracking_clearDevices() { public void cecDevices_tracking_clearDevices() { int logicalAddress = Constants.ADDR_PLAYBACK_1; int logicalAddress = Constants.ADDR_PLAYBACK_1; Loading