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