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