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 com.android.media.remotedisplay;
18f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
19f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownimport android.media.RemoteDisplayState.RemoteDisplayInfo;
20f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownimport android.text.TextUtils;
21f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
22e6585b32ea586743258a5457e2184ffc087f2d2fKenny Rootimport java.util.Objects;
23e6585b32ea586743258a5457e2184ffc087f2d2fKenny Root
24f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown/**
25f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown * Represents a remote display that has been discovered.
26f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown */
27f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brownpublic class RemoteDisplay {
28f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    private final RemoteDisplayInfo mMutableInfo;
29f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    private RemoteDisplayInfo mImmutableInfo;
30f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
31f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
32f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Status code: Indicates that the remote display is not available.
33f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
34f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int STATUS_NOT_AVAILABLE = RemoteDisplayInfo.STATUS_NOT_AVAILABLE;
35f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
36f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
37f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Status code: Indicates that the remote display is in use by someone else.
38f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
39f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int STATUS_IN_USE = RemoteDisplayInfo.STATUS_IN_USE;
40f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
41f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
42f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Status code: Indicates that the remote display is available for new connections.
43f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
44f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int STATUS_AVAILABLE = RemoteDisplayInfo.STATUS_AVAILABLE;
45f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
46f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
47f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Status code: Indicates that the remote display is current connecting.
48f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
49f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int STATUS_CONNECTING = RemoteDisplayInfo.STATUS_CONNECTING;
50f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
51f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
52f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Status code: Indicates that the remote display is connected and is mirroring
53f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * display contents.
54f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
55f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int STATUS_CONNECTED = RemoteDisplayInfo.STATUS_CONNECTED;
56f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
57f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
58f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Volume handling: Output volume can be changed.
59f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
60f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int PLAYBACK_VOLUME_VARIABLE =
61f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            RemoteDisplayInfo.PLAYBACK_VOLUME_VARIABLE;
62f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
63f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
64f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Volume handling: Output volume is fixed.
65f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
66f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public static final int PLAYBACK_VOLUME_FIXED =
67f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            RemoteDisplayInfo.PLAYBACK_VOLUME_FIXED;
68f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
69f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    /**
70f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     * Creates a remote display with the specified name and id.
71f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown     */
72f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public RemoteDisplay(String id, String name) {
73f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (TextUtils.isEmpty(id)) {
74f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            throw new IllegalArgumentException("id must not be null or empty");
75f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
76f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        mMutableInfo = new RemoteDisplayInfo(id);
77f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        setName(name);
78f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
79f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
80f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public String getId() {
81f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.id;
82f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
83f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
84f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public String getName() {
85f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.name;
86f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
87f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
88f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setName(String name) {
89e6585b32ea586743258a5457e2184ffc087f2d2fKenny Root        if (!Objects.equals(mMutableInfo.name, name)) {
90f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.name = name;
91f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
92f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
93f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
94f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
95f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public String getDescription() {
96f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.description;
97f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
98f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
99f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setDescription(String description) {
100e6585b32ea586743258a5457e2184ffc087f2d2fKenny Root        if (!Objects.equals(mMutableInfo.description, description)) {
101f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.description = description;
102f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
103f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
104f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
105f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
106f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public int getStatus() {
107f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.status;
108f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
109f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
110f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setStatus(int status) {
111f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (mMutableInfo.status != status) {
112f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.status = status;
113f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
114f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
115f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
116f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
117f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public int getVolume() {
118f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.volume;
119f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
120f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
121f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setVolume(int volume) {
122f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (mMutableInfo.volume != volume) {
123f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.volume = volume;
124f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
125f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
126f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
127f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
128f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public int getVolumeMax() {
129f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.volumeMax;
130f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
131f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
132f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setVolumeMax(int volumeMax) {
133f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (mMutableInfo.volumeMax != volumeMax) {
134f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.volumeMax = volumeMax;
135f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
136f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
137f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
138f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
139f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public int getVolumeHandling() {
140f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.volumeHandling;
141f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
142f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
143f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setVolumeHandling(int volumeHandling) {
144f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (mMutableInfo.volumeHandling != volumeHandling) {
145f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.volumeHandling = volumeHandling;
146f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
147f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
148f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
149f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
150f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public int getPresentationDisplayId() {
151f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mMutableInfo.presentationDisplayId;
152f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
153f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
154f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public void setPresentationDisplayId(int presentationDisplayId) {
155f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (mMutableInfo.presentationDisplayId != presentationDisplayId) {
156f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mMutableInfo.presentationDisplayId = presentationDisplayId;
157f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = null;
158f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
159f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
160f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
161f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    @Override
162f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    public String toString() {
163f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return "RemoteDisplay{" + mMutableInfo.toString() + "}";
164f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
165f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown
166f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    RemoteDisplayInfo getInfo() {
167f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        if (mImmutableInfo == null) {
168f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown            mImmutableInfo = new RemoteDisplayInfo(mMutableInfo);
169f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        }
170f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown        return mImmutableInfo;
171f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown    }
172f3c99e883f46c56e5e2877e844b902b6eb45545bJeff Brown}
173