From 8f2ed357a23fac4a55da43d20138b438b4ac79a7 Mon Sep 17 00:00:00 2001 From: Jungshik Jang Date: Mon, 7 Jul 2014 15:02:47 +0900 Subject: [PATCH] Handle in TV. When TV receives it should update the name of device and should notify them who are listening device changes. Bug: 16115666 Change-Id: Ic3b60def8858ca5b7041202135d5dcaf47fa06e7 --- .../server/hdmi/HdmiCecLocalDevice.java | 7 +++ .../server/hdmi/HdmiCecLocalDeviceTv.java | 43 ++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 43debdac83a23..c5169b96c8eb0 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -160,6 +160,8 @@ abstract class HdmiCecLocalDevice { return handleVendorCommand(message); case Constants.MESSAGE_VENDOR_COMMAND_WITH_ID: return handleVendorCommandWithId(message); + case Constants.MESSAGE_SET_OSD_NAME: + return handleSetOsdName(message); default: return false; } @@ -360,6 +362,11 @@ abstract class HdmiCecLocalDevice { return true; } + protected boolean handleSetOsdName(HdmiCecMessage message) { + // The default behavior of is doing nothing. + return true; + } + @ServiceThreadOnly final void handleAddressAllocated(int logicalAddress) { assertRunOnServiceThread(); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index c12d5cc653189..c96ad2890e600 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -31,6 +31,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -259,7 +260,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { int address = message.getSource(); int path = HdmiUtils.twoBytesToInt(message.getParams()); if (getDeviceInfo(address) == null) { - handleNewDeviceAtTheTailOfActivePath(address, path); + handleNewDeviceAtTheTailOfActivePath(path); } else { ActiveSourceHandler.create(this, null).process(address, path); } @@ -340,13 +341,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { int path = HdmiUtils.twoBytesToInt(message.getParams()); int address = message.getSource(); if (!isInDeviceList(path, address)) { - handleNewDeviceAtTheTailOfActivePath(address, path); + handleNewDeviceAtTheTailOfActivePath(path); } addAndStartAction(new NewDeviceAction(this, address, path)); return true; } - private void handleNewDeviceAtTheTailOfActivePath(int address, int path) { + private void handleNewDeviceAtTheTailOfActivePath(int path) { // Seq #22 if (isTailOfActivePath(path, getActivePath())) { removeAction(RoutingControlAction.class); @@ -440,6 +441,35 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return handleTextViewOn(message); } + @Override + @ServiceThreadOnly + protected boolean handleSetOsdName(HdmiCecMessage message) { + int source = message.getSource(); + HdmiCecDeviceInfo deviceInfo = getDeviceInfo(source); + // If the device is not in device list, ignore it. + if (deviceInfo == null) { + Slog.e(TAG, "No source device info for ." + message); + return true; + } + String osdName = null; + try { + osdName = new String(message.getParams(), "US-ASCII"); + } catch (UnsupportedEncodingException e) { + Slog.e(TAG, "Invalid request:" + message, e); + return true; + } + + if (deviceInfo.getDisplayName().equals(osdName)) { + Slog.i(TAG, "Ignore incoming having same osd name:" + message); + return true; + } + + addCecDevice(new HdmiCecDeviceInfo(deviceInfo.getLogicalAddress(), + deviceInfo.getPhysicalAddress(), deviceInfo.getDeviceType(), + deviceInfo.getVendorId(), osdName)); + return true; + } + @ServiceThreadOnly private void launchDeviceDiscovery() { assertRunOnServiceThread(); @@ -729,7 +759,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { * that has the same logical address as new one has. */ @ServiceThreadOnly - HdmiCecDeviceInfo addDeviceInfo(HdmiCecDeviceInfo deviceInfo) { + private HdmiCecDeviceInfo addDeviceInfo(HdmiCecDeviceInfo deviceInfo) { assertRunOnServiceThread(); HdmiCecDeviceInfo oldDeviceInfo = getDeviceInfo(deviceInfo.getLogicalAddress()); if (oldDeviceInfo != null) { @@ -750,7 +780,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { * @return removed {@link HdmiCecDeviceInfo} it exists. Otherwise, returns {@code null} */ @ServiceThreadOnly - HdmiCecDeviceInfo removeDeviceInfo(int logicalAddress) { + private HdmiCecDeviceInfo removeDeviceInfo(int logicalAddress) { assertRunOnServiceThread(); HdmiCecDeviceInfo deviceInfo = mDeviceInfos.get(logicalAddress); if (deviceInfo != null) { @@ -878,7 +908,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } /** - * Called when a device is newly added or a new device is detected. + * Called when a device is newly added or a new device is detected or + * existing device is updated. * * @param info device info of a new device. */