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

Commit 093fa4eb authored by Jae Seo's avatar Jae Seo
Browse files

TIF: Enable per state input icon in TvInputInfo

Also made the fields final and grouped them.

Bug: 23820259
Change-Id: I725c830d7c73e8cbc01b6a4f4f4991cb42258380
parent 09c09fd3
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -24645,6 +24645,7 @@ package android.media.tv {
    method public boolean isPassthroughInput();
    method public boolean isPassthroughInput();
    method public java.lang.CharSequence loadCustomLabel(android.content.Context);
    method public java.lang.CharSequence loadCustomLabel(android.content.Context);
    method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
    method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
    method public android.graphics.drawable.Drawable loadIcon(android.content.Context, int);
    method public java.lang.CharSequence loadLabel(android.content.Context);
    method public java.lang.CharSequence loadLabel(android.content.Context);
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.media.tv.TvInputInfo> CREATOR;
    field public static final android.os.Parcelable.Creator<android.media.tv.TvInputInfo> CREATOR;
@@ -24667,6 +24668,7 @@ package android.media.tv {
    method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean);
    method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean);
    method public android.media.tv.TvInputInfo.Builder setHdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo);
    method public android.media.tv.TvInputInfo.Builder setHdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo);
    method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon);
    method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon);
    method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon, int);
    method public android.media.tv.TvInputInfo.Builder setLabel(int);
    method public android.media.tv.TvInputInfo.Builder setLabel(int);
    method public android.media.tv.TvInputInfo.Builder setParentId(java.lang.String);
    method public android.media.tv.TvInputInfo.Builder setParentId(java.lang.String);
    method public android.media.tv.TvInputInfo.Builder setTunerCount(int);
    method public android.media.tv.TvInputInfo.Builder setTunerCount(int);
