111417b1cfde8f1749905f2d735623af9214148afJeff Brown/*
211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Copyright (C) 2013 The Android Open Source Project
311417b1cfde8f1749905f2d735623af9214148afJeff Brown *
411417b1cfde8f1749905f2d735623af9214148afJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
511417b1cfde8f1749905f2d735623af9214148afJeff Brown * you may not use this file except in compliance with the License.
611417b1cfde8f1749905f2d735623af9214148afJeff Brown * You may obtain a copy of the License at
711417b1cfde8f1749905f2d735623af9214148afJeff Brown *
811417b1cfde8f1749905f2d735623af9214148afJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
911417b1cfde8f1749905f2d735623af9214148afJeff Brown *
1011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Unless required by applicable law or agreed to in writing, software
1111417b1cfde8f1749905f2d735623af9214148afJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1211417b1cfde8f1749905f2d735623af9214148afJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1311417b1cfde8f1749905f2d735623af9214148afJeff Brown * See the License for the specific language governing permissions and
1411417b1cfde8f1749905f2d735623af9214148afJeff Brown * limitations under the License.
1511417b1cfde8f1749905f2d735623af9214148afJeff Brown */
1611417b1cfde8f1749905f2d735623af9214148afJeff Brownpackage android.support.v7.media;
1711417b1cfde8f1749905f2d735623af9214148afJeff Brown
1811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.content.IntentFilter;
1994be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.content.IntentSender;
2011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
2111417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.text.TextUtils;
2211417b1cfde8f1749905f2d735623af9214148afJeff Brown
2311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.ArrayList;
2411417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Arrays;
257599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brownimport java.util.Collection;
2611417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Collections;
2711417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.List;
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown
2911417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
3011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Describes the properties of a route.
3111417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
3211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Each route is uniquely identified by an opaque id string.  This token
3311417b1cfde8f1749905f2d735623af9214148afJeff Brown * may take any form as long as it is unique within the media route provider.
3411417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p><p>
3511417b1cfde8f1749905f2d735623af9214148afJeff Brown * This object is immutable once created using a {@link Builder} instance.
3611417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
3711417b1cfde8f1749905f2d735623af9214148afJeff Brown */
3811417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic final class MediaRouteDescriptor {
3911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ID = "id";
4011417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_NAME = "name";
41d63957d28aaabcec588b8cde12eac16414783aebJeff Brown    private static final String KEY_DESCRIPTION = "status";
4211417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ENABLED = "enabled";
4311417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_CONNECTING = "connecting";
4411417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_CONTROL_FILTERS = "controlFilters";
4511417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_PLAYBACK_TYPE = "playbackType";
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_PLAYBACK_STREAM = "playbackStream";
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_VOLUME = "volume";
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_VOLUME_MAX = "volumeMax";
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_VOLUME_HANDLING = "volumeHandling";
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_PRESENTATION_DISPLAY_ID = "presentationDisplayId";
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_EXTRAS = "extras";
5294be6100218126ce6a08bf1f56209578500b361fRoboErik    private static final String KEY_CAN_DISCONNECT = "canDisconnect";
5394be6100218126ce6a08bf1f56209578500b361fRoboErik    private static final String KEY_SETTINGS_INTENT = "settingsIntent";
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final Bundle mBundle;
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown    private List<IntentFilter> mControlFilters;
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown
5855b361aea868e53e848bc45af3a55ae43e7871c3Jeff Brown    private MediaRouteDescriptor(Bundle bundle, List<IntentFilter> controlFilters) {
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle = bundle;
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown        mControlFilters = controlFilters;
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
6211417b1cfde8f1749905f2d735623af9214148afJeff Brown
6311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
6411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the unique id of the route.
65cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * <p>
66cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * The route id associated with a route descriptor functions as a stable
67cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * identifier for the route and must be unique among all routes offered
68cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * by the provider.
69cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * </p>
7011417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
7111417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String getId() {
7211417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getString(KEY_ID);
7311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
7411417b1cfde8f1749905f2d735623af9214148afJeff Brown
7511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
76d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * Gets the user-visible name of the route.
77d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * <p>
78d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * The route name identifies the destination represented by the route.
79d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * It may be a user-supplied name, an alias, or device serial number.
80d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * </p>
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String getName() {
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getString(KEY_NAME);
8411417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
8511417b1cfde8f1749905f2d735623af9214148afJeff Brown
8611417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
87d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * Gets the user-visible description of the route.
88d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * <p>
89d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * The route description describes the kind of destination represented by the route.
90d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * It may be a user-supplied string, a model number or brand of device.
91d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * </p>
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
93d63957d28aaabcec588b8cde12eac16414783aebJeff Brown    public String getDescription() {
94d63957d28aaabcec588b8cde12eac16414783aebJeff Brown        return mBundle.getString(KEY_DESCRIPTION);
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets whether the route is enabled.
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isEnabled() {
10111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBoolean(KEY_ENABLED, true);
10211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10311417b1cfde8f1749905f2d735623af9214148afJeff Brown
10411417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
10511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets whether the route is connecting.
10611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
10711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isConnecting() {
10811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBoolean(KEY_CONNECTING, false);
10911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
11011417b1cfde8f1749905f2d735623af9214148afJeff Brown
11111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
11294be6100218126ce6a08bf1f56209578500b361fRoboErik     * Gets whether the route can be disconnected without stopping playback. To
11394be6100218126ce6a08bf1f56209578500b361fRoboErik     * specify that the route should disconnect without stopping use
11494be6100218126ce6a08bf1f56209578500b361fRoboErik     * {@link MediaRouter#unselect(int)} with
11594be6100218126ce6a08bf1f56209578500b361fRoboErik     * {@link MediaRouter#UNSELECT_REASON_DISCONNECTED}.
11694be6100218126ce6a08bf1f56209578500b361fRoboErik     */
11794be6100218126ce6a08bf1f56209578500b361fRoboErik    public boolean canDisconnectAndKeepPlaying() {
11894be6100218126ce6a08bf1f56209578500b361fRoboErik        return mBundle.getBoolean(KEY_CAN_DISCONNECT, false);
11994be6100218126ce6a08bf1f56209578500b361fRoboErik    }
12094be6100218126ce6a08bf1f56209578500b361fRoboErik
12194be6100218126ce6a08bf1f56209578500b361fRoboErik    /**
12294be6100218126ce6a08bf1f56209578500b361fRoboErik     * Gets an {@link IntentSender} for starting a settings activity for this
12394be6100218126ce6a08bf1f56209578500b361fRoboErik     * route. The activity may have specific route settings or general settings
12494be6100218126ce6a08bf1f56209578500b361fRoboErik     * for the connected device or route provider.
12594be6100218126ce6a08bf1f56209578500b361fRoboErik     *
12694be6100218126ce6a08bf1f56209578500b361fRoboErik     * @return An {@link IntentSender} to start a settings activity.
12794be6100218126ce6a08bf1f56209578500b361fRoboErik     */
12894be6100218126ce6a08bf1f56209578500b361fRoboErik    public IntentSender getSettingsActivity() {
12994be6100218126ce6a08bf1f56209578500b361fRoboErik        return mBundle.getParcelable(KEY_SETTINGS_INTENT);
13094be6100218126ce6a08bf1f56209578500b361fRoboErik    }
13194be6100218126ce6a08bf1f56209578500b361fRoboErik
13294be6100218126ce6a08bf1f56209578500b361fRoboErik    /**
13311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's {@link MediaControlIntent media control intent} filters.
13411417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
13511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public List<IntentFilter> getControlFilters() {
13611417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureControlFilters();
13711417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mControlFilters;
13811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
13911417b1cfde8f1749905f2d735623af9214148afJeff Brown
14011417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureControlFilters() {
14111417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mControlFilters == null) {
14211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mControlFilters = mBundle.<IntentFilter>getParcelableArrayList(KEY_CONTROL_FILTERS);
14311417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlFilters == null) {
14411417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters = Collections.<IntentFilter>emptyList();
14511417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
14611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
14711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
14811417b1cfde8f1749905f2d735623af9214148afJeff Brown
14911417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
15011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's playback type.
15111417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
15211417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getPlaybackType() {
15311417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_PLAYBACK_TYPE, MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE);
15411417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
15511417b1cfde8f1749905f2d735623af9214148afJeff Brown
15611417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
15711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's playback stream.
15811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
15911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getPlaybackStream() {
16011417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_PLAYBACK_STREAM, -1);
16111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
16211417b1cfde8f1749905f2d735623af9214148afJeff Brown
16311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
16411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's current volume, or 0 if unknown.
16511417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
16611417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getVolume() {
16711417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_VOLUME);
16811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
16911417b1cfde8f1749905f2d735623af9214148afJeff Brown
17011417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
17111417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's maximum volume, or 0 if unknown.
17211417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
17311417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getVolumeMax() {
17411417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_VOLUME_MAX);
17511417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
17611417b1cfde8f1749905f2d735623af9214148afJeff Brown
17711417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
17811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's volume handling.
17911417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
18011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getVolumeHandling() {
18111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_VOLUME_HANDLING,
18211417b1cfde8f1749905f2d735623af9214148afJeff Brown                MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED);
18311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
18411417b1cfde8f1749905f2d735623af9214148afJeff Brown
18511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
18611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's presentation display id, or -1 if none.
18711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
18811417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getPresentationDisplayId() {
18911417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_PRESENTATION_DISPLAY_ID, -1);
19011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
19111417b1cfde8f1749905f2d735623af9214148afJeff Brown
19211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
19311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets a bundle of extras for this route descriptor.
19411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * The extras will be ignored by the media router but they may be used
19511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * by applications.
19611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
19711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Bundle getExtras() {
19811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBundle(KEY_EXTRAS);
19911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
20011417b1cfde8f1749905f2d735623af9214148afJeff Brown
20111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
20211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Returns true if the route descriptor has all of the required fields.
20311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
20411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isValid() {
20511417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureControlFilters();
20611417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (TextUtils.isEmpty(getId())
20711417b1cfde8f1749905f2d735623af9214148afJeff Brown                || TextUtils.isEmpty(getName())
20811417b1cfde8f1749905f2d735623af9214148afJeff Brown                || mControlFilters.contains(null)) {
20911417b1cfde8f1749905f2d735623af9214148afJeff Brown            return false;
21011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
21111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return true;
21211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
21311417b1cfde8f1749905f2d735623af9214148afJeff Brown
21411417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
21511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String toString() {
21611417b1cfde8f1749905f2d735623af9214148afJeff Brown        StringBuilder result = new StringBuilder();
21711417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("MediaRouteDescriptor{ ");
21811417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("id=").append(getId());
21911417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", name=").append(getName());
220d63957d28aaabcec588b8cde12eac16414783aebJeff Brown        result.append(", description=").append(getDescription());
22111417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isEnabled=").append(isEnabled());
22211417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isConnecting=").append(isConnecting());
22311417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", controlFilters=").append(Arrays.toString(getControlFilters().toArray()));
22411417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", playbackType=").append(getPlaybackType());
22511417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", playbackStream=").append(getPlaybackStream());
22611417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", volume=").append(getVolume());
22711417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", volumeMax=").append(getVolumeMax());
22811417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", volumeHandling=").append(getVolumeHandling());
22911417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", presentationDisplayId=").append(getPresentationDisplayId());
23011417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", extras=").append(getExtras());
23111417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isValid=").append(isValid());
2323d4c9459ed77f732dd3ba602713af6ebf9280c8cJeff Brown        result.append(" }");
23311417b1cfde8f1749905f2d735623af9214148afJeff Brown        return result.toString();
23411417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
23511417b1cfde8f1749905f2d735623af9214148afJeff Brown
23611417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
23711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Converts this object to a bundle for serialization.
23811417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
23911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The contents of the object represented as a bundle.
24011417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
24111417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Bundle asBundle() {
24211417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle;
24311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
24411417b1cfde8f1749905f2d735623af9214148afJeff Brown
24511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
24611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Creates an instance from a bundle.
24711417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
24811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param bundle The bundle, or null if none.
24911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The new instance, or null if the bundle was null.
25011417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
25111417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static MediaRouteDescriptor fromBundle(Bundle bundle) {
25255b361aea868e53e848bc45af3a55ae43e7871c3Jeff Brown        return bundle != null ? new MediaRouteDescriptor(bundle, null) : null;
25311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
25411417b1cfde8f1749905f2d735623af9214148afJeff Brown
25511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
25611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Builder for {@link MediaRouteDescriptor media route descriptors}.
25711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
25811417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static final class Builder {
25911417b1cfde8f1749905f2d735623af9214148afJeff Brown        private final Bundle mBundle;
26011417b1cfde8f1749905f2d735623af9214148afJeff Brown        private ArrayList<IntentFilter> mControlFilters;
26111417b1cfde8f1749905f2d735623af9214148afJeff Brown
26211417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
26311417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Creates a media route descriptor builder.
26411417b1cfde8f1749905f2d735623af9214148afJeff Brown         *
26511417b1cfde8f1749905f2d735623af9214148afJeff Brown         * @param id The unique id of the route.
266d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * @param name The user-visible name of the route.
26711417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
26811417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder(String id, String name) {
26911417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle = new Bundle();
27011417b1cfde8f1749905f2d735623af9214148afJeff Brown            setId(id);
27111417b1cfde8f1749905f2d735623af9214148afJeff Brown            setName(name);
27211417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
27311417b1cfde8f1749905f2d735623af9214148afJeff Brown
27411417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
27511417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Creates a media route descriptor builder whose initial contents are
27611417b1cfde8f1749905f2d735623af9214148afJeff Brown         * copied from an existing descriptor.
27711417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
27811417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder(MediaRouteDescriptor descriptor) {
27911417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (descriptor == null) {
28011417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("descriptor must not be null");
28111417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
28211417b1cfde8f1749905f2d735623af9214148afJeff Brown
28311417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle = new Bundle(descriptor.mBundle);
28411417b1cfde8f1749905f2d735623af9214148afJeff Brown
28511417b1cfde8f1749905f2d735623af9214148afJeff Brown            descriptor.ensureControlFilters();
28611417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!descriptor.mControlFilters.isEmpty()) {
28711417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters = new ArrayList<IntentFilter>(descriptor.mControlFilters);
28811417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
28911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
29011417b1cfde8f1749905f2d735623af9214148afJeff Brown
29111417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
29211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the unique id of the route.
293cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * <p>
294cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * The route id associated with a route descriptor functions as a stable
295cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * identifier for the route and must be unique among all routes offered
296cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * by the provider.
297cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * </p>
29811417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
29911417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setId(String id) {
30011417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putString(KEY_ID, id);
30111417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
30211417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
30311417b1cfde8f1749905f2d735623af9214148afJeff Brown
30411417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
305d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * Sets the user-visible name of the route.
306d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * <p>
307d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * The route name identifies the destination represented by the route.
308d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * It may be a user-supplied name, an alias, or device serial number.
309d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * </p>
31011417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
31111417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setName(String name) {
31211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putString(KEY_NAME, name);
31311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
31411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
31511417b1cfde8f1749905f2d735623af9214148afJeff Brown
31611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
317d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * Sets the user-visible description of the route.
318d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * <p>
319d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * The route description describes the kind of destination represented by the route.
320d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * It may be a user-supplied string, a model number or brand of device.
321d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * </p>
32211417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
323d63957d28aaabcec588b8cde12eac16414783aebJeff Brown        public Builder setDescription(String description) {
324d63957d28aaabcec588b8cde12eac16414783aebJeff Brown            mBundle.putString(KEY_DESCRIPTION, description);
32511417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
32611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
32711417b1cfde8f1749905f2d735623af9214148afJeff Brown
32811417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
32911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets whether the route is enabled.
33011417b1cfde8f1749905f2d735623af9214148afJeff Brown         * <p>
33111417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Disabled routes represent routes that a route provider knows about, such as paired
33211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Wifi Display receivers, but that are not currently available for use.
33311417b1cfde8f1749905f2d735623af9214148afJeff Brown         * </p>
33411417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
33511417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setEnabled(boolean enabled) {
33611417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBoolean(KEY_ENABLED, enabled);
33711417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
33811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
33911417b1cfde8f1749905f2d735623af9214148afJeff Brown
34011417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
34111417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets whether the route is in the process of connecting and is not yet
34211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * ready for use.
34311417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
34411417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setConnecting(boolean connecting) {
34511417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBoolean(KEY_CONNECTING, connecting);
34611417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
34711417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
34811417b1cfde8f1749905f2d735623af9214148afJeff Brown
34911417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
35094be6100218126ce6a08bf1f56209578500b361fRoboErik         * Sets whether the route can be disconnected without stopping playback.
35194be6100218126ce6a08bf1f56209578500b361fRoboErik         */
35294be6100218126ce6a08bf1f56209578500b361fRoboErik        public Builder setCanDisconnect(boolean canDisconnect) {
35394be6100218126ce6a08bf1f56209578500b361fRoboErik            mBundle.putBoolean(KEY_CAN_DISCONNECT, canDisconnect);
35494be6100218126ce6a08bf1f56209578500b361fRoboErik            return this;
35594be6100218126ce6a08bf1f56209578500b361fRoboErik        }
35694be6100218126ce6a08bf1f56209578500b361fRoboErik
35794be6100218126ce6a08bf1f56209578500b361fRoboErik        /**
35894be6100218126ce6a08bf1f56209578500b361fRoboErik         * Sets an intent sender for launching the settings activity for this
35994be6100218126ce6a08bf1f56209578500b361fRoboErik         * route.
36094be6100218126ce6a08bf1f56209578500b361fRoboErik         */
36194be6100218126ce6a08bf1f56209578500b361fRoboErik        public Builder setSettingsActivity(IntentSender is) {
36294be6100218126ce6a08bf1f56209578500b361fRoboErik            mBundle.putParcelable(KEY_SETTINGS_INTENT, is);
36394be6100218126ce6a08bf1f56209578500b361fRoboErik            return this;
36494be6100218126ce6a08bf1f56209578500b361fRoboErik        }
36594be6100218126ce6a08bf1f56209578500b361fRoboErik
36694be6100218126ce6a08bf1f56209578500b361fRoboErik        /**
36711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a {@link MediaControlIntent media control intent} filter for the route.
36811417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
36911417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder addControlFilter(IntentFilter filter) {
37011417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (filter == null) {
37111417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("filter must not be null");
37211417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
37311417b1cfde8f1749905f2d735623af9214148afJeff Brown
37411417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlFilters == null) {
37511417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters = new ArrayList<IntentFilter>();
37611417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
37711417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!mControlFilters.contains(filter)) {
37811417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters.add(filter);
37911417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
38011417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
38111417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
38211417b1cfde8f1749905f2d735623af9214148afJeff Brown
38311417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
38411417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a list of {@link MediaControlIntent media control intent} filters for the route.
38511417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
3867599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown        public Builder addControlFilters(Collection<IntentFilter> filters) {
38711417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (filters == null) {
38811417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("filters must not be null");
38911417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
39011417b1cfde8f1749905f2d735623af9214148afJeff Brown
3917599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown            if (!filters.isEmpty()) {
3927599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown                for (IntentFilter filter : filters) {
3937599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown                    addControlFilter(filter);
3947599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown                }
39511417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
39611417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
39711417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
39811417b1cfde8f1749905f2d735623af9214148afJeff Brown
39911417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
40011417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's playback type.
40111417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
40211417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setPlaybackType(int playbackType) {
40311417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
40411417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
40511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
40611417b1cfde8f1749905f2d735623af9214148afJeff Brown
40711417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
40811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's playback stream.
40911417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
41011417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setPlaybackStream(int playbackStream) {
41111417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
41211417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
41311417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
41411417b1cfde8f1749905f2d735623af9214148afJeff Brown
41511417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
41611417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's current volume, or 0 if unknown.
41711417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
41811417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setVolume(int volume) {
41911417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_VOLUME, volume);
42011417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
42111417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
42211417b1cfde8f1749905f2d735623af9214148afJeff Brown
42311417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
42411417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's maximum volume, or 0 if unknown.
42511417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
42611417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setVolumeMax(int volumeMax) {
42711417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
42811417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
42911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
43011417b1cfde8f1749905f2d735623af9214148afJeff Brown
43111417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
43211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's volume handling.
43311417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
43411417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setVolumeHandling(int volumeHandling) {
43511417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
43611417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
43711417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
43811417b1cfde8f1749905f2d735623af9214148afJeff Brown
43911417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
44011417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's presentation display id, or -1 if none.
44111417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
44211417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setPresentationDisplayId(int presentationDisplayId) {
44311417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
44411417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
44511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
44611417b1cfde8f1749905f2d735623af9214148afJeff Brown
44711417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
44811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets a bundle of extras for this route descriptor.
44911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * The extras will be ignored by the media router but they may be used
45011417b1cfde8f1749905f2d735623af9214148afJeff Brown         * by applications.
45111417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
45211417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setExtras(Bundle extras) {
45311417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBundle(KEY_EXTRAS, extras);
45411417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
45511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
45611417b1cfde8f1749905f2d735623af9214148afJeff Brown
45711417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
45811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Builds the {@link MediaRouteDescriptor media route descriptor}.
45911417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
46011417b1cfde8f1749905f2d735623af9214148afJeff Brown        public MediaRouteDescriptor build() {
46111417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlFilters != null) {
46211417b1cfde8f1749905f2d735623af9214148afJeff Brown                mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, mControlFilters);
46311417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
46455b361aea868e53e848bc45af3a55ae43e7871c3Jeff Brown            return new MediaRouteDescriptor(mBundle, mControlFilters);
46511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
46611417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
46711417b1cfde8f1749905f2d735623af9214148afJeff Brown}