From 273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0 Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Mon, 5 Mar 2018 16:01:26 +0900 Subject: MediaSession2: Add MediaPlaylistController.PlaylistEventCallback This includes following changes per offline discussion - Add MediaPlaylistController.PlaylistEventCallback - Add following APIs to the MediaPlaylistController * registerPlaylistControllerCallback() / unregisterPlaylistControllerCallback() * getRepeatMode() / setRepeatMode() * getShuffleMode() / setShuffleMode() * setPlaylist() with metadata * setPlaylistMetadata() / getPlaylistMetadata() - Add following APIs to the SessionCallback * onMediaPrepared() * onPlayerStateChanged() * onBufferingStateChanged() - Remove following methods from ControllerCallback * onPlaylistChanged() Bug: 64098437 Bug: 74157064 Test: passed MediaComponentTest Change-Id: I5ad12a9a5d6a7d9e23a577dca8ea26fbacb8f259 --- api/current.txt | 100 +++-- media/java/android/media/MediaController2.java | 142 +++++-- media/java/android/media/MediaPlayerBase.java | 2 +- .../android/media/MediaPlaylistController.java | 234 +++++++++++- media/java/android/media/MediaSession2.java | 414 +++++++++++++++------ 5 files changed, 700 insertions(+), 192 deletions(-) diff --git a/api/current.txt b/api/current.txt index 01117c9c2716..c8dad38a7e45 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23362,10 +23362,12 @@ package android.media { method public float getPlaybackSpeed(); method public int getPlayerState(); method public java.util.List getPlaylist(); - method public android.media.MediaSession2.PlaylistParams getPlaylistParams(); + method public android.media.MediaMetadata2 getPlaylistMetadata(); method public long getPosition(); + method public int getRepeatMode(); method public android.app.PendingIntent getSessionActivity(); method public android.media.SessionToken2 getSessionToken(); + method public int getShuffleMode(); method public boolean isConnected(); method public void pause(); method public void play(); @@ -23376,19 +23378,24 @@ package android.media { method public void prepareFromMediaId(java.lang.String, android.os.Bundle); method public void prepareFromSearch(java.lang.String, android.os.Bundle); method public void prepareFromUri(android.net.Uri, android.os.Bundle); + method public void registerPlaylistControllerCallback(java.util.concurrent.Executor, android.media.MediaPlaylistController.PlaylistEventCallback); method public void removePlaylistItem(android.media.MediaItem2); method public void replacePlaylistItem(int, android.media.MediaItem2); method public void rewind(); method public void seekTo(long); method public void sendCustomCommand(android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); method public void setPlaybackSpeed(float); - method public void setPlaylistParams(android.media.MediaSession2.PlaylistParams); + method public void setPlaylist(java.util.List, android.media.MediaMetadata2); method public void setRating(java.lang.String, android.media.Rating2); + method public void setRepeatMode(int); + method public void setShuffleMode(int); method public void setVolumeTo(int, int); method public void skipToNext(); method public void skipToPlaylistItem(android.media.MediaItem2); method public void skipToPrevious(); method public void stop(); + method public void unregisterPlaylistControllerCallback(android.media.MediaPlaylistController.PlaylistEventCallback); + method public void updatePlaylistMetadata(android.media.MediaMetadata2); } public static abstract class MediaController2.ControllerCallback { @@ -23404,8 +23411,6 @@ package android.media { method public void onPlaybackInfoChanged(android.media.MediaController2, android.media.MediaController2.PlaybackInfo); method public void onPlaybackSpeedChanged(android.media.MediaController2, float); method public void onPlayerStateChanged(android.media.MediaController2, int); - method public void onPlaylistChanged(android.media.MediaController2, java.util.List); - method public void onPlaylistParamsChanged(android.media.MediaController2, android.media.MediaSession2.PlaylistParams); method public void onPositionChanged(android.media.MediaController2, long, long); } @@ -24544,9 +24549,33 @@ package android.media { method public abstract void addPlaylistItem(int, android.media.MediaItem2); method public abstract android.media.MediaItem2 getCurrentPlaylistItem(); method public abstract java.util.List getPlaylist(); + method public abstract android.media.MediaMetadata2 getPlaylistMetadata(); + method public abstract int getRepeatMode(); + method public abstract int getShuffleMode(); + method public abstract void registerPlaylistControllerCallback(java.util.concurrent.Executor, android.media.MediaPlaylistController.PlaylistEventCallback); method public abstract void removePlaylistItem(android.media.MediaItem2); method public abstract void replacePlaylistItem(int, android.media.MediaItem2); + method public abstract void setPlaylist(java.util.List, android.media.MediaMetadata2); + method public abstract void setRepeatMode(int); + method public abstract void setShuffleMode(int); method public abstract void skipToPlaylistItem(android.media.MediaItem2); + method public abstract void unregisterPlaylistControllerCallback(android.media.MediaPlaylistController.PlaylistEventCallback); + method public abstract void updatePlaylistMetadata(android.media.MediaMetadata2); + field public static final int REPEAT_MODE_ALL = 2; // 0x2 + field public static final int REPEAT_MODE_GROUP = 3; // 0x3 + field public static final int REPEAT_MODE_NONE = 0; // 0x0 + field public static final int REPEAT_MODE_ONE = 1; // 0x1 + field public static final int SHUFFLE_MODE_ALL = 1; // 0x1 + field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2 + field public static final int SHUFFLE_MODE_NONE = 0; // 0x0 + } + + public static abstract class MediaPlaylistController.PlaylistEventCallback { + ctor public MediaPlaylistController.PlaylistEventCallback(); + method public void onPlaylistChanged(android.media.MediaPlaylistController, java.util.List, android.media.MediaMetadata2); + method public void onPlaylistMetadataChanged(android.media.MediaPlaylistController, android.media.MediaMetadata2); + method public void onRepeatModeChanged(android.media.MediaPlaylistController, int); + method public void onShuffleModeChanged(android.media.MediaPlaylistController, int); } public class MediaRecorder implements android.media.AudioRouting { @@ -24835,13 +24864,16 @@ package android.media { method public float getPlaybackSpeed(); method public android.media.MediaPlayerBase getPlayer(); method public java.util.List getPlaylist(); - method public android.media.MediaSession2.PlaylistParams getPlaylistParams(); + method public android.media.MediaMetadata2 getPlaylistMetadata(); + method public int getRepeatMode(); + method public int getShuffleMode(); method public android.media.SessionToken2 getToken(); method public android.media.VolumeProvider2 getVolumeProvider(); method public void notifyError(int, android.os.Bundle); method public void pause(); method public void play(); method public void prepare(); + method public void registerPlaylistControllerCallback(java.util.concurrent.Executor, android.media.MediaPlaylistController.PlaylistEventCallback); method public void removePlaylistItem(android.media.MediaItem2); method public void replacePlaylistItem(int, android.media.MediaItem2); method public void rewind(); @@ -24852,36 +24884,45 @@ package android.media { method public void setAudioFocusRequest(android.media.AudioFocusRequest); method public void setCustomLayout(android.media.MediaSession2.ControllerInfo, java.util.List); method public void setPlaybackSpeed(float); - method public void setPlaylist(java.util.List); - method public void setPlaylistParams(android.media.MediaSession2.PlaylistParams); + method public void setPlaylist(java.util.List, android.media.MediaMetadata2); + method public void setRepeatMode(int); + method public void setShuffleMode(int); method public void skipToNext(); method public void skipToPlaylistItem(android.media.MediaItem2); method public void skipToPrevious(); method public void stop(); + method public void unregisterPlaylistControllerCallback(android.media.MediaPlaylistController.PlaylistEventCallback); method public void updatePlayer(android.media.MediaPlayerBase, android.media.MediaPlaylistController, android.media.VolumeProvider2); - field public static final int COMMAND_CODE_BROWSER = 22; // 0x16 + method public void updatePlaylistMetadata(android.media.MediaMetadata2); + field public static final int COMMAND_CODE_BROWSER = 28; // 0x1c field public static final int COMMAND_CODE_CUSTOM = 0; // 0x0 + field public static final int COMMAND_CODE_PLAYBACK_ADJUST_VOLUME = 11; // 0xb field public static final int COMMAND_CODE_PLAYBACK_FAST_FORWARD = 7; // 0x7 field public static final int COMMAND_CODE_PLAYBACK_PAUSE = 2; // 0x2 field public static final int COMMAND_CODE_PLAYBACK_PLAY = 1; // 0x1 field public static final int COMMAND_CODE_PLAYBACK_PREPARE = 6; // 0x6 field public static final int COMMAND_CODE_PLAYBACK_REWIND = 8; // 0x8 field public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9; // 0x9 - field public static final int COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS = 11; // 0xb + field public static final int COMMAND_CODE_PLAYBACK_SET_VOLUME = 10; // 0xa field public static final int COMMAND_CODE_PLAYBACK_SKIP_NEXT_ITEM = 4; // 0x4 field public static final int COMMAND_CODE_PLAYBACK_SKIP_PREV_ITEM = 5; // 0x5 - field public static final int COMMAND_CODE_PLAYBACK_SKIP_TO_PLAYLIST_ITEM = 10; // 0xa field public static final int COMMAND_CODE_PLAYBACK_STOP = 3; // 0x3 - field public static final int COMMAND_CODE_PLAYLIST_ADD = 12; // 0xc - field public static final int COMMAND_CODE_PLAYLIST_GET = 14; // 0xe - field public static final int COMMAND_CODE_PLAYLIST_REMOVE = 13; // 0xd - field public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 16; // 0x10 - field public static final int COMMAND_CODE_PLAY_FROM_SEARCH = 18; // 0x12 - field public static final int COMMAND_CODE_PLAY_FROM_URI = 17; // 0x11 - field public static final int COMMAND_CODE_PREPARE_FROM_MEDIA_ID = 19; // 0x13 - field public static final int COMMAND_CODE_PREPARE_FROM_SEARCH = 21; // 0x15 - field public static final int COMMAND_CODE_PREPARE_FROM_URI = 20; // 0x14 - field public static final int COMMAND_CODE_SET_VOLUME = 15; // 0xf + field public static final int COMMAND_CODE_PLAYLIST_ADD_ITEM = 15; // 0xf + field public static final int COMMAND_CODE_PLAYLIST_GET_LIST = 18; // 0x12 + field public static final int COMMAND_CODE_PLAYLIST_GET_LIST_METADATA = 20; // 0x14 + field public static final int COMMAND_CODE_PLAYLIST_REMOVE_ITEM = 16; // 0x10 + field public static final int COMMAND_CODE_PLAYLIST_REPLACE_ITEM = 17; // 0x11 + field public static final int COMMAND_CODE_PLAYLIST_SET_LIST = 19; // 0x13 + field public static final int COMMAND_CODE_PLAYLIST_SET_LIST_METADATA = 21; // 0x15 + field public static final int COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE = 14; // 0xe + field public static final int COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE = 13; // 0xd + field public static final int COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM = 12; // 0xc + field public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 22; // 0x16 + field public static final int COMMAND_CODE_PLAY_FROM_SEARCH = 24; // 0x18 + field public static final int COMMAND_CODE_PLAY_FROM_URI = 23; // 0x17 + field public static final int COMMAND_CODE_PREPARE_FROM_MEDIA_ID = 25; // 0x19 + field public static final int COMMAND_CODE_PREPARE_FROM_SEARCH = 27; // 0x1b + field public static final int COMMAND_CODE_PREPARE_FROM_URI = 26; // 0x1a field public static final int ERROR_CODE_ACTION_ABORTED = 10; // 0xa field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1 field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3 @@ -24951,31 +24992,18 @@ package android.media { method public boolean isTrusted(); } - public static final class MediaSession2.PlaylistParams { - ctor public MediaSession2.PlaylistParams(android.content.Context, int, int, android.media.MediaMetadata2); - method public static android.media.MediaSession2.PlaylistParams fromBundle(android.content.Context, android.os.Bundle); - method public android.media.MediaMetadata2 getPlaylistMetadata(); - method public int getRepeatMode(); - method public int getShuffleMode(); - method public android.os.Bundle toBundle(); - field public static final int REPEAT_MODE_ALL = 2; // 0x2 - field public static final int REPEAT_MODE_GROUP = 3; // 0x3 - field public static final int REPEAT_MODE_NONE = 0; // 0x0 - field public static final int REPEAT_MODE_ONE = 1; // 0x1 - field public static final int SHUFFLE_MODE_ALL = 1; // 0x1 - field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2 - field public static final int SHUFFLE_MODE_NONE = 0; // 0x0 - } - public static abstract class MediaSession2.SessionCallback { ctor public MediaSession2.SessionCallback(android.content.Context); + method public void onBufferingStateChanged(android.media.MediaSession2, android.media.MediaItem2, int); method public boolean onCommandRequest(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command); method public android.media.MediaSession2.CommandGroup onConnect(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo); method public void onCustomCommand(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); method public void onDisconnected(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo); + method public void onMediaPrepared(android.media.MediaSession2, android.media.MediaItem2); method public void onPlayFromMediaId(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPlayFromSearch(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPlayFromUri(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle); + method public void onPlayerStateChanged(android.media.MediaSession2, int); method public void onPrepareFromMediaId(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPrepareFromSearch(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPrepareFromUri(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle); diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java index df7b5afc83e3..25188fb1ba3c 100644 --- a/media/java/android/media/MediaController2.java +++ b/media/java/android/media/MediaController2.java @@ -147,7 +147,9 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController * @see #onPositionChanged(MediaController2, long, long) * @see #onBufferedPositionChanged(MediaController2, long) * @see #onCurrentPlaylistItemChanged(MediaController2, MediaItem2) + * @hide */ + // TODO(jaewan): Remove (b/74174728) public void onPlaylistChanged(@NonNull MediaController2 controller, @NonNull List playlist) { } @@ -228,7 +230,9 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController * * @param controller the controller for this event * @param params The new play list parameters. + * @hide */ + // TODO(jaewan): Remove (b/74116823) public void onPlaylistParamsChanged(@NonNull MediaController2 controller, @NonNull PlaylistParams params) { } } @@ -439,25 +443,15 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController mProvider.seekTo_impl(pos); } - /** - * Sets the index of current DataSourceDesc in the play list to be played. - * - * @param item the index of DataSourceDesc in the play list you want to play - * @throws IllegalArgumentException if the play list is null - * @throws NullPointerException if index is outside play list range - */ - @Override - public void skipToPlaylistItem(@NonNull MediaItem2 item) { - mProvider.skipToPlaylistItem_impl(item); - } - /** * Sets the {@link PlaylistParams} for the current play list. Repeat/shuffle mode and metadata * for the list can be set by calling this method. * * @param params A {@link PlaylistParams} object to set. * @throws IllegalArgumentException if given {@param param} is null. + * @hide */ + // TODO(jaewan): Remove (b/74116823) public void setPlaylistParams(@NonNull PlaylistParams params) { mProvider.setPlaylistParams_impl(params); } @@ -671,17 +665,6 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController return mProvider.getBufferedPosition_impl(); } - /** - * Get the lastly cached current item from - * {@link ControllerCallback#onCurrentPlaylistItemChanged(MediaController2, MediaItem2)}. - * - * @return index of the current item - */ - @Override - public MediaItem2 getCurrentPlaylistItem() { - return mProvider.getCurrentPlaylistItem_impl(); - } - /** * Get the current playback info for this session. * @@ -719,6 +702,35 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController mProvider.sendCustomCommand_impl(command, args, cb); } + /** + * Register {@link MediaPlaylistController.PlaylistEventCallback} to listen changes in the + * underlying {@link MediaPlaylistController}, regardless of the change in the controller. + *

+ * Registered callbacks will be also called when the controller is changed. + * + * @param executor a callback Executor + * @param callback a PlaylistEventCallback + * @throws IllegalArgumentException if executor or callback is {@code null}. + */ + @Override + public void registerPlaylistControllerCallback(@NonNull @CallbackExecutor Executor executor, + @NonNull PlaylistEventCallback callback) { + // TODO(jaewan): Implement (b/74169681) + //mProvider.registerPlaylistControllerCallback_impl(executor, callback); + } + + /** + * Unregister the previously registered {@link MediaPlaylistController.PlaylistEventCallback}. + * + * @param callback the callback to be removed + * @throws IllegalArgumentException if the callback is {@code null}. + */ + @Override + public void unregisterPlaylistControllerCallback(@NonNull PlaylistEventCallback callback) { + // TODO(jaewan): Implement (b/74169681) + //mProvider.unregisterPlaylistControllerCallback_impl(callback); + } + /** * Return playlist from the session. * @@ -729,15 +741,50 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController return mProvider.getPlaylist_impl(); } + + @Override + public void setPlaylist(@NonNull List list, @Nullable MediaMetadata2 metadata) { + // TODO(jaewan): Implement (b/74174649) + } + + @Override + public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) { + // TODO(jaewan): Implement (b/74174649) + } + + @Override + public @Nullable MediaMetadata2 getPlaylistMetadata() { + // TODO(jaewan): Implement (b/74174649) + return null; + } + /** * Returns the {@link PlaylistParams} for the current play list. * Can return {@code null} if the controller doesn't have enough permission, or if the session * has not set the parameters. + * @hide */ + // TODO(jaewan): Remove (b/74116823) public @Nullable PlaylistParams getPlaylistParams() { return mProvider.getPlaylistParams_impl(); } + /** + * Inserts the media item to the play list at position index. + *

+ * This will not change the currently playing media item. + * If index is less than or equal to the current index of the play list, + * the current index of the play list will be incremented correspondingly. + * + * @param index the index you want to add + * @param item the media item you want to add + * @throws IndexOutOfBoundsException if index is outside play list range + */ + @Override + public void addPlaylistItem(int index, @NonNull MediaItem2 item) { + mProvider.addPlaylistItem_impl(index, item); + } + /** * Removes the media item at index in the playlist. *

@@ -760,18 +807,47 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController } /** - * Inserts the media item to the play list at position index. - *

- * This will not change the currently playing media item. - * If index is less than or equal to the current index of the play list, - * the current index of the play list will be incremented correspondingly. + * Get the lastly cached current item from + * {@link ControllerCallback#onCurrentPlaylistItemChanged(MediaController2, MediaItem2)}. * - * @param index the index you want to add - * @param item the media item you want to add - * @throws IndexOutOfBoundsException if index is outside play list range + * @return index of the current item */ @Override - public void addPlaylistItem(int index, @NonNull MediaItem2 item) { - mProvider.addPlaylistItem_impl(index, item); + public MediaItem2 getCurrentPlaylistItem() { + return mProvider.getCurrentPlaylistItem_impl(); + } + + /** + * Sets the index of current DataSourceDesc in the play list to be played. + * + * @param item the index of DataSourceDesc in the play list you want to play + * @throws IllegalArgumentException if the play list is null + * @throws NullPointerException if index is outside play list range + */ + @Override + public void skipToPlaylistItem(@NonNull MediaItem2 item) { + mProvider.skipToPlaylistItem_impl(item); + } + + @Override + public @RepeatMode int getRepeatMode() { + // TODO(jaewan): Implement (b/74118768) + return 0; + } + + @Override + public void setRepeatMode(int repeatMode) { + // TODO(jaewan): Implement (b/74118768) + } + + @Override + public @ShuffleMode int getShuffleMode() { + // TODO(jaewan): Implement (b/74118768) + return 0; + } + + @Override + public void setShuffleMode(int shuffleMode) { + // TODO(jaewan): Implement (b/74118768) } } diff --git a/media/java/android/media/MediaPlayerBase.java b/media/java/android/media/MediaPlayerBase.java index 24274f1356e3..70a36bf201dd 100644 --- a/media/java/android/media/MediaPlayerBase.java +++ b/media/java/android/media/MediaPlayerBase.java @@ -278,7 +278,7 @@ public abstract class MediaPlayerBase implements AutoCloseable { */ public static abstract class PlayerEventCallback { /** - * Called when the player's curretn data source has changed. + * Called when the player's current data source has changed. * @param mpb the player whose data source changed. * @param dsd the new current data source. */ diff --git a/media/java/android/media/MediaPlaylistController.java b/media/java/android/media/MediaPlaylistController.java index c98d50e2c5e7..1ad56178b757 100644 --- a/media/java/android/media/MediaPlaylistController.java +++ b/media/java/android/media/MediaPlaylistController.java @@ -16,9 +16,18 @@ package android.media; +import android.annotation.CallbackExecutor; +import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; +import android.media.MediaSession2.PlaylistParams; +import android.media.MediaSession2.PlaylistParams.RepeatMode; +import android.media.MediaSession2.PlaylistParams.ShuffleMode; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.List; +import java.util.concurrent.Executor; /** * Controller interface for playlist management. @@ -30,10 +39,231 @@ import java.util.List; // Note that setPlaylist() isn't added on purpose because it's considered session-specific. public interface MediaPlaylistController { + /** + * @hide + */ + @IntDef({REPEAT_MODE_NONE, REPEAT_MODE_ONE, REPEAT_MODE_ALL, + REPEAT_MODE_GROUP}) + @Retention(RetentionPolicy.SOURCE) + @interface RepeatMode {} + + /** + * Playback will be stopped at the end of the playing media list. + */ + int REPEAT_MODE_NONE = 0; + + /** + * Playback of the current playing media item will be repeated. + */ + int REPEAT_MODE_ONE = 1; + + /** + * Playing media list will be repeated. + */ + int REPEAT_MODE_ALL = 2; + + /** + * Playback of the playing media group will be repeated. + * A group is a logical block of media items which is specified in the section 5.7 of the + * Bluetooth AVRCP 1.6. An example of a group is the playlist. + */ + int REPEAT_MODE_GROUP = 3; + + /** + * @hide + */ + @IntDef({SHUFFLE_MODE_NONE, SHUFFLE_MODE_ALL, SHUFFLE_MODE_GROUP}) + @Retention(RetentionPolicy.SOURCE) + @interface ShuffleMode {} + + /** + * Media list will be played in order. + */ + int SHUFFLE_MODE_NONE = 0; + + /** + * Media list will be played in shuffled order. + */ + int SHUFFLE_MODE_ALL = 1; + + /** + * Media group will be played in shuffled order. + * A group is a logical block of media items which is specified in the section 5.7 of the + * Bluetooth AVRCP 1.6. An example of a group is the playlist. + */ + int SHUFFLE_MODE_GROUP = 2; + + abstract class PlaylistEventCallback { + /** + * Called when a playlist is changed. + * + * @param mplc playlist controller for this event + * @param list new playlist + * @param metadata new metadata + */ + public void onPlaylistChanged(@NonNull MediaPlaylistController mplc, + @NonNull List list, @Nullable MediaMetadata2 metadata) { } + + /** + * Called when a playlist is changed. + * + * @param mplc playlist controller for this event + * @param metadata new metadata + */ + public void onPlaylistMetadataChanged(@NonNull MediaPlaylistController mplc, + @Nullable MediaMetadata2 metadata) { } + + /** + * Called when a playlist is changed. + * + * @param mplc playlist controller for this event + * @param shuffleMode repeat mode + * @see #SHUFFLE_MODE_NONE + * @see #SHUFFLE_MODE_ALL + * @see #SHUFFLE_MODE_GROUP + */ + public void onShuffleModeChanged(@NonNull MediaPlaylistController mplc, + @ShuffleMode int shuffleMode) { } + + /** + * Called when a playlist is changed. + * + * @param mplc playlist controller for this event + * @param repeatMode repeat mode + * @see #REPEAT_MODE_NONE + * @see #REPEAT_MODE_ONE + * @see #REPEAT_MODE_ALL + * @see #REPEAT_MODE_GROUP + */ + public void onRepeatModeChanged(@NonNull MediaPlaylistController mplc, + @RepeatMode int repeatMode) { } + } + + /** + * Register {@link PlaylistEventCallback} to listen changes in the underlying + * {@link MediaPlaylistController}, regardless of the change in the controller. + * + * @param executor a callback Executor + * @param callback a PlaylistEventCallback + * @throws IllegalArgumentException if executor or callback is {@code null}. + */ + void registerPlaylistControllerCallback(@NonNull @CallbackExecutor Executor executor, + @NonNull PlaylistEventCallback callback); + + /** + * Unregister the previously registered {@link PlaylistEventCallback}. + * + * @param callback the callback to be removed + * @throws IllegalArgumentException if the callback is {@code null}. + */ + void unregisterPlaylistControllerCallback(@NonNull PlaylistEventCallback callback); + + /** + * Returns the playlist + * + * @return playlist, or null if none is set. + */ + @Nullable List getPlaylist(); + + /** + * Sets the playlist. + * + * @param list playlist + * @param metadata metadata of the playlist + */ + void setPlaylist(@NonNull List list, @Nullable MediaMetadata2 metadata); + + /** + * Returns the playlist metadata + * + * @return metadata metadata of the playlist, or null if none is set + */ + @Nullable MediaMetadata2 getPlaylistMetadata(); + + /** + * Updates the playlist metadata + * + * @param metadata metadata of the playlist + */ + void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata); + + /** + * Adds the media item to the playlist at the index + * + * @param index index + * @param item media item to add + */ void addPlaylistItem(int index, @NonNull MediaItem2 item); + + /** + * Removes the media item from the playlist + * + * @param item media item to remove + */ void removePlaylistItem(@NonNull MediaItem2 item); + + /** + * Replaces the media item with the . + *

+ * This can be used to update metadata of a MediaItem. + * + * @param index index + * @param item + */ + void replacePlaylistItem(int index, @NonNull MediaItem2 item); + + /** + * Returns the current media item. + * @return the current media item, or null if none is set, or none available to play. + */ MediaItem2 getCurrentPlaylistItem(); + + /** + * Skips to the the media item, and plays from it. + * + * @param item media item to start playing from + */ void skipToPlaylistItem(@NonNull MediaItem2 item); - void replacePlaylistItem(int index, @NonNull MediaItem2 item); - List getPlaylist(); + + /** + * Get repeat mode + * + * @return repeat mode + * @see #REPEAT_MODE_NONE + * @see #REPEAT_MODE_ONE + * @see #REPEAT_MODE_ALL + * @see #REPEAT_MODE_GROUP + */ + @RepeatMode int getRepeatMode(); + + /** + * Set repeat mode + * + * @param repeatMode repeat mode + * @see #REPEAT_MODE_NONE + * @see #REPEAT_MODE_ONE + * @see #REPEAT_MODE_ALL + * @see #REPEAT_MODE_GROUP + */ + void setRepeatMode(@RepeatMode int repeatMode); + + /** + * Get shuffle mode + * + * @return shuffle mode + * @see #SHUFFLE_MODE_NONE + * @see #SHUFFLE_MODE_ALL + * @see #SHUFFLE_MODE_GROUP + */ + @ShuffleMode int getShuffleMode(); + + /** + * Set shuffle mode + * + * @param shuffleMode shuffle mode + * @see #SHUFFLE_MODE_NONE + * @see #SHUFFLE_MODE_ALL + * @see #SHUFFLE_MODE_GROUP + */ + void setShuffleMode(@ShuffleMode int shuffleMode); } diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index d94be66c853a..4b6e4fd05bc7 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -23,7 +23,9 @@ import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.media.MediaPlayerBase.BuffState; import android.media.MediaPlayerBase.PlayerEventCallback; +import android.media.MediaPlayerBase.PlayerState; import android.media.session.MediaSession; import android.media.session.MediaSession.Callback; import android.media.session.PlaybackState; @@ -81,7 +83,6 @@ import java.util.concurrent.Executor; public class MediaSession2 implements AutoCloseable, MediaPlaylistController { private final MediaSession2Provider mProvider; - // Next ID: 23 /** * Command code for the custom command which can be defined by string action in the * {@link Command}. @@ -160,94 +161,173 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. */ public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9; + /** - * Command code for {@link MediaController2#skipToPlaylistItem(MediaItem2)}. + * Command code for both {@link MediaController2#setVolumeTo(int, int)}. *

- * Command would be sent directly to the player if the session doesn't reject the request - * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + * Command would set the device volume or send to the volume provider directly if the session + * doesn't reject the request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYBACK_SET_VOLUME = 10; + + /** + * Command code for both {@link MediaController2#adjustVolume(int, int)}. + *

+ * Command would adjust the device volume or send to the volume provider directly if the session + * doesn't reject the request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. */ - public static final int COMMAND_CODE_PLAYBACK_SKIP_TO_PLAYLIST_ITEM = 10; + public static final int COMMAND_CODE_PLAYBACK_ADJUST_VOLUME = 11; /** * Command code for {@link MediaController2#setPlaylistParams(PlaylistParams)}. *

* Command would be sent directly to the player if the session doesn't reject the request * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + * @hide */ - public static final int COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS = 11; + // TODO(jaewan): Remove (b/74116823) + public static final int COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS = 12; + + /** + * Command code for {@link MediaController2#skipToPlaylistItem(MediaItem2)}. + *

+ * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM = 12; + + /** + * Command code for {@link MediaController2#setShuffleMode(int)}. + *

+ * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE = 13; + + /** + * Command code for {@link MediaController2#setRepeatMode(int)}. + *

+ * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE = 14; /** * Command code for {@link MediaController2#addPlaylistItem(int, MediaItem2)}. *

- * Command would be sent directly to the player if the session doesn't reject the request - * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. */ - public static final int COMMAND_CODE_PLAYLIST_ADD = 12; + public static final int COMMAND_CODE_PLAYLIST_ADD_ITEM = 15; /** * Command code for {@link MediaController2#addPlaylistItem(int, MediaItem2)}. *

- * Command would be sent directly to the player if the session doesn't reject the request - * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. */ - public static final int COMMAND_CODE_PLAYLIST_REMOVE = 13; + public static final int COMMAND_CODE_PLAYLIST_REMOVE_ITEM = 16; /** - * Command code for {@link MediaController2#getPlaylist()}. + * Command code for {@link MediaController2#replacePlaylistItem(int, MediaItem2)}. *

- * Command would be sent directly to the player if the session doesn't reject the request - * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. */ - public static final int COMMAND_CODE_PLAYLIST_GET = 14; + public static final int COMMAND_CODE_PLAYLIST_REPLACE_ITEM = 17; /** - * Command code for both {@link MediaController2#setVolumeTo(int, int)} and - * {@link MediaController2#adjustVolume(int, int)}. + * Command code for {@link MediaController2#getPlaylist()}. This will expose metadata + * information to the controller. *

- * Command would adjust the volume or sent to the volume provider directly if the session - * doesn't reject the request through the + * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYLIST_GET_LIST = 18; + + /** + * Command code for {@link MediaController2#setPlaylist(List, MediaMetadata2). + *

+ * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYLIST_SET_LIST = 19; + + /** + * Command code for {@link MediaController2#getPlaylistMetadata()} ()}. This will expose + * metadata information to the controller. + * * + * Command code for {@link MediaController2#setPlaylist(List, MediaMetadata2)} and + * {@link MediaController2#updatePlaylistMetadata(MediaMetadata2)}. + *

+ * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the + * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + */ + public static final int COMMAND_CODE_PLAYLIST_GET_LIST_METADATA = 20; + + /** + * Command code for {@link MediaController2#updatePlaylistMetadata(MediaMetadata2)}. + *

+ * Command would be sent directly to the playlist controller if the session doesn't reject the + * request through the * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. */ - public static final int COMMAND_CODE_SET_VOLUME = 15; + public static final int COMMAND_CODE_PLAYLIST_SET_LIST_METADATA = 21; /** * Command code for {@link MediaController2#playFromMediaId(String, Bundle)}. */ - public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 16; + public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 22; /** * Command code for {@link MediaController2#playFromUri(Uri, Bundle)}. */ - public static final int COMMAND_CODE_PLAY_FROM_URI = 17; + public static final int COMMAND_CODE_PLAY_FROM_URI = 23; /** * Command code for {@link MediaController2#playFromSearch(String, Bundle)}. */ - public static final int COMMAND_CODE_PLAY_FROM_SEARCH = 18; + public static final int COMMAND_CODE_PLAY_FROM_SEARCH = 24; /** * Command code for {@link MediaController2#prepareFromMediaId(String, Bundle)}. */ - public static final int COMMAND_CODE_PREPARE_FROM_MEDIA_ID = 19; + public static final int COMMAND_CODE_PREPARE_FROM_MEDIA_ID = 25; /** * Command code for {@link MediaController2#prepareFromUri(Uri, Bundle)}. */ - public static final int COMMAND_CODE_PREPARE_FROM_URI = 20; + public static final int COMMAND_CODE_PREPARE_FROM_URI = 26; /** * Command code for {@link MediaController2#prepareFromSearch(String, Bundle)}. */ - public static final int COMMAND_CODE_PREPARE_FROM_SEARCH = 21; + public static final int COMMAND_CODE_PREPARE_FROM_SEARCH = 27; /** * Command code for {@link MediaBrowser2} specific functions that allows navigation and search - * from the {@link MediaLibraryService2}. This would be ignored if a {@link MediaSession2}, - * not {@link android.media.MediaLibraryService2.MediaLibrarySession}, specify this. + * from the {@link MediaLibraryService2}. This would be ignored for a {@link MediaSession2}, + * not {@link android.media.MediaLibraryService2.MediaLibrarySession}. * * @see MediaBrowser2 */ - public static final int COMMAND_CODE_BROWSER = 22; + public static final int COMMAND_CODE_BROWSER = 28; + + /** + * @hide + */ + public static final int COMMAND_CODE_MAX = 28; /** * @hide @@ -516,12 +596,12 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { * @see #COMMAND_CODE_PLAYBACK_FAST_FORWARD * @see #COMMAND_CODE_PLAYBACK_REWIND * @see #COMMAND_CODE_PLAYBACK_SEEK_TO - * @see #COMMAND_CODE_PLAYBACK_SKIP_TO_PLAYLIST_ITEM + * @see #COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM * @see #COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS - * @see #COMMAND_CODE_PLAYLIST_ADD - * @see #COMMAND_CODE_PLAYLIST_REMOVE - * @see #COMMAND_CODE_PLAYLIST_GET - * @see #COMMAND_CODE_SET_VOLUME + * @see #COMMAND_CODE_PLAYLIST_ADD_ITEM + * @see #COMMAND_CODE_PLAYLIST_REMOVE_ITEM + * @see #COMMAND_CODE_PLAYLIST_GET_LIST + * @see #COMMAND_CODE_PLAYBACK_SET_VOLUME */ public boolean onCommandRequest(@NonNull MediaSession2 session, @NonNull ControllerInfo controller, @NonNull Command command) { @@ -674,6 +754,31 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { */ public void onPrepareFromUri(@NonNull MediaSession2 session, @NonNull ControllerInfo controller, @NonNull Uri uri, @Nullable Bundle extras) { } + + /** + * Called when the player is prepared, i.e. it is ready to play the content + * referenced by the given data source. + * @param session the session for this event + * @param item the media item for which buffering is happening + */ + public void onMediaPrepared(@NonNull MediaSession2 session, @NonNull MediaItem2 item) { } + + /** + * Called to indicate that the state of the player has changed. + * See {@link MediaPlayerBase#getPlayerState()} for polling the player state. + * @param session the session for this event + * @param state the new state of the player. + */ + public void onPlayerStateChanged(@NonNull MediaSession2 session, @PlayerState int state) { } + + /** + * Called to report buffering events for a data source. + * @param session the session for this event + * @param item the media item for which buffering is happening. + * @param state the new buffering state. + */ + public void onBufferingStateChanged(@NonNull MediaSession2 session, + @NonNull MediaItem2 item, @BuffState int state) { } }; /** @@ -1022,7 +1127,9 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { /** * Parameter for the playlist. + * @hide */ + // TODO(jaewan): Remove (b/74116823) public final static class PlaylistParams { /** * @hide @@ -1317,16 +1424,10 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { mProvider.stop_impl(); } - /** - * Rewind playback - */ public void skipToPrevious() { mProvider.skipToPrevious_impl(); } - /** - * Rewind playback - */ public void skipToNext() { mProvider.skipToNext_impl(); } @@ -1365,17 +1466,6 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { mProvider.seekTo_impl(pos); } - /** - * Skip to the item in the play list. - * - * @param item item in the play list you want to play - * @throws IllegalArgumentException if the play list is null - * @throws NullPointerException if index is outside play list range - */ - public void skipToPlaylistItem(MediaItem2 item) { - mProvider.skipToPlaylistItem_impl(item); - } - /** * @hide */ @@ -1390,81 +1480,15 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { // To match with KEYCODE_MEDIA_SKIP_BACKWARD } - /** - * Set a list of {@link MediaItem2} as the current play list. - * - * @param playlist A list of {@link MediaItem2} objects to set as a play list. - * @throws IllegalArgumentException if given {@param playlist} is null. - */ - public void setPlaylist(@NonNull List playlist) { - mProvider.setPlaylist_impl(playlist); - } - - /** - * Remove the media item in the play list. - *

- * If the item is the currently playing item of the playlist, current playback - * will be stopped and playback moves to next source in the list. - * - * @throws IllegalArgumentException if the play list is null - */ - public void removePlaylistItem(MediaItem2 item) { - mProvider.removePlaylistItem_impl(item); - } - - /** - * Add the media item to the play list at position index. - *

- * This will not change the currently playing media item. - * If index is less than or equal to the current index of the play list, - * the current index of the play list will be incremented correspondingly. - * - * @param index the index you want to add - * @param item the media item you want to add - * @throws IndexOutOfBoundsException if index is outside play list range - */ - @Override - public void addPlaylistItem(int index, @NonNull MediaItem2 item) { - mProvider.addPlaylistItem_impl(index, item); - } - - /** - * Replace the media item at index in the playlist. - * @param index the index of the item to replace - * @param item the new item - */ - @Override - public void replacePlaylistItem(int index, @NonNull MediaItem2 item) { - mProvider.replacePlaylistItem_impl(index, item); - } - - /** - * Return the playlist which is lastly set. - * - * @return playlist - */ - @Override - public List getPlaylist() { - return mProvider.getPlaylist_impl(); - } - - /** - * Return currently playing media item. - * - * @return currently playing media item - */ - @Override - public MediaItem2 getCurrentPlaylistItem() { - return mProvider.getCurrentPlaylistItem_impl(); - } - /** * Sets the {@link PlaylistParams} for the current play list. Repeat/shuffle mode and metadata * for the list can be set by calling this method. * * @param params A {@link PlaylistParams} object to set. * @throws IllegalArgumentException if given {@param param} is null. + * @hide */ + // TODO(jaewan): Remove (b/74116823) public void setPlaylistParams(PlaylistParams params) { mProvider.setPlaylistParams_impl(params); } @@ -1472,7 +1496,9 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { /** * Returns the {@link PlaylistParams} for the current play list. * Returns {@code null} if not set. + * @hide */ + // TODO(jaewan): Remove (b/74116823) public PlaylistParams getPlaylistParams() { return mProvider.getPlaylistParams_impl(); } @@ -1542,4 +1568,152 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { public void setPlaybackSpeed(float speed) { // TODO(jaewan): implement this (b/74093080) } + + /** + * Register {@link MediaPlaylistController.PlaylistEventCallback} to listen changes in the + * underlying {@link MediaPlaylistController}, regardless of the change in the controller. + *

+ * Registered callbacks will be also called when the controller is changed. + * + * @param executor a callback Executor + * @param callback a PlaylistEventCallback + * @throws IllegalArgumentException if executor or callback is {@code null}. + */ + @Override + public void registerPlaylistControllerCallback(@NonNull @CallbackExecutor Executor executor, + @NonNull PlaylistEventCallback callback) { + // TODO(jaewan): Implement (b/74169681) + //mProvider.registerPlaylistControllerCallback_impl(executor, callback); + } + + /** + * Unregister the previously registered {@link MediaPlaylistController.PlaylistEventCallback}. + * + * @param callback the callback to be removed + * @throws IllegalArgumentException if the callback is {@code null}. + */ + @Override + public void unregisterPlaylistControllerCallback(@NonNull PlaylistEventCallback callback) { + // TODO(jaewan): Implement (b/74169681) + //mProvider.unregisterPlaylistControllerCallback_impl(callback); + } + + /** + * Return the playlist which is lastly set. + * + * @return playlist + */ + @Override + public List getPlaylist() { + return mProvider.getPlaylist_impl(); + } + + /** + * Set a list of {@link MediaItem2} as the current play list. + * + * @param playlist A list of {@link MediaItem2} objects to set as a play list. + * @throws IllegalArgumentException if given {@param playlist} is null. + * @hide + */ + // TODO(jaewan): Remove + public void setPlaylist(@NonNull List playlist) { + mProvider.setPlaylist_impl(playlist); + } + + @Override + public void setPlaylist(@NonNull List list, @Nullable MediaMetadata2 metadata) { + // TODO(jaewan): Implement (b/74174649) + } + + /** + * Skip to the item in the play list. + * + * @param item item in the play list you want to play + * @throws IllegalArgumentException if the play list is null + * @throws NullPointerException if index is outside play list range + */ + public void skipToPlaylistItem(MediaItem2 item) { + mProvider.skipToPlaylistItem_impl(item); + } + + @Override + public MediaMetadata2 getPlaylistMetadata() { + // TODO(jaewan): Implement (b/74174649) + return null; + } + + /** + * Add the media item to the play list at position index. + *

+ * This will not change the currently playing media item. + * If index is less than or equal to the current index of the play list, + * the current index of the play list will be incremented correspondingly. + * + * @param index the index you want to add + * @param item the media item you want to add + * @throws IndexOutOfBoundsException if index is outside play list range + */ + @Override + public void addPlaylistItem(int index, @NonNull MediaItem2 item) { + mProvider.addPlaylistItem_impl(index, item); + } + + /** + * Remove the media item in the play list. + *

+ * If the item is the currently playing item of the playlist, current playback + * will be stopped and playback moves to next source in the list. + * + * @throws IllegalArgumentException if the play list is null + */ + public void removePlaylistItem(MediaItem2 item) { + mProvider.removePlaylistItem_impl(item); + } + + /** + * Replace the media item at index in the playlist. + * @param index the index of the item to replace + * @param item the new item + */ + @Override + public void replacePlaylistItem(int index, @NonNull MediaItem2 item) { + mProvider.replacePlaylistItem_impl(index, item); + } + + /** + * Return currently playing media item. + * + * @return currently playing media item + */ + @Override + public MediaItem2 getCurrentPlaylistItem() { + return mProvider.getCurrentPlaylistItem_impl(); + } + + @Override + public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) { + // TODO(jaewan): Implement (b/74174649) + } + + @Override + public int getRepeatMode() { + // TODO(jaewan): Implement (b/74118768) + return 0; + } + + @Override + public void setRepeatMode(int repeatMode) { + // TODO(jaewan): Implement (b/74118768) + } + + @Override + public int getShuffleMode() { + // TODO(jaewan): Implement (b/74118768) + return 0; + } + + @Override + public void setShuffleMode(int shuffleMode) { + // TODO(jaewan): Implement (b/74118768) + } } -- cgit v1.2.3-59-g8ed1b From 42a36c341dcac1e12d178ef063e73669eec12cf1 Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Mon, 5 Mar 2018 19:06:35 +0900 Subject: MediaSession2: Pass player info for the callbacks from MediaPlayerBase Player can be updated meantime, and player event from the previous player can be sent after the update. Providing player information will provide developers more opportunity to filter out unecessary callbacks. Bug: 64098437 Test: Run MediaComponents test Change-Id: I9c23101df139e26351c008462c726ae7069130eb --- api/current.txt | 6 +++--- media/java/android/media/MediaSession2.java | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/api/current.txt b/api/current.txt index c8dad38a7e45..1866fc0f4505 100644 --- a/api/current.txt +++ b/api/current.txt @@ -24994,16 +24994,16 @@ package android.media { public static abstract class MediaSession2.SessionCallback { ctor public MediaSession2.SessionCallback(android.content.Context); - method public void onBufferingStateChanged(android.media.MediaSession2, android.media.MediaItem2, int); + method public void onBufferingStateChanged(android.media.MediaSession2, android.media.MediaPlayerBase, android.media.MediaItem2, int); method public boolean onCommandRequest(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command); method public android.media.MediaSession2.CommandGroup onConnect(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo); method public void onCustomCommand(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); method public void onDisconnected(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo); - method public void onMediaPrepared(android.media.MediaSession2, android.media.MediaItem2); + method public void onMediaPrepared(android.media.MediaSession2, android.media.MediaPlayerBase, android.media.MediaItem2); method public void onPlayFromMediaId(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPlayFromSearch(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPlayFromUri(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle); - method public void onPlayerStateChanged(android.media.MediaSession2, int); + method public void onPlayerStateChanged(android.media.MediaSession2, android.media.MediaPlayerBase, int); method public void onPrepareFromMediaId(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPrepareFromSearch(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); method public void onPrepareFromUri(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle); diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index 4b6e4fd05bc7..3bd80b28223d 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -759,26 +759,31 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { * Called when the player is prepared, i.e. it is ready to play the content * referenced by the given data source. * @param session the session for this event + * @param mpb the player for this event * @param item the media item for which buffering is happening */ - public void onMediaPrepared(@NonNull MediaSession2 session, @NonNull MediaItem2 item) { } + public void onMediaPrepared(@NonNull MediaSession2 session, @NonNull MediaPlayerBase mpb, + @NonNull MediaItem2 item) { } /** * Called to indicate that the state of the player has changed. * See {@link MediaPlayerBase#getPlayerState()} for polling the player state. * @param session the session for this event + * @param mpb the player for this event * @param state the new state of the player. */ - public void onPlayerStateChanged(@NonNull MediaSession2 session, @PlayerState int state) { } + public void onPlayerStateChanged(@NonNull MediaSession2 session, + @NonNull MediaPlayerBase mpb, @PlayerState int state) { } /** * Called to report buffering events for a data source. * @param session the session for this event + * @param mpb the player for this event * @param item the media item for which buffering is happening. * @param state the new buffering state. */ public void onBufferingStateChanged(@NonNull MediaSession2 session, - @NonNull MediaItem2 item, @BuffState int state) { } + @NonNull MediaPlayerBase mpb, @NonNull MediaItem2 item, @BuffState int state) { } }; /** -- cgit v1.2.3-59-g8ed1b