+151 −80
Original line number Original line Diff line number Diff line
@@ -111,26 +111,32 @@ public final class TvInputInfo implements Parcelable {
    public static final String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";
    public static final String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";


    private final ResolveInfo mService;
    private final ResolveInfo mService;

    private final String mId;
    private final String mId;
    private final String mParentId;
    private final int mType;
    private final int mType;
    private final boolean mIsHardwareInput;
    private final boolean mIsHardwareInput;
    private final Bundle mExtras;

    // Attributes from XML meta data.
    private String mSetupActivity;
    private String mSettingsActivity;
    private boolean mCanRecord;
    private int mTunerCount;


    private HdmiDeviceInfo mHdmiDeviceInfo;
    // TODO: Remove mLabel and mIconUri when createTvInputInfo() is removed.
    private int mLabelResId;
    // TODO: Remove when createTvInputInfo() is removed.
    private String mLabel;
    private String mLabel;
    private Icon mIcon;
    // TODO: Remove when createTvInputInfo() is removed.
    private Uri mIconUri;
    private Uri mIconUri;
    private boolean mIsConnectedToHdmiSwitch;

    private final int mLabelResId;
    private final Icon mIcon;
    private final Icon mIconStandby;
    private final Icon mIconDisconnected;

    // Attributes from XML meta data.
    private final String mSetupActivity;
    private final String mSettingsActivity;
    private final boolean mCanRecord;
    private final int mTunerCount;

    // Attributes specific to HDMI
    private final HdmiDeviceInfo mHdmiDeviceInfo;
    private final boolean mIsConnectedToHdmiSwitch;
    private final String mParentId;

    private final Bundle mExtras;


    /**
    /**
     * Create a new instance of the TvInputInfo class, instantiating it from the given Context,
     * Create a new instance of the TvInputInfo class, instantiating it from the given Context,
@@ -240,28 +246,27 @@ public final class TvInputInfo implements Parcelable {
                .build();
                .build();
    }
    }


    /**
    private TvInputInfo(ResolveInfo service, String id, int type, boolean isHardwareInput,
     * Constructor.
            int labelResId, Icon icon, Icon iconStandby, Icon iconDisconnected,
     *
            String setupActivity, String settingsActivity, boolean canRecord, int tunerCount,
     * @param service The ResolveInfo returned from the package manager about this TV input service.
            HdmiDeviceInfo hdmiDeviceInfo, boolean isConnectedToHdmiSwitch, String parentId,
     * @param id ID of this TV input. Should be generated via generateInputId*().
            Bundle extras) {
     * @param parentId ID of this TV input's parent input. {@code null} if none exists.
     * @param type The type of this TV input service.
     * @param isHardwareInput {@code true} if this TV input represents a hardware device.
     *            {@code false} otherwise.
     * @param isConnectedToHdmiSwitch Whether a CEC device for this TV input is connected to an HDMI
     *            switch, i.e., the device isn't directly connected to a HDMI port.
     */
    private TvInputInfo(ResolveInfo service, String id, String parentId, int type,
            boolean isHardwareInput, boolean isConnectedToHdmiSwitch, Bundle extras) {
        mService = service;
        mService = service;
        mId = id;
        mId = id;
        mParentId = parentId;
        mType = type;
        mType = type;
        mIsHardwareInput = isHardwareInput;
        mIsHardwareInput = isHardwareInput;
        mLabelResId = labelResId;
        mIcon = icon;
        mIconStandby = iconStandby;
        mIconDisconnected = iconDisconnected;
        mSetupActivity = setupActivity;
        mSettingsActivity = settingsActivity;
        mCanRecord = canRecord;
        mTunerCount = tunerCount;
        mHdmiDeviceInfo = hdmiDeviceInfo;
        mIsConnectedToHdmiSwitch = isConnectedToHdmiSwitch;
        mIsConnectedToHdmiSwitch = isConnectedToHdmiSwitch;
        mParentId = parentId;
        mExtras = extras;
        mExtras = extras;
        mTunerCount = type == TYPE_TUNER ? 1 : 0;
    }
    }


    /**
    /**
@@ -475,6 +480,36 @@ public final class TvInputInfo implements Parcelable {
        return loadServiceIcon(context);
        return loadServiceIcon(context);
    }
    }


    /**
     * Loads the user-displayed icon for this TV input per input state.
     *
     * @param context Supplies a {@link Context} used to load the icon.
     * @param state The input state. Should be one of the followings.
     *              {@link TvInputManager#INPUT_STATE_CONNECTED},
     *              {@link TvInputManager#INPUT_STATE_CONNECTED_STANDBY} and
     *              {@link TvInputManager#INPUT_STATE_DISCONNECTED}.
     * @return a Drawable containing the TV input's icon for the given state or {@code null} if such
     *         an icon is not defined.
     * @hide
     */
    @SystemApi
    public Drawable loadIcon(@NonNull Context context, int state) {
        if (state == TvInputManager.INPUT_STATE_CONNECTED) {
            return loadIcon(context);
        } else if (state == TvInputManager.INPUT_STATE_CONNECTED_STANDBY) {
            if (mIconStandby != null) {
                return mIconStandby.loadDrawable(context);
            }
        } else if (state == TvInputManager.INPUT_STATE_DISCONNECTED) {
            if (mIconDisconnected != null) {
                return mIconDisconnected.loadDrawable(context);
            }
        } else {
            throw new IllegalArgumentException("Unknown state: " + state);
        }
        return null;
    }

    @Override
    @Override
    public int describeContents() {
    public int describeContents() {
        return 0;
        return 0;
@@ -496,21 +531,23 @@ public final class TvInputInfo implements Parcelable {
        }
        }


        TvInputInfo obj = (TvInputInfo) o;
        TvInputInfo obj = (TvInputInfo) o;
        return TextUtils.equals(mId, obj.mId)
        return Objects.equals(mService, obj.mService)
                && TextUtils.equals(mParentId, obj.mParentId)
                && TextUtils.equals(mId, obj.mId)
                && Objects.equals(mService, obj.mService)
                && TextUtils.equals(mSetupActivity, obj.mSetupActivity)
                && TextUtils.equals(mSettingsActivity, obj.mSettingsActivity)
                && mType == obj.mType
                && mType == obj.mType
                && mTunerCount == obj.mTunerCount
                && mCanRecord == obj.mCanRecord
                && mIsHardwareInput == obj.mIsHardwareInput
                && mIsHardwareInput == obj.mIsHardwareInput
                && Objects.equals(mHdmiDeviceInfo, obj.mHdmiDeviceInfo)
                && TextUtils.equals(mLabel, obj.mLabel)
                && Objects.equals(mIcon, obj.mIcon)
                && Objects.equals(mIconUri, obj.mIconUri)
                && Objects.equals(mIconUri, obj.mIconUri)
                && mLabelResId == obj.mLabelResId
                && mLabelResId == obj.mLabelResId
                && TextUtils.equals(mLabel, obj.mLabel)
                && Objects.equals(mIcon, obj.mIcon)
                && Objects.equals(mIconStandby, obj.mIconStandby)
                && Objects.equals(mIconDisconnected, obj.mIconDisconnected)
                && TextUtils.equals(mSetupActivity, obj.mSetupActivity)
                && TextUtils.equals(mSettingsActivity, obj.mSettingsActivity)
                && mCanRecord == obj.mCanRecord
                && mTunerCount == obj.mTunerCount
                && Objects.equals(mHdmiDeviceInfo, obj.mHdmiDeviceInfo)
                && mIsConnectedToHdmiSwitch == obj.mIsConnectedToHdmiSwitch
                && mIsConnectedToHdmiSwitch == obj.mIsConnectedToHdmiSwitch
                && TextUtils.equals(mParentId, obj.mParentId)
                && Objects.equals(mExtras, obj.mExtras);
                && Objects.equals(mExtras, obj.mExtras);
    }
    }


