PlaybackStateCompat.java revision e49860b0f76d8336c1d41831ed370b0ff94278ef
124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/*
224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Copyright (C) 2014 The Android Open Source Project
324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * you may not use this file except in compliance with the License.
624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * You may obtain a copy of the License at
724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
1024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Unless required by applicable law or agreed to in writing, software
1124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * See the License for the specific language governing permissions and
1424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * limitations under the License.
1524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */
1624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownpackage android.support.v4.media.session;
1724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Build;
19aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErikimport android.os.Bundle;
2024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcel;
2124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcelable;
2224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.SystemClock;
2324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.text.TextUtils;
2424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
2524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/**
2624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Playback state for a {@link MediaSessionCompat}. This includes a state like
2724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * {@link PlaybackStateCompat#STATE_PLAYING}, the current playback position,
2824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * and the current control capabilities.
2924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */
3024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownpublic final class PlaybackStateCompat implements Parcelable {
31ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik
3224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
33ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the stop command.
3424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
35ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
3624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
3724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_STOP = 1 << 0;
3824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
3924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
40ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the pause command.
4124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
42ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
4324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
4424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_PAUSE = 1 << 1;
4524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
4624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
47ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the play command.
4824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
49ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
5024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
5124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_PLAY = 1 << 2;
5224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
5324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
54ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the rewind command.
5524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
56ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
5724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
5824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_REWIND = 1 << 3;
5924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
6024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
61ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the previous command.
6224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
63ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
6424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
6524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SKIP_TO_PREVIOUS = 1 << 4;
6624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
6724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
68ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the next command.
6924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
70ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
7124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
7224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SKIP_TO_NEXT = 1 << 5;
7324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
75ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the fast forward command.
7624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
77ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
7824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
7924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_FAST_FORWARD = 1 << 6;
8024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
82ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the set rating command.
8324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
84ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
8524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
8624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SET_RATING = 1 << 7;
8724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
89ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the seek to command.
9024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
91ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
9224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
9324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SEEK_TO = 1 << 8;
9424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
96ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the play/pause toggle command.
9724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
98ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
9924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
10024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_PLAY_PAUSE = 1 << 9;
10124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
103ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the play from media id command.
104ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     *
105ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
106ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     */
107ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik    public static final long ACTION_PLAY_FROM_MEDIA_ID = 1 << 10;
108ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik
109ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik    /**
110ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the play from search command.
111ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     *
112ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
113ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     */
114ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik    public static final long ACTION_PLAY_FROM_SEARCH = 1 << 11;
115ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik
116ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik    /**
117ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * Indicates this session supports the skip to queue item command.
118ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     *
119ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     * @see Builder#setActions(long)
120ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik     */
121ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik    public static final long ACTION_SKIP_TO_QUEUE_ITEM = 1 << 12;
122ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik
123ff40f5c731e8a4e6e2d33ffc95f77dce0397f2c5RoboErik    /**
12424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * This is the default playback state and indicates that no media has been
12524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * added yet, or the performer has been reset and has no content to play.
12624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
12724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
12824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
12924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_NONE = 0;
13024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
13124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
13224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently stopped.
13324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
13424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
13524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
13624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_STOPPED = 1;
13724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
13824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
13924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently paused.
14024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
14124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
14224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
14324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_PAUSED = 2;
14424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
14524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
14624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently playing.
14724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
14824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
14924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
15024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_PLAYING = 3;
15124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
15224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
15324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently fast forwarding.
15424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
15524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
15624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
15724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_FAST_FORWARDING = 4;
15824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
15924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
16024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently rewinding.
16124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
16224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
16324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
16424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_REWINDING = 5;
16524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
16624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
16724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently buffering and will begin playing
16824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * when enough data has buffered.
16924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
17024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
17124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
17224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_BUFFERING = 6;
17324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
17424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
17524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently in an error state. The error
17624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * message should also be set when entering this state.
17724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
17824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
17924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
18024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_ERROR = 7;
18124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
18224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
18324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating the class doing playback is currently connecting to a
18424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * route. Depending on the implementation you may return to the previous
18524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * state when the connection finishes or enter {@link #STATE_NONE}. If
18624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * the connection failed {@link #STATE_ERROR} should be used.
18724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @hide
18824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
18924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_CONNECTING = 8;
19024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
19124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
19224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating the player is currently skipping to the previous item.
19324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
19424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
19524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
19624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_SKIPPING_TO_PREVIOUS = 9;
19724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
19824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
19924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating the player is currently skipping to the next item.
20024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
20124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
20224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
20324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_SKIPPING_TO_NEXT = 10;
20424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
20624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Use this value for the position to indicate the position is not known.
20724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
20824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static long PLAYBACK_POSITION_UNKNOWN = -1;
20924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
21024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final int mState;
21124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final long mPosition;
212312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik    private final long mBufferedPosition;
21384b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik    private final float mSpeed;
21424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final long mActions;
21524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final CharSequence mErrorMessage;
21624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final long mUpdateTime;
21724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
21824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private Object mStateObj;
21924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
220312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik    private PlaybackStateCompat(int state, long position, long bufferedPosition,
22124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            float rate, long actions, CharSequence errorMessage, long updateTime) {
22224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mState = state;
22324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mPosition = position;
224312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        mBufferedPosition = bufferedPosition;
22584b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        mSpeed = rate;
22624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mActions = actions;
22724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mErrorMessage = errorMessage;
22824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mUpdateTime = updateTime;
22924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
23024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
23124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private PlaybackStateCompat(Parcel in) {
23224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mState = in.readInt();
23324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mPosition = in.readLong();
23484b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        mSpeed = in.readFloat();
23524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mUpdateTime = in.readLong();
236312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        mBufferedPosition = in.readLong();
23724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mActions = in.readLong();
23824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mErrorMessage = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
23924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
24024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
24124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
24224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public String toString() {
24324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        StringBuilder bob = new StringBuilder("PlaybackState {");
24424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append("state=").append(mState);
24524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", position=").append(mPosition);
246312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        bob.append(", buffered position=").append(mBufferedPosition);
24784b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        bob.append(", speed=").append(mSpeed);
24824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", updated=").append(mUpdateTime);
24924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", actions=").append(mActions);
25024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", error=").append(mErrorMessage);
25124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append("}");
25224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return bob.toString();
25324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
25424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
25524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
25624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public int describeContents() {
25724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return 0;
25824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
25924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
26024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
26124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
26224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeInt(mState);
26324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeLong(mPosition);
26484b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        dest.writeFloat(mSpeed);
26524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeLong(mUpdateTime);
266312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        dest.writeLong(mBufferedPosition);
26724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeLong(mActions);
26824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        TextUtils.writeToParcel(mErrorMessage, dest, flags);
26924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
27024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
27124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
27224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the current state of playback. One of the following:
27324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <ul>
27424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_NONE}</li>
27524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_STOPPED}</li>
27624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_PLAYING}</li>
27724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_PAUSED}</li>
27824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_FAST_FORWARDING}</li>
27924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_REWINDING}</li>
28024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_BUFFERING}</li>
28124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_ERROR}</li>
28224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
28324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public int getState() {
28424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mState;
28524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
28624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
28724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
28824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the current playback position in ms.
28924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
29024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public long getPosition() {
29124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mPosition;
29224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
29324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
29424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
295312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik     * Get the current buffered position in ms. This is the farthest playback
29624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * point that can be reached from the current position using only buffered
29724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * content.
29824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
299312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik    public long getBufferedPosition() {
300312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        return mBufferedPosition;
30124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
30224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
30324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
30484b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik     * Get the current playback speed as a multiple of normal playback. This
30524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * should be negative when rewinding. A value of 1 means normal playback and
30624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * 0 means paused.
30724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
30884b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik     * @return The current speed of playback.
30924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
31084b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik    public float getPlaybackSpeed() {
31184b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        return mSpeed;
31224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
31324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
31424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
31524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the current actions available on this session. This should use a
31624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * bitmask of the available actions.
31724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <ul>
31824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_PREVIOUS}</li>
31924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_REWIND}</li>
32024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_PLAY}</li>
32124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_PAUSE}</li>
32224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_STOP}</li>
32324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_FAST_FORWARD}</li>
32424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_NEXT}</li>
32524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SEEK_TO}</li>
32624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SET_RATING}</li>
32724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </ul>
32824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
32924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public long getActions() {
33024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mActions;
33124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
33224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
33324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
33424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get a user readable error message. This should be set when the state is
33524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * {@link PlaybackStateCompat#STATE_ERROR}.
33624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
33724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public CharSequence getErrorMessage() {
33824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mErrorMessage;
33924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
34024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
34124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
34224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the elapsed real time at which position was last updated. If the
34324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * position has never been set this will return 0;
34424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
34524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return The last time the position was updated.
34624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
34724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public long getLastPositionUpdateTime() {
34824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mUpdateTime;
34924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
35024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
35124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
35224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Creates an instance from a framework {@link android.media.session.PlaybackState} object.
35324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <p>
35424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * This method is only supported on API 21+.
35524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </p>
35624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
35724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param stateObj A {@link android.media.session.PlaybackState} object, or null if none.
35824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return An equivalent {@link PlaybackStateCompat} object, or null if none.
35924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
36024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static PlaybackStateCompat fromPlaybackState(Object stateObj) {
36124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if (stateObj == null || Build.VERSION.SDK_INT < 21) {
36224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return null;
36324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
36424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
36524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        PlaybackStateCompat state = new PlaybackStateCompat(
36624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getState(stateObj),
36724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getPosition(stateObj),
368312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik                PlaybackStateCompatApi21.getBufferedPosition(stateObj),
36984b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik                PlaybackStateCompatApi21.getPlaybackSpeed(stateObj),
37024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getActions(stateObj),
37124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getErrorMessage(stateObj),
37224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getLastPositionUpdateTime(stateObj));
37324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        state.mStateObj = stateObj;
37424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return state;
37524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
37624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
37724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
37824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Gets the underlying framework {@link android.media.session.PlaybackState} object.
37924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <p>
38024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * This method is only supported on API 21+.
38124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </p>
38224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
38324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return An equivalent {@link android.media.session.PlaybackState} object, or null if none.
38424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
38524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public Object getPlaybackState() {
38624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if (mStateObj != null || Build.VERSION.SDK_INT < 21) {
38724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return mStateObj;
38824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
38924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
390312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        mStateObj = PlaybackStateCompatApi21.newInstance(mState, mPosition, mBufferedPosition,
39184b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik                mSpeed, mActions, mErrorMessage, mUpdateTime);
39224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mStateObj;
39324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
39424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
39524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final Parcelable.Creator<PlaybackStateCompat> CREATOR =
39624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            new Parcelable.Creator<PlaybackStateCompat>() {
39724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
39824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public PlaybackStateCompat createFromParcel(Parcel in) {
39924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new PlaybackStateCompat(in);
40024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
40124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
40224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
40324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public PlaybackStateCompat[] newArray(int size) {
40424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new PlaybackStateCompat[size];
40524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
40624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    };
40724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
40824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
409aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik     * {@link PlaybackStateCompat.CustomAction CustomActions} can be used to
410aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik     * extend the capabilities of the standard transport controls by exposing
411aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik     * app specific actions to {@link MediaControllerCompat Controllers}.
412aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik     */
413aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik    public static final class CustomAction implements Parcelable {
414aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        private final String mAction;
415aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        private final CharSequence mName;
416aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        private final int mIcon;
417aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        private final Bundle mExtras;
418aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
419aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        /**
420aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Use {@link PlaybackStateCompat.CustomAction.Builder#build()}.
421aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         */
422aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        private CustomAction(String action, CharSequence name, int icon, Bundle extras) {
423aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mAction = action;
424aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mName = name;
425aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mIcon = icon;
426aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mExtras = extras;
427aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
428aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
429aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        private CustomAction(Parcel in) {
430aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mAction = in.readString();
431aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
432aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mIcon = in.readInt();
433aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            mExtras = in.readBundle();
434aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
435aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
436aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        @Override
437aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public void writeToParcel(Parcel dest, int flags) {
438aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            dest.writeString(mAction);
439aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            TextUtils.writeToParcel(mName, dest, flags);
440aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            dest.writeInt(mIcon);
441aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            dest.writeBundle(mExtras);
442aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
443aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
444aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        @Override
445aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public int describeContents() {
446aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            return 0;
447aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
448aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
449aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public static final Parcelable.Creator<PlaybackStateCompat.CustomAction> CREATOR
450aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                = new Parcelable.Creator<PlaybackStateCompat.CustomAction>() {
451aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
452aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    @Override
453aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    public PlaybackStateCompat.CustomAction createFromParcel(Parcel p) {
454aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                        return new PlaybackStateCompat.CustomAction(p);
455aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    }
456aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
457aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    @Override
458aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    public PlaybackStateCompat.CustomAction[] newArray(int size) {
459aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                        return new PlaybackStateCompat.CustomAction[size];
460aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    }
461aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                };
462aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
463aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        /**
464aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Returns the action of the {@link CustomAction}.
465aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         *
466aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * @return The action of the {@link CustomAction}.
467aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         */
468aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public String getAction() {
469aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            return mAction;
470aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
471aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
472aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        /**
473aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Returns the display name of this action. e.g. "Favorite"
474aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         *
475aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * @return The display name of this {@link CustomAction}.
476aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         */
477aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public CharSequence getName() {
478aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            return mName;
479aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
480aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
481aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        /**
482aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Returns the resource id of the icon in the {@link MediaSessionCompat
483aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Session's} package.
484aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         *
485aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * @return The resource id of the icon in the {@link MediaSessionCompat
486aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         *         Session's} package.
487aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         */
488aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public int getIcon() {
489aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            return mIcon;
490aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
491aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
492aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        /**
493aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Returns extras which provide additional application-specific
494aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * information about the action, or null if none. These arguments are
495aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * meant to be consumed by a {@link MediaControllerCompat} if it knows
496aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * how to handle them.
497aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         *
498aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * @return Optional arguments for the {@link CustomAction}.
499aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         */
500aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public Bundle getExtras() {
501aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            return mExtras;
502aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
503aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
504aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        @Override
505aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public String toString() {
506aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            return "Action:" +
507aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    "mName='" + mName +
508aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    ", mIcon=" + mIcon +
509aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    ", mExtras=" + mExtras;
510aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
511aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
512aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        /**
513aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         * Builder for {@link CustomAction} objects.
514aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik         */
515aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        public static final class Builder {
516aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            private final String mAction;
517aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            private final CharSequence mName;
518aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            private final int mIcon;
519aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            private Bundle mExtras;
520aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
521aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            /**
522aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * Creates a {@link CustomAction} builder with the id, name, and
523aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * icon set.
524aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *
525aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * @param action The action of the {@link CustomAction}.
526aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * @param name The display name of the {@link CustomAction}. This
527aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *            name will be displayed along side the action if the UI
528aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *            supports it.
529aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * @param icon The icon resource id of the {@link CustomAction}.
530aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *            This resource id must be in the same package as the
531aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *            {@link MediaSessionCompat}. It will be displayed with
532aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *            the custom action if the UI supports it.
533aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             */
534aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            public Builder(String action, CharSequence name, int icon) {
535aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                if (TextUtils.isEmpty(action)) {
536aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    throw new IllegalArgumentException(
537aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                            "You must specify an action to build a CustomAction.");
538aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                }
539aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                if (TextUtils.isEmpty(name)) {
540aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    throw new IllegalArgumentException(
541aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                            "You must specify a name to build a CustomAction.");
542aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                }
543aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                if (icon == 0) {
544aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                    throw new IllegalArgumentException(
545aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                            "You must specify an icon resource id to build a CustomAction.");
546aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                }
547aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                mAction = action;
548aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                mName = name;
549aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                mIcon = icon;
550aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            }
551aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
552aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            /**
553aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * Set optional extras for the {@link CustomAction}. These extras
554aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * are meant to be consumed by a {@link MediaControllerCompat} if it
555aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * knows how to handle them. Keys should be fully qualified (e.g.
556aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * "com.example.MY_ARG") to avoid collisions.
557aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *
558aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * @param extras Optional extras for the {@link CustomAction}.
559aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * @return this.
560aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             */
561aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            public Builder setExtras(Bundle extras) {
562aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                mExtras = extras;
563aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                return this;
564aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            }
565aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
566aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            /**
567aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * Build and return the {@link CustomAction} instance with the
568aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * specified values.
569aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             *
570aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             * @return A new {@link CustomAction} instance.
571aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik             */
572aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            public CustomAction build() {
573aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik                return new CustomAction(mAction, mName, mIcon, mExtras);
574aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik            }
575aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik        }
576aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik    }
577aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik
578aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik    /**
57924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Builder for {@link PlaybackStateCompat} objects.
58024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
58124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final class Builder {
58224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private int mState;
58324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private long mPosition;
584312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        private long mBufferedPosition;
58524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private float mRate;
58624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private long mActions;
58724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private CharSequence mErrorMessage;
58824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private long mUpdateTime;
58924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
59024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
59124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Create an empty Builder.
59224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
59324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public Builder() {
59424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
59524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
59624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
59724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Create a Builder using a {@link PlaybackStateCompat} instance to set the
59824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * initial values.
59924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         *
60024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param source The playback state to copy.
60124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
60224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public Builder(PlaybackStateCompat source) {
60324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mState = source.mState;
60424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mPosition = source.mPosition;
60584b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik            mRate = source.mSpeed;
60624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mUpdateTime = source.mUpdateTime;
607312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik            mBufferedPosition = source.mBufferedPosition;
60824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mActions = source.mActions;
60924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mErrorMessage = source.mErrorMessage;
61024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
61124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
61224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
61324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Set the current state of playback.
61424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <p>
615e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * The position must be in ms and indicates the current playback
616e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * position within the track. If the position is unknown use
61724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * {@link #PLAYBACK_POSITION_UNKNOWN}.
61824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <p>
619e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * The rate is a multiple of normal playback and should be 0 when paused
620e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * and negative when rewinding. Normal playback rate is 1.0.
62124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <p>
62224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * The state must be one of the following:
62324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <ul>
62424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_NONE}</li>
62524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_STOPPED}</li>
62624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_PLAYING}</li>
62724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_PAUSED}</li>
62824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_FAST_FORWARDING}</li>
62924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_REWINDING}</li>
63024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_BUFFERING}</li>
63124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_ERROR}</li>
63224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * </ul>
63324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         *
63424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param state The current state of playback.
63524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param position The position in the current track in ms.
636e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @param playbackSpeed The current rate of playback as a multiple of
637e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *            normal playback.
63824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
639e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public Builder setState(int state, long position, float playbackSpeed) {
640e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            return setState(state, position, playbackSpeed, SystemClock.elapsedRealtime());
641e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        }
642e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
643e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        /**
644e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * Set the current state of playback.
645e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <p>
646e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * The position must be in ms and indicates the current playback
647e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * position within the track. If the position is unknown use
648e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * {@link #PLAYBACK_POSITION_UNKNOWN}.
649e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <p>
650e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * The rate is a multiple of normal playback and should be 0 when paused
651e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * and negative when rewinding. Normal playback rate is 1.0.
652e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <p>
653e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * The state must be one of the following:
654e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <ul>
655e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_NONE}</li>
656e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_STOPPED}</li>
657e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_PLAYING}</li>
658e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_PAUSED}</li>
659e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_FAST_FORWARDING}</li>
660e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_REWINDING}</li>
661e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_BUFFERING}</li>
662e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * <li> {@link PlaybackStateCompat#STATE_ERROR}</li>
663e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * </ul>
664e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *
665e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @param state The current state of playback.
666e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @param position The position in the current item in ms.
667e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @param playbackSpeed The current speed of playback as a multiple of
668e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *            normal playback.
669e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @param updateTime The time in the {@link SystemClock#elapsedRealtime}
670e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *            timebase that the position was updated at.
671e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @return this
672e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         */
673e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public Builder setState(int state, long position, float playbackSpeed, long updateTime) {
674e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            mState = state;
675e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            mPosition = position;
676e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            mUpdateTime = updateTime;
677e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            mRate = playbackSpeed;
678e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            return this;
67924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
68024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
68124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
682312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik         * Set the current buffered position in ms. This is the farthest
683312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik         * playback point that can be reached from the current position using
684312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik         * only buffered content.
685e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *
686e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @return this
68724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
688e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public Builder setBufferedPosition(long bufferPosition) {
689312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik            mBufferedPosition = bufferPosition;
690e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            return this;
69124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
69224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
69324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
694e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * Set the current capabilities available on this session. This should
695e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * use a bitmask of the available capabilities.
69624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <ul>
69724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_PREVIOUS}</li>
69824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_REWIND}</li>
69924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_PLAY}</li>
70024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_PAUSE}</li>
70124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_STOP}</li>
70224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_FAST_FORWARD}</li>
70324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_NEXT}</li>
70424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SEEK_TO}</li>
70524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SET_RATING}</li>
70624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * </ul>
707e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *
708e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @return this
70924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
710e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public Builder setActions(long capabilities) {
71124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mActions = capabilities;
712e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            return this;
71324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
71424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
71524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
716e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * Set a user readable error message. This should be set when the state
717e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * is {@link PlaybackStateCompat#STATE_ERROR}.
718e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         *
719e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik         * @return this
72024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
721e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public Builder setErrorMessage(CharSequence errorMessage) {
72224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mErrorMessage = errorMessage;
723e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik            return this;
72424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
72524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
72624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
72724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Creates the playback state object.
72824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
72924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public PlaybackStateCompat build() {
730312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik            return new PlaybackStateCompat(mState, mPosition, mBufferedPosition,
73124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                    mRate, mActions, mErrorMessage, mUpdateTime);
73224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
73324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
73424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
735