1f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown/*
2f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * Copyright (C) 2013 The Android Open Source Project
3f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown *
4f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * you may not use this file except in compliance with the License.
6f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * You may obtain a copy of the License at
7f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown *
8f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown *
10f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * Unless required by applicable law or agreed to in writing, software
11f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * See the License for the specific language governing permissions and
14f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * limitations under the License.
15f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown */
16f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
17f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownpackage android.media;
18f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
19f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownimport android.os.Parcel;
20f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownimport android.os.Parcelable;
21f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownimport android.text.TextUtils;
22f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
23f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownimport java.util.ArrayList;
24f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
25f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown/**
26f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * Information available from IRemoteDisplayProvider about available remote displays.
27f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown *
28f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * Clients must not modify the contents of this object.
29f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * @hide
30f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown */
31f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownpublic final class RemoteDisplayState implements Parcelable {
32f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    // Note: These constants are used by the remote display provider API.
33f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    // Do not change them!
34f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final String SERVICE_INTERFACE =
35f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            "com.android.media.remotedisplay.RemoteDisplayProvider";
36f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int DISCOVERY_MODE_NONE = 0;
37f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int DISCOVERY_MODE_PASSIVE = 1;
38f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int DISCOVERY_MODE_ACTIVE = 2;
39f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
40f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
41f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * A list of all remote displays.
42f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
43f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public final ArrayList<RemoteDisplayInfo> displays;
44f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
45f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public RemoteDisplayState() {
46f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        displays = new ArrayList<RemoteDisplayInfo>();
47f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
48f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
49f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    RemoteDisplayState(Parcel src) {
50f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        displays = src.createTypedArrayList(RemoteDisplayInfo.CREATOR);
51f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
52f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
53f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public boolean isValid() {
54f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (displays == null) {
55f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            return false;
56f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
57f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        final int count = displays.size();
58f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        for (int i = 0; i < count; i++) {
59f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            if (!displays.get(i).isValid()) {
60f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                return false;
61f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            }
62f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
63f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return true;
64f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
65f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
66f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    @Override
67f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public int describeContents() {
68f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return 0;
69f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
70f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
71f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    @Override
72f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void writeToParcel(Parcel dest, int flags) {
73f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        dest.writeTypedList(displays);
74f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
75f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
76f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final Parcelable.Creator<RemoteDisplayState> CREATOR =
77f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            new Parcelable.Creator<RemoteDisplayState>() {
78f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        @Override
79f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public RemoteDisplayState createFromParcel(Parcel in) {
80f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            return new RemoteDisplayState(in);
81f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
82f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
83f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        @Override
84f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public RemoteDisplayState[] newArray(int size) {
85f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            return new RemoteDisplayState[size];
86f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
87f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    };
88f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
89f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final class RemoteDisplayInfo implements Parcelable {
90f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        // Note: These constants are used by the remote display provider API.
91f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        // Do not change them!
92f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int STATUS_NOT_AVAILABLE = 0;
93f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int STATUS_IN_USE = 1;
94f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int STATUS_AVAILABLE = 2;
95f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int STATUS_CONNECTING = 3;
96f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int STATUS_CONNECTED = 4;
97f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
98f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int PLAYBACK_VOLUME_VARIABLE =
99f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE;
100f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final int PLAYBACK_VOLUME_FIXED =
101f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
102f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
103f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public String id;
104f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public String name;
105f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public String description;
106f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public int status;
107f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public int volume;
108f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public int volumeMax;
109f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public int volumeHandling;
110f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public int presentationDisplayId;
111f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
112f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public RemoteDisplayInfo(String id) {
113f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            this.id = id;
114f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            status = STATUS_NOT_AVAILABLE;
115f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volumeHandling = MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
116f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            presentationDisplayId = -1;
117f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
118f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
119f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public RemoteDisplayInfo(RemoteDisplayInfo other) {
120f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            id = other.id;
121f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            name = other.name;
122f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            description = other.description;
123f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            status = other.status;
124f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volume = other.volume;
125f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volumeMax = other.volumeMax;
126f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volumeHandling = other.volumeHandling;
127f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            presentationDisplayId = other.presentationDisplayId;
128f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
129f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
130f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        RemoteDisplayInfo(Parcel in) {
131f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            id = in.readString();
132f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            name = in.readString();
133f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            description = in.readString();
134f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            status = in.readInt();
135f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volume = in.readInt();
136f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volumeMax = in.readInt();
137f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            volumeHandling = in.readInt();
138f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            presentationDisplayId = in.readInt();
139f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
140f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
141f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public boolean isValid() {
142f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            return !TextUtils.isEmpty(id) && !TextUtils.isEmpty(name);
143f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
144f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
145f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        @Override
146f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public int describeContents() {
147f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            return 0;
148f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
149f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
150f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        @Override
151f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public void writeToParcel(Parcel dest, int flags) {
152f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeString(id);
153f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeString(name);
154f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeString(description);
155f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeInt(status);
156f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeInt(volume);
157f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeInt(volumeMax);
158f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeInt(volumeHandling);
159f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            dest.writeInt(presentationDisplayId);
160f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
161f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
162f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        @Override
163f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public String toString() {
164f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            return "RemoteDisplayInfo{ id=" + id
165f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", name=" + name
166f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", description=" + description
167f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", status=" + status
168f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", volume=" + volume
169f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", volumeMax=" + volumeMax
170f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", volumeHandling=" + volumeHandling
171f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + ", presentationDisplayId=" + presentationDisplayId
172f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                    + " }";
173f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
174f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
175f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        @SuppressWarnings("hiding")
176f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        public static final Parcelable.Creator<RemoteDisplayInfo> CREATOR =
177f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                new Parcelable.Creator<RemoteDisplayInfo>() {
178f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            @Override
179f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            public RemoteDisplayInfo createFromParcel(Parcel in) {
180f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                return new RemoteDisplayInfo(in);
181f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            }
182f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
183f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            @Override
184f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            public RemoteDisplayInfo[] newArray(int size) {
185f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown                return new RemoteDisplayInfo[size];
186f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            }
187f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        };
188f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
189f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown}
190