diff options
| author | 2018-03-06 14:43:10 +0900 | |
|---|---|---|
| committer | 2018-03-07 16:31:53 +0900 | |
| commit | 4d4a8c95ae9cb49413aa13ec19dcef5068ea710f (patch) | |
| tree | d25246c05279dced2a9988f514721671c15db5ff | |
| parent | 8c76ca03418884d8e60bda1f5695d44563b20007 (diff) | |
MediaSession2: Add onDataSourceMissingHelper
This allows a developer to create DataSourceDesc when the item is about
to be played. Typical example of the usages are,
1. For a playlist consists of FileDescriptors, its developer may not
want to open all files when MediaSession2.setPlaylist() is
called.
2. A controller has called setPlaylist(), addPlaylistItem(), or
replacePlaylistItem(). Controller cannot know the
DataSourceDesc, and only the session developer can know about
it.
Bug: 64098437
Test: Run MediaComponents test
Change-Id: I73f27ca0a799b1cddf5046b41f0ca01d08037103
| -rw-r--r-- | api/current.txt | 6 | ||||
| -rw-r--r-- | media/java/android/media/MediaItem2.java | 11 | ||||
| -rw-r--r-- | media/java/android/media/MediaSession2.java | 75 |
3 files changed, 89 insertions, 3 deletions
diff --git a/api/current.txt b/api/current.txt index 1146e42abc57..e48d0e37bfc9 100644 --- a/api/current.txt +++ b/api/current.txt @@ -24852,6 +24852,7 @@ package android.media { public class MediaSession2 implements java.lang.AutoCloseable android.media.MediaPlaylistController { 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(); @@ -24879,6 +24880,7 @@ package android.media { method public void setAllowedCommands(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.CommandGroup); 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 setOnDataSourceMissingHelper(android.media.MediaSession2.OnDataSourceMissingHelper); method public void setPlaybackSpeed(float); method public void setPlaylist(java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2); method public void setRepeatMode(int); @@ -24988,6 +24990,10 @@ package android.media { method public boolean isTrusted(); } + public static abstract interface MediaSession2.OnDataSourceMissingHelper { + method public abstract android.media.DataSourceDesc onDataSourceMissing(android.media.MediaSession2, android.media.MediaItem2); + } + public static abstract class MediaSession2.SessionCallback { ctor public MediaSession2.SessionCallback(android.content.Context); method public void onBufferingStateChanged(android.media.MediaSession2, android.media.MediaPlayerBase, android.media.MediaItem2, int); diff --git a/media/java/android/media/MediaItem2.java b/media/java/android/media/MediaItem2.java index f6edd0c0b25d..2db1392a9d83 100644 --- a/media/java/android/media/MediaItem2.java +++ b/media/java/android/media/MediaItem2.java @@ -139,6 +139,13 @@ public class MediaItem2 { return mProvider.getDataSourceDesc_impl(); } + @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); + } + /** * Build {@link MediaItem2} */ @@ -189,12 +196,12 @@ public class MediaItem2 { } /** - * Set the data source descriptor for this instance. Should not be {@code null}. + * Set the data source descriptor for this instance. {@code null} for unset. * * @param dataSourceDesc data source descriptor * @return this instance for chaining */ - public Builder setDataSourceDesc(@NonNull DataSourceDesc dataSourceDesc) { + public Builder setDataSourceDesc(@Nullable DataSourceDesc dataSourceDesc) { return mProvider.setDataSourceDesc_impl(dataSourceDesc); } diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index ddb51c3e697d..b75785abef76 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -408,6 +408,29 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { public static final int ERROR_CODE_SETUP_REQUIRED = 12; /** + * Interface definition of a callback to be invoked when a {@link MediaItem2} in the playlist + * didn't have a {@link DataSourceDesc} but it's needed now for preparing or playing it. + * + * #see #setOnDataSourceMissingHelper + */ + public interface OnDataSourceMissingHelper { + /** + * Called when a {@link MediaItem2} in the playlist didn't have a {@link DataSourceDesc} + * but it's needed now for preparing or playing it. + * <p> + * Returned data source descriptor will be sent to the player directly to prepare or play + * the contents. + * + * @param session the session for this event + * @param item media item from the controller + * @return a data source descriptor if the media item. Can be {@code null} if the content + * isn't available. + */ + @Nullable DataSourceDesc onDataSourceMissing(@NonNull MediaSession2 session, + @NonNull MediaItem2 item); + } + + /** * Define a command that a {@link MediaController2} can send to a {@link MediaSession2}. * <p> * If {@link #getCommandCode()} isn't {@link #COMMAND_CODE_CUSTOM}), it's predefined command. @@ -1357,7 +1380,7 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { * This API can be called in the {@link SessionCallback#onConnect(MediaSession2, ControllerInfo)}. * * @param controller controller to specify layout. - * @param layout oredered list of layout. + * @param layout ordered list of layout. */ public void setCustomLayout(@NonNull ControllerInfo controller, @NonNull List<CommandButton> layout) { @@ -1565,6 +1588,46 @@ 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. + * <p> + * Default implementation of the {@link MediaPlaylistController} will call helper when a + * {@link MediaItem2} in the playlist doesn't have a {@link DataSourceDesc}. This may happen + * when + * <ul> + * <li>{@link MediaItem2} specified by {@link #setPlaylist(List, MediaMetadata2)} doesn't + * have {@link DataSourceDesc}</li> + * <li>{@link MediaController2#addPlaylistItem(int, MediaItem2)} is called and accepted + * by {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}. + * In that case, an item would be added automatically without the data source.</li> + * </ul> + * <p> + * If it's not set, playback wouldn't happen for the item without data source descriptor. + * <p> + * The helper will be run on the executor that you've specified by the + * {@link Builder#setSessionCallback(Executor, SessionCallback)}. + * + * @param helper a data source misisng helper. + * @throws IllegalStateException when the helper is set when the playlist controller is set + * @see #setPlaylist(List, MediaMetadata2) + * @see SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command) + * @see #COMMAND_CODE_PLAYLIST_ADD_ITEM + * @see #COMMAND_CODE_PLAYLIST_REPLACE_ITEM + */ + public void setOnDataSourceMissingHelper(@NonNull OnDataSourceMissingHelper helper) { + // TODO(jaewan): Implement (b/74090741) + } + + /** + * Clears the data source missing helper. + * + * @see #setOnDataSourceMissingHelper(OnDataSourceMissingHelper) + */ + public void clearOnDataSourceMissingHelper() { + // TODO(jaewan): Implement (b/74090741) + } + + /** * Register {@link MediaPlaylistController.PlaylistEventCallback} to listen changes in the * underlying {@link MediaPlaylistController}, regardless of the change in the controller. * <p> @@ -1615,6 +1678,16 @@ public class MediaSession2 implements AutoCloseable, MediaPlaylistController { mProvider.setPlaylist_impl(playlist); } + /** + * Set a list of {@link MediaItem2} as the current play list. + * <p> + * You may specify a {@link MediaItem2} without {@link DataSourceDesc}. However, in that case, + * you should set {@link OnDataSourceMissingHelper} for player to prepare. + * + * @param list A list of {@link MediaItem2} objects to set as a play list. + * @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) |