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}