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