Handle <Device Vendor ID> messages in HdmiCecNetwork
Listen for <Device Vendor ID> messages and update device info with Vendor ID when available. Bug: 155704817 Test: atest com.android.server.hdmi Change-Id: I6570d9f2e47b97599a13bc7541914b97fdbd4bbf
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -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,
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user