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

Commit 4f9f57ce authored by Ji-Hwan Lee's avatar Ji-Hwan Lee
Browse files

TIF: Extend multiple TV input per service for HDMI logical devices

Remove ITvInputManager.registerTvInputInfo() and let addTvInputInfo*()
cover the registration.

Bug: 15570939
Change-Id: Ic36701de96696e7fe32fc1faa0d5f6fde53f6666
parent 75df3bf9
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -64,11 +64,6 @@ interface ITvInputManager {

    // For TV input hardware binding
    List<TvInputHardwareInfo> getHardwareList();
    /*
     * All TvInputServices which want to use hardware must call this method on
     * BOOT_COMPLETE.
     */
    void registerTvInputInfo(in TvInputInfo info, int deviceId);
    ITvInputHardware acquireTvInputHardware(int deviceId, in ITvInputHardwareCallback callback,
            in TvInputInfo info, int userId);
    void releaseTvInputHardware(int deviceId, in ITvInputHardware hardware, int userId);
+5 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.media.tv;

import android.hardware.hdmi.HdmiCecDeviceInfo;
import android.media.tv.ITvInputServiceCallback;
import android.media.tv.ITvInputSessionCallback;
import android.media.tv.TvInputHardwareInfo;
@@ -32,6 +33,8 @@ oneway interface ITvInputService {
            in String inputId);

    // For hardware TvInputService
    void notifyHardwareAdded(in TvInputHardwareInfo info);
    void notifyHardwareRemoved(int deviceId);
    void notifyHardwareAdded(in TvInputHardwareInfo hardwareInfo);
    void notifyHardwareRemoved(in TvInputHardwareInfo hardwareInfo);
    void notifyHdmiCecDeviceAdded(in HdmiCecDeviceInfo cecDeviceInfo);
    void notifyHdmiCecDeviceRemoved(in HdmiCecDeviceInfo cecDeviceInfo);
}
+2 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.media.tv.TvInputInfo;
 * @hide
 */
