diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7336802d35..d4b891a8cc 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -46,6 +46,9 @@ ([#8581](https://github.com/google/ExoPlayer/issues/8581)). * FFmpeg extension: Update to use NDK r22 ([#8581](https://github.com/google/ExoPlayer/issues/8581)). +* MediaSession extension: Remove dependency to core module and rely on common + only. The `TimelineQueueEditor` uses a new `MediaDescriptionConverter` for + this purpose and does not rely on the `ConcatenatingMediaSource` anymore. ### 2.13.1 (2021-02-12) diff --git a/extensions/mediasession/build.gradle b/extensions/mediasession/build.gradle index 5c827084da..9b812911ab 100644 --- a/extensions/mediasession/build.gradle +++ b/extensions/mediasession/build.gradle @@ -14,7 +14,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { - implementation project(modulePrefix + 'library-core') + implementation project(modulePrefix + 'library-common') api 'androidx.media:media:' + androidxMediaVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java index 7f60d5e715..cab16744b9 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java @@ -23,15 +23,13 @@ import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.source.ConcatenatingMediaSource; -import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.util.Util; import java.util.List; /** - * A {@link MediaSessionConnector.QueueEditor} implementation based on the {@link - * ConcatenatingMediaSource}. + * A {@link MediaSessionConnector.QueueEditor} implementation. * *

This class implements the {@link MediaSessionConnector.CommandReceiver} interface and handles * the {@link #COMMAND_MOVE_QUEUE_ITEM} to move a queue item instead of removing and inserting it. @@ -44,18 +42,17 @@ public final class TimelineQueueEditor public static final String EXTRA_FROM_INDEX = "from_index"; public static final String EXTRA_TO_INDEX = "to_index"; - /** - * Factory to create {@link MediaSource}s. - */ - public interface MediaSourceFactory { + /** Converts a {@link MediaDescriptionCompat} to a {@link MediaItem}. */ + public interface MediaDescriptionConverter { /** - * Creates a {@link MediaSource} for the given {@link MediaDescriptionCompat}. + * Returns a {@link MediaItem} for the given {@link MediaDescriptionCompat} or null if the + * description can't be converted. * - * @param description The {@link MediaDescriptionCompat} to create a media source for. - * @return A {@link MediaSource} or {@code null} if no source can be created for the given - * description. + *

If not null, the media item that is returned will be used to call {@link + * Player#addMediaItem(MediaItem)}. */ - @Nullable MediaSource createMediaSource(MediaDescriptionCompat description); + @Nullable + MediaItem convert(MediaDescriptionCompat description); } /** @@ -110,51 +107,46 @@ public final class TimelineQueueEditor public boolean equals(MediaDescriptionCompat d1, MediaDescriptionCompat d2) { return Util.areEqual(d1.getMediaId(), d2.getMediaId()); } - } private final MediaControllerCompat mediaController; private final QueueDataAdapter queueDataAdapter; - private final MediaSourceFactory sourceFactory; + private final MediaDescriptionConverter mediaDescriptionConverter; private final MediaDescriptionEqualityChecker equalityChecker; - private final ConcatenatingMediaSource queueMediaSource; /** * Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory. * * @param mediaController A {@link MediaControllerCompat} to read the current queue. - * @param queueMediaSource The {@link ConcatenatingMediaSource} to manipulate. * @param queueDataAdapter A {@link QueueDataAdapter} to change the backing data. - * @param sourceFactory The {@link MediaSourceFactory} to build media sources. + * @param mediaDescriptionConverter The {@link MediaDescriptionConverter} for converting media + * descriptions to {@link MediaItem MediaItems}. */ public TimelineQueueEditor( MediaControllerCompat mediaController, - ConcatenatingMediaSource queueMediaSource, QueueDataAdapter queueDataAdapter, - MediaSourceFactory sourceFactory) { - this(mediaController, queueMediaSource, queueDataAdapter, sourceFactory, - new MediaIdEqualityChecker()); + MediaDescriptionConverter mediaDescriptionConverter) { + this( + mediaController, queueDataAdapter, mediaDescriptionConverter, new MediaIdEqualityChecker()); } /** * Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory. * * @param mediaController A {@link MediaControllerCompat} to read the current queue. - * @param queueMediaSource The {@link ConcatenatingMediaSource} to manipulate. * @param queueDataAdapter A {@link QueueDataAdapter} to change the backing data. - * @param sourceFactory The {@link MediaSourceFactory} to build media sources. + * @param mediaDescriptionConverter The {@link MediaDescriptionConverter} for converting media + * descriptions to {@link MediaItem MediaItems}. * @param equalityChecker The {@link MediaDescriptionEqualityChecker} to match queue items. */ public TimelineQueueEditor( MediaControllerCompat mediaController, - ConcatenatingMediaSource queueMediaSource, QueueDataAdapter queueDataAdapter, - MediaSourceFactory sourceFactory, + MediaDescriptionConverter mediaDescriptionConverter, MediaDescriptionEqualityChecker equalityChecker) { this.mediaController = mediaController; - this.queueMediaSource = queueMediaSource; this.queueDataAdapter = queueDataAdapter; - this.sourceFactory = sourceFactory; + this.mediaDescriptionConverter = mediaDescriptionConverter; this.equalityChecker = equalityChecker; } @@ -165,10 +157,10 @@ public final class TimelineQueueEditor @Override public void onAddQueueItem(Player player, MediaDescriptionCompat description, int index) { - @Nullable MediaSource mediaSource = sourceFactory.createMediaSource(description); - if (mediaSource != null) { + @Nullable MediaItem mediaItem = mediaDescriptionConverter.convert(description); + if (mediaItem != null) { queueDataAdapter.add(index, description); - queueMediaSource.addMediaSource(index, mediaSource); + player.addMediaItem(index, mediaItem); } } @@ -178,7 +170,7 @@ public final class TimelineQueueEditor for (int i = 0; i < queue.size(); i++) { if (equalityChecker.equals(queue.get(i).getDescription(), description)) { queueDataAdapter.remove(i); - queueMediaSource.removeMediaSource(i); + player.removeMediaItem(i); return; } } @@ -200,9 +192,8 @@ public final class TimelineQueueEditor int to = extras.getInt(EXTRA_TO_INDEX, C.INDEX_UNSET); if (from != C.INDEX_UNSET && to != C.INDEX_UNSET) { queueDataAdapter.move(from, to); - queueMediaSource.moveMediaSource(from, to); + player.moveMediaItem(from, to); } return true; } - }