Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61daf6b3 authored by Jungshik Jang's avatar Jungshik Jang
Browse files

Hook up device power status change to TIF

Instead of introducing new api update existing
IDeviceEventListener

Bug: 16445063
Change-Id: I93bfc736a06a78e83c95877a53f4f241b51ed9c0
parent 3d1232f3
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;
+7 −2
Original line number Diff line number Diff line
@@ -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
     *        <ul>
     *        <li>{@link HdmiControlManager#DEVICE_EVENT_ADD_DEVICE}
     *        <li>{@link HdmiControlManager#DEVICE_EVENT_REMOVE_DEVICE}
     *        <li>{@link HdmiControlManager#DEVICE_EVENT_UPDATE_DEVICE}
     *        </ul>
     */
    void onStatusChanged(in HdmiDeviceInfo deviceInfo, in boolean activated);
    void onStatusChanged(in HdmiDeviceInfo deviceInfo, in int status);
}
+6 −6
Original line number Diff line number Diff line
@@ -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);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -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);
                }
+37 −15
Original line number Diff line number Diff line
@@ -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) {
                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;
                        }
                } else {
                        messageType = ListenerHandler.HDMI_DEVICE_ADDED;
                        break;
                    }
                    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;
                    }
                Message msg = mHandler.obtainMessage(
                        activated ? ListenerHandler.HDMI_DEVICE_ADDED
                        : ListenerHandler.HDMI_DEVICE_REMOVED,
                        0, 0, deviceInfo);
                    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(messageType, 0, 0, deviceInfo);
                if (findHardwareInfoForHdmiPortLocked(deviceInfo.getPortId()) != null) {
                    msg.sendToTarget();
                } else {
Loading