summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sungsoo Lim <sungsoo@google.com> 2018-03-07 13:09:36 +0900
committer Sungsoo Lim <sungsoo@google.com> 2018-03-07 16:41:19 +0900
commitdf0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9 (patch)
tree511503c46f465136b7ceb9511396f395ca08fa24
parent87086f59ad7263facde0d17404c70e5311cde29c (diff)
Remove MediaPlaylistController, add MediaPlaylistAgent
MediaPlaylistAgent is the abstract class an application needs to derive from to pass an object to a MediaSession2 that will override default playlist handling behaviors. It contains a set of notify* methods to signal MediaSession2 that playlist-related state has changed. Bug: 64098437 Test: make update-api Change-Id: Icb3c57ddc14eba276f49d4ba85f11adbeb3e0917
-rw-r--r--api/current.txt81
-rw-r--r--media/java/android/media/MediaController2.java135
-rw-r--r--media/java/android/media/MediaLibraryService2.java4
-rw-r--r--media/java/android/media/MediaPlaylistAgent.java (renamed from media/java/android/media/MediaPlaylistController.java)146
-rw-r--r--media/java/android/media/MediaSession2.java147
-rw-r--r--media/java/android/media/update/MediaSession2Provider.java7
6 files changed, 322 insertions, 198 deletions
diff --git a/api/current.txt b/api/current.txt
index 9c42a24442b8..92f738941c81 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -23350,7 +23350,7 @@ package android.media {
field public static final int REGULAR_CODECS = 0; // 0x0
}
- public class MediaController2 implements java.lang.AutoCloseable android.media.MediaPlaylistController {
+ public class MediaController2 implements java.lang.AutoCloseable {
ctor public MediaController2(android.content.Context, android.media.SessionToken2, java.util.concurrent.Executor, android.media.MediaController2.ControllerCallback);
method public void addPlaylistItem(int, android.media.MediaItem2);
method public void adjustVolume(int, int);
@@ -23378,7 +23378,6 @@ 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();
@@ -23390,11 +23389,10 @@ package android.media {
method public void setRepeatMode(int);
method public void setShuffleMode(int);
method public void setVolumeTo(int, int);
- method public void skipToNext();
+ method public void skipToNextItem();
method public void skipToPlaylistItem(android.media.MediaItem2);
- method public void skipToPrevious();
+ method public void skipToPreviousItem();
method public void stop();
- method public void unregisterPlaylistControllerCallback(android.media.MediaPlaylistController.PlaylistEventCallback);
method public void updatePlaylistMetadata(android.media.MediaMetadata2);
}
@@ -23411,7 +23409,11 @@ 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, android.media.MediaPlaylistAgent, java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
+ method public void onPlaylistMetadataChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, android.media.MediaMetadata2);
method public void onPositionChanged(android.media.MediaController2, long, long);
+ method public void onRepeatModeChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, int);
+ method public void onShuffleModeChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, int);
}
public static final class MediaController2.PlaybackInfo {
@@ -23872,7 +23874,7 @@ package android.media {
method public android.media.MediaLibraryService2.MediaLibrarySession build();
method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setId(java.lang.String);
method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setPlayer(android.media.MediaPlayerBase);
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setPlaylistController(android.media.MediaPlaylistController);
+ method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setPlaylistAgent(android.media.MediaPlaylistAgent);
method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setSessionActivity(android.app.PendingIntent);
method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setSessionCallback(java.util.concurrent.Executor, android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback);
method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setVolumeProvider(android.media.VolumeProvider2);
@@ -24541,21 +24543,28 @@ package android.media {
method public void onPlayerStateChanged(android.media.MediaPlayerBase, int);
}
- public abstract interface MediaPlaylistController {
- method public abstract void addPlaylistItem(int, android.media.MediaItem2);
- 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);
+ public abstract class MediaPlaylistAgent {
+ ctor public MediaPlaylistAgent(android.content.Context);
+ method public void addPlaylistItem(int, android.media.MediaItem2);
+ method public java.util.List<android.media.MediaItem2> getPlaylist();
+ method public android.media.MediaMetadata2 getPlaylistMetadata();
+ method public int getRepeatMode();
+ method public int getShuffleMode();
+ method public final void notifyPlaylistChanged();
+ method public final void notifyPlaylistMetadataChanged();
+ method public final void notifyRepeatModeChanged();
+ method public final void notifyShuffleModeChanged();
+ method public final void registerPlaylistEventCallback(java.util.concurrent.Executor, android.media.MediaPlaylistAgent.PlaylistEventCallback);
+ method public void removePlaylistItem(android.media.MediaItem2);
+ method public void replacePlaylistItem(int, android.media.MediaItem2);
+ 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 skipToNextItem();
+ method public void skipToPlaylistItem(android.media.MediaItem2);
+ method public void skipToPreviousItem();
+ method public final void unregisterPlaylistEventCallback(android.media.MediaPlaylistAgent.PlaylistEventCallback);
+ method public 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
@@ -24565,12 +24574,12 @@ package android.media {
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 static abstract class MediaPlaylistAgent.PlaylistEventCallback {
+ ctor public MediaPlaylistAgent.PlaylistEventCallback();
+ method public void onPlaylistChanged(android.media.MediaPlaylistAgent, java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
+ method public void onPlaylistMetadataChanged(android.media.MediaPlaylistAgent, android.media.MediaMetadata2);
+ method public void onRepeatModeChanged(android.media.MediaPlaylistAgent, int);
+ method public void onShuffleModeChanged(android.media.MediaPlaylistAgent, int);
}
public class MediaRecorder implements android.media.AudioRouting {
@@ -24849,17 +24858,17 @@ package android.media {
method public abstract void onScanCompleted(java.lang.String, android.net.Uri);
}
- public class MediaSession2 implements java.lang.AutoCloseable android.media.MediaPlaylistController {
+ public class MediaSession2 implements java.lang.AutoCloseable {
method public void addPlaylistItem(int, android.media.MediaItem2);
method public void clearOnDataSourceMissingHelper();
method public void close();
method public void fastForward();
method public java.util.List<android.media.MediaSession2.ControllerInfo> getConnectedControllers();
method public android.media.MediaItem2 getCurrentMediaItem();
- method public android.media.MediaPlaylistController getMediaPlaylistController();
method public float getPlaybackSpeed();
method public android.media.MediaPlayerBase getPlayer();
method public java.util.List<android.media.MediaItem2> getPlaylist();
+ method public android.media.MediaPlaylistAgent getPlaylistAgent();
method public android.media.MediaMetadata2 getPlaylistMetadata();
method public int getRepeatMode();
method public int getShuffleMode();
@@ -24869,7 +24878,6 @@ package android.media {
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();
@@ -24884,12 +24892,11 @@ package android.media {
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 skipToNextItem();
method public void skipToPlaylistItem(android.media.MediaItem2);
- method public void skipToPrevious();
+ method public void skipToPreviousItem();
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);
+ method public void updatePlayer(android.media.MediaPlayerBase, android.media.MediaPlaylistAgent, android.media.VolumeProvider2);
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
@@ -24940,7 +24947,7 @@ package android.media {
method public android.media.MediaSession2 build();
method public android.media.MediaSession2.Builder setId(java.lang.String);
method public android.media.MediaSession2.Builder setPlayer(android.media.MediaPlayerBase);
- method public android.media.MediaSession2.Builder setPlaylistController(android.media.MediaPlaylistController);
+ method public android.media.MediaSession2.Builder setPlaylistAgent(android.media.MediaPlaylistAgent);
method public android.media.MediaSession2.Builder setSessionActivity(android.app.PendingIntent);
method public android.media.MediaSession2.Builder setSessionCallback(java.util.concurrent.Executor, android.media.MediaSession2.SessionCallback);
method public android.media.MediaSession2.Builder setVolumeProvider(android.media.VolumeProvider2);
@@ -25006,10 +25013,14 @@ package android.media {
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, android.media.MediaPlayerBase, int);
+ method public void onPlaylistChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
+ method public void onPlaylistMetadataChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, android.media.MediaMetadata2);
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);
+ method public void onRepeatModeChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, int);
method public void onSetRating(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.media.Rating2);
+ method public void onShuffleModeChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, int);
}
public abstract class MediaSessionService2 extends android.app.Service {
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index f619bb9bbc08..a9f72d0a8b44 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -21,6 +21,8 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
import android.content.Context;
+import android.media.MediaPlaylistAgent.RepeatMode;
+import android.media.MediaPlaylistAgent.ShuffleMode;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton;
import android.media.MediaSession2.CommandGroup;
@@ -65,7 +67,7 @@ import java.util.concurrent.Executor;
* @see MediaSession2
* @see MediaSessionService2
*/
-public class MediaController2 implements AutoCloseable, MediaPlaylistController {
+public class MediaController2 implements AutoCloseable {
/**
* Interface for listening to change in activeness of the {@link MediaSession2}. It's
* active if and only if it has set a player.
@@ -225,6 +227,57 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
@NonNull MediaItem2 item) { }
/**
+ * Called when a playlist is changed.
+ *
+ * @param controller the controller for this event
+ * @param mplc playlist controller for this event
+ * @param list new playlist
+ * @param metadata new metadata
+ */
+ public void onPlaylistChanged(@NonNull MediaController2 controller,
+ @NonNull MediaPlaylistAgent mplc, @NonNull List<MediaItem2> list,
+ @Nullable MediaMetadata2 metadata) { }
+
+ /**
+ * Called when a playlist metadata is changed.
+ *
+ * @param controller the controller for this event
+ * @param mplc playlist controller for this event
+ * @param metadata new metadata
+ */
+ public void onPlaylistMetadataChanged(@NonNull MediaController2 controller,
+ @NonNull MediaPlaylistAgent mplc, @Nullable MediaMetadata2 metadata) { }
+
+ /**
+ * Called when the shuffle mode is changed.
+ *
+ * @param controller the controller for this event
+ * @param mplc playlist controller for this event
+ * @param shuffleMode repeat mode
+ * @see MediaPlaylistAgent#SHUFFLE_MODE_NONE
+ * @see MediaPlaylistAgent#SHUFFLE_MODE_ALL
+ * @see MediaPlaylistAgent#SHUFFLE_MODE_GROUP
+ */
+ public void onShuffleModeChanged(@NonNull MediaController2 controller,
+ @NonNull MediaPlaylistAgent mplc,
+ @MediaPlaylistAgent.ShuffleMode int shuffleMode) { }
+
+ /**
+ * Called when the repeat mode is changed.
+ *
+ * @param controller the controller for this event
+ * @param mplc playlist controller for this event
+ * @param repeatMode repeat mode
+ * @see MediaPlaylistAgent#REPEAT_MODE_NONE
+ * @see MediaPlaylistAgent#REPEAT_MODE_ONE
+ * @see MediaPlaylistAgent#REPEAT_MODE_ALL
+ * @see MediaPlaylistAgent#REPEAT_MODE_GROUP
+ */
+ public void onRepeatModeChanged(@NonNull MediaController2 controller,
+ @NonNull MediaPlaylistAgent mplc,
+ @MediaPlaylistAgent.RepeatMode int repeatMode) { }
+
+ /**
* Called when the playlist parameters are changed.
*
* @param controller the controller for this event
@@ -398,14 +451,6 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
mProvider.stop_impl();
}
- public void skipToPrevious() {
- mProvider.skipToPrevious_impl();
- }
-
- public void skipToNext() {
- mProvider.skipToNext_impl();
- }
-
/**
* Request that the player prepare its playback. In other words, other sessions can continue
* to play during the preparation of this session. This method can be used to speed up the
@@ -702,56 +747,38 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
}
/**
- * 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.
*
* @return playlist. Can be {@code null} if the controller doesn't have enough permission.
*/
- @Override
public @Nullable List<MediaItem2> getPlaylist() {
return mProvider.getPlaylist_impl();
}
-
- @Override
+ /**
+ * Sets the playlist.
+ *
+ * @param list playlist
+ * @param metadata metadata of the playlist
+ */
public void setPlaylist(@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) {
// TODO(jaewan): Implement (b/74174649)
}
- @Override
+ /**
+ * Updates the playlist metadata
+ *
+ * @param metadata metadata of the playlist
+ */
public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) {
// TODO(jaewan): Implement (b/74174649)
}
- @Override
+ /**
+ * Returns the playlist metadata
+ *
+ * @return metadata metadata of the playlist, or null if none is set
+ */
public @Nullable MediaMetadata2 getPlaylistMetadata() {
// TODO(jaewan): Implement (b/74174649)
return null;
@@ -779,7 +806,6 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
* @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);
}
@@ -790,7 +816,6 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
* 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.
*/
- @Override
public void removePlaylistItem(@NonNull MediaItem2 item) {
mProvider.removePlaylistItem_impl(item);
}
@@ -800,7 +825,6 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
* @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);
}
@@ -823,30 +847,35 @@ public class MediaController2 implements AutoCloseable, MediaPlaylistController
* @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 void skipToPreviousItem() {
+ // TODO(jaewan): fix this
+ mProvider.skipToPrevious_impl();
+ }
+
+ public void skipToNextItem() {
+ // TODO(jaewan): fix this
+ mProvider.skipToNext_impl();
+ }
+
public @RepeatMode int getRepeatMode() {
// TODO(jaewan): Implement (b/74118768)
return 0;
}
- @Override
- public void setRepeatMode(int repeatMode) {
+ public void setRepeatMode(@RepeatMode 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) {
+ public void setShuffleMode(@ShuffleMode int shuffleMode) {
// TODO(jaewan): Implement (b/74118768)
}
}
diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java
index 237268515c0d..38c5389eae11 100644
--- a/media/java/android/media/MediaLibraryService2.java
+++ b/media/java/android/media/MediaLibraryService2.java
@@ -221,8 +221,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 {
}
@Override
- public Builder setPlaylistController(@NonNull MediaPlaylistController mplc) {
- return super.setPlaylistController(mplc);
+ public Builder setPlaylistAgent(@NonNull MediaPlaylistAgent mplc) {
+ return super.setPlaylistAgent(mplc);
}
@Override
diff --git a/media/java/android/media/MediaPlaylistController.java b/media/java/android/media/MediaPlaylistAgent.java
index 63276a47e91d..923810387818 100644
--- a/media/java/android/media/MediaPlaylistController.java
+++ b/media/java/android/media/MediaPlaylistAgent.java
@@ -20,9 +20,7 @@ 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 android.content.Context;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -30,15 +28,16 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
- * Controller interface for playlist management.
+ * MediaPlaylistAgent is the abstract class an application needs to derive from to pass an object
+ * to a MediaSession2 that will override default playlist handling behaviors. It contains a set of
+ * notify methods to signal MediaSession2 that playlist-related state has changed.
+ * <p>
* Playlists are composed of one or multiple {@link MediaItem2} instances, which combine metadata
* and data sources (as {@link DataSourceDesc})
* Used by {@link MediaSession2} and {@link MediaController2}.
*/
- // This class only includes methods that contain {@link MediaItem2}.
- // Note that setPlaylist() isn't added on purpose because it's considered session-specific.
-
-public interface MediaPlaylistController {
+// This class only includes methods that contain {@link MediaItem2}.
+public abstract class MediaPlaylistAgent {
/**
* @hide
*/
@@ -50,24 +49,24 @@ public interface MediaPlaylistController {
/**
* Playback will be stopped at the end of the playing media list.
*/
- int REPEAT_MODE_NONE = 0;
+ public static final int REPEAT_MODE_NONE = 0;
/**
* Playback of the current playing media item will be repeated.
*/
- int REPEAT_MODE_ONE = 1;
+ public static final int REPEAT_MODE_ONE = 1;
/**
* Playing media list will be repeated.
*/
- int REPEAT_MODE_ALL = 2;
+ public static final 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;
+ public static final int REPEAT_MODE_GROUP = 3;
/**
* @hide
@@ -79,21 +78,28 @@ public interface MediaPlaylistController {
/**
* Media list will be played in order.
*/
- int SHUFFLE_MODE_NONE = 0;
+ public static final int SHUFFLE_MODE_NONE = 0;
/**
* Media list will be played in shuffled order.
*/
- int SHUFFLE_MODE_ALL = 1;
+ public static final 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;
+ public static final int SHUFFLE_MODE_GROUP = 2;
+
+ private MediaPlayerBase mPlayer;
- abstract class PlaylistEventCallback {
+ /**
+ * A callback class to receive notifications for events on the media player. See
+ * {@link MediaPlaylistAgent#registerPlaylistEventCallback(Executor, PlaylistEventCallback)}
+ * to register this callback.
+ */
+ public static abstract class PlaylistEventCallback {
/**
* Called when a playlist is changed.
*
@@ -101,20 +107,20 @@ public interface MediaPlaylistController {
* @param list new playlist
* @param metadata new metadata
*/
- public void onPlaylistChanged(@NonNull MediaPlaylistController mplc,
+ public void onPlaylistChanged(@NonNull MediaPlaylistAgent mplc,
@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) { }
/**
- * Called when a playlist is changed.
+ * Called when a playlist metadata is changed.
*
* @param mplc playlist controller for this event
* @param metadata new metadata
*/
- public void onPlaylistMetadataChanged(@NonNull MediaPlaylistController mplc,
+ public void onPlaylistMetadataChanged(@NonNull MediaPlaylistAgent mplc,
@Nullable MediaMetadata2 metadata) { }
/**
- * Called when a playlist is changed.
+ * Called when the shuffle mode is changed.
*
* @param mplc playlist controller for this event
* @param shuffleMode repeat mode
@@ -122,11 +128,11 @@ public interface MediaPlaylistController {
* @see #SHUFFLE_MODE_ALL
* @see #SHUFFLE_MODE_GROUP
*/
- public void onShuffleModeChanged(@NonNull MediaPlaylistController mplc,
+ public void onShuffleModeChanged(@NonNull MediaPlaylistAgent mplc,
@ShuffleMode int shuffleMode) { }
/**
- * Called when a playlist is changed.
+ * Called when the repeat mode is changed.
*
* @param mplc playlist controller for this event
* @param repeatMode repeat mode
@@ -135,20 +141,27 @@ public interface MediaPlaylistController {
* @see #REPEAT_MODE_ALL
* @see #REPEAT_MODE_GROUP
*/
- public void onRepeatModeChanged(@NonNull MediaPlaylistController mplc,
+ public void onRepeatModeChanged(@NonNull MediaPlaylistAgent mplc,
@RepeatMode int repeatMode) { }
}
+ public MediaPlaylistAgent(Context context) {
+ // FYI, Need to have a context in the constructor for making this class be updatable
+ // TODO(jaewan) : implement this
+ }
+
/**
* Register {@link PlaylistEventCallback} to listen changes in the underlying
- * {@link MediaPlaylistController}, regardless of the change in the controller.
+ * {@link MediaPlaylistAgent}, 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);
+ public final void registerPlaylistEventCallback(
+ @NonNull @CallbackExecutor Executor executor, @NonNull PlaylistEventCallback callback) {
+ // TODO(jaewan): implement this
+ }
/**
* Unregister the previously registered {@link PlaylistEventCallback}.
@@ -156,14 +169,36 @@ public interface MediaPlaylistController {
* @param callback the callback to be removed
* @throws IllegalArgumentException if the callback is {@code null}.
*/
- void unregisterPlaylistControllerCallback(@NonNull PlaylistEventCallback callback);
+ public final void unregisterPlaylistEventCallback(
+ @NonNull PlaylistEventCallback callback) {
+ // TODO(jaewan): implement this
+ }
+
+ public final void notifyPlaylistChanged() {
+ // TODO(jaewan): implement this
+ }
+
+ public final void notifyPlaylistMetadataChanged() {
+ // TODO(jaewan): implement this
+ }
+
+ public final void notifyShuffleModeChanged() {
+ // TODO(jaewan): implement this
+ }
+
+ public final void notifyRepeatModeChanged() {
+ // TODO(jaewan): implement this
+ }
/**
* Returns the playlist
*
* @return playlist, or null if none is set.
*/
- @Nullable List<MediaItem2> getPlaylist();
+ public @Nullable List<MediaItem2> getPlaylist() {
+ // TODO(jaewan): implement this
+ return null;
+ }
/**
* Sets the playlist.
@@ -171,21 +206,28 @@ public interface MediaPlaylistController {
* @param list playlist
* @param metadata metadata of the playlist
*/
- void setPlaylist(@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata);
+ public void setPlaylist(@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) {
+ // TODO(jaewan): implement this
+ }
/**
* Returns the playlist metadata
*
* @return metadata metadata of the playlist, or null if none is set
*/
- @Nullable MediaMetadata2 getPlaylistMetadata();
+ public @Nullable MediaMetadata2 getPlaylistMetadata() {
+ // TODO(jaewan): implement this
+ return null;
+ }
/**
* Updates the playlist metadata
*
* @param metadata metadata of the playlist
*/
- void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata);
+ public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) {
+ // TODO(jaewan): implement this
+ }
/**
* Adds the media item to the playlist at the index
@@ -193,14 +235,18 @@ public interface MediaPlaylistController {
* @param index index
* @param item media item to add
*/
- void addPlaylistItem(int index, @NonNull MediaItem2 item);
+ public void addPlaylistItem(int index, @NonNull MediaItem2 item) {
+ // TODO(jaewan): implement this
+ }
/**
* Removes the media item from the playlist
*
* @param item media item to remove
*/
- void removePlaylistItem(@NonNull MediaItem2 item);
+ public void removePlaylistItem(@NonNull MediaItem2 item) {
+ // TODO(jaewan): implement this
+ }
/**
* Replaces the media item with the .
@@ -210,14 +256,26 @@ public interface MediaPlaylistController {
* @param index index
* @param item
*/
- void replacePlaylistItem(int index, @NonNull MediaItem2 item);
+ public void replacePlaylistItem(int index, @NonNull MediaItem2 item) {
+ // TODO(jaewan): implement this
+ }
/**
* Skips to the the media item, and plays from it.
*
* @param item media item to start playing from
*/
- void skipToPlaylistItem(@NonNull MediaItem2 item);
+ public void skipToPlaylistItem(@NonNull MediaItem2 item) {
+ // TODO(jaewan): implement this
+ }
+
+ public void skipToPreviousItem() {
+ // TODO(jaewan): implement this
+ }
+
+ public void skipToNextItem() {
+ // TODO(jaewan): implement this
+ }
/**
* Get repeat mode
@@ -228,7 +286,10 @@ public interface MediaPlaylistController {
* @see #REPEAT_MODE_ALL
* @see #REPEAT_MODE_GROUP
*/
- @RepeatMode int getRepeatMode();
+ public @RepeatMode int getRepeatMode() {
+ // TODO(jaewan): implement this
+ return REPEAT_MODE_NONE;
+ }
/**
* Set repeat mode
@@ -239,7 +300,9 @@ public interface MediaPlaylistController {
* @see #REPEAT_MODE_ALL
* @see #REPEAT_MODE_GROUP
*/
- void setRepeatMode(@RepeatMode int repeatMode);
+ public void setRepeatMode(@RepeatMode int repeatMode) {
+ // TODO(jaewan): implement this
+ }
/**
* Get shuffle mode
@@ -249,7 +312,10 @@ public interface MediaPlaylistController {
* @see #SHUFFLE_MODE_ALL
* @see #SHUFFLE_MODE_GROUP
*/
- @ShuffleMode int getShuffleMode();
+ public @ShuffleMode int getShuffleMode() {
+ // TODO(jaewan): implement this
+ return SHUFFLE_MODE_NONE;
+ }
/**
* Set shuffle mode
@@ -259,5 +325,7 @@ public interface MediaPlaylistController {
* @see #SHUFFLE_MODE_ALL
* @see #SHUFFLE_MODE_GROUP
*/
- void setShuffleMode(@ShuffleMode int shuffleMode);
+ public void setShuffleMode(@ShuffleMode int shuffleMode) {
+ // TODO(jaewan): implement this
+ }
}
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 4d7f85f00f61..4ad197a74bec 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -80,7 +80,7 @@ import java.util.concurrent.Executor;
*
* @see MediaSessionService2
*/
-public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
+public class MediaSession2 implements AutoCloseable {
private final MediaSession2Provider mProvider;
/**
@@ -114,7 +114,7 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
public static final int COMMAND_CODE_PLAYBACK_STOP = 3;
/**
- * Command code for {@link MediaController2#skipToNext()}.
+ * Command code for {@link MediaController2#skipToNextItem()}.
* <p>
* Command would be sent directly to the player if the session doesn't reject the request
* through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
@@ -122,7 +122,7 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
public static final int COMMAND_CODE_PLAYBACK_SKIP_NEXT_ITEM = 4;
/**
- * Command code for {@link MediaController2#skipToPrevious()}.
+ * Command code for {@link MediaController2#skipToPreviousItem()}.
* <p>
* Command would be sent directly to the player if the session doesn't reject the request
* through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
@@ -813,6 +813,7 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
/**
* 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.
@@ -820,7 +821,58 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
*/
public void onBufferingStateChanged(@NonNull MediaSession2 session,
@NonNull MediaPlayerBase mpb, @NonNull MediaItem2 item, @BuffState int state) { }
- };
+
+ /**
+ * Called when a playlist is changed.
+ *
+ * @param session the session for this event
+ * @param mplc playlist controller for this event
+ * @param list new playlist
+ * @param metadata new metadata
+ */
+ public void onPlaylistChanged(@NonNull MediaSession2 session,
+ @NonNull MediaPlaylistAgent mplc, @NonNull List<MediaItem2> list,
+ @Nullable MediaMetadata2 metadata) { }
+
+ /**
+ * Called when a playlist metadata is changed.
+ *
+ * @param session the session for this event
+ * @param mplc playlist controller for this event
+ * @param metadata new metadata
+ */
+ public void onPlaylistMetadataChanged(@NonNull MediaSession2 session,
+ @NonNull MediaPlaylistAgent mplc, @Nullable MediaMetadata2 metadata) { }
+
+ /**
+ * Called when the shuffle mode is changed.
+ *
+ * @param session the session for this event
+ * @param mplc playlist controller for this event
+ * @param shuffleMode repeat mode
+ * @see MediaPlaylistAgent#SHUFFLE_MODE_NONE
+ * @see MediaPlaylistAgent#SHUFFLE_MODE_ALL
+ * @see MediaPlaylistAgent#SHUFFLE_MODE_GROUP
+ */
+ public void onShuffleModeChanged(@NonNull MediaSession2 session,
+ @NonNull MediaPlaylistAgent mplc,
+ @MediaPlaylistAgent.ShuffleMode int shuffleMode) { }
+
+ /**
+ * Called when the repeat mode is changed.
+ *
+ * @param session the session for this event
+ * @param mplc playlist controller for this event
+ * @param repeatMode repeat mode
+ * @see MediaPlaylistAgent#REPEAT_MODE_NONE
+ * @see MediaPlaylistAgent#REPEAT_MODE_ONE
+ * @see MediaPlaylistAgent#REPEAT_MODE_ALL
+ * @see MediaPlaylistAgent#REPEAT_MODE_GROUP
+ */
+ public void onRepeatModeChanged(@NonNull MediaSession2 session,
+ @NonNull MediaPlaylistAgent mplc,
+ @MediaPlaylistAgent.RepeatMode int repeatMode) { }
+ }
/**
* Base builder class for MediaSession2 and its subclass. Any change in this class should be
@@ -860,13 +912,14 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
}
/**
- * Set the {@link MediaPlaylistController} for this session to manages playlist of the
+ * Set the {@link MediaPlaylistAgent} for this session to manages playlist of the
* underlying {@link MediaPlayerBase player}.
*
- * @param mplc a {@link MediaPlaylistController} that manages playlist of the
+ * @param mplc a {@link MediaPlaylistAgent} that manages playlist of the
* {@code player.}
*/
- U setPlaylistController(@NonNull MediaPlaylistController mplc) {
+ U setPlaylistAgent(@NonNull MediaPlaylistAgent mplc) {
+ // TODO(jaewan): fix this
mProvider.setPlaylistController_impl(mplc);
return (U) this;
}
@@ -954,8 +1007,8 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
}
@Override
- public Builder setPlaylistController(@NonNull MediaPlaylistController mplc) {
- return super.setPlaylistController(mplc);
+ public Builder setPlaylistAgent(@NonNull MediaPlaylistAgent mplc) {
+ return super.setPlaylistAgent(mplc);
}
@Override
@@ -1316,13 +1369,13 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
* player on the {@link Handler} where the session is created on.
*
* @param player a {@link MediaPlayerBase} that handles actual media playback in your app.
- * @param mplc a {@link MediaPlaylistController} that manages playlist of the
+ * @param mplc a {@link MediaPlaylistAgent} that manages playlist of the
* {@code player}
* @param volumeProvider The provider that will receive volume button events. If
* {@code null}, system will adjust the appropriate stream volume for this session's player.
*/
public void updatePlayer(@NonNull MediaPlayerBase player,
- @Nullable MediaPlaylistController mplc, @Nullable VolumeProvider2 volumeProvider) {
+ @Nullable MediaPlaylistAgent mplc, @Nullable VolumeProvider2 volumeProvider) {
mProvider.updatePlayer_impl(player, mplc, volumeProvider);
}
@@ -1334,15 +1387,16 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
/**
* @return player
*/
- public @Nullable
+ public @NonNull
MediaPlayerBase getPlayer() {
return mProvider.getPlayer_impl();
}
/**
- * @return playlist controller
+ * @return playlist manager
*/
- public @Nullable MediaPlaylistController getMediaPlaylistController() {
+ public @Nullable
+ MediaPlaylistAgent getPlaylistAgent() {
// TODO(jaewan): implement this (b/74090741)
return null;
}
@@ -1455,14 +1509,6 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
mProvider.stop_impl();
}
- public void skipToPrevious() {
- mProvider.skipToPrevious_impl();
- }
-
- public void skipToNext() {
- mProvider.skipToNext_impl();
- }
-
/**
* Request that the player prepare its playback. In other words, other sessions can continue
* to play during the preparation of this session. This method can be used to speed up the
@@ -1545,7 +1591,7 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
}
/**
- * Register {@link EventCallback} to listen changes in the underlying
+ * Register {@link PlayerEventCallback} to listen changes in the underlying
* {@link MediaPlayerBase}, regardless of the change in the underlying player.
* <p>
* Registered callbacks will be also called when the underlying player is changed.
@@ -1562,7 +1608,7 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
}
/**
- * Unregister the previously registered {@link EventCallback}.
+ * Unregister the previously registered {@link PlayerEventCallback}.
*
* @param callback the callback to be removed
* @throws IllegalArgumentException if the callback is {@code null}.
@@ -1602,9 +1648,9 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
/**
* Sets the data source missing helper. Helper will be used to provide default implementation of
- * {@link MediaPlaylistController} when it isn't set by developer.
+ * {@link MediaPlaylistAgent} when it isn't set by developer.
* <p>
- * Default implementation of the {@link MediaPlaylistController} will call helper when a
+ * Default implementation of the {@link MediaPlaylistAgent} will call helper when a
* {@link MediaItem2} in the playlist doesn't have a {@link DataSourceDesc}. This may happen
* when
* <ul>
@@ -1641,40 +1687,10 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
}
/**
- * 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 the playlist which is lastly set.
*
* @return playlist
*/
- @Override
public List<MediaItem2> getPlaylist() {
return mProvider.getPlaylist_impl();
}
@@ -1701,7 +1717,6 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
* @throws IllegalArgumentException if given {@param playlist} is null.
* @see #setOnDataSourceMissingHelper
*/
- @Override
public void setPlaylist(@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) {
// TODO(jaewan): Implement (b/74174649)
}
@@ -1717,7 +1732,16 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
mProvider.skipToPlaylistItem_impl(item);
}
- @Override
+ public void skipToPreviousItem() {
+ // TODO(jaewan): fix this
+ mProvider.skipToPrevious_impl();
+ }
+
+ public void skipToNextItem() {
+ // TODO(jaewan): fix this
+ mProvider.skipToNext_impl();
+ }
+
public MediaMetadata2 getPlaylistMetadata() {
// TODO(jaewan): Implement (b/74174649)
return null;
@@ -1734,7 +1758,6 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
* @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);
}
@@ -1756,7 +1779,6 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
* @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);
}
@@ -1771,29 +1793,24 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController {
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)
}
diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java
index 295175260106..af6133a37570 100644
--- a/media/java/android/media/update/MediaSession2Provider.java
+++ b/media/java/android/media/update/MediaSession2Provider.java
@@ -16,13 +16,12 @@
package android.media.update;
-import android.annotation.NonNull;
import android.app.PendingIntent;
import android.media.MediaItem2;
import android.media.MediaMetadata2;
import android.media.MediaPlayerBase;
import android.media.MediaPlayerBase.PlayerEventCallback;
-import android.media.MediaPlaylistController;
+import android.media.MediaPlaylistAgent;
import android.media.MediaSession2;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton;
@@ -44,7 +43,7 @@ import java.util.concurrent.Executor;
*/
public interface MediaSession2Provider extends TransportControlProvider {
void close_impl();
- void updatePlayer_impl(MediaPlayerBase player, MediaPlaylistController mplc,
+ void updatePlayer_impl(MediaPlayerBase player, MediaPlaylistAgent mplc,
VolumeProvider2 volumeProvider);
MediaPlayerBase getPlayer_impl();
VolumeProvider2 getVolumeProvider_impl();
@@ -124,7 +123,7 @@ public interface MediaSession2Provider extends TransportControlProvider {
interface BuilderBaseProvider<T extends MediaSession2, C extends SessionCallback> {
void setPlayer_impl(MediaPlayerBase player);
- void setPlaylistController_impl(MediaPlaylistController mplc);
+ void setPlaylistController_impl(MediaPlaylistAgent mplc);
void setVolumeProvider_impl(VolumeProvider2 volumeProvider);
void setSessionActivity_impl(PendingIntent pi);
void setId_impl(String id);