1692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim/*
2692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Copyright 2018 The Android Open Source Project
3692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *
4692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Licensed under the Apache License, Version 2.0 (the "License");
5692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * you may not use this file except in compliance with the License.
6692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * You may obtain a copy of the License at
7692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *
8692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *      http://www.apache.org/licenses/LICENSE-2.0
9692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *
10692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Unless required by applicable law or agreed to in writing, software
11692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * distributed under the License is distributed on an "AS IS" BASIS,
12692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * See the License for the specific language governing permissions and
14692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * limitations under the License.
15692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim */
16692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limpackage com.android.support.mediarouter.media;
17692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
18692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.content.IntentFilter;
19692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.content.IntentSender;
20692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.net.Uri;
21692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.os.Bundle;
22692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.text.TextUtils;
23692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
24692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.ArrayList;
25692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.Arrays;
26692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.Collection;
27692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.Collections;
28692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.List;
29692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
30692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim/**
31692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Describes the properties of a route.
32692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * <p>
33692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Each route is uniquely identified by an opaque id string.  This token
34692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * may take any form as long as it is unique within the media route provider.
35692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * </p><p>
36692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * This object is immutable once created using a {@link Builder} instance.
37692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * </p>
38692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim */
39692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limpublic final class MediaRouteDescriptor {
40692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_ID = "id";
41692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_GROUP_MEMBER_IDS = "groupMemberIds";
42692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_NAME = "name";
43692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_DESCRIPTION = "status";
44692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_ICON_URI = "iconUri";
45692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_ENABLED = "enabled";
46692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_CONNECTING = "connecting";
47692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_CONNECTION_STATE = "connectionState";
48692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_CONTROL_FILTERS = "controlFilters";
49692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_PLAYBACK_TYPE = "playbackType";
50692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_PLAYBACK_STREAM = "playbackStream";
51692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_DEVICE_TYPE = "deviceType";
52692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_VOLUME = "volume";
53692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_VOLUME_MAX = "volumeMax";
54692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_VOLUME_HANDLING = "volumeHandling";
55692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_PRESENTATION_DISPLAY_ID = "presentationDisplayId";
56692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_EXTRAS = "extras";
57692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_CAN_DISCONNECT = "canDisconnect";
58692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_SETTINGS_INTENT = "settingsIntent";
59692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_MIN_CLIENT_VERSION = "minClientVersion";
60692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static final String KEY_MAX_CLIENT_VERSION = "maxClientVersion";
61692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
62692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    final Bundle mBundle;
63692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    List<IntentFilter> mControlFilters;
64692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
65692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    MediaRouteDescriptor(Bundle bundle, List<IntentFilter> controlFilters) {
66692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        mBundle = bundle;
67692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        mControlFilters = controlFilters;
68692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
69692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
70692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
71692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the unique id of the route.
72692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * <p>
73692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * The route id associated with a route descriptor functions as a stable
74692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * identifier for the route and must be unique among all routes offered
75692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * by the provider.
76692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p>
77692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
78692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public String getId() {
79692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getString(KEY_ID);
80692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
81692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
82692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
83692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the group member ids of the route.
84692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * <p>
85692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * A route descriptor that has one or more group member route ids
86692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * represents a route group. A member route may belong to another group.
87692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p>
88692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @hide
89692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
90692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    // @RestrictTo(LIBRARY_GROUP)
91692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public List<String> getGroupMemberIds() {
92692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getStringArrayList(KEY_GROUP_MEMBER_IDS);
93692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
94692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
95692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
96692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the user-visible name of the route.
97692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * <p>
98692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * The route name identifies the destination represented by the route.
99692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * It may be a user-supplied name, an alias, or device serial number.
100692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p>
101692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
102692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public String getName() {
103692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getString(KEY_NAME);
104692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
105692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
106692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
107692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the user-visible description of the route.
108692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * <p>
109692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * The route description describes the kind of destination represented by the route.
110692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * It may be a user-supplied string, a model number or brand of device.
111692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p>
112692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
113692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public String getDescription() {
114692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getString(KEY_DESCRIPTION);
115692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
116692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
117692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
118692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the URI of the icon representing this route.
119692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * <p>
120692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * This icon will be used in picker UIs if available.
121692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p>
122692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
123692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public Uri getIconUri() {
124692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        String iconUri = mBundle.getString(KEY_ICON_URI);
125692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return iconUri == null ? null : Uri.parse(iconUri);
126692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
127692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
128692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
129692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets whether the route is enabled.
130692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
131692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public boolean isEnabled() {
132692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getBoolean(KEY_ENABLED, true);
133692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
134692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
135692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
136692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets whether the route is connecting.
137692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @deprecated Use {@link #getConnectionState} instead
138692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
139692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    @Deprecated
140692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public boolean isConnecting() {
141692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getBoolean(KEY_CONNECTING, false);
142692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
143692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
144692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
145692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the connection state of the route.
146692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
147692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return The connection state of this route:
148692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#CONNECTION_STATE_DISCONNECTED},
149692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
150692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
151692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
152692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getConnectionState() {
153692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_CONNECTION_STATE,
154692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                MediaRouter.RouteInfo.CONNECTION_STATE_DISCONNECTED);
155692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
156692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
157692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
158692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets whether the route can be disconnected without stopping playback.
159692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * <p>
160692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * The route can normally be disconnected without stopping playback when
161692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * the destination device on the route is connected to two or more source
162692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * devices. The route provider should update the route immediately when the
163692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * number of connected devices changes.
164692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p><p>
165692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * To specify that the route should disconnect without stopping use
166692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter#unselect(int)} with
167692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter#UNSELECT_REASON_DISCONNECTED}.
168692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * </p>
169692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
170692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public boolean canDisconnectAndKeepPlaying() {
171692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getBoolean(KEY_CAN_DISCONNECT, false);
172692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
173692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
174692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
175692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets an {@link IntentSender} for starting a settings activity for this
176692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * route. The activity may have specific route settings or general settings
177692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * for the connected device or route provider.
178692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
179692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return An {@link IntentSender} to start a settings activity.
180692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
181692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public IntentSender getSettingsActivity() {
182692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getParcelable(KEY_SETTINGS_INTENT);
183692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
184692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
185692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
186692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the route's {@link MediaControlIntent media control intent} filters.
187692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
188692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public List<IntentFilter> getControlFilters() {
189692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ensureControlFilters();
190692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mControlFilters;
191692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
192692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
193692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    void ensureControlFilters() {
194692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        if (mControlFilters == null) {
195692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mControlFilters = mBundle.<IntentFilter>getParcelableArrayList(KEY_CONTROL_FILTERS);
196692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (mControlFilters == null) {
197692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mControlFilters = Collections.<IntentFilter>emptyList();
198692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
199692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
200692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
201692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
202692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
203692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the type of playback associated with this route.
204692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
205692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return The type of playback associated with this route:
206692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
207692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
208692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
209692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getPlaybackType() {
210692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_PLAYBACK_TYPE, MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE);
211692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
212692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
213692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
214692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the route's playback stream.
215692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
216692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getPlaybackStream() {
217692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_PLAYBACK_STREAM, -1);
218692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
219692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
220692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
221692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the type of the receiver device associated with this route.
222692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
223692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return The type of the receiver device associated with this route:
224692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#DEVICE_TYPE_TV} or
225692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#DEVICE_TYPE_SPEAKER}.
226692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
227692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getDeviceType() {
228692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_DEVICE_TYPE);
229692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
230692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
231692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
232692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the route's current volume, or 0 if unknown.
233692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
234692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getVolume() {
235692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_VOLUME);
236692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
237692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
238692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
239692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the route's maximum volume, or 0 if unknown.
240692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
241692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getVolumeMax() {
242692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_VOLUME_MAX);
243692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
244692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
245692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
246692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets information about how volume is handled on the route.
247692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
248692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return How volume is handled on the route:
249692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
250692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
251692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
252692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getVolumeHandling() {
253692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_VOLUME_HANDLING,
254692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED);
255692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
256692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
257692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
258692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the route's presentation display id, or -1 if none.
259692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
260692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getPresentationDisplayId() {
261692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(
262692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                KEY_PRESENTATION_DISPLAY_ID, MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE);
263692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
264692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
265692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
266692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets a bundle of extras for this route descriptor.
267692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * The extras will be ignored by the media router but they may be used
268692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * by applications.
269692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
270692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public Bundle getExtras() {
271692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getBundle(KEY_EXTRAS);
272692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
273692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
274692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
275692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the minimum client version required for this route.
276692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @hide
277692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
278692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    // @RestrictTo(LIBRARY_GROUP)
279692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getMinClientVersion() {
280692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_MIN_CLIENT_VERSION,
281692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                MediaRouteProviderProtocol.CLIENT_VERSION_START);
282692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
283692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
284692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
285692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Gets the maximum client version required for this route.
286692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @hide
287692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
288692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    // @RestrictTo(LIBRARY_GROUP)
289692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public int getMaxClientVersion() {
290692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle.getInt(KEY_MAX_CLIENT_VERSION, Integer.MAX_VALUE);
291692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
292692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
293692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
294692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Returns true if the route descriptor has all of the required fields.
295692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
296692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public boolean isValid() {
297692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ensureControlFilters();
298692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        if (TextUtils.isEmpty(getId())
299692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                || TextUtils.isEmpty(getName())
300692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                || mControlFilters.contains(null)) {
301692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return false;
302692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
303692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return true;
304692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
305692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
306692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    @Override
307692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public String toString() {
308692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        StringBuilder result = new StringBuilder();
309692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append("MediaRouteDescriptor{ ");
310692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append("id=").append(getId());
311692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", groupMemberIds=").append(getGroupMemberIds());
312692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", name=").append(getName());
313692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", description=").append(getDescription());
314692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", iconUri=").append(getIconUri());
315692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", isEnabled=").append(isEnabled());
316692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", isConnecting=").append(isConnecting());
317692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", connectionState=").append(getConnectionState());
318692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", controlFilters=").append(Arrays.toString(getControlFilters().toArray()));
319692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", playbackType=").append(getPlaybackType());
320692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", playbackStream=").append(getPlaybackStream());
321692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", deviceType=").append(getDeviceType());
322692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", volume=").append(getVolume());
323692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", volumeMax=").append(getVolumeMax());
324692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", volumeHandling=").append(getVolumeHandling());
325692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", presentationDisplayId=").append(getPresentationDisplayId());
326692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", extras=").append(getExtras());
327692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", isValid=").append(isValid());
328692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", minClientVersion=").append(getMinClientVersion());
329692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(", maxClientVersion=").append(getMaxClientVersion());
330692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        result.append(" }");
331692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return result.toString();
332692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
333692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
334692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
335692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Converts this object to a bundle for serialization.
336692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
337692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return The contents of the object represented as a bundle.
338692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
339692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public Bundle asBundle() {
340692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return mBundle;
341692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
342692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
343692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
344692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Creates an instance from a bundle.
345692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     *
346692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @param bundle The bundle, or null if none.
347692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * @return The new instance, or null if the bundle was null.
348692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
349692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static MediaRouteDescriptor fromBundle(Bundle bundle) {
350692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return bundle != null ? new MediaRouteDescriptor(bundle, null) : null;
351692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
352692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
353692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
354692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Builder for {@link MediaRouteDescriptor media route descriptors}.
355692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
356692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class Builder {
357692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        private final Bundle mBundle;
358692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        private ArrayList<String> mGroupMemberIds;
359692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        private ArrayList<IntentFilter> mControlFilters;
360692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
361692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
362692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Creates a media route descriptor builder.
363692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         *
364692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @param id The unique id of the route.
365692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @param name The user-visible name of the route.
366692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
367692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder(String id, String name) {
368692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle = new Bundle();
369692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            setId(id);
370692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            setName(name);
371692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
372692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
373692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
374692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Creates a media route descriptor builder whose initial contents are
375692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * copied from an existing descriptor.
376692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
377692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder(MediaRouteDescriptor descriptor) {
378692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (descriptor == null) {
379692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new IllegalArgumentException("descriptor must not be null");
380692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
381692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
382692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle = new Bundle(descriptor.mBundle);
383692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
384692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            descriptor.ensureControlFilters();
385692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (!descriptor.mControlFilters.isEmpty()) {
386692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mControlFilters = new ArrayList<IntentFilter>(descriptor.mControlFilters);
387692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
388692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
389692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
390692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
391692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the unique id of the route.
392692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
393692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * The route id associated with a route descriptor functions as a stable
394692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * identifier for the route and must be unique among all routes offered
395692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * by the provider.
396692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
397692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
398692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setId(String id) {
399692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putString(KEY_ID, id);
400692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
401692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
402692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
403692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
404692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Adds a group member id of the route.
405692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
406692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * A route descriptor that has one or more group member route ids
407692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * represents a route group. A member route may belong to another group.
408692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
409692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @hide
410692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
411692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        // @RestrictTo(LIBRARY_GROUP)
412692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder addGroupMemberId(String groupMemberId) {
413692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (TextUtils.isEmpty(groupMemberId)) {
414692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new IllegalArgumentException("groupMemberId must not be empty");
415692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
416692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
417692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (mGroupMemberIds == null) {
418692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mGroupMemberIds = new ArrayList<>();
419692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
420692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (!mGroupMemberIds.contains(groupMemberId)) {
421692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mGroupMemberIds.add(groupMemberId);
422692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
423692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
424692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
425692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
426692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
427692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Adds a list of group member ids of the route.
428692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
429692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * A route descriptor that has one or more group member route ids
430692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * represents a route group. A member route may belong to another group.
431692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
432692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @hide
433692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
434692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        // @RestrictTo(LIBRARY_GROUP)
435692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder addGroupMemberIds(Collection<String> groupMemberIds) {
436692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (groupMemberIds == null) {
437692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new IllegalArgumentException("groupMemberIds must not be null");
438692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
439692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
440692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (!groupMemberIds.isEmpty()) {
441692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                for (String groupMemberId : groupMemberIds) {
442692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    addGroupMemberId(groupMemberId);
443692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                }
444692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
445692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
446692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
447692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
448692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
449692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the user-visible name of the route.
450692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
451692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * The route name identifies the destination represented by the route.
452692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * It may be a user-supplied name, an alias, or device serial number.
453692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
454692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
455692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setName(String name) {
456692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putString(KEY_NAME, name);
457692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
458692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
459692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
460692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
461692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the user-visible description of the route.
462692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
463692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * The route description describes the kind of destination represented by the route.
464692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * It may be a user-supplied string, a model number or brand of device.
465692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
466692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
467692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setDescription(String description) {
468692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putString(KEY_DESCRIPTION, description);
469692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
470692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
471692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
472692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
473692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the URI of the icon representing this route.
474692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
475692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * This icon will be used in picker UIs if available.
476692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p><p>
477692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * The URI must be one of the following formats:
478692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <ul>
479692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
480692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})
481692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </li>
482692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
483692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </ul>
484692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
485692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
486692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setIconUri(Uri iconUri) {
487692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (iconUri == null) {
488692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new IllegalArgumentException("iconUri must not be null");
489692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
490692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putString(KEY_ICON_URI, iconUri.toString());
491692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
492692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
493692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
494692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
495692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets whether the route is enabled.
496692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * <p>
497692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Disabled routes represent routes that a route provider knows about, such as paired
498692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Wifi Display receivers, but that are not currently available for use.
499692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * </p>
500692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
501692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setEnabled(boolean enabled) {
502692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putBoolean(KEY_ENABLED, enabled);
503692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
504692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
505692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
506692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
507692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets whether the route is in the process of connecting and is not yet
508692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * ready for use.
509692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @deprecated Use {@link #setConnectionState} instead.
510692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
511692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Deprecated
512692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setConnecting(boolean connecting) {
513692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putBoolean(KEY_CONNECTING, connecting);
514692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
515692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
516692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
517692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
518692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's connection state.
519692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         *
520692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @param connectionState The connection state of the route:
521692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#CONNECTION_STATE_DISCONNECTED},
522692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
523692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
524692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
525692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setConnectionState(int connectionState) {
526692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_CONNECTION_STATE, connectionState);
527692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
528692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
529692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
530692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
531692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets whether the route can be disconnected without stopping playback.
532692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
533692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setCanDisconnect(boolean canDisconnect) {
534692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putBoolean(KEY_CAN_DISCONNECT, canDisconnect);
535692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
536692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
537692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
538692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
539692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets an intent sender for launching the settings activity for this
540692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * route.
541692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
542692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setSettingsActivity(IntentSender is) {
543692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putParcelable(KEY_SETTINGS_INTENT, is);
544692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
545692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
546692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
547692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
548692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Adds a {@link MediaControlIntent media control intent} filter for the route.
549692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
550692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder addControlFilter(IntentFilter filter) {
551692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (filter == null) {
552692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new IllegalArgumentException("filter must not be null");
553692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
554692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
555692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (mControlFilters == null) {
556692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mControlFilters = new ArrayList<IntentFilter>();
557692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
558692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (!mControlFilters.contains(filter)) {
559692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mControlFilters.add(filter);
560692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
561692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
562692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
563692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
564692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
565692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Adds a list of {@link MediaControlIntent media control intent} filters for the route.
566692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
567692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder addControlFilters(Collection<IntentFilter> filters) {
568692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (filters == null) {
569692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new IllegalArgumentException("filters must not be null");
570692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
571692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
572692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (!filters.isEmpty()) {
573692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                for (IntentFilter filter : filters) {
574692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    addControlFilter(filter);
575692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                }
576692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
577692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
578692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
579692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
580692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
581692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's playback type.
582692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         *
583692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @param playbackType The playback type of the route:
584692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
585692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
586692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
587692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setPlaybackType(int playbackType) {
588692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
589692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
590692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
591692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
592692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
593692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's playback stream.
594692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
595692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setPlaybackStream(int playbackStream) {
596692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
597692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
598692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
599692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
600692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
601692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's receiver device type.
602692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         *
603692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @param deviceType The receive device type of the route:
604692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#DEVICE_TYPE_TV} or
605692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#DEVICE_TYPE_SPEAKER}.
606692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
607692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setDeviceType(int deviceType) {
608692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_DEVICE_TYPE, deviceType);
609692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
610692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
611692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
612692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
613692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's current volume, or 0 if unknown.
614692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
615692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setVolume(int volume) {
616692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_VOLUME, volume);
617692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
618692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
619692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
620692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
621692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's maximum volume, or 0 if unknown.
622692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
623692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setVolumeMax(int volumeMax) {
624692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
625692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
626692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
627692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
628692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
629692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's volume handling.
630692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         *
631692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @param volumeHandling how volume is handled on the route:
632692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
633692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
634692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
635692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setVolumeHandling(int volumeHandling) {
636692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
637692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
638692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
639692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
640692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
641692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's presentation display id, or -1 if none.
642692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
643692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setPresentationDisplayId(int presentationDisplayId) {
644692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
645692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
646692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
647692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
648692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
649692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets a bundle of extras for this route descriptor.
650692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * The extras will be ignored by the media router but they may be used
651692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * by applications.
652692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
653692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setExtras(Bundle extras) {
654692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putBundle(KEY_EXTRAS, extras);
655692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
656692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
657692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
658692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
659692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's minimum client version.
660692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * A router whose version is lower than this will not be able to connect to this route.
661692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @hide
662692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
663692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        // @RestrictTo(LIBRARY_GROUP)
664692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setMinClientVersion(int minVersion) {
665692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_MIN_CLIENT_VERSION, minVersion);
666692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
667692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
668692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
669692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
670692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Sets the route's maximum client version.
671692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * A router whose version is higher than this will not be able to connect to this route.
672692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * @hide
673692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
674692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        // @RestrictTo(LIBRARY_GROUP)
675692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Builder setMaxClientVersion(int maxVersion) {
676692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mBundle.putInt(KEY_MAX_CLIENT_VERSION, maxVersion);
677692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return this;
678692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
679692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
680692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        /**
681692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         * Builds the {@link MediaRouteDescriptor media route descriptor}.
682692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim         */
683692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public MediaRouteDescriptor build() {
684692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (mControlFilters != null) {
685692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, mControlFilters);
686692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
687692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (mGroupMemberIds != null) {
688692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mBundle.putStringArrayList(KEY_GROUP_MEMBER_IDS, mGroupMemberIds);
689692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
690692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return new MediaRouteDescriptor(mBundle, mControlFilters);
691692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
692692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
693692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim}
694