Merge "MediaSession: Add methods for queue managements"

This commit is contained in:
TreeHugger Robot
2017-02-06 17:57:37 +00:00
committed by Android (Google) Code Review
8 changed files with 355 additions and 45 deletions

View File

@@ -23597,6 +23597,8 @@ package android.media.session {
public final class MediaController {
ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
method public void addQueueItem(android.media.MediaDescription);
method public void addQueueItem(android.media.MediaDescription, int);
method public void adjustVolume(int, int);
method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
method public android.os.Bundle getExtras();
@@ -23615,6 +23617,8 @@ package android.media.session {
method public boolean isShuffleModeEnabled();
method public void registerCallback(android.media.session.MediaController.Callback);
method public void registerCallback(android.media.session.MediaController.Callback, android.os.Handler);
method public void removeQueueItem(android.media.MediaDescription);
method public void removeQueueItemAt(int);
method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
method public void setVolumeTo(int, int);
method public void unregisterCallback(android.media.session.MediaController.Callback);
@@ -23692,11 +23696,14 @@ package android.media.session {
method public void setSessionActivity(android.app.PendingIntent);
method public void setShuffleModeEnabled(boolean);
field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
}
public static abstract class MediaSession.Callback {
ctor public MediaSession.Callback();
method public void onAddQueueItem(android.media.MediaDescription);
method public void onAddQueueItem(android.media.MediaDescription, int);
method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
method public void onCustomAction(java.lang.String, android.os.Bundle);
method public void onFastForward();
@@ -23710,6 +23717,8 @@ package android.media.session {
method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
method public void onRemoveQueueItem(android.media.MediaDescription);
method public void onRemoveQueueItemAt(int);
method public void onRewind();
method public void onSeekTo(long);
method public void onSetRating(android.media.Rating);

View File

@@ -25291,6 +25291,8 @@ package android.media.session {
public final class MediaController {
ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
method public void addQueueItem(android.media.MediaDescription);
method public void addQueueItem(android.media.MediaDescription, int);
method public void adjustVolume(int, int);
method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
method public android.os.Bundle getExtras();
@@ -25309,6 +25311,8 @@ package android.media.session {
method public boolean isShuffleModeEnabled();
method public void registerCallback(android.media.session.MediaController.Callback);
method public void registerCallback(android.media.session.MediaController.Callback, android.os.Handler);
method public void removeQueueItem(android.media.MediaDescription);
method public void removeQueueItemAt(int);
method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
method public void setVolumeTo(int, int);
method public void unregisterCallback(android.media.session.MediaController.Callback);
@@ -25386,11 +25390,14 @@ package android.media.session {
method public void setSessionActivity(android.app.PendingIntent);
method public void setShuffleModeEnabled(boolean);
field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
}
public static abstract class MediaSession.Callback {
ctor public MediaSession.Callback();
method public void onAddQueueItem(android.media.MediaDescription);
method public void onAddQueueItem(android.media.MediaDescription, int);
method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
method public void onCustomAction(java.lang.String, android.os.Bundle);
method public void onFastForward();
@@ -25404,6 +25411,8 @@ package android.media.session {
method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
method public void onRemoveQueueItem(android.media.MediaDescription);
method public void onRemoveQueueItemAt(int);
method public void onRewind();
method public void onSeekTo(long);
method public void onSetRating(android.media.Rating);

View File

@@ -23689,6 +23689,8 @@ package android.media.session {
public final class MediaController {
ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
method public void addQueueItem(android.media.MediaDescription);
method public void addQueueItem(android.media.MediaDescription, int);
method public void adjustVolume(int, int);
method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
method public android.os.Bundle getExtras();
@@ -23707,6 +23709,8 @@ package android.media.session {
method public boolean isShuffleModeEnabled();
method public void registerCallback(android.media.session.MediaController.Callback);
method public void registerCallback(android.media.session.MediaController.Callback, android.os.Handler);
method public void removeQueueItem(android.media.MediaDescription);
method public void removeQueueItemAt(int);
method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
method public void setVolumeTo(int, int);
method public void unregisterCallback(android.media.session.MediaController.Callback);
@@ -23784,11 +23788,14 @@ package android.media.session {
method public void setSessionActivity(android.app.PendingIntent);
method public void setShuffleModeEnabled(boolean);
field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
}
public static abstract class MediaSession.Callback {
ctor public MediaSession.Callback();
method public void onAddQueueItem(android.media.MediaDescription);
method public void onAddQueueItem(android.media.MediaDescription, int);
method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
method public void onCustomAction(java.lang.String, android.os.Bundle);
method public void onFastForward();
@@ -23802,6 +23809,8 @@ package android.media.session {
method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
method public void onRemoveQueueItem(android.media.MediaDescription);
method public void onRemoveQueueItemAt(int);
method public void onRewind();
method public void onSeekTo(long);
method public void onSetRating(android.media.Rating);

View File

@@ -16,6 +16,7 @@
package android.media.session;
import android.content.Intent;
import android.media.MediaDescription;
import android.media.Rating;
import android.net.Uri;
import android.os.Bundle;
@@ -49,6 +50,10 @@ oneway interface ISessionCallback {
void onRepeatMode(int repeatMode);
void onShuffleMode(boolean enabled);
void onCustomAction(String action, in Bundle args);
void onAddQueueItem(in MediaDescription description);
void onAddQueueItemAt(in MediaDescription description, int index);
void onRemoveQueueItem(in MediaDescription description);
void onRemoveQueueItemAt(int index);
// These callbacks are for volume handling
void onAdjustVolume(int direction);

View File

@@ -18,6 +18,7 @@ package android.media.session;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.media.MediaDescription;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.session.ISessionControllerCallback;
@@ -51,6 +52,11 @@ interface ISessionController {
MediaMetadata getMetadata();
PlaybackState getPlaybackState();
ParceledListSlice getQueue();
void addQueueItem(in MediaDescription description);
void addQueueItemAt(in MediaDescription description, int index);
void removeQueueItem(in MediaDescription description);
void removeQueueItemAt(int index);
CharSequence getQueueTitle();
Bundle getExtras();
int getRatingType();

View File

@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaDescription;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.VolumeProvider;
@@ -38,6 +39,7 @@ import android.util.Log;
import android.view.KeyEvent;
import java.lang.ref.WeakReference;
import java.lang.UnsupportedOperationException;
import java.util.ArrayList;
import java.util.List;
@@ -111,8 +113,7 @@ public final class MediaController {
}
/**
* Get a {@link TransportControls} instance to send transport actions to
* the associated session.
* Get a {@link TransportControls} instance to send transport actions to this session.
*
* @return A transport controls instance.
*/
@@ -151,7 +152,7 @@ public final class MediaController {
try {
return mSessionBinder.getPlaybackState();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getPlaybackState.", e);
Log.wtf(TAG, "Error calling getPlaybackState", e);
return null;
}
}
@@ -165,7 +166,7 @@ public final class MediaController {
try {
return mSessionBinder.getMetadata();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getMetadata.", e);
Log.wtf(TAG, "Error calling getMetadata", e);
return null;
}
}
@@ -183,11 +184,102 @@ public final class MediaController {
return queue.getList();
}
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getQueue.", e);
Log.wtf(TAG, "Error calling getQueue", e);
}
return null;
}
/**
* Add a queue item from the given {@code description} at the end of the play queue
* of this session. Not all sessions may support this.
*
* @param description The {@link MediaDescription} for creating the
* {@link MediaSession.QueueItem} to be inserted.
* @throws UnsupportedOperationException If this session doesn't support this.
* @see MediaSession#FLAG_HANDLES_QUEUE_COMMANDS
*/
public void addQueueItem(MediaDescription description) {
try {
long flags = mSessionBinder.getFlags();
if ((flags & MediaSession.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
throw new UnsupportedOperationException(
"This session doesn't support queue management operations");
}
mSessionBinder.addQueueItem(description);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling addQueueItem", e);
}
}
/**
* Add a queue item from the given {@code description} at the specified position
* in the play queue of this session. Shifts the queue item currently at that position
* (if any) and any subsequent queue items to the right (adds one to their indices).
* Not all sessions may support this.
*
* @param description The {@link MediaDescription} for creating the
* {@link MediaSession.QueueItem} to be inserted.
* @param index The index at which the created {@link MediaSession.QueueItem} is to be inserted.
* @throws UnsupportedOperationException If this session doesn't support this.
* @see MediaSession#FLAG_HANDLES_QUEUE_COMMANDS
*/
public void addQueueItem(MediaDescription description, int index) {
try {
long flags = mSessionBinder.getFlags();
if ((flags & MediaSession.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
throw new UnsupportedOperationException(
"This session doesn't support queue management operations");
}
mSessionBinder.addQueueItemAt(description, index);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling addQueueItemAt", e);
}
}
/**
* Remove the first occurrence of the specified {@link MediaSession.QueueItem}
* with the given {@link MediaDescription description} in the play queue of the associated
* session. Not all sessions may support this.
*
* @param description The {@link MediaDescription} for denoting the
* {@link MediaSession.QueueItem} to be removed.
* @throws UnsupportedOperationException If this session doesn't support this.
* @see MediaSession#FLAG_HANDLES_QUEUE_COMMANDS
*/
public void removeQueueItem(MediaDescription description) {
try {
long flags = mSessionBinder.getFlags();
if ((flags & MediaSession.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
throw new UnsupportedOperationException(
"This session doesn't support queue management operations");
}
mSessionBinder.removeQueueItem(description);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling removeQueueItem", e);
}
}
/**
* Remove an queue item at the specified position in the play queue
* of this session. Not all sessions may support this.
*
* @param index The index of the element to be removed.
* @throws UnsupportedOperationException If this session doesn't support this.
* @see MediaSession#FLAG_HANDLES_QUEUE_COMMANDS
*/
public void removeQueueItemAt(int index) {
try {
long flags = mSessionBinder.getFlags();
if ((flags & MediaSession.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
throw new UnsupportedOperationException(
"This session doesn't support queue management operations");
}
mSessionBinder.removeQueueItemAt(index);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling removeQueueItemAt", e);
}
}
/**
* Get the queue title for this session.
*/
@@ -230,7 +322,7 @@ public final class MediaController {
try {
return mSessionBinder.getRatingType();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getRatingType.", e);
Log.wtf(TAG, "Error calling getRatingType", e);
return Rating.RATING_NONE;
}
}
@@ -245,7 +337,7 @@ public final class MediaController {
try {
return mSessionBinder.getRepeatMode();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getRepeatMode.", e);
Log.wtf(TAG, "Error calling getRepeatMode", e);
return PlaybackState.REPEAT_MODE_NONE;
}
}
@@ -259,7 +351,7 @@ public final class MediaController {
try {
return mSessionBinder.isShuffleModeEnabled();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling isShuffleModeEnabled.", e);
Log.wtf(TAG, "Error calling isShuffleModeEnabled", e);
return false;
}
}
@@ -273,7 +365,7 @@ public final class MediaController {
try {
return mSessionBinder.getFlags();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getFlags.", e);
Log.wtf(TAG, "Error calling getFlags", e);
}
return 0;
}
@@ -290,7 +382,7 @@ public final class MediaController {
result.maxVolume, result.currentVolume);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getAudioInfo.", e);
Log.wtf(TAG, "Error calling getAudioInfo", e);
}
return null;
}
@@ -305,7 +397,7 @@ public final class MediaController {
try {
return mSessionBinder.getLaunchPendingIntent();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling getPendingIntent.", e);
Log.wtf(TAG, "Error calling getPendingIntent", e);
}
return null;
}
@@ -334,7 +426,7 @@ public final class MediaController {
try {
mSessionBinder.setVolumeTo(value, flags, mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling setVolumeTo.", e);
Log.wtf(TAG, "Error calling setVolumeTo", e);
}
}
@@ -355,7 +447,7 @@ public final class MediaController {
try {
mSessionBinder.adjustVolume(direction, flags, mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling adjustVolumeBy.", e);
Log.wtf(TAG, "Error calling adjustVolumeBy", e);
}
}
@@ -421,7 +513,7 @@ public final class MediaController {
try {
mSessionBinder.sendCommand(command, args, cb);
} catch (RemoteException e) {
Log.d(TAG, "Dead object in sendCommand.", e);
Log.d(TAG, "Dead object in sendCommand", e);
}
}
@@ -435,7 +527,7 @@ public final class MediaController {
try {
mPackageName = mSessionBinder.getPackageName();
} catch (RemoteException e) {
Log.d(TAG, "Dead object in getPackageName.", e);
Log.d(TAG, "Dead object in getPackageName", e);
}
}
return mPackageName;
@@ -452,7 +544,7 @@ public final class MediaController {
try {
mTag = mSessionBinder.getTag();
} catch (RemoteException e) {
Log.d(TAG, "Dead object in getTag.", e);
Log.d(TAG, "Dead object in getTag", e);
}
}
return mTag;
@@ -652,7 +744,7 @@ public final class MediaController {
try {
mSessionBinder.prepare();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare.", e);
Log.wtf(TAG, "Error calling prepare", e);
}
}
@@ -671,12 +763,12 @@ public final class MediaController {
public void prepareFromMediaId(String mediaId, Bundle extras) {
if (TextUtils.isEmpty(mediaId)) {
throw new IllegalArgumentException(
"You must specify a non-empty String for prepareFromMediaId.");
"You must specify a non-empty String for prepareFromMediaId");
}
try {
mSessionBinder.prepareFromMediaId(mediaId, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare(" + mediaId + ").", e);
Log.wtf(TAG, "Error calling prepare(" + mediaId + ")", e);
}
}
@@ -702,7 +794,7 @@ public final class MediaController {
try {
mSessionBinder.prepareFromSearch(query, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare(" + query + ").", e);
Log.wtf(TAG, "Error calling prepare(" + query + ")", e);
}
}
@@ -721,12 +813,12 @@ public final class MediaController {
public void prepareFromUri(Uri uri, Bundle extras) {
if (uri == null || Uri.EMPTY.equals(uri)) {
throw new IllegalArgumentException(
"You must specify a non-empty Uri for prepareFromUri.");
"You must specify a non-empty Uri for prepareFromUri");
}
try {
mSessionBinder.prepareFromUri(uri, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare(" + uri + ").", e);
Log.wtf(TAG, "Error calling prepare(" + uri + ")", e);
}
}
@@ -737,7 +829,7 @@ public final class MediaController {
try {
mSessionBinder.play();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play.", e);
Log.wtf(TAG, "Error calling play", e);
}
}
@@ -751,12 +843,12 @@ public final class MediaController {
public void playFromMediaId(String mediaId, Bundle extras) {
if (TextUtils.isEmpty(mediaId)) {
throw new IllegalArgumentException(
"You must specify a non-empty String for playFromMediaId.");
"You must specify a non-empty String for playFromMediaId");
}
try {
mSessionBinder.playFromMediaId(mediaId, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play(" + mediaId + ").", e);
Log.wtf(TAG, "Error calling play(" + mediaId + ")", e);
}
}
@@ -778,7 +870,7 @@ public final class MediaController {
try {
mSessionBinder.playFromSearch(query, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play(" + query + ").", e);
Log.wtf(TAG, "Error calling play(" + query + ")", e);
}
}
@@ -792,12 +884,12 @@ public final class MediaController {
public void playFromUri(Uri uri, Bundle extras) {
if (uri == null || Uri.EMPTY.equals(uri)) {
throw new IllegalArgumentException(
"You must specify a non-empty Uri for playFromUri.");
"You must specify a non-empty Uri for playFromUri");
}
try {
mSessionBinder.playFromUri(uri, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play(" + uri + ").", e);
Log.wtf(TAG, "Error calling play(" + uri + ")", e);
}
}
@@ -809,7 +901,7 @@ public final class MediaController {
try {
mSessionBinder.skipToQueueItem(id);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling skipToItem(" + id + ").", e);
Log.wtf(TAG, "Error calling skipToItem(" + id + ")", e);
}
}
@@ -821,7 +913,7 @@ public final class MediaController {
try {
mSessionBinder.pause();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling pause.", e);
Log.wtf(TAG, "Error calling pause", e);
}
}
@@ -833,7 +925,7 @@ public final class MediaController {
try {
mSessionBinder.stop();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling stop.", e);
Log.wtf(TAG, "Error calling stop", e);
}
}
@@ -846,7 +938,7 @@ public final class MediaController {
try {
mSessionBinder.seekTo(pos);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling seekTo.", e);
Log.wtf(TAG, "Error calling seekTo", e);
}
}
@@ -858,7 +950,7 @@ public final class MediaController {
try {
mSessionBinder.fastForward();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling fastForward.", e);
Log.wtf(TAG, "Error calling fastForward", e);
}
}
@@ -869,7 +961,7 @@ public final class MediaController {
try {
mSessionBinder.next();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling next.", e);
Log.wtf(TAG, "Error calling next", e);
}
}
@@ -881,7 +973,7 @@ public final class MediaController {
try {
mSessionBinder.rewind();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling rewind.", e);
Log.wtf(TAG, "Error calling rewind", e);
}
}
@@ -892,7 +984,7 @@ public final class MediaController {
try {
mSessionBinder.previous();
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling previous.", e);
Log.wtf(TAG, "Error calling previous", e);
}
}
@@ -907,7 +999,7 @@ public final class MediaController {
try {
mSessionBinder.rate(rating);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling rate.", e);
Log.wtf(TAG, "Error calling rate", e);
}
}
@@ -923,7 +1015,7 @@ public final class MediaController {
try {
mSessionBinder.repeatMode(repeatMode);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling setRepeatMode.", e);
Log.wtf(TAG, "Error calling setRepeatMode", e);
}
}
@@ -936,7 +1028,7 @@ public final class MediaController {
try {
mSessionBinder.shuffleMode(enabled);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling shuffleMode.", e);
Log.wtf(TAG, "Error calling shuffleMode", e);
}
}
@@ -950,7 +1042,7 @@ public final class MediaController {
public void sendCustomAction(@NonNull PlaybackState.CustomAction customAction,
@Nullable Bundle args) {
if (customAction == null) {
throw new IllegalArgumentException("CustomAction cannot be null.");
throw new IllegalArgumentException("CustomAction cannot be null");
}
sendCustomAction(customAction.getAction(), args);
}
@@ -966,12 +1058,12 @@ public final class MediaController {
*/
public void sendCustomAction(@NonNull String action, @Nullable Bundle args) {
if (TextUtils.isEmpty(action)) {
throw new IllegalArgumentException("CustomAction cannot be null.");
throw new IllegalArgumentException("CustomAction cannot be null");
}
try {
mSessionBinder.sendCustomAction(action, args);
} catch (RemoteException e) {
Log.d(TAG, "Dead object in sendCustomAction.", e);
Log.d(TAG, "Dead object in sendCustomAction", e);
}
}
}

View File

@@ -86,6 +86,12 @@ public final class MediaSession {
*/
public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 1 << 1;
/**
* Set this flag on the session to indicate that it handles queue
* management commands through its {@link Callback}.
*/
public static final int FLAG_HANDLES_QUEUE_COMMANDS = 1 << 2;
/**
* System only flag for a session that needs to have priority over all other
* sessions. This flag ensures this session will receive media button events
@@ -100,6 +106,7 @@ public final class MediaSession {
@IntDef(flag = true, value = {
FLAG_HANDLES_MEDIA_BUTTONS,
FLAG_HANDLES_TRANSPORT_CONTROLS,
FLAG_HANDLES_QUEUE_COMMANDS,
FLAG_EXCLUSIVE_GLOBAL_PRIORITY })
public @interface SessionFlags { }
@@ -645,6 +652,22 @@ public final class MediaSession {
postToCallback(CallbackMessageHandler.MSG_CUSTOM_ACTION, action, args);
}
private void dispatchAddQueueItem(MediaDescription description) {
postToCallback(CallbackMessageHandler.MSG_ADD_QUEUE_ITEM, description);
}
private void dispatchAddQueueItem(MediaDescription description, int index) {
postToCallback(CallbackMessageHandler.MSG_ADD_QUEUE_ITEM_AT, description, index);
}
private void dispatchRemoveQueueItem(MediaDescription description) {
postToCallback(CallbackMessageHandler.MSG_REMOVE_QUEUE_ITEM, description);
}
private void dispatchRemoveQueueItemAt(int index) {
postToCallback(CallbackMessageHandler.MSG_REMOVE_QUEUE_ITEM_AT, index);
}
private void dispatchMediaButton(Intent mediaButtonIntent) {
postToCallback(CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent);
}
@@ -666,10 +689,22 @@ public final class MediaSession {
postToCallback(CallbackMessageHandler.MSG_COMMAND, cmd);
}
private void postToCallback(int what, int arg1) {
postToCallback(what, null, arg1);
}
private void postToCallback(int what, Object obj) {
postToCallback(what, obj, null);
}
private void postToCallback(int what, Object obj, int arg1) {
synchronized (mLock) {
if (mCallback != null) {
mCallback.post(what, obj, arg1);
}
}
}
private void postToCallback(int what, Object obj, Bundle extras) {
synchronized (mLock) {
if (mCallback != null) {
@@ -1043,6 +1078,47 @@ public final class MediaSession {
*/
public void onCustomAction(@NonNull String action, @Nullable Bundle extras) {
}
/**
* Called when a {@link MediaController} wants to add a {@link QueueItem} with the given
* {@link MediaDescription description} at the end of the play queue.
*
* @param description The {@link MediaDescription} for creating the {@link QueueItem} to be
* inserted.
*/
public void onAddQueueItem(MediaDescription description) {
}
/**
* Called when a {@link MediaController} wants to add a {@link QueueItem} with the given
* {@link MediaDescription description} at the specified position in the play queue.
*
* @param description The {@link MediaDescription} for creating the {@link QueueItem} to be
* inserted.
* @param index The index at which the created {@link QueueItem} is to be inserted.
*/
public void onAddQueueItem(MediaDescription description, int index) {
}
/**
* Called when a {@link MediaController} wants to remove the first occurrence of the
* specified {@link QueueItem} with the given {@link MediaDescription description}
* in the play queue.
*
* @param description The {@link MediaDescription} for denoting the {@link QueueItem} to be
* removed.
*/
public void onRemoveQueueItem(MediaDescription description) {
}
/**
* Called when a {@link MediaController} wants to remove a {@link QueueItem} at the
* specified position in the play queue.
*
* @param index The index of the element to be removed.
*/
public void onRemoveQueueItemAt(int index) {
}
}
/**
@@ -1238,6 +1314,38 @@ public final class MediaSession {
}
}
@Override
public void onAddQueueItem(MediaDescription description) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchAddQueueItem(description);
}
}
@Override
public void onAddQueueItemAt(MediaDescription description, int index) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchAddQueueItem(description, index);
}
}
@Override
public void onRemoveQueueItem(MediaDescription description) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchRemoveQueueItem(description);
}
}
@Override
public void onRemoveQueueItemAt(int index) {
MediaSession session = mMediaSession.get();
if (session != null) {
session.dispatchRemoveQueueItemAt(index);
}
}
@Override
public void onAdjustVolume(int direction) {
MediaSession session = mMediaSession.get();
@@ -1376,6 +1484,10 @@ public final class MediaSession {
private static final int MSG_CUSTOM_ACTION = 22;
private static final int MSG_ADJUST_VOLUME = 23;
private static final int MSG_SET_VOLUME = 24;
private static final int MSG_ADD_QUEUE_ITEM = 25;
private static final int MSG_ADD_QUEUE_ITEM_AT = 26;
private static final int MSG_REMOVE_QUEUE_ITEM = 27;
private static final int MSG_REMOVE_QUEUE_ITEM_AT = 28;
private MediaSession.Callback mCallback;
@@ -1465,7 +1577,7 @@ public final class MediaSession {
mCallback.onSetRating((Rating) msg.obj);
break;
case MSG_REPEAT_MODE:
mCallback.onSetRepeatMode((int) msg.obj);
mCallback.onSetRepeatMode(msg.arg1);
break;
case MSG_SHUFFLE_MODE:
mCallback.onSetShuffleModeEnabled((boolean) msg.obj);
@@ -1473,12 +1585,24 @@ public final class MediaSession {
case MSG_CUSTOM_ACTION:
mCallback.onCustomAction((String) msg.obj, msg.getData());
break;
case MSG_ADD_QUEUE_ITEM:
mCallback.onAddQueueItem((MediaDescription) msg.obj);
break;
case MSG_ADD_QUEUE_ITEM_AT:
mCallback.onAddQueueItem((MediaDescription) msg.obj, msg.arg1);
break;
case MSG_REMOVE_QUEUE_ITEM:
mCallback.onRemoveQueueItem((MediaDescription) msg.obj);
break;
case MSG_REMOVE_QUEUE_ITEM_AT:
mCallback.onRemoveQueueItemAt(msg.arg1);
break;
case MSG_ADJUST_VOLUME:
synchronized (mLock) {
vp = mVolumeProvider;
}
if (vp != null) {
vp.onAdjustVolume((int) msg.obj);
vp.onAdjustVolume(msg.arg1);
}
break;
case MSG_SET_VOLUME:
@@ -1486,7 +1610,7 @@ public final class MediaSession {
vp = mVolumeProvider;
}
if (vp != null) {
vp.onSetVolumeTo((int) msg.obj);
vp.onSetVolumeTo(msg.arg1);
}
break;
}

View File

@@ -1123,6 +1123,38 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
}
public void addQueueItem(MediaDescription description) {
try {
mCb.onAddQueueItem(description);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in addQueueItem.", e);
}
}
public void addQueueItemAt(MediaDescription description, int index) {
try {
mCb.onAddQueueItemAt(description, index);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in addQueueItemAt.", e);
}
}
public void removeQueueItem(MediaDescription description) {
try {
mCb.onRemoveQueueItem(description);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in removeQueueItem.", e);
}
}
public void removeQueueItemAt(int index) {
try {
mCb.onRemoveQueueItemAt(index);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in removeQueueItem.", e);
}
}
public void adjustVolume(int direction) {
try {
mCb.onAdjustVolume(direction);
@@ -1396,6 +1428,30 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
}
@Override
public void addQueueItem(MediaDescription description) {
updateCallingPackage();
mSessionCb.addQueueItem(description);
}
@Override
public void addQueueItemAt(MediaDescription description, int index) {
updateCallingPackage();
mSessionCb.addQueueItemAt(description, index);
}
@Override
public void removeQueueItem(MediaDescription description) {
updateCallingPackage();
mSessionCb.removeQueueItem(description);
}
@Override
public void removeQueueItemAt(int index) {
updateCallingPackage();
mSessionCb.removeQueueItemAt(index);
}
@Override
public CharSequence getQueueTitle() {
return mQueueTitle;