diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java index 2a3967c1d07aa..30b7f70ccf3ba 100644 --- a/media/java/android/media/MediaController2.java +++ b/media/java/android/media/MediaController2.java @@ -748,7 +748,14 @@ public class MediaController2 implements AutoCloseable { } /** - * Return playlist from the session. + * Returns the cached playlist from + * {@link ControllerCallback#onPlaylistChanged(MediaController2, MediaPlaylistAgent, List, + * MediaMetadata2)}. + *
+ * This list may differ with the list that was specified with + * {@link #setPlaylist(List, MediaMetadata2)} depending on the {@link MediaPlaylistAgent} + * implementation. Use media items returned here for other playlist agent APIs such as + * {@link MediaPlaylistAgent#skipToPlaylistItem(MediaItem2)}. * * @return playlist. Can be {@code null} if the controller doesn't have enough permission. */ @@ -758,12 +765,19 @@ public class MediaController2 implements AutoCloseable { /** * Sets the playlist. + *
+ * Even when the playlist is successfully set, use the playlist returned from
+ * {@link #getPlaylist()} for playlist APIs such as {@link #skipToPlaylistItem(MediaItem2)}.
+ * Otherwise the session in the remote process can't distinguish between media items.
*
* @param list playlist
* @param metadata metadata of the playlist
+ * @see #getPlaylist()
+ * @see ControllerCallback#onPlaylistChanged(
+ * MediaController2, MediaPlaylistAgent, List, MediaMetadata2)
*/
public void setPlaylist(@NonNull List
* 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.
+ * If index is less than or equal to the current index of the playlist,
+ * the current index of the playlist 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
*/
public void addPlaylistItem(int index, @NonNull MediaItem2 item) {
mProvider.addPlaylistItem_impl(index, item);
@@ -816,6 +832,8 @@ public class MediaController2 implements AutoCloseable {
*
* 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.
+ *
+ * @param item the media item you want to add
*/
public void removePlaylistItem(@NonNull MediaItem2 item) {
mProvider.removePlaylistItem_impl(item);
diff --git a/media/java/android/media/MediaItem2.java b/media/java/android/media/MediaItem2.java
index 2db1392a9d83b..b50c3e4bcd0b1 100644
--- a/media/java/android/media/MediaItem2.java
+++ b/media/java/android/media/MediaItem2.java
@@ -64,6 +64,13 @@ public class MediaItem2 {
mProvider = provider;
}
+ /**
+ * @hide
+ */
+ public MediaItem2Provider getProvider() {
+ return mProvider;
+ }
+
/**
* Return this object as a bundle to share between processes.
*
@@ -141,9 +148,7 @@ public class MediaItem2 {
@Override
public boolean equals(Object obj) {
- // TODO(jaewan): Override this. MediaItem2 may have auto-generated srcId when the DSD isn't
- // set, and it should be compared for the equals.
- return super.equals(obj);
+ return mProvider.equals_impl(obj);
}
/**
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 65378b4658a3e..ddecb95c6528f 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -61,7 +61,7 @@ import java.util.concurrent.Executor;
* sessions can be created to provide finer grain controls of media.
*
* If you want to support background playback, {@link MediaSessionService2} is preferred
- * instead. With it, your playback can be revived even after you've finished playback. See
+ * instead. With it, your playback can be revived even after playback is finished. See
* {@link MediaSessionService2} for details.
*
* A session can be obtained by {@link Builder}. The owner of the session may pass its session token
@@ -254,7 +254,7 @@ public class MediaSession2 implements AutoCloseable {
public static final int COMMAND_CODE_PLAYLIST_GET_LIST = 18;
/**
- * Command code for {@link MediaController2#setPlaylist(List, MediaMetadata2).
+ * Command code for {@link MediaController2#setPlaylist(List, MediaMetadata2)}.
*
* Command would be sent directly to the playlist agent if the session doesn't reject the
* request through the
@@ -263,11 +263,8 @@ public class MediaSession2 implements AutoCloseable {
public static final int COMMAND_CODE_PLAYLIST_SET_LIST = 19;
/**
- * Command code for {@link MediaController2#getPlaylistMetadata()} ()}. This will expose
+ * 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 agent if the session doesn't reject the
* request through the
@@ -827,7 +824,11 @@ public class MediaSession2 implements AutoCloseable {
@NonNull MediaPlayerBase player, @NonNull MediaItem2 item, @BuffState int state) { }
/**
- * Called when a playlist is changed.
+ * Called when a playlist is changed from the {@link MediaPlaylistAgent}.
+ *
+ * This is called when the underlying agent has called
+ * {@link MediaPlaylistAgent.PlaylistEventCallback#onPlaylistChanged(MediaPlaylistAgent,
+ * List, MediaMetadata2)}.
*
* @param session the session for this event
* @param playlistAgent playlist agent for this event
@@ -1681,7 +1682,7 @@ public class MediaSession2 implements AutoCloseable {
*
* If it's not set, playback wouldn't happen for the item without data source descriptor.
*
- * The helper will be run on the executor that you've specified by the
+ * The helper will be run on the executor that was specified by
* {@link Builder#setSessionCallback(Executor, SessionCallback)}.
*
* @param helper a data source missing helper.
@@ -1705,40 +1706,46 @@ public class MediaSession2 implements AutoCloseable {
}
/**
- * Return the playlist which is lastly set.
+ * Returns the playlist from the {@link MediaPlaylistAgent}.
+ *
+ * This list may differ with the list that was specified with
+ * {@link #setPlaylist(List, MediaMetadata2)} depending on the {@link MediaPlaylistAgent}
+ * implementation. Use media items returned here for other playlist agent APIs such as
+ * {@link MediaPlaylistAgent#skipToPlaylistItem(MediaItem2)}.
*
* @return playlist
+ * @see MediaPlaylistAgent#getPlaylist()
+ * @see SessionCallback#onPlaylistChanged(
+ * MediaSession2, MediaPlaylistAgent, List, MediaMetadata2)
*/
public List
- * You may specify a {@link MediaItem2} without {@link DataSourceDesc}. However, in that case,
- * you should set {@link OnDataSourceMissingHelper} for player to prepare.
+ * This may be an asynchronous call, and {@link MediaPlaylistAgent} may keep the copy of the
+ * list. Wait for {@link SessionCallback#onPlaylistChanged(MediaSession2, MediaPlaylistAgent,
+ * List, MediaMetadata2)} to know the operation finishes.
+ *
+ * You may specify a {@link MediaItem2} without {@link DataSourceDesc}. In that case,
+ * {@link MediaPlaylistAgent} has responsibility to dynamically query {@link DataSourceDesc}
+ * when such media item is ready for preparation or play. Default implementation needs
+ * {@link OnDataSourceMissingHelper} for such case.
*
* @param list A list of {@link MediaItem2} objects to set as a play list.
- * @throws IllegalArgumentException if given list is {@code null}, or has duplicated media item.
+ * @throws IllegalArgumentException if given list is {@code null}, or has duplicated media
+ * items.
+ * @see MediaPlaylistAgent#setPlaylist(List, MediaMetadata2)
+ * @see SessionCallback#onPlaylistChanged(
+ * MediaSession2, MediaPlaylistAgent, List, MediaMetadata2)
* @see #setOnDataSourceMissingHelper
*/
public void setPlaylist(@NonNull List
* This will not change the currently playing media item.
* If index is less than or equal to the current index of the play list,
@@ -1774,26 +1785,25 @@ public class MediaSession2 implements AutoCloseable {
*
* @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
*/
public void addPlaylistItem(int index, @NonNull MediaItem2 item) {
mProvider.addPlaylistItem_impl(index, item);
}
/**
- * Remove the media item in the play list.
+ * Removes the media item in the playlist.
*
* 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
+ * @param item the media item you want to add
*/
public void removePlaylistItem(@NonNull MediaItem2 item) {
mProvider.removePlaylistItem_impl(item);
}
/**
- * Replace the media item at index in the playlist. This can be also used to update metadata of
+ * Replaces the media item at index in the playlist. This can be also used to update metadata of
* an item.
*
* @param index the index of the item to replace
@@ -1813,8 +1823,13 @@ public class MediaSession2 implements AutoCloseable {
return mProvider.getCurrentPlaylistItem_impl();
}
+ /**
+ * Updates the playlist metadata to the {@link MediaPlaylistAgent}.
+ *
+ * @param metadata metadata of the playlist
+ */
public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) {
- // TODO(jaewan): Implement (b/74174649)
+ mProvider.updatePlaylistMetadata_impl(metadata);
}
public @RepeatMode int getRepeatMode() {
diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java
index 06e9544ef453c..c48f336e832d4 100644
--- a/media/java/android/media/update/MediaController2Provider.java
+++ b/media/java/android/media/update/MediaController2Provider.java
@@ -21,6 +21,7 @@ import android.app.PendingIntent;
import android.media.AudioAttributes;
import android.media.MediaController2.PlaybackInfo;
import android.media.MediaItem2;
+import android.media.MediaMetadata2;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.PlaylistParams;
import android.media.PlaybackState2;
@@ -58,6 +59,9 @@ public interface MediaController2Provider extends TransportControlProvider {
void setRating_impl(String mediaId, Rating2 rating);
void sendCustomCommand_impl(Command command, Bundle args, ResultReceiver cb);
List