diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 7cfa211bb9fd4..3c61e39f8cce1 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -69,6 +69,10 @@ public final class HdmiControlManager { public static final int RESULT_INCORRECT_MODE = 6; public static final int RESULT_COMMUNICATION_FAILED = 7; + public static final int DEVICE_EVENT_ADD_DEVICE = 1; + public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; + public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; + // --- One Touch Recording success result /** Recording currently selected source. Indicates the status of a recording. */ public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 0x01; diff --git a/core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl b/core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl index 94fd14f7ccedc..69f29111635c5 100644 --- a/core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl +++ b/core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl @@ -29,7 +29,12 @@ oneway interface IHdmiDeviceEventListener { /** * @param deviceInfo {@link HdmiDeviceInfo} of the logical device whose * status has changed - * @param activated true if the device gets activated + * @param status device status. It should be one of the following values + * */ - void onStatusChanged(in HdmiDeviceInfo deviceInfo, in boolean activated); + void onStatusChanged(in HdmiDeviceInfo deviceInfo, in int status); } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 183f299576553..4810650e35999 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -640,7 +640,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { private void clearDeviceInfoList() { assertRunOnServiceThread(); for (HdmiDeviceInfo info : mSafeExternalInputs) { - invokeDeviceEventListener(info, false); + invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE); } mDeviceInfos.clear(); updateSafeDeviceInfoList(); @@ -1070,9 +1070,9 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return false; } - private void invokeDeviceEventListener(HdmiDeviceInfo info, boolean activated) { + private void invokeDeviceEventListener(HdmiDeviceInfo info, int status) { if (!hideDevicesBehindLegacySwitch(info)) { - mService.invokeDeviceEventListeners(info, activated); + mService.invokeDeviceEventListeners(info, status); } } @@ -1144,7 +1144,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // The addition of TV device itself should not be notified. return; } - invokeDeviceEventListener(info, true); + invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_ADD_DEVICE); } /** @@ -1158,7 +1158,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { HdmiDeviceInfo info = removeDeviceInfo(address); mCecMessageCache.flushMessagesFrom(address); - invokeDeviceEventListener(info, false); + invokeDeviceEventListener(info, HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE); } @ServiceThreadOnly @@ -1537,6 +1537,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // addDeviceInfo replaces old device info with new one if exists. addDeviceInfo(newInfo); - // TODO: notify this update to others. + invokeDeviceEventListener(newInfo, HdmiControlManager.DEVICE_EVENT_UPDATE_DEVICE); } } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 6f68bd871b501..356db66076ac2 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1254,11 +1254,11 @@ public final class HdmiControlService extends SystemService { } } - void invokeDeviceEventListeners(HdmiDeviceInfo device, boolean activated) { + void invokeDeviceEventListeners(HdmiDeviceInfo device, int status) { synchronized (mLock) { for (IHdmiDeviceEventListener listener : mDeviceEventListeners) { try { - listener.onStatusChanged(device, activated); + listener.onStatusChanged(device, status); } catch (RemoteException e) { Slog.e(TAG, "Failed to report device event:" + e); } diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index 71f43b487214c..b88e669b975cc 100644 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -21,6 +21,7 @@ import static android.media.tv.TvInputManager.INPUT_STATE_DISCONNECTED; import android.content.Context; import android.content.Intent; +import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiHotplugEvent; import android.hardware.hdmi.IHdmiControlService; @@ -862,6 +863,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { public void onHardwareDeviceRemoved(TvInputHardwareInfo info); public void onHdmiDeviceAdded(HdmiDeviceInfo device); public void onHdmiDeviceRemoved(HdmiDeviceInfo device); + public void onHdmiDeviceUpdated(HdmiDeviceInfo device); } private class ListenerHandler extends Handler { @@ -870,6 +872,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { private static final int HARDWARE_DEVICE_REMOVED = 3; private static final int HDMI_DEVICE_ADDED = 4; private static final int HDMI_DEVICE_REMOVED = 5; + private static final int HDMI_DEVICE_UPDATED = 6; @Override public final void handleMessage(Message msg) { @@ -900,6 +903,10 @@ class TvInputHardwareManager implements TvInputHal.Callback { mListener.onHdmiDeviceRemoved(info); break; } + case HDMI_DEVICE_UPDATED: { + HdmiDeviceInfo info = (HdmiDeviceInfo) msg.obj; + mListener.onHdmiDeviceUpdated(info); + } default: { Slog.w(TAG, "Unhandled message: " + msg); break; @@ -932,25 +939,40 @@ class TvInputHardwareManager implements TvInputHal.Callback { private final class HdmiDeviceEventListener extends IHdmiDeviceEventListener.Stub { @Override - public void onStatusChanged(HdmiDeviceInfo deviceInfo, boolean activated) { + public void onStatusChanged(HdmiDeviceInfo deviceInfo, int status) { synchronized (mLock) { - if (activated) { - if (!mHdmiDeviceList.contains(deviceInfo)) { - mHdmiDeviceList.add(deviceInfo); - } else { - Slog.w(TAG, "The list already contains " + deviceInfo + "; ignoring."); - return; + int messageType = 0; + switch (status) { + case HdmiControlManager.DEVICE_EVENT_ADD_DEVICE: { + if (!mHdmiDeviceList.contains(deviceInfo)) { + mHdmiDeviceList.add(deviceInfo); + } else { + Slog.w(TAG, "The list already contains " + deviceInfo + "; ignoring."); + return; + } + messageType = ListenerHandler.HDMI_DEVICE_ADDED; + break; } - } else { - if (!mHdmiDeviceList.remove(deviceInfo)) { - Slog.w(TAG, "The list doesn't contain " + deviceInfo + "; ignoring."); - return; + case HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE: { + if (!mHdmiDeviceList.remove(deviceInfo)) { + Slog.w(TAG, "The list doesn't contain " + deviceInfo + "; ignoring."); + return; + } + messageType = ListenerHandler.HDMI_DEVICE_REMOVED; + break; + } + case HdmiControlManager.DEVICE_EVENT_UPDATE_DEVICE: { + if (!mHdmiDeviceList.remove(deviceInfo)) { + Slog.w(TAG, "The list doesn't contain " + deviceInfo + "; ignoring."); + return; + } + mHdmiDeviceList.add(deviceInfo); + messageType = ListenerHandler.HDMI_DEVICE_UPDATED; + break; } } - Message msg = mHandler.obtainMessage( - activated ? ListenerHandler.HDMI_DEVICE_ADDED - : ListenerHandler.HDMI_DEVICE_REMOVED, - 0, 0, deviceInfo); + + Message msg = mHandler.obtainMessage(messageType, 0, 0, deviceInfo); if (findHardwareInfoForHdmiPortLocked(deviceInfo.getPortId()) != null) { msg.sendToTarget(); } else { diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index dfa7e2adc5ac7..dc5bc84d07491 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -2174,5 +2174,10 @@ public final class TvInputManagerService extends SystemService { } } } + + @Override + public void onHdmiDeviceUpdated(HdmiDeviceInfo deviceInfo) { + // TODO: implement here. + } } }