oneway interface ITvInputServiceCallback {
    void addTvInput(in TvInputInfo inputInfo);
    void addHardwareTvInput(in int deviceID, in TvInputInfo inputInfo);
    void addHdmiCecTvInput(in int logicalAddress, in TvInputInfo inputInfo);
    void removeTvInput(in String inputId);
}
+8 −9
Original line number Diff line number Diff line
@@ -122,7 +122,8 @@ public final class TvInputInfo implements Parcelable {
    public static TvInputInfo createTvInputInfo(Context context, ResolveInfo service)
            throws XmlPullParserException, IOException {
        return createTvInputInfo(context, service, generateInputIdForComponentName(
                new ComponentName(service.serviceInfo.packageName, service.serviceInfo.name)));
                new ComponentName(service.serviceInfo.packageName, service.serviceInfo.name)),
                null);
    }

    /**
@@ -134,10 +135,10 @@ public final class TvInputInfo implements Parcelable {
     * @hide
     */
    public static TvInputInfo createTvInputInfo(Context context, ResolveInfo service,
            HdmiCecDeviceInfo cecInfo) throws XmlPullParserException, IOException {
            HdmiCecDeviceInfo cecInfo, String parentId) throws XmlPullParserException, IOException {
        return createTvInputInfo(context, service, generateInputIdForHdmiCec(
                new ComponentName(service.serviceInfo.packageName, service.serviceInfo.name),
                cecInfo));
                cecInfo), parentId);
    }

    /**
@@ -152,11 +153,11 @@ public final class TvInputInfo implements Parcelable {
            TvInputHardwareInfo hardwareInfo) throws XmlPullParserException, IOException {
        return createTvInputInfo(context, service, generateInputIdForHardware(
                new ComponentName(service.serviceInfo.packageName, service.serviceInfo.name),
                hardwareInfo));
                hardwareInfo), null);
    }

    private static TvInputInfo createTvInputInfo(Context context, ResolveInfo service,
            String id) throws XmlPullParserException, IOException {
            String id, String parentId) throws XmlPullParserException, IOException {
        ServiceInfo si = service.serviceInfo;
        PackageManager pm = context.getPackageManager();
        XmlResourceParser parser = null;
@@ -181,7 +182,7 @@ public final class TvInputInfo implements Parcelable {
                        "Meta-data does not start with tv-input-service tag in " + si.name);
            }

            TvInputInfo input = new TvInputInfo(context, service, id, null);
            TvInputInfo input = new TvInputInfo(service, id, parentId);
            TypedArray sa = res.obtainAttributes(attrs,
                    com.android.internal.R.styleable.TvInputService);
            input.mSetupActivity = sa.getString(
@@ -222,9 +223,8 @@ public final class TvInputInfo implements Parcelable {
     * @param id ID of this TV input. Should be generated via generateInputId*().
     * @param parentId ID of this TV input's parent input. {@code null} if none exists.
     */
    private TvInputInfo(Context context, ResolveInfo service, String id, String parentId) {
    private TvInputInfo(ResolveInfo service, String id, String parentId) {
        mService = service;
        ServiceInfo si = service.serviceInfo;
        mId = id;
        mParentId = parentId;
    }
@@ -429,7 +429,6 @@ public final class TvInputInfo implements Parcelable {

    /**
     * Used to make this class parcelable.
     *
     * @hide
     */
    public static final Parcelable.Creator<TvInputInfo> CREATOR =
+91 −20
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.hardware.hdmi.HdmiCecDeviceInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -121,21 +122,32 @@ public abstract class TvInputService extends Service {

            @Override
            public void notifyHardwareAdded(TvInputHardwareInfo hardwareInfo) {
                mHandler.obtainMessage(ServiceHandler.DO_ADD_TV_INPUT_FROM_HARDWARE,
                mHandler.obtainMessage(ServiceHandler.DO_ADD_HARDWARE_TV_INPUT,
                        hardwareInfo).sendToTarget();
            }

            @Override
            public void notifyHardwareRemoved(int deviceId) {
                mHandler.obtainMessage(ServiceHandler.DO_REMOVE_TV_INPUT_FROM_HARDWARE,
                        deviceId, 0).sendToTarget();
            public void notifyHardwareRemoved(TvInputHardwareInfo hardwareInfo) {
                mHandler.obtainMessage(ServiceHandler.DO_REMOVE_HARDWARE_TV_INPUT,
                        hardwareInfo).sendToTarget();
            }

            @Override
            public void notifyHdmiCecDeviceAdded(HdmiCecDeviceInfo cecDeviceInfo) {
                mHandler.obtainMessage(ServiceHandler.DO_ADD_HDMI_CEC_TV_INPUT,
                        cecDeviceInfo).sendToTarget();
            }

            @Override
            public void notifyHdmiCecDeviceRemoved(HdmiCecDeviceInfo cecDeviceInfo) {
                mHandler.obtainMessage(ServiceHandler.DO_REMOVE_HDMI_CEC_TV_INPUT,
                        cecDeviceInfo).sendToTarget();
            }
        };
    }

    /**
     * Get the number of callbacks that are registered.
     *
     * @hide
     */
    @VisibleForTesting
@@ -153,11 +165,11 @@ public abstract class TvInputService extends Service {
    public abstract Session onCreateSession(String inputId);

    /**
     * Returns a new TvInputInfo object if this service is responsible for {@code hardwareInfo};
     * otherwise, return {@code null}. Override to modify default behavior of ignoring all input.
     *
     * @param hardwareInfo TvInputHardwareInfo object just added.
     * Returns a new {@link TvInputInfo} object if this service is responsible for
     * {@code hardwareInfo}; otherwise, return {@code null}. Override to modify default behavior of
     * ignoring all hardware input.
     *
     * @param hardwareInfo {@link TvInputHardwareInfo} object just added.
     * @hide
     */
    @SystemApi
@@ -167,12 +179,40 @@ public abstract class TvInputService extends Service {

    /**
     * Returns the input ID for {@code deviceId} if it is handled by this service;
     * otherwise, return {@code null}. Override to modify default behavior of ignoring all input.
     * otherwise, return {@code null}. Override to modify default behavior of ignoring all hardware
     * input.
     *
     * @param hardwareInfo {@link TvInputHardwareInfo} object just removed.
     * @hide
     */
    @SystemApi
    public String onHardwareRemoved(int deviceId) {
    public String onHardwareRemoved(TvInputHardwareInfo hardwareInfo) {
        return null;
    }

    /**
     * Returns a new {@link TvInputInfo} object if this service is responsible for
     * {@code cecDeviceInfo}; otherwise, return {@code null}. Override to modify default behavior
     * of ignoring all HDMI CEC logical input device.
     *
     * @param cecDeviceInfo {@link HdmiCecDeviceInfo} object just added.
     * @hide
     */
    @SystemApi
    public TvInputInfo onHdmiCecDeviceAdded(HdmiCecDeviceInfo cecDeviceInfo) {
        return null;
    }

    /**
     * Returns the input ID for {@code logicalAddress} if it is handled by this service;
     * otherwise, return {@code null}. Override to modify default behavior of ignoring all HDMI CEC
     * logical input device.
     *
     * @param cecDeviceInfo {@link HdmiCecDeviceInfo} object just removed.
     * @hide
     */
    @SystemApi
    public String onHdmiCecDeviceRemoved(HdmiCecDeviceInfo cecDeviceInfo) {
        return null;
    }

@@ -899,14 +939,29 @@ public abstract class TvInputService extends Service {
    @SuppressLint("HandlerLeak")
    private final class ServiceHandler extends Handler {
        private static final int DO_CREATE_SESSION = 1;
        private static final int DO_ADD_TV_INPUT_FROM_HARDWARE = 2;
        private static final int DO_REMOVE_TV_INPUT_FROM_HARDWARE = 3;
        private static final int DO_ADD_HARDWARE_TV_INPUT = 2;
        private static final int DO_REMOVE_HARDWARE_TV_INPUT = 3;
        private static final int DO_ADD_HDMI_CEC_TV_INPUT = 4;
        private static final int DO_REMOVE_HDMI_CEC_TV_INPUT = 5;

        private void broadcastAddHardwareTvInput(int deviceId, TvInputInfo inputInfo) {
            int n = mCallbacks.beginBroadcast();
            for (int i = 0; i < n; ++i) {
                try {
                    mCallbacks.getBroadcastItem(i).addHardwareTvInput(deviceId, inputInfo);
                } catch (RemoteException e) {
                    Log.e(TAG, "Error while broadcasting: " + e);
                }
            }
            mCallbacks.finishBroadcast();
        }

        private void broadcastAddTvInput(TvInputInfo inputInfo) {
        private void broadcastAddHdmiCecTvInput(
                int logicalAddress, TvInputInfo inputInfo) {
            int n = mCallbacks.beginBroadcast();
            for (int i = 0; i < n; ++i) {
                try {
                    mCallbacks.getBroadcastItem(i).addTvInput(inputInfo);
                    mCallbacks.getBroadcastItem(i).addHdmiCecTvInput(logicalAddress, inputInfo);
                } catch (RemoteException e) {
                    Log.e(TAG, "Error while broadcasting: " + e);
                }
@@ -951,17 +1006,33 @@ public abstract class TvInputService extends Service {
                    args.recycle();
                    return;
                }
                case DO_ADD_TV_INPUT_FROM_HARDWARE: {
                case DO_ADD_HARDWARE_TV_INPUT: {
                    TvInputHardwareInfo hardwareInfo = (TvInputHardwareInfo) msg.obj;
                    TvInputInfo inputInfo = onHardwareAdded(hardwareInfo);
                    if (inputInfo != null) {
                        broadcastAddTvInput(inputInfo);
                        broadcastAddHardwareTvInput(hardwareInfo.getDeviceId(), inputInfo);
                    }
                    return;
                }
                case DO_REMOVE_HARDWARE_TV_INPUT: {
                    TvInputHardwareInfo hardwareInfo = (TvInputHardwareInfo) msg.obj;
                    String inputId = onHardwareRemoved(hardwareInfo);
                    if (inputId != null) {
                        broadcastRemoveTvInput(inputId);
                    }
                    return;
                }
                case DO_ADD_HDMI_CEC_TV_INPUT: {
                    HdmiCecDeviceInfo cecDeviceInfo = (HdmiCecDeviceInfo) msg.obj;
                    TvInputInfo inputInfo = onHdmiCecDeviceAdded(cecDeviceInfo);
                    if (inputInfo != null) {
                        broadcastAddHdmiCecTvInput(cecDeviceInfo.getLogicalAddress(), inputInfo);
                    }
                    return;
                }
                case DO_REMOVE_TV_INPUT_FROM_HARDWARE: {
                    int deviceId = msg.arg1;
                    String inputId = onHardwareRemoved(deviceId);
                case DO_REMOVE_HDMI_CEC_TV_INPUT: {
                    HdmiCecDeviceInfo cecDeviceInfo = (HdmiCecDeviceInfo) msg.obj;
                    String inputId = onHdmiCecDeviceRemoved(cecDeviceInfo);
                    if (inputId != null) {
                        broadcastRemoveTvInput(inputId);
                    }
Loading