1c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim/*
2c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Copyright (C) 2014 The Android Open Source Project
3c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
4c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * you may not use this file except in compliance with the License.
6c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * You may obtain a copy of the License at
7c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
8c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
9c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
10c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Unless required by applicable law or agreed to in writing, software
11c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * See the License for the specific language governing permissions and
14c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * limitations under the License.
15c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim */
16c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
17d5cc4a281e7ce29d1e8687ff3394b57a3a549260Jae Seopackage android.media.tv;
18c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
1971d5c76f19e8714102073bf774c025d5ccdebc11Shubangimport static java.lang.annotation.RetentionPolicy.SOURCE;
2071d5c76f19e8714102073bf774c025d5ccdebc11Shubang
2171d5c76f19e8714102073bf774c025d5ccdebc11Shubangimport android.annotation.IntDef;
22d811af223ea4064669ad219f78aa7f57d6bb5bceJi-Hwan Leeimport android.annotation.SystemApi;
2339f285d5a75f653d2d2309b47cfaa143da42a0caShubangimport android.hardware.tv.input.V1_0.Constants;
24d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kimimport android.media.AudioManager;
25c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.os.Parcel;
26c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.os.Parcelable;
27c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.util.Log;
2871d5c76f19e8714102073bf774c025d5ccdebc11Shubangimport java.lang.annotation.Retention;
29c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
30c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim/**
31c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Simple container for information about TV input hardware.
32c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Not for third-party developers.
33c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
34c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * @hide
35c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim */
36d811af223ea4064669ad219f78aa7f57d6bb5bceJi-Hwan Lee@SystemApi
37c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimpublic final class TvInputHardwareInfo implements Parcelable {
38c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    static final String TAG = "TvInputHardwareInfo";
39c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
40c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    // Match hardware/libhardware/include/hardware/tv_input.h
4139f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_OTHER_HARDWARE = Constants.TV_INPUT_TYPE_OTHER;
4239f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_TUNER          = Constants.TV_INPUT_TYPE_TUNER;
4339f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_COMPOSITE      = Constants.TV_INPUT_TYPE_COMPOSITE;
4439f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_SVIDEO         = Constants.TV_INPUT_TYPE_SVIDEO;
4539f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_SCART          = Constants.TV_INPUT_TYPE_SCART;
4639f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_COMPONENT      = Constants.TV_INPUT_TYPE_COMPONENT;
4739f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_VGA            = Constants.TV_INPUT_TYPE_VGA;
4839f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_DVI            = Constants.TV_INPUT_TYPE_DVI;
4939f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_HDMI           = Constants.TV_INPUT_TYPE_HDMI;
5039f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int TV_INPUT_TYPE_DISPLAY_PORT   = Constants.TV_INPUT_TYPE_DISPLAY_PORT;
51c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
5271d5c76f19e8714102073bf774c025d5ccdebc11Shubang    /** @hide */
5371d5c76f19e8714102073bf774c025d5ccdebc11Shubang    @Retention(SOURCE)
5471d5c76f19e8714102073bf774c025d5ccdebc11Shubang    @IntDef({CABLE_CONNECTION_STATUS_UNKNOWN, CABLE_CONNECTION_STATUS_CONNECTED,
5571d5c76f19e8714102073bf774c025d5ccdebc11Shubang        CABLE_CONNECTION_STATUS_DISCONNECTED})
5671d5c76f19e8714102073bf774c025d5ccdebc11Shubang    public @interface CableConnectionStatus {}
5771d5c76f19e8714102073bf774c025d5ccdebc11Shubang
5871d5c76f19e8714102073bf774c025d5ccdebc11Shubang    // Match hardware/interfaces/tv/input/1.0/types.hal
5971d5c76f19e8714102073bf774c025d5ccdebc11Shubang    /**
6071d5c76f19e8714102073bf774c025d5ccdebc11Shubang     * The hardware is unsure about the connection status or does not support cable detection.
6171d5c76f19e8714102073bf774c025d5ccdebc11Shubang     */
6239f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int CABLE_CONNECTION_STATUS_UNKNOWN =
6339f285d5a75f653d2d2309b47cfaa143da42a0caShubang            Constants.CABLE_CONNECTION_STATUS_UNKNOWN;
6471d5c76f19e8714102073bf774c025d5ccdebc11Shubang
6571d5c76f19e8714102073bf774c025d5ccdebc11Shubang    /**
6671d5c76f19e8714102073bf774c025d5ccdebc11Shubang     * Cable is connected to the hardware.
6771d5c76f19e8714102073bf774c025d5ccdebc11Shubang     */
6839f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int CABLE_CONNECTION_STATUS_CONNECTED =
6939f285d5a75f653d2d2309b47cfaa143da42a0caShubang            Constants.CABLE_CONNECTION_STATUS_CONNECTED;
7071d5c76f19e8714102073bf774c025d5ccdebc11Shubang
7171d5c76f19e8714102073bf774c025d5ccdebc11Shubang    /**
7271d5c76f19e8714102073bf774c025d5ccdebc11Shubang     * Cable is disconnected to the hardware.
7371d5c76f19e8714102073bf774c025d5ccdebc11Shubang     */
7439f285d5a75f653d2d2309b47cfaa143da42a0caShubang    public static final int CABLE_CONNECTION_STATUS_DISCONNECTED =
7539f285d5a75f653d2d2309b47cfaa143da42a0caShubang            Constants.CABLE_CONNECTION_STATUS_DISCONNECTED;
7671d5c76f19e8714102073bf774c025d5ccdebc11Shubang
77c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public static final Parcelable.Creator<TvInputHardwareInfo> CREATOR =
78c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            new Parcelable.Creator<TvInputHardwareInfo>() {
79c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        @Override
80c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvInputHardwareInfo createFromParcel(Parcel source) {
81c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            try {
82c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                TvInputHardwareInfo info = new TvInputHardwareInfo();
83c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                info.readFromParcel(source);
84c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                return info;
85c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            } catch (Exception e) {
86c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                Log.e(TAG, "Exception creating TvInputHardwareInfo from parcel", e);
87c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                return null;
88c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            }
89c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
90c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
91c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        @Override
92c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvInputHardwareInfo[] newArray(int size) {
93c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return new TvInputHardwareInfo[size];
94c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
95c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    };
96c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
97c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mDeviceId;
98c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mType;
99d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    private int mAudioType;
100d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    private String mAudioAddress;
101a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim    private int mHdmiPortId;
10271d5c76f19e8714102073bf774c025d5ccdebc11Shubang    @CableConnectionStatus
10371d5c76f19e8714102073bf774c025d5ccdebc11Shubang    private int mCableConnectionStatus;
104c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
105d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    private TvInputHardwareInfo() {
106c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
107c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
108c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getDeviceId() {
109c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mDeviceId;
110c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
111c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
112c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getType() {
113c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mType;
114c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
115c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
116d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    public int getAudioType() {
117d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        return mAudioType;
118d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    }
119d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
120d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    public String getAudioAddress() {
121d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        return mAudioAddress;
122d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    }
123d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
124a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim    public int getHdmiPortId() {
125a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        if (mType != TV_INPUT_TYPE_HDMI) {
126a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            throw new IllegalStateException();
127a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
128a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        return mHdmiPortId;
129a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim    }
130a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim
13171d5c76f19e8714102073bf774c025d5ccdebc11Shubang    /**
13271d5c76f19e8714102073bf774c025d5ccdebc11Shubang     * Gets the cable connection status of the hardware.
13371d5c76f19e8714102073bf774c025d5ccdebc11Shubang     *
13471d5c76f19e8714102073bf774c025d5ccdebc11Shubang     * @return {@code CABLE_CONNECTION_STATUS_CONNECTED} if cable is connected.
13571d5c76f19e8714102073bf774c025d5ccdebc11Shubang     *         {@code CABLE_CONNECTION_STATUS_DISCONNECTED} if cable is disconnected.
13671d5c76f19e8714102073bf774c025d5ccdebc11Shubang     *         {@code CABLE_CONNECTION_STATUS_UNKNOWN} if the hardware is unsure about the
13771d5c76f19e8714102073bf774c025d5ccdebc11Shubang     *         connection status or does not support cable detection.
13871d5c76f19e8714102073bf774c025d5ccdebc11Shubang     */
13971d5c76f19e8714102073bf774c025d5ccdebc11Shubang    @CableConnectionStatus
14071d5c76f19e8714102073bf774c025d5ccdebc11Shubang    public int getCableConnectionStatus() {
14171d5c76f19e8714102073bf774c025d5ccdebc11Shubang        return mCableConnectionStatus;
14271d5c76f19e8714102073bf774c025d5ccdebc11Shubang    }
14371d5c76f19e8714102073bf774c025d5ccdebc11Shubang
1441034df8c63d309462e99012f84885705229eeed5Dongwon Kang    @Override
1451034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public String toString() {
1461034df8c63d309462e99012f84885705229eeed5Dongwon Kang        StringBuilder b = new StringBuilder(128);
1471034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append("TvInputHardwareInfo {id=").append(mDeviceId);
1481034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append(", type=").append(mType);
1491034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append(", audio_type=").append(mAudioType);
1501034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append(", audio_addr=").append(mAudioAddress);
1511034df8c63d309462e99012f84885705229eeed5Dongwon Kang        if (mType == TV_INPUT_TYPE_HDMI) {
1521034df8c63d309462e99012f84885705229eeed5Dongwon Kang            b.append(", hdmi_port=").append(mHdmiPortId);
1531034df8c63d309462e99012f84885705229eeed5Dongwon Kang        }
15471d5c76f19e8714102073bf774c025d5ccdebc11Shubang        b.append(", cable_connection_status=").append(mCableConnectionStatus);
1551034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append("}");
1561034df8c63d309462e99012f84885705229eeed5Dongwon Kang        return b.toString();
1571034df8c63d309462e99012f84885705229eeed5Dongwon Kang    }
1581034df8c63d309462e99012f84885705229eeed5Dongwon Kang
159c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    // Parcelable
160c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    @Override
161c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int describeContents() {
162c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return 0;
163c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
164c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
165c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    @Override
166c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public void writeToParcel(Parcel dest, int flags) {
167c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mDeviceId);
168c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mType);
169d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        dest.writeInt(mAudioType);
170d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        dest.writeString(mAudioAddress);
171a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        if (mType == TV_INPUT_TYPE_HDMI) {
172a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            dest.writeInt(mHdmiPortId);
173a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
17471d5c76f19e8714102073bf774c025d5ccdebc11Shubang        dest.writeInt(mCableConnectionStatus);
175c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
176c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
177c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public void readFromParcel(Parcel source) {
178c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        mDeviceId = source.readInt();
179c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        mType = source.readInt();
180d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        mAudioType = source.readInt();
181d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        mAudioAddress = source.readString();
182a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        if (mType == TV_INPUT_TYPE_HDMI) {
183a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            mHdmiPortId = source.readInt();
184a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
18571d5c76f19e8714102073bf774c025d5ccdebc11Shubang        mCableConnectionStatus = source.readInt();
186d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    }
187d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
188d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    public static final class Builder {
189d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private Integer mDeviceId = null;
190d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private Integer mType = null;
191d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private int mAudioType = AudioManager.DEVICE_NONE;
192d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private String mAudioAddress = "";
193a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        private Integer mHdmiPortId = null;
19471d5c76f19e8714102073bf774c025d5ccdebc11Shubang        private Integer mCableConnectionStatus = CABLE_CONNECTION_STATUS_UNKNOWN;
195d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
196d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder() {
197d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
198d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
199d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder deviceId(int deviceId) {
200d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mDeviceId = deviceId;
201d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
202d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
203d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
204d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder type(int type) {
205d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mType = type;
206d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
207d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
208d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
209d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder audioType(int audioType) {
210d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mAudioType = audioType;
211d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
212d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
213d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
214d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder audioAddress(String audioAddress) {
215d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mAudioAddress = audioAddress;
216d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
217d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
218d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
219a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        public Builder hdmiPortId(int hdmiPortId) {
220a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            mHdmiPortId = hdmiPortId;
221a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            return this;
222a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
223a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim
22471d5c76f19e8714102073bf774c025d5ccdebc11Shubang        /**
22571d5c76f19e8714102073bf774c025d5ccdebc11Shubang         * Sets cable connection status.
22671d5c76f19e8714102073bf774c025d5ccdebc11Shubang         */
22771d5c76f19e8714102073bf774c025d5ccdebc11Shubang        public Builder cableConnectionStatus(@CableConnectionStatus int cableConnectionStatus) {
22871d5c76f19e8714102073bf774c025d5ccdebc11Shubang            mCableConnectionStatus = cableConnectionStatus;
22971d5c76f19e8714102073bf774c025d5ccdebc11Shubang            return this;
23071d5c76f19e8714102073bf774c025d5ccdebc11Shubang        }
23171d5c76f19e8714102073bf774c025d5ccdebc11Shubang
232d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public TvInputHardwareInfo build() {
233d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            if (mDeviceId == null || mType == null) {
234d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim                throw new UnsupportedOperationException();
235d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            }
236a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            if ((mType == TV_INPUT_TYPE_HDMI && mHdmiPortId == null) ||
237a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim                    (mType != TV_INPUT_TYPE_HDMI && mHdmiPortId != null)) {
238a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim                throw new UnsupportedOperationException();
239a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            }
240d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
241d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            TvInputHardwareInfo info = new TvInputHardwareInfo();
242d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            info.mDeviceId = mDeviceId;
243d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            info.mType = mType;
244d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            info.mAudioType = mAudioType;
245d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            if (info.mAudioType != AudioManager.DEVICE_NONE) {
246d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim                info.mAudioAddress = mAudioAddress;
247d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            }
248a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            if (mHdmiPortId != null) {
249a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim                info.mHdmiPortId = mHdmiPortId;
250a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            }
25171d5c76f19e8714102073bf774c025d5ccdebc11Shubang            info.mCableConnectionStatus = mCableConnectionStatus;
252d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return info;
253d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
254c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
255c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim}
256