1b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown/* 2b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Copyright (C) 2013 The Android Open Source Project 3b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 4b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * you may not use this file except in compliance with the License. 6b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * You may obtain a copy of the License at 7b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 8b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 10b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Unless required by applicable law or agreed to in writing, software 11b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * See the License for the specific language governing permissions and 14b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * limitations under the License. 15b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 16b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 17b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brownpackage android.support.v7.media; 18b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 19b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brownimport android.app.PendingIntent; 20b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brownimport android.os.Bundle; 21b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brownimport android.os.SystemClock; 22b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brownimport android.support.v4.util.TimeUtils; 23b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 24b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown/** 25b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Describes the playback status of a media session. 26b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * <p> 27b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * This class is part of the remote playback protocol described by the 28b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * {@link MediaControlIntent MediaControlIntent} class. 29b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p><p> 30b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * When a media session is created, it is initially in the 31b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * {@link #SESSION_STATE_ACTIVE active} state. When the media session ends 32b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * normally, it transitions to the {@link #SESSION_STATE_ENDED ended} state. 33b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * If the media session is invalidated due to another session forcibly taking 34b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * control of the route, then it transitions to the 35b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * {@link #SESSION_STATE_INVALIDATED invalidated} state. 36b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Refer to the documentation of each state for an explanation of its meaning. 37b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p><p> 38b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * To monitor session status, the application should supply a {@link PendingIntent} to use as the 39b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * {@link MediaControlIntent#EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receiver} 40b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * for a given {@link MediaControlIntent#ACTION_START_SESSION session start request}. 41b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p><p> 42b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * This object is immutable once created using a {@link Builder} instance. 43b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p> 44b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 45b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brownpublic final class MediaSessionStatus { 46b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private static final String KEY_TIMESTAMP = "timestamp"; 47b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private static final String KEY_SESSION_STATE = "sessionState"; 48b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private static final String KEY_QUEUE_PAUSED = "queuePaused"; 49b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private static final String KEY_EXTRAS = "extras"; 50b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 51b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private final Bundle mBundle; 52b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 53b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 54b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Session state: Active. 55b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * <p> 56b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Indicates that the media session is active and in control of the route. 57b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p> 58b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 59b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public static final int SESSION_STATE_ACTIVE = 0; 60b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 61b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 62b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Session state: Ended. 63b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * <p> 64b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Indicates that the media session was ended normally using the 65b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * {@link MediaControlIntent#ACTION_END_SESSION end session} action. 66b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p><p> 67b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * A terminated media session cannot be used anymore. To play more media, the 68b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * application must start a new session. 69b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p> 70b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 71b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public static final int SESSION_STATE_ENDED = 1; 72b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 73b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 74b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Session state: Invalidated. 75b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * <p> 76b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Indicates that the media session was invalidated involuntarily due to 77b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * another session taking control of the route. 78b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p><p> 79b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * An invalidated media session cannot be used anymore. To play more media, the 80b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * application must start a new session. 81b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * </p> 82b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 83b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public static final int SESSION_STATE_INVALIDATED = 2; 84b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 85b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private MediaSessionStatus(Bundle bundle) { 86b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle = bundle; 87b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 88b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 89b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 90b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Gets the timestamp associated with the status information in 91b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base. 92b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 93b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @return The status timestamp in the {@link SystemClock#elapsedRealtime()} time base. 94b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 95b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public long getTimestamp() { 96b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return mBundle.getLong(KEY_TIMESTAMP); 97b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 98b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 99b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 100b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Gets the session state. 101b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 102b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @return The session state. One of {@link #SESSION_STATE_ACTIVE}, 103b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * {@link #SESSION_STATE_ENDED}, or {@link #SESSION_STATE_INVALIDATED}. 104b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 105b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public int getSessionState() { 106b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return mBundle.getInt(KEY_SESSION_STATE, SESSION_STATE_INVALIDATED); 107b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 108b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 109b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 110b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Returns true if the session's queue is paused. 111b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 112b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @return True if the session's queue is paused. 113b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 114b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public boolean isQueuePaused() { 115b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return mBundle.getBoolean(KEY_QUEUE_PAUSED); 116b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 117b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 118b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 119b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Gets a bundle of extras for this status object. 120b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * The extras will be ignored by the media router but they may be used 121b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * by applications. 122b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 123b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Bundle getExtras() { 124b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return mBundle.getBundle(KEY_EXTRAS); 125b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 126b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 127b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown @Override 128b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public String toString() { 129b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown StringBuilder result = new StringBuilder(); 130b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append("MediaSessionStatus{ "); 131b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append("timestamp="); 132b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown TimeUtils.formatDuration(SystemClock.elapsedRealtime() - getTimestamp(), result); 133b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append(" ms ago"); 134b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append(", sessionState=").append(sessionStateToString(getSessionState())); 135b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append(", queuePaused=").append(isQueuePaused()); 136b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append(", extras=").append(getExtras()); 137b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown result.append(" }"); 138b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return result.toString(); 139b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 140b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 141b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private static String sessionStateToString(int sessionState) { 142b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown switch (sessionState) { 143b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown case SESSION_STATE_ACTIVE: 144b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return "active"; 145b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown case SESSION_STATE_ENDED: 146b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return "ended"; 147b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown case SESSION_STATE_INVALIDATED: 148b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return "invalidated"; 149b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 150b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return Integer.toString(sessionState); 151b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 152b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 153b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 154b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Converts this object to a bundle for serialization. 155b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 156b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @return The contents of the object represented as a bundle. 157b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 158b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Bundle asBundle() { 159b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return mBundle; 160b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 161b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 162b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 163b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Creates an instance from a bundle. 164b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 165b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @param bundle The bundle, or null if none. 166b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @return The new instance, or null if the bundle was null. 167b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 168b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public static MediaSessionStatus fromBundle(Bundle bundle) { 169b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return bundle != null ? new MediaSessionStatus(bundle) : null; 170b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 171b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 172b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 173b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Builder for {@link MediaSessionStatus media session status objects}. 174b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 175b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public static final class Builder { 176b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown private final Bundle mBundle; 177b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 178b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 179b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Creates a media session status builder using the current time as the 180b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * reference timestamp. 181b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * 182b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * @param sessionState The session state. 183b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 184b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Builder(int sessionState) { 185b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle = new Bundle(); 186b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown setTimestamp(SystemClock.elapsedRealtime()); 187b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown setSessionState(sessionState); 188b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 189b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 190b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 191b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Creates a media session status builder whose initial contents are 192b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * copied from an existing status. 193b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 194b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Builder(MediaSessionStatus status) { 195b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown if (status == null) { 196b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown throw new IllegalArgumentException("status must not be null"); 197b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 198b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 199b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle = new Bundle(status.mBundle); 200b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 201b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 202b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 203b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Sets the timestamp associated with the status information in 204b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base. 205b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 206b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Builder setTimestamp(long elapsedRealtimeTimestamp) { 207b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp); 208b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return this; 209b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 210b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 211b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 212b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Sets the session state. 213b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 214b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Builder setSessionState(int sessionState) { 215b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle.putInt(KEY_SESSION_STATE, sessionState); 216b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return this; 217b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 218b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 219b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 220b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Sets whether the queue is paused. 221b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 222b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Builder setQueuePaused(boolean queuePaused) { 223b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle.putBoolean(KEY_QUEUE_PAUSED, queuePaused); 224b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return this; 225b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 226b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 227b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 228b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Sets a bundle of extras for this status object. 229b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * The extras will be ignored by the media router but they may be used 230b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * by applications. 231b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 232b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public Builder setExtras(Bundle extras) { 233b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown mBundle.putBundle(KEY_EXTRAS, extras); 234b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return this; 235b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 236b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown 237b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown /** 238b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown * Builds the {@link MediaSessionStatus media session status object}. 239b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown */ 240b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown public MediaSessionStatus build() { 241b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown return new MediaSessionStatus(mBundle); 242b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 243b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown } 244b8e8322e718125cdacfac70e9605d8f9b563e6eeJeff Brown} 245