16cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim/* 26cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Copyright 2018 The Android Open Source Project 36cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * 46cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License"); 56cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * you may not use this file except in compliance with the License. 66cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * You may obtain a copy of the License at 76cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * 86cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * http://www.apache.org/licenses/LICENSE-2.0 96cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * 106cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Unless required by applicable law or agreed to in writing, software 116cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS, 126cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * See the License for the specific language governing permissions and 146cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * limitations under the License. 156cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 166cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 176cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimpackage android.media; 186cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 19273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kimimport android.annotation.CallbackExecutor; 20273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kimimport android.annotation.IntDef; 216cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport android.annotation.NonNull; 22273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kimimport android.annotation.Nullable; 235f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Limimport android.media.update.ApiLoader; 245f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Limimport android.media.update.MediaPlaylistAgentProvider; 256cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 26273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kimimport java.lang.annotation.Retention; 27273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kimimport java.lang.annotation.RetentionPolicy; 286cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport java.util.List; 29273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kimimport java.util.concurrent.Executor; 306cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 316cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim/** 323a582e73c115e693bab8cb6f213d275704b9c5d7Jean-Michel Trivi * @hide 33df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * MediaPlaylistAgent is the abstract class an application needs to derive from to pass an object 34df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * to a MediaSession2 that will override default playlist handling behaviors. It contains a set of 35df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * notify methods to signal MediaSession2 that playlist-related state has changed. 36df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * <p> 37c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Playlists are composed of one or multiple {@link MediaItem2} instances, which combine metadata 38c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * and data sources (as {@link DataSourceDesc}) 39c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Used by {@link MediaSession2} and {@link MediaController2}. 406cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 41df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim// This class only includes methods that contain {@link MediaItem2}. 42df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Limpublic abstract class MediaPlaylistAgent { 43273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 44273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @hide 45273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 46273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @IntDef({REPEAT_MODE_NONE, REPEAT_MODE_ONE, REPEAT_MODE_ALL, 47273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim REPEAT_MODE_GROUP}) 48273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @Retention(RetentionPolicy.SOURCE) 49f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim public @interface RepeatMode {} 50273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 51273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 52273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Playback will be stopped at the end of the playing media list. 53273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 54df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int REPEAT_MODE_NONE = 0; 55273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 56273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 57273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Playback of the current playing media item will be repeated. 58273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 59df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int REPEAT_MODE_ONE = 1; 60273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 61273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 62273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Playing media list will be repeated. 63273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 64df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int REPEAT_MODE_ALL = 2; 65273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 66273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 67273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Playback of the playing media group will be repeated. 68273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * A group is a logical block of media items which is specified in the section 5.7 of the 69273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Bluetooth AVRCP 1.6. An example of a group is the playlist. 70273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 71df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int REPEAT_MODE_GROUP = 3; 72273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 73273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 74273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @hide 75273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 76273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @IntDef({SHUFFLE_MODE_NONE, SHUFFLE_MODE_ALL, SHUFFLE_MODE_GROUP}) 77273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @Retention(RetentionPolicy.SOURCE) 78f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim public @interface ShuffleMode {} 79273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 80273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 81273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Media list will be played in order. 82273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 83df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int SHUFFLE_MODE_NONE = 0; 84273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 85273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 86273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Media list will be played in shuffled order. 87273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 88df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int SHUFFLE_MODE_ALL = 1; 89273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 90273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 91273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Media group will be played in shuffled order. 92273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * A group is a logical block of media items which is specified in the section 5.7 of the 93273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Bluetooth AVRCP 1.6. An example of a group is the playlist. 94273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 95df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static final int SHUFFLE_MODE_GROUP = 2; 96df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 975f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim private final MediaPlaylistAgentProvider mProvider; 98273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 99df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim /** 100df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * A callback class to receive notifications for events on the media player. See 101df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * {@link MediaPlaylistAgent#registerPlaylistEventCallback(Executor, PlaylistEventCallback)} 102df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * to register this callback. 103df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim */ 104df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public static abstract class PlaylistEventCallback { 105273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 106273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Called when a playlist is changed. 107273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 108525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * @param playlistAgent playlist agent for this event 109273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param list new playlist 110273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param metadata new metadata 111273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 112525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim public void onPlaylistChanged(@NonNull MediaPlaylistAgent playlistAgent, 113273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) { } 114273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 115273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 116df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * Called when a playlist metadata is changed. 117273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 118525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * @param playlistAgent playlist agent for this event 119273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param metadata new metadata 120273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 121525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim public void onPlaylistMetadataChanged(@NonNull MediaPlaylistAgent playlistAgent, 122273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @Nullable MediaMetadata2 metadata) { } 123273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 124273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 125df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * Called when the shuffle mode is changed. 126273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 127525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * @param playlistAgent playlist agent for this event 128273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param shuffleMode repeat mode 129273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_NONE 130273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_ALL 131273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_GROUP 132273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 133525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim public void onShuffleModeChanged(@NonNull MediaPlaylistAgent playlistAgent, 134273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @ShuffleMode int shuffleMode) { } 135273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 136273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 137df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim * Called when the repeat mode is changed. 138273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 139525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * @param playlistAgent playlist agent for this event 140273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param repeatMode repeat mode 141273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_NONE 142273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_ONE 143273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_ALL 144273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_GROUP 145273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 146525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim public void onRepeatModeChanged(@NonNull MediaPlaylistAgent playlistAgent, 147273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim @RepeatMode int repeatMode) { } 148273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim } 149273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 1506823d81d8c2ea8c7b9c3a4c72f9005174050c22fChristofer Ã…kersten public MediaPlaylistAgent() { 1516823d81d8c2ea8c7b9c3a4c72f9005174050c22fChristofer Ã…kersten mProvider = ApiLoader.getProvider().createMediaPlaylistAgent(this); 152df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 153df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 154273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 155273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Register {@link PlaylistEventCallback} to listen changes in the underlying 156525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * {@link MediaPlaylistAgent}. 157273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 158273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param executor a callback Executor 159273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param callback a PlaylistEventCallback 160273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @throws IllegalArgumentException if executor or callback is {@code null}. 161273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 162df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public final void registerPlaylistEventCallback( 163df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim @NonNull @CallbackExecutor Executor executor, @NonNull PlaylistEventCallback callback) { 1645f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.registerPlaylistEventCallback_impl(executor, callback); 165df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 166273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 167273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 168273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Unregister the previously registered {@link PlaylistEventCallback}. 169273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 170273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param callback the callback to be removed 171273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @throws IllegalArgumentException if the callback is {@code null}. 172273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 1735f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim public final void unregisterPlaylistEventCallback(@NonNull PlaylistEventCallback callback) { 1745f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.unregisterPlaylistEventCallback_impl(callback); 175df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 176df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 177df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public final void notifyPlaylistChanged() { 1785f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.notifyPlaylistChanged_impl(); 179df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 180df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 181df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public final void notifyPlaylistMetadataChanged() { 1825f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.notifyPlaylistMetadataChanged_impl(); 183df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 184df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 185df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public final void notifyShuffleModeChanged() { 1865f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.notifyShuffleModeChanged_impl(); 187df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 188df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 189df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public final void notifyRepeatModeChanged() { 1905f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.notifyRepeatModeChanged_impl(); 191df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 192273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 193273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 194273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Returns the playlist 195273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 196273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @return playlist, or null if none is set. 197273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 198df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public @Nullable List<MediaItem2> getPlaylist() { 1995f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim return mProvider.getPlaylist_impl(); 200df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 201273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 202273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 203273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Sets the playlist. 204273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 205273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param list playlist 206273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param metadata metadata of the playlist 207273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 208df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void setPlaylist(@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) { 2095f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.setPlaylist_impl(list, metadata); 210df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 211273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 212273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 213273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Returns the playlist metadata 214273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 215273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @return metadata metadata of the playlist, or null if none is set 216273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 217df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public @Nullable MediaMetadata2 getPlaylistMetadata() { 2185f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim return mProvider.getPlaylistMetadata_impl(); 219df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 220273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 221273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 222273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Updates the playlist metadata 223273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 224273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param metadata metadata of the playlist 225273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 226df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) { 2275f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.updatePlaylistMetadata_impl(metadata); 228df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 229273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 230273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 231f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * Adds the media item to the playlist at position index. Index equals or greater than 232f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * the current playlist size will add the item at the end of the playlist. 233f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * <p> 234f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * This will not change the currently playing media item. 235f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * If index is less than or equal to the current index of the playlist, 236f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * the current index of the playlist will be incremented correspondingly. 237273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 238f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * @param index the index you want to add 239f73bc870c0e07861019d4833c3ccb42d0af9fab0Jaewan Kim * @param item the media item you want to add 240273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 241df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void addPlaylistItem(int index, @NonNull MediaItem2 item) { 2425f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.addPlaylistItem_impl(index, item); 243df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 244273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 245273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 246273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Removes the media item from the playlist 247273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 248273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param item media item to remove 249273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 250df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void removePlaylistItem(@NonNull MediaItem2 item) { 2515f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.removePlaylistItem_impl(item); 252df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 253273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 254273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 255525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * Replace the media item at index in the playlist. This can be also used to update metadata of 256525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * an item. 257273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 258525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * @param index the index of the item to replace 259525c88c2b792931c46ab4452c2bbe9989614ba74Jaewan Kim * @param item the new item 260273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 261df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void replacePlaylistItem(int index, @NonNull MediaItem2 item) { 2625f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.replacePlaylistItem_impl(index, item); 263df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 264273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 265273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 266273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Skips to the the media item, and plays from it. 267273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 268273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param item media item to start playing from 269273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 270df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void skipToPlaylistItem(@NonNull MediaItem2 item) { 2715f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.skipToPlaylistItem_impl(item); 272df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 273df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 27468c774a1ee105648878933fb858c183882be2427Jaewan Kim /** 27568c774a1ee105648878933fb858c183882be2427Jaewan Kim * Skips to the previous item in the playlist. 27668c774a1ee105648878933fb858c183882be2427Jaewan Kim */ 277df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void skipToPreviousItem() { 2785f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.skipToPreviousItem_impl(); 279df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 280df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim 28168c774a1ee105648878933fb858c183882be2427Jaewan Kim /** 28268c774a1ee105648878933fb858c183882be2427Jaewan Kim * Skips to the next item in the playlist. 28368c774a1ee105648878933fb858c183882be2427Jaewan Kim */ 284df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void skipToNextItem() { 2855f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.skipToNextItem_impl(); 286df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 287273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 288273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 289f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim * Gets the repeat mode 290273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 291273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @return repeat mode 292273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_NONE 293273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_ONE 294273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_ALL 295273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_GROUP 296273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 297df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public @RepeatMode int getRepeatMode() { 2985f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim return mProvider.getRepeatMode_impl(); 299df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 300273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 301273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 302f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim * Sets the repeat mode 303273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 304273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @param repeatMode repeat mode 305273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_NONE 306273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_ONE 307273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_ALL 308273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #REPEAT_MODE_GROUP 309273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 310df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void setRepeatMode(@RepeatMode int repeatMode) { 3115f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.setRepeatMode_impl(repeatMode); 312df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 313273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 314273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 315f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim * Gets the shuffle mode 316273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 317f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim * @return The shuffle mode 318273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_NONE 319273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_ALL 320273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_GROUP 321273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 322df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public @ShuffleMode int getShuffleMode() { 3235f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim return mProvider.getShuffleMode_impl(); 324df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 325273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim 326273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim /** 327f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim * Sets the shuffle mode 328273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * 329f10ca2f9606f004e66415ce5d9b3e97441cc9917Jaewan Kim * @param shuffleMode The shuffle mode 330273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_NONE 331273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_ALL 332273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * @see #SHUFFLE_MODE_GROUP 333273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim */ 334df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim public void setShuffleMode(@ShuffleMode int shuffleMode) { 3355f8a8ee0e59142cc54cbdac949d8a7c3f4e64653Sungsoo Lim mProvider.setShuffleMode_impl(shuffleMode); 336df0e8fdffd43d55eaffc7d2e7266d2f4526fb3b9Sungsoo Lim } 337e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon 338e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon /** 3395df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * Called by {@link MediaSession2} when it wants to translate {@link DataSourceDesc} from the 3405df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * {@link MediaPlayerBase.PlayerEventCallback} to the {@link MediaItem2}. Override this method 3415df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * if you want to create {@link DataSourceDesc}s dynamically, instead of specifying them with 3425df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * {@link #setPlaylist(List, MediaMetadata2)}. 3435df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * <p> 3445df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * Session would throw an exception if this returns {@code null} for {@param dsd} from the 3455df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * {@link MediaPlayerBase.PlayerEventCallback}. 3465df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * <p> 3475df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * Default implementation calls the {@link #getPlaylist()} and searches the {@link MediaItem2} 3485df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * with the {@param dsd}. 349e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon * 3505df18392633f339cea55fe3c01472ce839984b98Jaewan Kim * @param dsd The dsd to query. 351e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon * @return A {@link MediaItem2} object in the playlist that matches given {@code dsd}. 352e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon * @throws IllegalArgumentException if {@code dsd} is null 353e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon */ 354e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon public @Nullable MediaItem2 getMediaItem(@NonNull DataSourceDesc dsd) { 355e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon return mProvider.getMediaItem_impl(dsd); 356e14acb53fa2ff0f6327afeae30268431d0eed927Hyundo Moon } 3576cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim} 358