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
19d811af223ea4064669ad219f78aa7f57d6bb5bceJi-Hwan Leeimport android.annotation.SystemApi;
20d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kimimport android.media.AudioManager;
21c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.os.Parcel;
22c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.os.Parcelable;
23c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimimport android.util.Log;
24c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
25c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim/**
26c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Simple container for information about TV input hardware.
27c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * Not for third-party developers.
28c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim *
29c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim * @hide
30c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim */
31d811af223ea4064669ad219f78aa7f57d6bb5bceJi-Hwan Lee@SystemApi
32c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kimpublic final class TvInputHardwareInfo implements Parcelable {
33c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    static final String TAG = "TvInputHardwareInfo";
34c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
35c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    // Match hardware/libhardware/include/hardware/tv_input.h
361034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_OTHER_HARDWARE = 1;
371034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_TUNER          = 2;
381034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_COMPOSITE      = 3;
391034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_SVIDEO         = 4;
401034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_SCART          = 5;
411034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_COMPONENT      = 6;
421034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_VGA            = 7;
431034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_DVI            = 8;
441034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_HDMI           = 9;
451034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public static final int TV_INPUT_TYPE_DISPLAY_PORT   = 10;
46c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
47c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public static final Parcelable.Creator<TvInputHardwareInfo> CREATOR =
48c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            new Parcelable.Creator<TvInputHardwareInfo>() {
49c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        @Override
50c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvInputHardwareInfo createFromParcel(Parcel source) {
51c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            try {
52c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                TvInputHardwareInfo info = new TvInputHardwareInfo();
53c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                info.readFromParcel(source);
54c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                return info;
55c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            } catch (Exception e) {
56c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                Log.e(TAG, "Exception creating TvInputHardwareInfo from parcel", e);
57c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim                return null;
58c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            }
59c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
60c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
61c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        @Override
62c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        public TvInputHardwareInfo[] newArray(int size) {
63c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim            return new TvInputHardwareInfo[size];
64c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        }
65c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    };
66c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
67c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mDeviceId;
68c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    private int mType;
69d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    private int mAudioType;
70d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    private String mAudioAddress;
71a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim    private int mHdmiPortId;
72c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
73d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    private TvInputHardwareInfo() {
74c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
75c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
76c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getDeviceId() {
77c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mDeviceId;
78c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
79c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
80c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int getType() {
81c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return mType;
82c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
83c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
84d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    public int getAudioType() {
85d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        return mAudioType;
86d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    }
87d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
88d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    public String getAudioAddress() {
89d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        return mAudioAddress;
90d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    }
91d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
92a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim    public int getHdmiPortId() {
93a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        if (mType != TV_INPUT_TYPE_HDMI) {
94a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            throw new IllegalStateException();
95a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
96a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        return mHdmiPortId;
97a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim    }
98a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim
991034df8c63d309462e99012f84885705229eeed5Dongwon Kang    @Override
1001034df8c63d309462e99012f84885705229eeed5Dongwon Kang    public String toString() {
1011034df8c63d309462e99012f84885705229eeed5Dongwon Kang        StringBuilder b = new StringBuilder(128);
1021034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append("TvInputHardwareInfo {id=").append(mDeviceId);
1031034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append(", type=").append(mType);
1041034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append(", audio_type=").append(mAudioType);
1051034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append(", audio_addr=").append(mAudioAddress);
1061034df8c63d309462e99012f84885705229eeed5Dongwon Kang        if (mType == TV_INPUT_TYPE_HDMI) {
1071034df8c63d309462e99012f84885705229eeed5Dongwon Kang            b.append(", hdmi_port=").append(mHdmiPortId);
1081034df8c63d309462e99012f84885705229eeed5Dongwon Kang        }
1091034df8c63d309462e99012f84885705229eeed5Dongwon Kang        b.append("}");
1101034df8c63d309462e99012f84885705229eeed5Dongwon Kang        return b.toString();
1111034df8c63d309462e99012f84885705229eeed5Dongwon Kang    }
1121034df8c63d309462e99012f84885705229eeed5Dongwon Kang
113c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    // Parcelable
114c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    @Override
115c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public int describeContents() {
116c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        return 0;
117c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
118c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
119c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    @Override
120c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public void writeToParcel(Parcel dest, int flags) {
121c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mDeviceId);
122c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        dest.writeInt(mType);
123d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        dest.writeInt(mAudioType);
124d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        dest.writeString(mAudioAddress);
125a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        if (mType == TV_INPUT_TYPE_HDMI) {
126a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            dest.writeInt(mHdmiPortId);
127a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
128c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
129c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim
130c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    public void readFromParcel(Parcel source) {
131c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        mDeviceId = source.readInt();
132c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim        mType = source.readInt();
133d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        mAudioType = source.readInt();
134d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        mAudioAddress = source.readString();
135a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        if (mType == TV_INPUT_TYPE_HDMI) {
136a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            mHdmiPortId = source.readInt();
137a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
138d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    }
139d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
140d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim    public static final class Builder {
141d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private Integer mDeviceId = null;
142d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private Integer mType = null;
143d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private int mAudioType = AudioManager.DEVICE_NONE;
144d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        private String mAudioAddress = "";
145a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        private Integer mHdmiPortId = null;
146d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
147d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder() {
148d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
149d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
150d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder deviceId(int deviceId) {
151d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mDeviceId = deviceId;
152d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
153d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
154d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
155d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder type(int type) {
156d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mType = type;
157d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
158d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
159d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
160d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder audioType(int audioType) {
161d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mAudioType = audioType;
162d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
163d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
164d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
165d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public Builder audioAddress(String audioAddress) {
166d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            mAudioAddress = audioAddress;
167d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return this;
168d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
169d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
170a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        public Builder hdmiPortId(int hdmiPortId) {
171a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            mHdmiPortId = hdmiPortId;
172a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            return this;
173a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim        }
174a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim
175d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        public TvInputHardwareInfo build() {
176d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            if (mDeviceId == null || mType == null) {
177d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim                throw new UnsupportedOperationException();
178d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            }
179a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            if ((mType == TV_INPUT_TYPE_HDMI && mHdmiPortId == null) ||
180a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim                    (mType != TV_INPUT_TYPE_HDMI && mHdmiPortId != null)) {
181a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim                throw new UnsupportedOperationException();
182a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            }
183d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim
184d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            TvInputHardwareInfo info = new TvInputHardwareInfo();
185d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            info.mDeviceId = mDeviceId;
186d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            info.mType = mType;
187d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            info.mAudioType = mAudioType;
188d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            if (info.mAudioType != AudioManager.DEVICE_NONE) {
189d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim                info.mAudioAddress = mAudioAddress;
190d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            }
191a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            if (mHdmiPortId != null) {
192a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim                info.mHdmiPortId = mHdmiPortId;
193a358b53e1d0bb7a7fc08b0a4d2a2e256f3045859Wonsik Kim            }
194d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim            return info;
195d7c29189aa639bfac1e6efcd222e65c2c8ecf3f1Wonsik Kim        }
196c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim    }
197c22dbb69194c8e8fe2a32326d1f37a738cad0904Wonsik Kim}
198