@@ -529,21 +566,23 @@ public final class TvInputInfo implements Parcelable {
     */
     */
    @Override
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeString(mId);
        dest.writeString(mParentId);
        mService.writeToParcel(dest, flags);
        mService.writeToParcel(dest, flags);
        dest.writeString(mSetupActivity);
        dest.writeString(mId);
        dest.writeString(mSettingsActivity);
        dest.writeInt(mType);
        dest.writeInt(mType);
        dest.writeInt(mTunerCount);
        dest.writeByte(mCanRecord ? (byte) 1 : 0);
        dest.writeByte(mIsHardwareInput ? (byte) 1 : 0);
        dest.writeByte(mIsHardwareInput ? (byte) 1 : 0);
        dest.writeParcelable(mHdmiDeviceInfo, flags);
        dest.writeString(mLabel);
        dest.writeParcelable(mIcon, flags);
        dest.writeParcelable(mIconUri, flags);
        dest.writeParcelable(mIconUri, flags);
        dest.writeInt(mLabelResId);
        dest.writeInt(mLabelResId);
        dest.writeString(mLabel);
        dest.writeParcelable(mIcon, flags);
        dest.writeParcelable(mIconStandby, flags);
        dest.writeParcelable(mIconDisconnected, flags);
        dest.writeString(mSetupActivity);
        dest.writeString(mSettingsActivity);
        dest.writeByte(mCanRecord ? (byte) 1 : 0);
        dest.writeInt(mTunerCount);
        dest.writeParcelable(mHdmiDeviceInfo, flags);
        dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0);
        dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0);
        dest.writeString(mParentId);
        dest.writeBundle(mExtras);
        dest.writeBundle(mExtras);
    }
    }


