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;
1911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
2011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.text.TextUtils;
2111417b1cfde8f1749905f2d735623af9214148afJeff Brown
2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.ArrayList;
2311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Arrays;
247599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brownimport java.util.Collection;
2511417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Collections;
2611417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.List;
2711417b1cfde8f1749905f2d735623af9214148afJeff Brown
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
2911417b1cfde8f1749905f2d735623af9214148afJeff Brown * Describes the properties of a route.
3011417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
3111417b1cfde8f1749905f2d735623af9214148afJeff Brown * Each route is uniquely identified by an opaque id string.  This token
3211417b1cfde8f1749905f2d735623af9214148afJeff Brown * may take any form as long as it is unique within the media route provider.
3311417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p><p>
3411417b1cfde8f1749905f2d735623af9214148afJeff Brown * This object is immutable once created using a {@link Builder} instance.
3511417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
3611417b1cfde8f1749905f2d735623af9214148afJeff Brown */
3711417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic final class MediaRouteDescriptor {
3811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ID = "id";
3911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_NAME = "name";
40d63957d28aaabcec588b8cde12eac16414783aebJeff Brown    private static final String KEY_DESCRIPTION = "status";
4111417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ENABLED = "enabled";
4211417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_CONNECTING = "connecting";
4311417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_CONTROL_FILTERS = "controlFilters";
4411417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_PLAYBACK_TYPE = "playbackType";
4511417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_PLAYBACK_STREAM = "playbackStream";
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_VOLUME = "volume";
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_VOLUME_MAX = "volumeMax";
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_VOLUME_HANDLING = "volumeHandling";
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_PRESENTATION_DISPLAY_ID = "presentationDisplayId";
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_EXTRAS = "extras";
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final Bundle mBundle;
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown    private List<IntentFilter> mControlFilters;
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown
5555b361aea868e53e848bc45af3a55ae43e7871c3Jeff Brown    private MediaRouteDescriptor(Bundle bundle, List<IntentFilter> controlFilters) {
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle = bundle;
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown        mControlFilters = controlFilters;
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the unique id of the route.
62cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * <p>
63cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * The route id associated with a route descriptor functions as a stable
64cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * identifier for the route and must be unique among all routes offered
65cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * by the provider.
66cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown     * </p>
6711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
6811417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String getId() {
6911417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getString(KEY_ID);
7011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
7111417b1cfde8f1749905f2d735623af9214148afJeff Brown
7211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
73d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * Gets the user-visible name of the route.
74d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * <p>
75d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * The route name identifies the destination represented by the route.
76d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * It may be a user-supplied name, an alias, or device serial number.
77d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * </p>
7811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
7911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String getName() {
8011417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getString(KEY_NAME);
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
84d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * Gets the user-visible description of the route.
85d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * <p>
86d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * The route description describes the kind of destination represented by the route.
87d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * It may be a user-supplied string, a model number or brand of device.
88d63957d28aaabcec588b8cde12eac16414783aebJeff Brown     * </p>
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
90d63957d28aaabcec588b8cde12eac16414783aebJeff Brown    public String getDescription() {
91d63957d28aaabcec588b8cde12eac16414783aebJeff Brown        return mBundle.getString(KEY_DESCRIPTION);
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown
9411417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets whether the route is enabled.
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isEnabled() {
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBoolean(KEY_ENABLED, true);
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown
10111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
10211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets whether the route is connecting.
10311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
10411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isConnecting() {
10511417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBoolean(KEY_CONNECTING, false);
10611417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10711417b1cfde8f1749905f2d735623af9214148afJeff Brown
10811417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
10911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's {@link MediaControlIntent media control intent} filters.
11011417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
11111417b1cfde8f1749905f2d735623af9214148afJeff Brown    public List<IntentFilter> getControlFilters() {
11211417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureControlFilters();
11311417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mControlFilters;
11411417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
11511417b1cfde8f1749905f2d735623af9214148afJeff Brown
11611417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureControlFilters() {
11711417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mControlFilters == null) {
11811417b1cfde8f1749905f2d735623af9214148afJeff Brown            mControlFilters = mBundle.<IntentFilter>getParcelableArrayList(KEY_CONTROL_FILTERS);
11911417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlFilters == null) {
12011417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters = Collections.<IntentFilter>emptyList();
12111417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
12211417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
12311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
12411417b1cfde8f1749905f2d735623af9214148afJeff Brown
12511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
12611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's playback type.
12711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
12811417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getPlaybackType() {
12911417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_PLAYBACK_TYPE, MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE);
13011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
13111417b1cfde8f1749905f2d735623af9214148afJeff Brown
13211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
13311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's playback stream.
13411417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
13511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getPlaybackStream() {
13611417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_PLAYBACK_STREAM, -1);
13711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
13811417b1cfde8f1749905f2d735623af9214148afJeff Brown
13911417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
14011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's current volume, or 0 if unknown.
14111417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
14211417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getVolume() {
14311417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_VOLUME);
14411417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
14511417b1cfde8f1749905f2d735623af9214148afJeff Brown
14611417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
14711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's maximum volume, or 0 if unknown.
14811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
14911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getVolumeMax() {
15011417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_VOLUME_MAX);
15111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
15211417b1cfde8f1749905f2d735623af9214148afJeff Brown
15311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
15411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's volume handling.
15511417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
15611417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getVolumeHandling() {
15711417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_VOLUME_HANDLING,
15811417b1cfde8f1749905f2d735623af9214148afJeff Brown                MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED);
15911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
16011417b1cfde8f1749905f2d735623af9214148afJeff Brown
16111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
16211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route's presentation display id, or -1 if none.
16311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
16411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int getPresentationDisplayId() {
16511417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getInt(KEY_PRESENTATION_DISPLAY_ID, -1);
16611417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
16711417b1cfde8f1749905f2d735623af9214148afJeff Brown
16811417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
16911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets a bundle of extras for this route descriptor.
17011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * The extras will be ignored by the media router but they may be used
17111417b1cfde8f1749905f2d735623af9214148afJeff Brown     * by applications.
17211417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
17311417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Bundle getExtras() {
17411417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBundle(KEY_EXTRAS);
17511417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
17611417b1cfde8f1749905f2d735623af9214148afJeff Brown
17711417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
17811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Returns true if the route descriptor has all of the required fields.
17911417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
18011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isValid() {
18111417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureControlFilters();
18211417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (TextUtils.isEmpty(getId())
18311417b1cfde8f1749905f2d735623af9214148afJeff Brown                || TextUtils.isEmpty(getName())
18411417b1cfde8f1749905f2d735623af9214148afJeff Brown                || mControlFilters.contains(null)) {
18511417b1cfde8f1749905f2d735623af9214148afJeff Brown            return false;
18611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
18711417b1cfde8f1749905f2d735623af9214148afJeff Brown        return true;
18811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
18911417b1cfde8f1749905f2d735623af9214148afJeff Brown
19011417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
19111417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String toString() {
19211417b1cfde8f1749905f2d735623af9214148afJeff Brown        StringBuilder result = new StringBuilder();
19311417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("MediaRouteDescriptor{ ");
19411417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("id=").append(getId());
19511417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", name=").append(getName());
196d63957d28aaabcec588b8cde12eac16414783aebJeff Brown        result.append(", description=").append(getDescription());
19711417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isEnabled=").append(isEnabled());
19811417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isConnecting=").append(isConnecting());
19911417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", controlFilters=").append(Arrays.toString(getControlFilters().toArray()));
20011417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", playbackType=").append(getPlaybackType());
20111417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", playbackStream=").append(getPlaybackStream());
20211417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", volume=").append(getVolume());
20311417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", volumeMax=").append(getVolumeMax());
20411417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", volumeHandling=").append(getVolumeHandling());
20511417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", presentationDisplayId=").append(getPresentationDisplayId());
20611417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", extras=").append(getExtras());
20711417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isValid=").append(isValid());
2083d4c9459ed77f732dd3ba602713af6ebf9280c8cJeff Brown        result.append(" }");
20911417b1cfde8f1749905f2d735623af9214148afJeff Brown        return result.toString();
21011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
21111417b1cfde8f1749905f2d735623af9214148afJeff Brown
21211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
21311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Converts this object to a bundle for serialization.
21411417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
21511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The contents of the object represented as a bundle.
21611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
21711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Bundle asBundle() {
21811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle;
21911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
22011417b1cfde8f1749905f2d735623af9214148afJeff Brown
22111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
22211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Creates an instance from a bundle.
22311417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
22411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param bundle The bundle, or null if none.
22511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The new instance, or null if the bundle was null.
22611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
22711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static MediaRouteDescriptor fromBundle(Bundle bundle) {
22855b361aea868e53e848bc45af3a55ae43e7871c3Jeff Brown        return bundle != null ? new MediaRouteDescriptor(bundle, null) : null;
22911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
23011417b1cfde8f1749905f2d735623af9214148afJeff Brown
23111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
23211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Builder for {@link MediaRouteDescriptor media route descriptors}.
23311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
23411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static final class Builder {
23511417b1cfde8f1749905f2d735623af9214148afJeff Brown        private final Bundle mBundle;
23611417b1cfde8f1749905f2d735623af9214148afJeff Brown        private ArrayList<IntentFilter> mControlFilters;
23711417b1cfde8f1749905f2d735623af9214148afJeff Brown
23811417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
23911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Creates a media route descriptor builder.
24011417b1cfde8f1749905f2d735623af9214148afJeff Brown         *
24111417b1cfde8f1749905f2d735623af9214148afJeff Brown         * @param id The unique id of the route.
242d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * @param name The user-visible name of the route.
24311417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
24411417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder(String id, String name) {
24511417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle = new Bundle();
24611417b1cfde8f1749905f2d735623af9214148afJeff Brown            setId(id);
24711417b1cfde8f1749905f2d735623af9214148afJeff Brown            setName(name);
24811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
24911417b1cfde8f1749905f2d735623af9214148afJeff Brown
25011417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
25111417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Creates a media route descriptor builder whose initial contents are
25211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * copied from an existing descriptor.
25311417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
25411417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder(MediaRouteDescriptor descriptor) {
25511417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (descriptor == null) {
25611417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("descriptor must not be null");
25711417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
25811417b1cfde8f1749905f2d735623af9214148afJeff Brown
25911417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle = new Bundle(descriptor.mBundle);
26011417b1cfde8f1749905f2d735623af9214148afJeff Brown
26111417b1cfde8f1749905f2d735623af9214148afJeff Brown            descriptor.ensureControlFilters();
26211417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!descriptor.mControlFilters.isEmpty()) {
26311417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters = new ArrayList<IntentFilter>(descriptor.mControlFilters);
26411417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
26511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
26611417b1cfde8f1749905f2d735623af9214148afJeff Brown
26711417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
26811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the unique id of the route.
269cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * <p>
270cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * The route id associated with a route descriptor functions as a stable
271cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * identifier for the route and must be unique among all routes offered
272cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * by the provider.
273cb63b6ecac9786891514f241dec71695f09d3efbJeff Brown         * </p>
27411417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
27511417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setId(String id) {
27611417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putString(KEY_ID, id);
27711417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
27811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
27911417b1cfde8f1749905f2d735623af9214148afJeff Brown
28011417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
281d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * Sets the user-visible name of the route.
282d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * <p>
283d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * The route name identifies the destination represented by the route.
284d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * It may be a user-supplied name, an alias, or device serial number.
285d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * </p>
28611417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
28711417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setName(String name) {
28811417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putString(KEY_NAME, name);
28911417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
29011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
29111417b1cfde8f1749905f2d735623af9214148afJeff Brown
29211417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
293d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * Sets the user-visible description of the route.
294d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * <p>
295d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * The route description describes the kind of destination represented by the route.
296d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * It may be a user-supplied string, a model number or brand of device.
297d63957d28aaabcec588b8cde12eac16414783aebJeff Brown         * </p>
29811417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
299d63957d28aaabcec588b8cde12eac16414783aebJeff Brown        public Builder setDescription(String description) {
300d63957d28aaabcec588b8cde12eac16414783aebJeff Brown            mBundle.putString(KEY_DESCRIPTION, description);
30111417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
30211417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
30311417b1cfde8f1749905f2d735623af9214148afJeff Brown
30411417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
30511417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets whether the route is enabled.
30611417b1cfde8f1749905f2d735623af9214148afJeff Brown         * <p>
30711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Disabled routes represent routes that a route provider knows about, such as paired
30811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Wifi Display receivers, but that are not currently available for use.
30911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * </p>
31011417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
31111417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setEnabled(boolean enabled) {
31211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBoolean(KEY_ENABLED, enabled);
31311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
31411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
31511417b1cfde8f1749905f2d735623af9214148afJeff Brown
31611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
31711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets whether the route is in the process of connecting and is not yet
31811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * ready for use.
31911417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
32011417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setConnecting(boolean connecting) {
32111417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBoolean(KEY_CONNECTING, connecting);
32211417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
32311417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
32411417b1cfde8f1749905f2d735623af9214148afJeff Brown
32511417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
32611417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a {@link MediaControlIntent media control intent} filter for the route.
32711417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
32811417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder addControlFilter(IntentFilter filter) {
32911417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (filter == null) {
33011417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("filter must not be null");
33111417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
33211417b1cfde8f1749905f2d735623af9214148afJeff Brown
33311417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlFilters == null) {
33411417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters = new ArrayList<IntentFilter>();
33511417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
33611417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!mControlFilters.contains(filter)) {
33711417b1cfde8f1749905f2d735623af9214148afJeff Brown                mControlFilters.add(filter);
33811417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
33911417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
34011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
34111417b1cfde8f1749905f2d735623af9214148afJeff Brown
34211417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
34311417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a list of {@link MediaControlIntent media control intent} filters for the route.
34411417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
3457599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown        public Builder addControlFilters(Collection<IntentFilter> filters) {
34611417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (filters == null) {
34711417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("filters must not be null");
34811417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
34911417b1cfde8f1749905f2d735623af9214148afJeff Brown
3507599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown            if (!filters.isEmpty()) {
3517599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown                for (IntentFilter filter : filters) {
3527599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown                    addControlFilter(filter);
3537599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown                }
35411417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
35511417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
35611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
35711417b1cfde8f1749905f2d735623af9214148afJeff Brown
35811417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
35911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's playback type.
36011417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
36111417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setPlaybackType(int playbackType) {
36211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
36311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
36411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
36511417b1cfde8f1749905f2d735623af9214148afJeff Brown
36611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
36711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's playback stream.
36811417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
36911417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setPlaybackStream(int playbackStream) {
37011417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
37111417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
37211417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
37311417b1cfde8f1749905f2d735623af9214148afJeff Brown
37411417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
37511417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's current volume, or 0 if unknown.
37611417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
37711417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setVolume(int volume) {
37811417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_VOLUME, volume);
37911417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
38011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
38111417b1cfde8f1749905f2d735623af9214148afJeff Brown
38211417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
38311417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's maximum volume, or 0 if unknown.
38411417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
38511417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setVolumeMax(int volumeMax) {
38611417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
38711417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
38811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
38911417b1cfde8f1749905f2d735623af9214148afJeff Brown
39011417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
39111417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's volume handling.
39211417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
39311417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setVolumeHandling(int volumeHandling) {
39411417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
39511417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
39611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
39711417b1cfde8f1749905f2d735623af9214148afJeff Brown
39811417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
39911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets the route's presentation display id, or -1 if none.
40011417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
40111417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setPresentationDisplayId(int presentationDisplayId) {
40211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
40311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
40411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
40511417b1cfde8f1749905f2d735623af9214148afJeff Brown
40611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
40711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets a bundle of extras for this route descriptor.
40811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * The extras will be ignored by the media router but they may be used
40911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * by applications.
41011417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
41111417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setExtras(Bundle extras) {
41211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBundle(KEY_EXTRAS, extras);
41311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
41411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
41511417b1cfde8f1749905f2d735623af9214148afJeff Brown
41611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
41711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Builds the {@link MediaRouteDescriptor media route descriptor}.
41811417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
41911417b1cfde8f1749905f2d735623af9214148afJeff Brown        public MediaRouteDescriptor build() {
42011417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlFilters != null) {
42111417b1cfde8f1749905f2d735623af9214148afJeff Brown                mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, mControlFilters);
42211417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
42355b361aea868e53e848bc45af3a55ae43e7871c3Jeff Brown            return new MediaRouteDescriptor(mBundle, mControlFilters);
42411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
42511417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
42611417b1cfde8f1749905f2d735623af9214148afJeff Brown}