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