PlaybackStateCompat.java revision 312f13dea7b4a9229dff784c6e94b0ec0c722b74
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;
1924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcel;
2024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcelable;
2124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.SystemClock;
2224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.text.TextUtils;
2324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
2424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/**
2524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Playback state for a {@link MediaSessionCompat}. This includes a state like
2624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * {@link PlaybackStateCompat#STATE_PLAYING}, the current playback position,
2724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * and the current control capabilities.
2824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */
2924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownpublic final class PlaybackStateCompat implements Parcelable {
3024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
3124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the stop command.
3224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
3324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
3424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
3524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_STOP = 1 << 0;
3624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
3724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
3824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the pause command.
3924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
4024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
4124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
4224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_PAUSE = 1 << 1;
4324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
4424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
4524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the play command.
4624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
4724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
4824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
4924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_PLAY = 1 << 2;
5024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
5124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
5224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the rewind command.
5324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
5424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
5524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
5624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_REWIND = 1 << 3;
5724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
5824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
5924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the previous command.
6024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
6124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
6224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
6324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SKIP_TO_PREVIOUS = 1 << 4;
6424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
6524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
6624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the next command.
6724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
6824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
6924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
7024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SKIP_TO_NEXT = 1 << 5;
7124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
7324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the fast forward command.
7424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
7524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
7624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
7724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_FAST_FORWARD = 1 << 6;
7824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
8024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the set rating command.
8124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
8224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
8324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
8424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SET_RATING = 1 << 7;
8524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
8724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the seek to command.
8824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
8924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
9024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
9124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_SEEK_TO = 1 << 8;
9224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
9424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates this performer supports the play/pause toggle command.
9524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
9624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setActions
9724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
9824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final long ACTION_PLAY_PAUSE = 1 << 9;
9924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
10124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * This is the default playback state and indicates that no media has been
10224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * added yet, or the performer has been reset and has no content to play.
10324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
10424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
10524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
10624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_NONE = 0;
10724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
10924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently stopped.
11024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
11124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
11224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
11324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_STOPPED = 1;
11424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
11524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
11624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently paused.
11724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
11824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
11924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
12024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_PAUSED = 2;
12124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
12224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
12324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently playing.
12424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
12524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
12624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
12724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_PLAYING = 3;
12824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
12924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
13024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently fast forwarding.
13124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
13224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
13324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
13424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_FAST_FORWARDING = 4;
13524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
13624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
13724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently rewinding.
13824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
13924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
14024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
14124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_REWINDING = 5;
14224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
14324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
14424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently buffering and will begin playing
14524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * when enough data has buffered.
14624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
14724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
14824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
14924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_BUFFERING = 6;
15024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
15124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
15224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating this item is currently in an error state. The error
15324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * message should also be set when entering this state.
15424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
15524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
15624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
15724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_ERROR = 7;
15824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
15924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
16024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating the class doing playback is currently connecting to a
16124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * route. Depending on the implementation you may return to the previous
16224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * state when the connection finishes or enter {@link #STATE_NONE}. If
16324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * the connection failed {@link #STATE_ERROR} should be used.
16424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @hide
16524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
16624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_CONNECTING = 8;
16724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
16824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
16924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating the player is currently skipping to the previous item.
17024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
17124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
17224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
17324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_SKIPPING_TO_PREVIOUS = 9;
17424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
17524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
17624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * State indicating the player is currently skipping to the next item.
17724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
17824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @see Builder#setState
17924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
18024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int STATE_SKIPPING_TO_NEXT = 10;
18124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
18224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
18324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Use this value for the position to indicate the position is not known.
18424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
18524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static long PLAYBACK_POSITION_UNKNOWN = -1;
18624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
18724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final int mState;
18824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final long mPosition;
189312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik    private final long mBufferedPosition;
19084b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik    private final float mSpeed;
19124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final long mActions;
19224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final CharSequence mErrorMessage;
19324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final long mUpdateTime;
19424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
19524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private Object mStateObj;
19624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
197312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik    private PlaybackStateCompat(int state, long position, long bufferedPosition,
19824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            float rate, long actions, CharSequence errorMessage, long updateTime) {
19924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mState = state;
20024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mPosition = position;
201312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        mBufferedPosition = bufferedPosition;
20284b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        mSpeed = rate;
20324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mActions = actions;
20424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mErrorMessage = errorMessage;
20524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mUpdateTime = updateTime;
20624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
20724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private PlaybackStateCompat(Parcel in) {
20924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mState = in.readInt();
21024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mPosition = in.readLong();
21184b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        mSpeed = in.readFloat();
21224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mUpdateTime = in.readLong();
213312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        mBufferedPosition = in.readLong();
21424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mActions = in.readLong();
21524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mErrorMessage = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
21624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
21724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
21824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
21924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public String toString() {
22024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        StringBuilder bob = new StringBuilder("PlaybackState {");
22124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append("state=").append(mState);
22224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", position=").append(mPosition);
223312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        bob.append(", buffered position=").append(mBufferedPosition);
22484b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        bob.append(", speed=").append(mSpeed);
22524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", updated=").append(mUpdateTime);
22624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", actions=").append(mActions);
22724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append(", error=").append(mErrorMessage);
22824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        bob.append("}");
22924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return bob.toString();
23024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
23124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
23224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
23324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public int describeContents() {
23424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return 0;
23524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
23624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
23724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
23824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
23924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeInt(mState);
24024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeLong(mPosition);
24184b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        dest.writeFloat(mSpeed);
24224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeLong(mUpdateTime);
243312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        dest.writeLong(mBufferedPosition);
24424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeLong(mActions);
24524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        TextUtils.writeToParcel(mErrorMessage, dest, flags);
24624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
24724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
24824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
24924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the current state of playback. One of the following:
25024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <ul>
25124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_NONE}</li>
25224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_STOPPED}</li>
25324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_PLAYING}</li>
25424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_PAUSED}</li>
25524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_FAST_FORWARDING}</li>
25624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_REWINDING}</li>
25724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_BUFFERING}</li>
25824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#STATE_ERROR}</li>
25924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
26024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public int getState() {
26124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mState;
26224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
26324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
26424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
26524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the current playback position in ms.
26624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
26724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public long getPosition() {
26824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mPosition;
26924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
27024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
27124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
272312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik     * Get the current buffered position in ms. This is the farthest playback
27324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * point that can be reached from the current position using only buffered
27424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * content.
27524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
276312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik    public long getBufferedPosition() {
277312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        return mBufferedPosition;
27824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
27924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
28024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
28184b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik     * Get the current playback speed as a multiple of normal playback. This
28224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * should be negative when rewinding. A value of 1 means normal playback and
28324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * 0 means paused.
28424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
28584b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik     * @return The current speed of playback.
28624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
28784b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik    public float getPlaybackSpeed() {
28884b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik        return mSpeed;
28924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
29024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
29124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
29224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the current actions available on this session. This should use a
29324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * bitmask of the available actions.
29424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <ul>
29524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_PREVIOUS}</li>
29624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_REWIND}</li>
29724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_PLAY}</li>
29824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_PAUSE}</li>
29924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_STOP}</li>
30024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_FAST_FORWARD}</li>
30124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_NEXT}</li>
30224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SEEK_TO}</li>
30324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <li> {@link PlaybackStateCompat#ACTION_SET_RATING}</li>
30424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </ul>
30524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
30624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public long getActions() {
30724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mActions;
30824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
30924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
31024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
31124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get a user readable error message. This should be set when the state is
31224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * {@link PlaybackStateCompat#STATE_ERROR}.
31324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
31424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public CharSequence getErrorMessage() {
31524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mErrorMessage;
31624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
31724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
31824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
31924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Get the elapsed real time at which position was last updated. If the
32024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * position has never been set this will return 0;
32124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
32224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return The last time the position was updated.
32324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
32424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public long getLastPositionUpdateTime() {
32524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mUpdateTime;
32624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
32724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
32824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
32924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Creates an instance from a framework {@link android.media.session.PlaybackState} object.
33024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <p>
33124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * This method is only supported on API 21+.
33224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </p>
33324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
33424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param stateObj A {@link android.media.session.PlaybackState} object, or null if none.
33524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return An equivalent {@link PlaybackStateCompat} object, or null if none.
33624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
33724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static PlaybackStateCompat fromPlaybackState(Object stateObj) {
33824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if (stateObj == null || Build.VERSION.SDK_INT < 21) {
33924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return null;
34024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
34124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
34224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        PlaybackStateCompat state = new PlaybackStateCompat(
34324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getState(stateObj),
34424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getPosition(stateObj),
345312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik                PlaybackStateCompatApi21.getBufferedPosition(stateObj),
34684b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik                PlaybackStateCompatApi21.getPlaybackSpeed(stateObj),
34724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getActions(stateObj),
34824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getErrorMessage(stateObj),
34924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                PlaybackStateCompatApi21.getLastPositionUpdateTime(stateObj));
35024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        state.mStateObj = stateObj;
35124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return state;
35224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
35324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
35424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
35524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Gets the underlying framework {@link android.media.session.PlaybackState} object.
35624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <p>
35724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * This method is only supported on API 21+.
35824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </p>
35924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
36024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return An equivalent {@link android.media.session.PlaybackState} object, or null if none.
36124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
36224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public Object getPlaybackState() {
36324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if (mStateObj != null || Build.VERSION.SDK_INT < 21) {
36424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return mStateObj;
36524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
36624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
367312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        mStateObj = PlaybackStateCompatApi21.newInstance(mState, mPosition, mBufferedPosition,
36884b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik                mSpeed, mActions, mErrorMessage, mUpdateTime);
36924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mStateObj;
37024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
37124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
37224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final Parcelable.Creator<PlaybackStateCompat> CREATOR =
37324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            new Parcelable.Creator<PlaybackStateCompat>() {
37424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
37524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public PlaybackStateCompat createFromParcel(Parcel in) {
37624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new PlaybackStateCompat(in);
37724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
37824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
37924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
38024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public PlaybackStateCompat[] newArray(int size) {
38124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new PlaybackStateCompat[size];
38224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
38324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    };
38424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
38524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
38624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Builder for {@link PlaybackStateCompat} objects.
38724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
38824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final class Builder {
38924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private int mState;
39024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private long mPosition;
391312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        private long mBufferedPosition;
39224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private float mRate;
39324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private long mActions;
39424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private CharSequence mErrorMessage;
39524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        private long mUpdateTime;
39624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
39724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
39824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Create an empty Builder.
39924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
40024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public Builder() {
40124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
40224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
40324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
40424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Create a Builder using a {@link PlaybackStateCompat} instance to set the
40524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * initial values.
40624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         *
40724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param source The playback state to copy.
40824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
40924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public Builder(PlaybackStateCompat source) {
41024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mState = source.mState;
41124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mPosition = source.mPosition;
41284b0350796e4ae8a113ce1abba54f07a2605cc5cRoboErik            mRate = source.mSpeed;
41324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mUpdateTime = source.mUpdateTime;
414312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik            mBufferedPosition = source.mBufferedPosition;
41524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mActions = source.mActions;
41624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mErrorMessage = source.mErrorMessage;
41724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
41824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
41924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
42024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Set the current state of playback.
42124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <p>
42224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * The position must be in ms and indicates the current playback position
42324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * within the track. If the position is unknown use
42424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * {@link #PLAYBACK_POSITION_UNKNOWN}.
42524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <p>
42624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * The rate is a multiple of normal playback and should be 0 when paused and
42724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * negative when rewinding. Normal playback rate is 1.0.
42824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <p>
42924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * The state must be one of the following:
43024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <ul>
43124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_NONE}</li>
43224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_STOPPED}</li>
43324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_PLAYING}</li>
43424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_PAUSED}</li>
43524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_FAST_FORWARDING}</li>
43624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_REWINDING}</li>
43724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_BUFFERING}</li>
43824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#STATE_ERROR}</li>
43924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * </ul>
44024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         *
44124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param state The current state of playback.
44224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param position The position in the current track in ms.
44324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param playbackRate The current rate of playback as a multiple of normal
44424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         *            playback.
44524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
44624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void setState(int state, long position, float playbackRate) {
44724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            this.mState = state;
44824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            this.mPosition = position;
44924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            this.mRate = playbackRate;
45024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mUpdateTime = SystemClock.elapsedRealtime();
45124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
45224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
45324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
454312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik         * Set the current buffered position in ms. This is the farthest
455312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik         * playback point that can be reached from the current position using
456312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik         * only buffered content.
45724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
458312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik        public void setBufferedPosition(long bufferPosition) {
459312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik            mBufferedPosition = bufferPosition;
46024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
46124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
46224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
46324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Set the current capabilities available on this session. This should use a
46424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * bitmask of the available capabilities.
46524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <ul>
46624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_PREVIOUS}</li>
46724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_REWIND}</li>
46824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_PLAY}</li>
46924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_PAUSE}</li>
47024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_STOP}</li>
47124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_FAST_FORWARD}</li>
47224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SKIP_TO_NEXT}</li>
47324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SEEK_TO}</li>
47424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * <li> {@link PlaybackStateCompat#ACTION_SET_RATING}</li>
47524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * </ul>
47624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
47724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void setActions(long capabilities) {
47824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mActions = capabilities;
47924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
48024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
48124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
48224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Set a user readable error message. This should be set when the state is
48324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * {@link PlaybackStateCompat#STATE_ERROR}.
48424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
48524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void setErrorMessage(CharSequence errorMessage) {
48624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mErrorMessage = errorMessage;
48724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
48824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
48924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
49024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Creates the playback state object.
49124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
49224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public PlaybackStateCompat build() {
493312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik            return new PlaybackStateCompat(mState, mPosition, mBufferedPosition,
49424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                    mRate, mActions, mErrorMessage, mUpdateTime);
49524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
49624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
49724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
498