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