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