@@ -569,21 +608,23 @@ public final class TvInputInfo implements Parcelable {
    };
    };


    private TvInputInfo(Parcel in) {
    private TvInputInfo(Parcel in) {
        mId = in.readString();
        mParentId = in.readString();
        mService = ResolveInfo.CREATOR.createFromParcel(in);
        mService = ResolveInfo.CREATOR.createFromParcel(in);
        mSetupActivity = in.readString();
        mId = in.readString();
        mSettingsActivity = in.readString();
        mType = in.readInt();
        mType = in.readInt();
        mTunerCount = in.readInt();
        mCanRecord = in.readByte() == 1;
        mIsHardwareInput = in.readByte() == 1;
        mIsHardwareInput = in.readByte() == 1;
        mHdmiDeviceInfo = in.readParcelable(null);
        mLabel = in.readString();
        mIcon = in.readParcelable(null);
        mIconUri = in.readParcelable(null);
        mIconUri = in.readParcelable(null);
        mLabelResId = in.readInt();
        mLabelResId = in.readInt();
        mLabel = in.readString();
        mIcon = in.readParcelable(null);
        mIconStandby = in.readParcelable(null);
        mIconDisconnected = in.readParcelable(null);
        mSetupActivity = in.readString();
        mSettingsActivity = in.readString();
        mCanRecord = in.readByte() == 1;
        mTunerCount = in.readInt();
        mHdmiDeviceInfo = in.readParcelable(null);
        mIsConnectedToHdmiSwitch = in.readByte() == 1;
        mIsConnectedToHdmiSwitch = in.readByte() == 1;
        mParentId = in.readString();
        mExtras = in.readBundle();
        mExtras = in.readBundle();
    }
    }


