diff options
| -rw-r--r-- | api/current.txt | 63 | ||||
| -rw-r--r-- | media/java/android/media/AudioManager.java | 31 | ||||
| -rw-r--r-- | media/java/android/media/RemoteController.java | 15 | ||||
| -rw-r--r-- | media/java/android/media/session/MediaController.java | 55 | ||||
| -rw-r--r-- | media/java/android/media/session/MediaSession.java | 99 | ||||
| -rw-r--r-- | media/java/android/media/session/MediaSessionManager.java | 77 | ||||
| -rw-r--r-- | media/java/android/media/session/ParcelableVolumeInfo.java | 2 | ||||
| -rw-r--r-- | media/java/android/media/session/PlaybackState.java | 40 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java | 14 |
9 files changed, 205 insertions, 191 deletions
diff --git a/api/current.txt b/api/current.txt index 93f30d6e9548..fd7c0534a9dd 100644 --- a/api/current.txt +++ b/api/current.txt @@ -16623,33 +16623,41 @@ package android.media.session { method public void adjustVolume(int, int); method public android.media.routing.MediaRouter.Delegate createMediaRouterDelegate(); method public boolean dispatchMediaButtonEvent(android.view.KeyEvent); + method public android.media.session.MediaController.AudioInfo getAudioInfo(); method public android.os.Bundle getExtras(); method public long getFlags(); method public android.app.PendingIntent getLaunchActivity(); method public android.media.MediaMetadata getMetadata(); method public java.lang.String getPackageName(); method public android.media.session.PlaybackState getPlaybackState(); - method public java.util.List<android.media.session.MediaSession.Track> getQueue(); + method public java.util.List<android.media.session.MediaSession.Item> getQueue(); method public java.lang.CharSequence getQueueTitle(); method public int getRatingType(); method public android.media.session.MediaSession.Token getSessionToken(); method public android.media.session.MediaController.TransportControls getTransportControls(); - method public android.media.session.MediaController.VolumeInfo getVolumeInfo(); method public void removeCallback(android.media.session.MediaController.Callback); method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver); method public void setVolumeTo(int, int); } + public static final class MediaController.AudioInfo { + method public android.media.AudioAttributes getAudioAttributes(); + method public int getCurrentVolume(); + method public int getMaxVolume(); + method public int getVolumeControl(); + method public int getVolumeType(); + } + public static abstract class MediaController.Callback { ctor public MediaController.Callback(); + method public void onAudioInfoChanged(android.media.session.MediaController.AudioInfo); method public void onExtrasChanged(android.os.Bundle); method public void onMetadataChanged(android.media.MediaMetadata); method public void onPlaybackStateChanged(android.media.session.PlaybackState); - method public void onQueueChanged(java.util.List<android.media.session.MediaSession.Track>); + method public void onQueueChanged(java.util.List<android.media.session.MediaSession.Item>); method public void onQueueTitleChanged(java.lang.CharSequence); method public void onSessionDestroyed(); method public void onSessionEvent(java.lang.String, android.os.Bundle); - method public void onVolumeInfoChanged(android.media.session.MediaController.VolumeInfo); } public final class MediaController.TransportControls { @@ -16663,20 +16671,12 @@ package android.media.session { method public void sendCustomAction(android.media.session.PlaybackState.CustomAction, android.os.Bundle); method public void sendCustomAction(java.lang.String, android.os.Bundle); method public void setRating(android.media.Rating); + method public void skipToItem(long); method public void skipToNext(); method public void skipToPrevious(); - method public void skipToTrack(long); method public void stop(); } - public static final class MediaController.VolumeInfo { - method public android.media.AudioAttributes getAudioAttributes(); - method public int getCurrentVolume(); - method public int getMaxVolume(); - method public int getVolumeControl(); - method public int getVolumeType(); - } - public final class MediaSession { ctor public MediaSession(android.content.Context, java.lang.String); method public android.media.session.MediaController getController(); @@ -16696,7 +16696,7 @@ package android.media.session { method public void setPlaybackState(android.media.session.PlaybackState); method public void setPlaybackToLocal(android.media.AudioAttributes); method public void setPlaybackToRemote(android.media.VolumeProvider); - method public void setQueue(java.util.List<android.media.session.MediaSession.Track>); + method public void setQueue(java.util.List<android.media.session.MediaSession.Item>); method public void setQueueTitle(java.lang.CharSequence); field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1 field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2 @@ -16717,19 +16717,13 @@ package android.media.session { method public void onRewind(); method public void onSeekTo(long); method public void onSetRating(android.media.Rating); + method public void onSkipToItem(long); method public void onSkipToNext(); method public void onSkipToPrevious(); - method public void onSkipToTrack(long); method public void onStop(); } - public static final class MediaSession.Token implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator CREATOR; - } - - public static final class MediaSession.Track implements android.os.Parcelable { + public static final class MediaSession.Item implements android.os.Parcelable { method public int describeContents(); method public android.os.Bundle getExtras(); method public long getId(); @@ -16740,20 +16734,25 @@ package android.media.session { field public static final int UNKNOWN_ID = -1; // 0xffffffff } - public static final class MediaSession.Track.Builder { - ctor public MediaSession.Track.Builder(android.media.MediaMetadata, long, android.net.Uri); - method public android.media.session.MediaSession.Track build(); - method public android.media.session.MediaSession.Track.Builder setExtras(android.os.Bundle); + public static final class MediaSession.Item.Builder { + ctor public MediaSession.Item.Builder(android.media.MediaMetadata, long, android.net.Uri); + method public android.media.session.MediaSession.Item build(); + method public android.media.session.MediaSession.Item.Builder setExtras(android.os.Bundle); + } + + public static final class MediaSession.Token implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; } public final class MediaSessionManager { - method public void addActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener, android.content.ComponentName); + method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName); method public java.util.List<android.media.session.MediaController> getActiveSessions(android.content.ComponentName); - method public void removeActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener); + method public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener); } - public static abstract class MediaSessionManager.SessionListener { - ctor public MediaSessionManager.SessionListener(android.content.Context); + public static abstract interface MediaSessionManager.OnActiveSessionsChangedListener { method public abstract void onActiveSessionsChanged(java.util.List<android.media.session.MediaController>); } @@ -16777,9 +16776,9 @@ package android.media.session { field public static final long ACTION_REWIND = 8L; // 0x8L field public static final long ACTION_SEEK_TO = 256L; // 0x100L field public static final long ACTION_SET_RATING = 128L; // 0x80L + field public static final long ACTION_SKIP_TO_ITEM = 4096L; // 0x1000L field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L - field public static final long ACTION_SKIP_TO_TRACK = 4096L; // 0x1000L field public static final long ACTION_STOP = 1L; // 0x1L field public static final android.os.Parcelable.Creator CREATOR; field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL @@ -16803,7 +16802,7 @@ package android.media.session { method public android.media.session.PlaybackState.Builder addCustomAction(android.media.session.PlaybackState.CustomAction); method public android.media.session.PlaybackState build(); method public android.media.session.PlaybackState.Builder setActions(long); - method public android.media.session.PlaybackState.Builder setActiveTrack(long); + method public android.media.session.PlaybackState.Builder setActiveItem(long); method public android.media.session.PlaybackState.Builder setBufferPosition(long); method public android.media.session.PlaybackState.Builder setErrorMessage(java.lang.CharSequence); method public android.media.session.PlaybackState.Builder setState(int, long, float, long); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 6a76a71c38f8..e69c456a4987 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -2332,18 +2332,21 @@ public class AudioManager { } /** - * Registers a {@link RemoteController} instance for it to receive media metadata updates - * and playback state information from applications using {@link RemoteControlClient}, and - * control their playback. - * <p>Registration requires the {@link OnClientUpdateListener} listener to be one of the - * enabled notification listeners (see + * Registers a {@link RemoteController} instance for it to receive media + * metadata updates and playback state information from applications using + * {@link RemoteControlClient}, and control their playback. + * <p> + * Registration requires the {@link OnClientUpdateListener} listener to be + * one of the enabled notification listeners (see * {@link android.service.notification.NotificationListenerService}). + * * @param rctlr the object to register. - * @return true if the {@link RemoteController} was successfully registered, false if an - * error occurred, due to an internal system error, or insufficient permissions. + * @return true if the {@link RemoteController} was successfully registered, + * false if an error occurred, due to an internal system error, or + * insufficient permissions. * @deprecated Use - * {@link MediaSessionManager#addActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener, ComponentName)} - * and {@link MediaController} instead. + * {@link MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, ComponentName)} + * and {@link MediaController} instead. */ @Deprecated public boolean registerRemoteController(RemoteController rctlr) { @@ -2355,12 +2358,14 @@ public class AudioManager { } /** - * Unregisters a {@link RemoteController}, causing it to no longer receive media metadata and - * playback state information, and no longer be capable of controlling playback. + * Unregisters a {@link RemoteController}, causing it to no longer receive + * media metadata and playback state information, and no longer be capable + * of controlling playback. + * * @param rctlr the object to unregister. * @deprecated Use - * {@link MediaSessionManager#removeActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener)} - * instead. + * {@link MediaSessionManager#removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener)} + * instead. */ @Deprecated public void unregisterRemoteController(RemoteController rctlr) { diff --git a/media/java/android/media/RemoteController.java b/media/java/android/media/RemoteController.java index adc839167df8..f378cef7803e 100644 --- a/media/java/android/media/RemoteController.java +++ b/media/java/android/media/RemoteController.java @@ -74,7 +74,7 @@ import java.util.List; private MetadataEditor mMetadataEditor; private MediaSessionManager mSessionManager; - private MediaSessionManager.SessionListener mSessionListener; + private MediaSessionManager.OnActiveSessionsChangedListener mSessionListener; private MediaController.Callback mSessionCb = new MediaControllerCallback(); /** @@ -140,7 +140,7 @@ import java.util.List; mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mSessionManager = (MediaSessionManager) context .getSystemService(Context.MEDIA_SESSION_SERVICE); - mSessionListener = new TopTransportSessionListener(context); + mSessionListener = new TopTransportSessionListener(); if (ActivityManager.isLowRamDeviceStatic()) { mMaxBitmapDimension = MAX_BITMAP_DIMENSION; @@ -710,11 +710,8 @@ import java.util.List; * Listens for changes to the active session stack and replaces the * currently tracked session if it has changed. */ - private class TopTransportSessionListener extends MediaSessionManager.SessionListener { - - public TopTransportSessionListener(Context context) { - super(context); - } + private class TopTransportSessionListener implements + MediaSessionManager.OnActiveSessionsChangedListener { @Override public void onActiveSessionsChanged(List<MediaController> controllers) { @@ -792,7 +789,7 @@ import java.util.List; void startListeningToSessions() { final ComponentName listenerComponent = new ComponentName(mContext, mOnClientUpdateListener.getClass()); - mSessionManager.addActiveSessionsListener(mSessionListener, listenerComponent, + mSessionManager.addOnActiveSessionsChangedListener(mSessionListener, listenerComponent, UserHandle.myUserId(), null); mSessionListener.onActiveSessionsChanged(mSessionManager .getActiveSessions(listenerComponent)); @@ -806,7 +803,7 @@ import java.util.List; * @hide */ void stopListeningToSessions() { - mSessionManager.removeActiveSessionsListener(mSessionListener); + mSessionManager.removeOnActiveSessionsChangedListener(mSessionListener); if (DEBUG) { Log.d(TAG, "Unregistered session listener for user " + UserHandle.myUserId()); diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 63c85f885215..074e5ad8bf00 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -185,7 +185,7 @@ public final class MediaController { * * @return The current play queue or null. */ - public @Nullable List<MediaSession.Track> getQueue() { + public @Nullable List<MediaSession.Item> getQueue() { try { ParceledListSlice queue = mSessionBinder.getQueue(); if (queue != null) { @@ -259,18 +259,18 @@ public final class MediaController { } /** - * Get the current volume info for this session. + * Get the current audio info for this session. * - * @return The current volume info or null. + * @return The current audio info or null. */ - public @Nullable VolumeInfo getVolumeInfo() { + public @Nullable AudioInfo getAudioInfo() { try { ParcelableVolumeInfo result = mSessionBinder.getVolumeAttributes(); - return new VolumeInfo(result.volumeType, result.audioAttrs, result.controlType, + return new AudioInfo(result.volumeType, result.audioAttrs, result.controlType, result.maxVolume, result.currentVolume); } catch (RemoteException e) { - Log.wtf(TAG, "Error calling getVolumeInfo.", e); + Log.wtf(TAG, "Error calling getAudioInfo.", e); } return null; } @@ -305,7 +305,7 @@ public final class MediaController { * {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. The flags in * {@link AudioManager} may be used to affect the handling. * - * @see #getVolumeInfo() + * @see #getAudioInfo() * @param value The value to set it to, between 0 and the reported max. * @param flags Any flags to pass with the command. */ @@ -326,7 +326,7 @@ public final class MediaController { * {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. The flags in * {@link AudioManager} may be used to affect the handling. * - * @see #getVolumeInfo() + * @see #getAudioInfo() * @param direction The direction to adjust the volume in. * @param flags Any flags to pass with the command. */ @@ -544,13 +544,14 @@ public final class MediaController { } /** - * Override to handle changes to tracks in the queue. + * Override to handle changes to items in the queue. * - * @param queue A list of tracks in the current play queue. It should include the currently - * playing track as well as previous and upcoming tracks if applicable. - * @see MediaSession.Track + * @param queue A list of items in the current play queue. It should + * include the currently playing item as well as previous and + * upcoming items if applicable. + * @see MediaSession.Item */ - public void onQueueChanged(@Nullable List<MediaSession.Track> queue) { + public void onQueueChanged(@Nullable List<MediaSession.Item> queue) { } /** @@ -572,11 +573,11 @@ public final class MediaController { } /** - * Override to handle changes to the volume info. + * Override to handle changes to the audio info. * - * @param info The current volume info for this session. + * @param info The current audio info for this session. */ - public void onVolumeInfoChanged(VolumeInfo info) { + public void onAudioInfoChanged(AudioInfo info) { } } @@ -638,14 +639,14 @@ public final class MediaController { } /** - * Play a track with a specific id in the play queue. - * If you specify an id that is not in the play queue, the behavior is undefined. + * Play an item with a specific id in the play queue. If you specify an + * id that is not in the play queue, the behavior is undefined. */ - public void skipToTrack(long id) { + public void skipToItem(long id) { try { mSessionBinder.skipToTrack(id); } catch (RemoteException e) { - Log.wtf(TAG, "Error calling skipToTrack(" + id + ").", e); + Log.wtf(TAG, "Error calling skipToItem(" + id + ").", e); } } @@ -784,9 +785,9 @@ public final class MediaController { } /** - * Holds information about the way volume is handled for this session. + * Holds information about the way audio is handled for this session. */ - public static final class VolumeInfo { + public static final class AudioInfo { private final int mVolumeType; private final int mVolumeControl; private final int mMaxVolume; @@ -796,7 +797,7 @@ public final class MediaController { /** * @hide */ - public VolumeInfo(int type, AudioAttributes attrs, int control, int max, int current) { + public AudioInfo(int type, AudioAttributes attrs, int control, int max, int current) { mVolumeType = type; mAudioAttrs = attrs; mVolumeControl = control; @@ -904,7 +905,7 @@ public final class MediaController { @Override public void onQueueChanged(ParceledListSlice parceledQueue) { - List<MediaSession.Track> queue = parceledQueue.getList(); + List<MediaSession.Item> queue = parceledQueue.getList(); MediaController controller = mController.get(); if (controller != null) { controller.postMessage(MSG_UPDATE_QUEUE, queue, null); @@ -931,7 +932,7 @@ public final class MediaController { public void onVolumeInfoChanged(ParcelableVolumeInfo pvi) { MediaController controller = mController.get(); if (controller != null) { - VolumeInfo info = new VolumeInfo(pvi.volumeType, pvi.audioAttrs, pvi.controlType, + AudioInfo info = new AudioInfo(pvi.volumeType, pvi.audioAttrs, pvi.controlType, pvi.maxVolume, pvi.currentVolume); controller.postMessage(MSG_UPDATE_VOLUME, info, null); } @@ -960,7 +961,7 @@ public final class MediaController { mCallback.onMetadataChanged((MediaMetadata) msg.obj); break; case MSG_UPDATE_QUEUE: - mCallback.onQueueChanged((List<MediaSession.Track>) msg.obj); + mCallback.onQueueChanged((List<MediaSession.Item>) msg.obj); break; case MSG_UPDATE_QUEUE_TITLE: mCallback.onQueueTitleChanged((CharSequence) msg.obj); @@ -969,7 +970,7 @@ public final class MediaController { mCallback.onExtrasChanged((Bundle) msg.obj); break; case MSG_UPDATE_VOLUME: - mCallback.onVolumeInfoChanged((VolumeInfo) msg.obj); + mCallback.onAudioInfoChanged((AudioInfo) msg.obj); break; case MSG_DESTROYED: mCallback.onSessionDestroyed(); diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index cf73c2ac3660..2cd161c56ce0 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -435,18 +435,19 @@ public final class MediaSession { } /** - * Update the list of tracks in the play queue. It is an ordered list and should contain the - * current track, and previous or upcoming tracks if they exist. - * Specify null if there is no current play queue. + * Update the list of items in the play queue. It is an ordered list and + * should contain the current item, and previous or upcoming items if they + * exist. Specify null if there is no current play queue. * <p> - * The queue should be of reasonable size. If the play queue is unbounded within your - * app, it is better to send a reasonable amount in a sliding window instead. + * The queue should be of reasonable size. If the play queue is unbounded + * within your app, it is better to send a reasonable amount in a sliding + * window instead. * - * @param queue A list of tracks in the play queue. + * @param queue A list of items in the play queue. */ - public void setQueue(@Nullable List<Track> queue) { + public void setQueue(@Nullable List<Item> queue) { try { - mBinder.setQueue(new ParceledListSlice<Track>(queue)); + mBinder.setQueue(new ParceledListSlice<Item>(queue)); } catch (RemoteException e) { Log.wtf("Dead object in setQueue.", e); } @@ -512,8 +513,8 @@ public final class MediaSession { postToCallback(CallbackMessageHandler.MSG_PLAY_SEARCH, query, extras); } - private void dispatchSkipToTrack(long id) { - postToCallback(CallbackMessageHandler.MSG_SKIP_TO_TRACK, id); + private void dispatchSkipToItem(long id) { + postToCallback(CallbackMessageHandler.MSG_SKIP_TO_ITEM, id); } private void dispatchPause() { @@ -782,9 +783,10 @@ public final class MediaSession { } /** - * Override to handle requests to play a track with a given id from the play queue. + * Override to handle requests to play an item with a given id from the + * play queue. */ - public void onSkipToTrack(long id) { + public void onSkipToItem(long id) { } /** @@ -916,7 +918,7 @@ public final class MediaSession { public void onSkipToTrack(long id) { MediaSession session = mMediaSession.get(); if (session != null) { - session.dispatchSkipToTrack(id); + session.dispatchSkipToItem(id); } } @@ -1015,12 +1017,12 @@ public final class MediaSession { } /** - * A single track that is part of the play queue. It contains information necessary to display - * a single track in the queue. + * A single item that is part of the play queue. It contains information + * necessary to display a single item in the queue. */ - public static final class Track implements Parcelable { + public static final class Item implements Parcelable { /** - * This id is reserved. No tracks can be explicitly asigned this id. + * This id is reserved. No items can be explicitly asigned this id. */ public static final int UNKNOWN_ID = -1; @@ -1030,22 +1032,23 @@ public final class MediaSession { private final Bundle mExtras; /** - * Create a new {@link MediaSession.Track}. + * Create a new {@link MediaSession.Item}. * - * @param metadata The metadata for this track. - * @param id An identifier for this track. It must be unique within the play queue. - * @param uri The uri for this track. - * @param extras A bundle of extras that can be used to add extra information about the - * track. + * @param metadata The metadata for this item. + * @param id An identifier for this item. It must be unique within the + * play queue. + * @param uri The uri for this item. + * @param extras A bundle of extras that can be used to add extra + * information about this item. */ - private Track(MediaMetadata metadata, long id, Uri uri, Bundle extras) { + private Item(MediaMetadata metadata, long id, Uri uri, Bundle extras) { mMetadata = metadata; mId = id; mUri = uri; mExtras = extras; } - private Track(Parcel in) { + private Item(Parcel in) { mMetadata = MediaMetadata.CREATOR.createFromParcel(in); mId = in.readLong(); mUri = Uri.CREATOR.createFromParcel(in); @@ -1053,35 +1056,35 @@ public final class MediaSession { } /** - * Get the metadata for this track. + * Get the metadata for this item. */ public MediaMetadata getMetadata() { return mMetadata; } /** - * Get the id for this track. + * Get the id for this item. */ public long getId() { return mId; } /** - * Get the Uri for this track. + * Get the Uri for this item. */ public Uri getUri() { return mUri; } /** - * Get the extras for this track. + * Get the extras for this item. */ public Bundle getExtras() { return mExtras; } /** - * Builder for {@link MediaSession.Track} objects. + * Builder for {@link MediaSession.Item} objects. */ public static final class Builder { private final MediaMetadata mMetadata; @@ -1096,15 +1099,15 @@ public final class MediaSession { public Builder(MediaMetadata metadata, long id, Uri uri) { if (metadata == null) { throw new IllegalArgumentException( - "You must specify a non-null MediaMetadata to build a Track."); + "You must specify a non-null MediaMetadata to build an Item."); } if (uri == null) { throw new IllegalArgumentException( - "You must specify a non-null Uri to build a Track."); + "You must specify a non-null Uri to build an Item."); } if (id == UNKNOWN_ID) { throw new IllegalArgumentException( - "You must specify an id other than UNKNOWN_ID to build a Track."); + "You must specify an id other than UNKNOWN_ID to build an Item."); } mMetadata = metadata; mId = id; @@ -1112,18 +1115,18 @@ public final class MediaSession { } /** - * Set optional extras for the track. + * Set optional extras for the item. */ - public MediaSession.Track.Builder setExtras(Bundle extras) { + public MediaSession.Item.Builder setExtras(Bundle extras) { mExtras = extras; return this; } /** - * Create the {@link Track}. + * Create the {@link Item}. */ - public MediaSession.Track build() { - return new MediaSession.Track(mMetadata, mId, mUri, mExtras); + public MediaSession.Item build() { + return new MediaSession.Item(mMetadata, mId, mUri, mExtras); } } @@ -1140,23 +1143,23 @@ public final class MediaSession { return 0; } - public static final Creator<MediaSession.Track> CREATOR - = new Creator<MediaSession.Track>() { + public static final Creator<MediaSession.Item> CREATOR + = new Creator<MediaSession.Item>() { @Override - public MediaSession.Track createFromParcel(Parcel p) { - return new MediaSession.Track(p); + public MediaSession.Item createFromParcel(Parcel p) { + return new MediaSession.Item(p); } @Override - public MediaSession.Track[] newArray(int size) { - return new MediaSession.Track[size]; + public MediaSession.Item[] newArray(int size) { + return new MediaSession.Item[size]; } }; @Override public String toString() { - return "MediaSession.Track {" + + return "MediaSession.Item {" + "Metadata=" + mMetadata + ", Id=" + mId + ", Uri=" + mUri + @@ -1182,7 +1185,7 @@ public final class MediaSession { private static final int MSG_PLAY = 1; private static final int MSG_PLAY_URI = 2; private static final int MSG_PLAY_SEARCH = 3; - private static final int MSG_SKIP_TO_TRACK = 4; + private static final int MSG_SKIP_TO_ITEM = 4; private static final int MSG_PAUSE = 5; private static final int MSG_STOP = 6; private static final int MSG_NEXT = 7; @@ -1232,8 +1235,8 @@ public final class MediaSession { case MSG_PLAY_SEARCH: mCallback.onPlayFromSearch((String) msg.obj, msg.getData()); break; - case MSG_SKIP_TO_TRACK: - mCallback.onSkipToTrack((Long) msg.obj); + case MSG_SKIP_TO_ITEM: + mCallback.onSkipToItem((Long) msg.obj); case MSG_PAUSE: mCallback.onPause(); break; diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index c2fb5a36193e..8a1e076aae22 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -30,6 +30,7 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.service.notification.NotificationListenerService; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import android.view.KeyEvent; @@ -50,6 +51,9 @@ import java.util.List; public final class MediaSessionManager { private static final String TAG = "SessionManager"; + private final ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper> mListeners + = new ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper>(); + private final Object mLock = new Object(); private final ISessionManager mService; private Context mContext; @@ -141,10 +145,11 @@ public final class MediaSessionManager { * @param notificationListener The enabled notification listener component. * May be null. */ - public void addActiveSessionsListener(@NonNull SessionListener sessionListener, + public void addOnActiveSessionsChangedListener( + @NonNull OnActiveSessionsChangedListener sessionListener, @Nullable ComponentName notificationListener) { - addActiveSessionsListener(sessionListener, notificationListener, UserHandle.myUserId(), - null); + addOnActiveSessionsChangedListener(sessionListener, notificationListener, + UserHandle.myUserId(), null); } /** @@ -163,7 +168,8 @@ public final class MediaSessionManager { * @param handler The handler to post updates on. * @hide */ - public void addActiveSessionsListener(@NonNull SessionListener sessionListener, + public void addOnActiveSessionsChangedListener( + @NonNull OnActiveSessionsChangedListener sessionListener, @Nullable ComponentName notificationListener, int userId, @Nullable Handler handler) { if (sessionListener == null) { throw new IllegalArgumentException("listener may not be null"); @@ -171,11 +177,18 @@ public final class MediaSessionManager { if (handler == null) { handler = new Handler(); } - sessionListener.setHandler(handler); - try { - mService.addSessionsListener(sessionListener.mStub, notificationListener, userId); - } catch (RemoteException e) { - Log.e(TAG, "Error in addActiveSessionsListener.", e); + synchronized (mLock) { + if (mListeners.get(sessionListener) != null) { + Log.w(TAG, "Attempted to add session listener twice, ignoring."); + return; + } + SessionsChangedWrapper wrapper = new SessionsChangedWrapper(sessionListener, handler); + try { + mService.addSessionsListener(wrapper.mStub, notificationListener, userId); + mListeners.put(sessionListener, wrapper); + } catch (RemoteException e) { + Log.e(TAG, "Error in addOnActiveSessionsChangedListener.", e); + } } } @@ -184,14 +197,20 @@ public final class MediaSessionManager { * * @param listener The listener to remove. */ - public void removeActiveSessionsListener(@NonNull SessionListener listener) { + public void removeOnActiveSessionsChangedListener( + @NonNull OnActiveSessionsChangedListener listener) { if (listener == null) { throw new IllegalArgumentException("listener may not be null"); } - try { - mService.removeSessionsListener(listener.mStub); - } catch (RemoteException e) { - Log.e(TAG, "Error in removeActiveSessionsListener.", e); + synchronized (mLock) { + SessionsChangedWrapper wrapper = mListeners.remove(listener); + if (wrapper != null) { + try { + mService.removeSessionsListener(wrapper.mStub); + } catch (RemoteException e) { + Log.e(TAG, "Error in removeOnActiveSessionsChangedListener.", e); + } + } } } @@ -257,28 +276,18 @@ public final class MediaSessionManager { /** * Listens for changes to the list of active sessions. This can be added - * using {@link #addActiveSessionsListener}. + * using {@link #addOnActiveSessionsChangedListener}. */ - public static abstract class SessionListener { - private final Context mContext; - private Handler mHandler; + public interface OnActiveSessionsChangedListener { + public void onActiveSessionsChanged(@Nullable List<MediaController> controllers); + } - public SessionListener(Context context) { - mContext = context; - } - /** - * Called when the list of active sessions has changed. This can be due - * to a session being added or removed or the order of sessions - * changing. The controllers will be provided in priority order with the - * most important controller at index 0. - * - * @param controllers The updated list of controllers for the user that - * changed. - */ - public abstract void onActiveSessionsChanged( - @Nullable List<MediaController> controllers); + private final class SessionsChangedWrapper { + private final OnActiveSessionsChangedListener mListener; + private final Handler mHandler; - private final void setHandler(Handler handler) { + public SessionsChangedWrapper(OnActiveSessionsChangedListener listener, Handler handler) { + mListener = listener; mHandler = handler; } @@ -295,7 +304,7 @@ public final class MediaSessionManager { for (int i = 0; i < size; i++) { controllers.add(new MediaController(mContext, tokens.get(i))); } - SessionListener.this.onActiveSessionsChanged(controllers); + mListener.onActiveSessionsChanged(controllers); } }); } diff --git a/media/java/android/media/session/ParcelableVolumeInfo.java b/media/java/android/media/session/ParcelableVolumeInfo.java index e71b5398dd0b..96a45d9bd91c 100644 --- a/media/java/android/media/session/ParcelableVolumeInfo.java +++ b/media/java/android/media/session/ParcelableVolumeInfo.java @@ -21,7 +21,7 @@ import android.os.Parcelable; /** * Convenience class for passing information about the audio configuration of a - * session. The public implementation is {@link MediaController.VolumeInfo}. + * session. The public implementation is {@link MediaController.AudioInfo}. * * @hide */ diff --git a/media/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java index 2ad8eaecbff1..566e21842d4c 100644 --- a/media/java/android/media/session/PlaybackState.java +++ b/media/java/android/media/session/PlaybackState.java @@ -120,11 +120,11 @@ public final class PlaybackState implements Parcelable { public static final long ACTION_PLAY_FROM_SEARCH = 1 << 11; /** - * Indicates this performer supports the skip to track command. + * Indicates this performer supports the skip to item command. * * @see Builder#setActions(long) */ - public static final long ACTION_SKIP_TO_TRACK = 1 << 12; + public static final long ACTION_SKIP_TO_ITEM = 1 << 12; /** * This is the default playback state and indicates that no media has been @@ -223,11 +223,11 @@ public final class PlaybackState implements Parcelable { private List<PlaybackState.CustomAction> mCustomActions; private final CharSequence mErrorMessage; private final long mUpdateTime; - private final long mActiveTrackId; + private final long mActiveItemId; private PlaybackState(int state, long position, long updateTime, float speed, long bufferPosition, long transportControls, - List<PlaybackState.CustomAction> customActions, long activeTrackId, + List<PlaybackState.CustomAction> customActions, long activeItemId, CharSequence error) { mState = state; mPosition = position; @@ -236,7 +236,7 @@ public final class PlaybackState implements Parcelable { mBufferPosition = bufferPosition; mActions = transportControls; mCustomActions = new ArrayList<>(customActions); - mActiveTrackId = activeTrackId; + mActiveItemId = activeItemId; mErrorMessage = error; } @@ -248,7 +248,7 @@ public final class PlaybackState implements Parcelable { mBufferPosition = in.readLong(); mActions = in.readLong(); mCustomActions = in.createTypedArrayList(CustomAction.CREATOR); - mActiveTrackId = in.readLong(); + mActiveItemId = in.readLong(); mErrorMessage = in.readCharSequence(); } @@ -263,7 +263,7 @@ public final class PlaybackState implements Parcelable { bob.append(", updated=").append(mUpdateTime); bob.append(", actions=").append(mActions); bob.append(", custom actions=").append(mCustomActions); - bob.append(", active track id=").append(mActiveTrackId); + bob.append(", active item id=").append(mActiveItemId); bob.append(", error=").append(mErrorMessage); bob.append("}"); return bob.toString(); @@ -283,7 +283,7 @@ public final class PlaybackState implements Parcelable { dest.writeLong(mBufferPosition); dest.writeLong(mActions); dest.writeTypedList(mCustomActions); - dest.writeLong(mActiveTrackId); + dest.writeLong(mActiveItemId); dest.writeCharSequence(mErrorMessage); } @@ -716,7 +716,7 @@ public final class PlaybackState implements Parcelable { private long mActions; private CharSequence mErrorMessage; private long mUpdateTime; - private long mActiveTrackId = MediaSession.Track.UNKNOWN_ID; + private long mActiveItemId = MediaSession.Item.UNKNOWN_ID; /** * Creates an initially empty state builder. @@ -744,14 +744,14 @@ public final class PlaybackState implements Parcelable { } mErrorMessage = from.mErrorMessage; mUpdateTime = from.mUpdateTime; - mActiveTrackId = from.mActiveTrackId; + mActiveItemId = from.mActiveItemId; } /** * Set the current state of playback. * <p> * The position must be in ms and indicates the current playback - * position within the track. If the position is unknown use + * position within the item. If the position is unknown use * {@link #PLAYBACK_POSITION_UNKNOWN}. When not using an unknown * position the time at which the position was updated must be provided. * It is okay to use {@link SystemClock#elapsedRealtime()} if the @@ -773,7 +773,7 @@ public final class PlaybackState implements Parcelable { * </ul> * * @param state The current state of playback. - * @param position The position in the current track in ms. + * @param position The position in the current item in ms. * @param playbackSpeed The current speed of playback as a multiple of * normal playback. * @param updateTime The time in the {@link SystemClock#elapsedRealtime} @@ -792,7 +792,7 @@ public final class PlaybackState implements Parcelable { * Set the current state of playback. * <p> * The position must be in ms and indicates the current playback - * position within the track. If the position is unknown use + * position within the item. If the position is unknown use * {@link #PLAYBACK_POSITION_UNKNOWN}. The update time will be set to * the current {@link SystemClock#elapsedRealtime()}. * <p> @@ -812,7 +812,7 @@ public final class PlaybackState implements Parcelable { * </ul> * * @param state The current state of playback. - * @param position The position in the current track in ms. + * @param position The position in the current item in ms. * @param playbackSpeed The current speed of playback as a multiple of * normal playback. * @return this @@ -902,14 +902,14 @@ public final class PlaybackState implements Parcelable { } /** - * Set the active track in the play queue by specifying its id. - * The default value is {@link MediaSession.Track#UNKNOWN_ID} + * Set the active item in the play queue by specifying its id. The + * default value is {@link MediaSession.Item#UNKNOWN_ID} * - * @param id The id of the active track. + * @param id The id of the active item. * @return this */ - public Builder setActiveTrack(long id) { - mActiveTrackId = id; + public Builder setActiveItem(long id) { + mActiveItemId = id; return this; } @@ -932,7 +932,7 @@ public final class PlaybackState implements Parcelable { */ public PlaybackState build() { return new PlaybackState(mState, mPosition, mUpdateTime, mSpeed, mBufferPosition, - mActions, mCustomActions, mActiveTrackId, mErrorMessage); + mActions, mCustomActions, mActiveItemId, mErrorMessage); } } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java index b05c242bf66a..51876b85778f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java @@ -37,7 +37,7 @@ import android.media.RingtoneManager; import android.media.ToneGenerator; import android.media.VolumeProvider; import android.media.session.MediaController; -import android.media.session.MediaController.VolumeInfo; +import android.media.session.MediaController.AudioInfo; import android.net.Uri; import android.os.Handler; import android.os.Message; @@ -537,8 +537,8 @@ public class VolumePanel extends Handler { if (mStreamControls != null) { StreamControl sc = mStreamControls.get(streamType); if (sc != null && sc.controller != null) { - VolumeInfo vi = sc.controller.getVolumeInfo(); - return vi.getMaxVolume(); + AudioInfo ai = sc.controller.getAudioInfo(); + return ai.getMaxVolume(); } } return -1; @@ -554,8 +554,8 @@ public class VolumePanel extends Handler { if (mStreamControls != null) { StreamControl sc = mStreamControls.get(streamType); if (sc != null && sc.controller != null) { - VolumeInfo vi = sc.controller.getVolumeInfo(); - return vi.getCurrentVolume(); + AudioInfo ai = sc.controller.getAudioInfo(); + return ai.getCurrentVolume(); } } return -1; @@ -990,7 +990,7 @@ public class VolumePanel extends Handler { // We still don't have one, ignore the command. Log.w(mTag, "sent remote volume change without a controller!"); } else { - VolumeInfo vi = controller.getVolumeInfo(); + AudioInfo vi = controller.getAudioInfo(); index = vi.getCurrentVolume(); max = vi.getMaxVolume(); if ((vi.getVolumeControl() & VolumeProvider.VOLUME_CONTROL_FIXED) != 0) { @@ -1362,7 +1362,7 @@ public class VolumePanel extends Handler { }; private final MediaController.Callback mMediaControllerCb = new MediaController.Callback() { - public void onVolumeInfoChanged(VolumeInfo info) { + public void onAudioInfoChanged(AudioInfo info) { onRemoteVolumeUpdateIfShown(); } }; |