Merge "Handle <Device Vendor ID> messages in HdmiCecNetwork"

This commit is contained in:
TreeHugger Robot
2020-10-27 08:56:43 +00:00
committed by Android (Google) Code Review
2 changed files with 73 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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;