@@ -619,13 +660,17 @@ public final class TvInputInfo implements Parcelable {


        private final Context mContext;
        private final Context mContext;
        private final ResolveInfo mResolveInfo;
        private final ResolveInfo mResolveInfo;
        private Icon mIcon;
        private int mLabelResId;
        private int mLabelResId;
        private int mTunerCount = 1;
        private Icon mIcon;
        private boolean mCanRecord;
        private Icon mIconStandby;
        private Icon mIconDisconnected;
        private String mSetupActivity;
        private String mSettingsActivity;
        private Boolean mCanRecord;
        private Integer mTunerCount;
        private TvInputHardwareInfo mTvInputHardwareInfo;
        private HdmiDeviceInfo mHdmiDeviceInfo;
        private HdmiDeviceInfo mHdmiDeviceInfo;
        private String mParentId;
        private String mParentId;
        private TvInputHardwareInfo mTvInputHardwareInfo;
        private Bundle mExtras;
        private Bundle mExtras;


        /**
        /**
@@ -672,6 +717,31 @@ public final class TvInputInfo implements Parcelable {
            return this;
            return this;
        }
        }


        /**
         * Sets the icon for a given input state.
         *
         * @param icon The icon that represents this TV input for the given state.
         * @param state The input state. Should be one of the followings.
         *              {@link TvInputManager#INPUT_STATE_CONNECTED},
         *              {@link TvInputManager#INPUT_STATE_CONNECTED_STANDBY} and
         *              {@link TvInputManager#INPUT_STATE_DISCONNECTED}.
         * @return This Builder object to allow for chaining of calls to builder methods.
         * @hide
         */
        @SystemApi
        public Builder setIcon(Icon icon, int state) {
            if (state == TvInputManager.INPUT_STATE_CONNECTED) {
                this.mIcon = icon;
            } else if (state == TvInputManager.INPUT_STATE_CONNECTED_STANDBY) {
                this.mIconStandby = icon;
            } else if (state == TvInputManager.INPUT_STATE_DISCONNECTED) {
                this.mIconDisconnected = icon;
            } else {
                throw new IllegalArgumentException("Unknown state: " + state);
            }
            return this;
        }

        /**
        /**
         * Sets the label.
         * Sets the label.
         *
         *
@@ -796,10 +866,11 @@ public final class TvInputInfo implements Parcelable {
                id = generateInputId(componentName);
                id = generateInputId(componentName);
                type = TYPE_TUNER;
                type = TYPE_TUNER;
            }
            }

            parseServiceMetadata(type);
            TvInputInfo info = new TvInputInfo(mResolveInfo, id, mParentId, type, isHardwareInput,
            return new TvInputInfo(mResolveInfo, id, type, isHardwareInput, mLabelResId, mIcon,
                    isConnectedToHdmiSwitch, mExtras);
                    mIconStandby, mIconDisconnected, mSetupActivity, mSettingsActivity,
            return parseServiceMetadata(type, info);
                    mCanRecord == null ? false : mCanRecord, mTunerCount == null ? 0 : mTunerCount,
                    mHdmiDeviceInfo, isConnectedToHdmiSwitch, mParentId, mExtras);
        }
        }


        private static String generateInputId(ComponentName name) {
        private static String generateInputId(ComponentName name) {
@@ -821,7 +892,7 @@ public final class TvInputInfo implements Parcelable {
                    + tvInputHardwareInfo.getDeviceId();
                    + tvInputHardwareInfo.getDeviceId();
        }
        }


        private TvInputInfo parseServiceMetadata(int inputType, TvInputInfo info)
        private void parseServiceMetadata(int inputType)
                throws XmlPullParserException, IOException {
                throws XmlPullParserException, IOException {
            ServiceInfo si = mResolveInfo.serviceInfo;
            ServiceInfo si = mResolveInfo.serviceInfo;
            PackageManager pm = mContext.getPackageManager();
            PackageManager pm = mContext.getPackageManager();
@@ -848,32 +919,32 @@ public final class TvInputInfo implements Parcelable {


                TypedArray sa = res.obtainAttributes(attrs,
                TypedArray sa = res.obtainAttributes(attrs,
                        com.android.internal.R.styleable.TvInputService);
                        com.android.internal.R.styleable.TvInputService);
                info.mSetupActivity = sa.getString(
                mSetupActivity = sa.getString(
                        com.android.internal.R.styleable.TvInputService_setupActivity);
                        com.android.internal.R.styleable.TvInputService_setupActivity);
                if (DEBUG) {
                if (DEBUG) {
                    Log.d(TAG, "Setup activity loaded. [" + info.mSetupActivity + "] for "
                    Log.d(TAG, "Setup activity loaded. [" + mSetupActivity + "] for " + si.name);
                            + si.name);
                }
                }
                if (inputType == TYPE_TUNER && TextUtils.isEmpty(info.mSetupActivity)) {
                if (inputType == TYPE_TUNER && TextUtils.isEmpty(mSetupActivity)) {
                    throw new XmlPullParserException("Setup activity not found in " + si.name);
                    throw new XmlPullParserException("Setup activity not found in " + si.name);
                }
                }
                info.mSettingsActivity = sa.getString(
                mSettingsActivity = sa.getString(
                        com.android.internal.R.styleable.TvInputService_settingsActivity);
                        com.android.internal.R.styleable.TvInputService_settingsActivity);
                if (DEBUG) {
                if (DEBUG) {
                    Log.d(TAG, "Settings activity loaded. [" + info.mSettingsActivity + "] for "
                    Log.d(TAG, "Settings activity loaded. [" + mSettingsActivity + "] for "
                            + si.name);
                            + si.name);
                }
                }
                info.mCanRecord = sa.getBoolean(
                if (mCanRecord == null) {
                    mCanRecord = sa.getBoolean(
                            com.android.internal.R.styleable.TvInputService_canRecord, false);
                            com.android.internal.R.styleable.TvInputService_canRecord, false);
                info.mTunerCount = sa.getInt(
                }
                        com.android.internal.R.styleable.TvInputService_tunerCount,
                if (mTunerCount == null && inputType == TYPE_TUNER) {
                        info.mTunerCount);
                    mTunerCount = sa.getInt(

                            com.android.internal.R.styleable.TvInputService_tunerCount, 1);
                }
                sa.recycle();
                sa.recycle();
            } catch (NameNotFoundException e) {
            } catch (NameNotFoundException e) {
                throw new XmlPullParserException("Unable to create context for: " + si.packageName);
                throw new XmlPullParserException("Unable to create context for: " + si.packageName);
            }
            }
            return info;
        }
        }
    }
    }