Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 273130dc authored by Jaewan Kim's avatar Jaewan Kim
Browse files

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
parent d97a0f1a
Loading
Loading
Loading
Loading
+64 −36
Original line number Diff line number Diff line
@@ -23362,10 +23362,12 @@ package android.media {
    method public float getPlaybackSpeed();
    method public int getPlayerState();
    method public java.util.List<android.media.MediaItem2> 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.MediaItem2>, 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<android.media.MediaItem2>);
    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<android.media.MediaItem2> 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.MediaItem2>, 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.MediaItem2>, 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<android.media.MediaItem2> 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<android.media.MediaSession2.CommandButton>);
    method public void setPlaybackSpeed(float);
    method public void setPlaylist(java.util.List<android.media.MediaItem2>);
    method public void setPlaylistParams(android.media.MediaSession2.PlaylistParams);
    method public void setPlaylist(java.util.List<android.media.MediaItem2>, 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);
+109 −33
Original line number Diff line number Diff line
@@ -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<MediaItem2> 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.
     * <p>
     * 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<MediaItem2> 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.
     * <p>
     * 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.
     *<p>
@@ -760,18 +807,47 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
    }

    /**
     * Inserts the media item to the play list at position index.
     * <p>
     * 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)
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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.
         */
+232 −2

File changed.

Preview size limit exceeded, changes collapsed.

+294 −120

File changed.

Preview size limit exceeded, changes collapsed.