Make media session extension depend on common module only

PiperOrigin-RevId: 359001281
This commit is contained in:
bachinger 2021-02-23 10:02:15 +00:00 committed by marcbaechinger
parent 95fcfdd71d
commit 45b0c98128
3 changed files with 29 additions and 35 deletions

View File

@ -46,6 +46,9 @@
([#8581](https://github.com/google/ExoPlayer/issues/8581)). ([#8581](https://github.com/google/ExoPlayer/issues/8581)).
* FFmpeg extension: Update to use NDK r22 * FFmpeg extension: Update to use NDK r22
([#8581](https://github.com/google/ExoPlayer/issues/8581)). ([#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) ### 2.13.1 (2021-02-12)

View File

@ -14,7 +14,7 @@
apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle"
dependencies { dependencies {
implementation project(modulePrefix + 'library-core') implementation project(modulePrefix + 'library-common')
api 'androidx.media:media:' + androidxMediaVersion api 'androidx.media:media:' + androidxMediaVersion
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion

View File

@ -23,15 +23,13 @@ import android.support.v4.media.session.MediaSessionCompat;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.ControlDispatcher;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player; 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 com.google.android.exoplayer2.util.Util;
import java.util.List; import java.util.List;
/** /**
* A {@link MediaSessionConnector.QueueEditor} implementation based on the {@link * A {@link MediaSessionConnector.QueueEditor} implementation.
* ConcatenatingMediaSource}.
* *
* <p>This class implements the {@link MediaSessionConnector.CommandReceiver} interface and handles * <p>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. * 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_FROM_INDEX = "from_index";
public static final String EXTRA_TO_INDEX = "to_index"; public static final String EXTRA_TO_INDEX = "to_index";
/** Converts a {@link MediaDescriptionCompat} to a {@link MediaItem}. */
public interface MediaDescriptionConverter {
/** /**
* Factory to create {@link MediaSource}s. * Returns a {@link MediaItem} for the given {@link MediaDescriptionCompat} or null if the
*/ * description can't be converted.
public interface MediaSourceFactory {
/**
* Creates a {@link MediaSource} for the given {@link MediaDescriptionCompat}.
* *
* @param description The {@link MediaDescriptionCompat} to create a media source for. * <p>If not null, the media item that is returned will be used to call {@link
* @return A {@link MediaSource} or {@code null} if no source can be created for the given * Player#addMediaItem(MediaItem)}.
* description.
*/ */
@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) { public boolean equals(MediaDescriptionCompat d1, MediaDescriptionCompat d2) {
return Util.areEqual(d1.getMediaId(), d2.getMediaId()); return Util.areEqual(d1.getMediaId(), d2.getMediaId());
} }
} }
private final MediaControllerCompat mediaController; private final MediaControllerCompat mediaController;
private final QueueDataAdapter queueDataAdapter; private final QueueDataAdapter queueDataAdapter;
private final MediaSourceFactory sourceFactory; private final MediaDescriptionConverter mediaDescriptionConverter;
private final MediaDescriptionEqualityChecker equalityChecker; private final MediaDescriptionEqualityChecker equalityChecker;
private final ConcatenatingMediaSource queueMediaSource;
/** /**
* Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory. * Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory.
* *
* @param mediaController A {@link MediaControllerCompat} to read the current queue. * @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 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( public TimelineQueueEditor(
MediaControllerCompat mediaController, MediaControllerCompat mediaController,
ConcatenatingMediaSource queueMediaSource,
QueueDataAdapter queueDataAdapter, QueueDataAdapter queueDataAdapter,
MediaSourceFactory sourceFactory) { MediaDescriptionConverter mediaDescriptionConverter) {
this(mediaController, queueMediaSource, queueDataAdapter, sourceFactory, this(
new MediaIdEqualityChecker()); mediaController, queueDataAdapter, mediaDescriptionConverter, new MediaIdEqualityChecker());
} }
/** /**
* Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory. * Creates a new {@link TimelineQueueEditor} with a given mediaSourceFactory.
* *
* @param mediaController A {@link MediaControllerCompat} to read the current queue. * @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 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. * @param equalityChecker The {@link MediaDescriptionEqualityChecker} to match queue items.
*/ */
public TimelineQueueEditor( public TimelineQueueEditor(
MediaControllerCompat mediaController, MediaControllerCompat mediaController,
ConcatenatingMediaSource queueMediaSource,
QueueDataAdapter queueDataAdapter, QueueDataAdapter queueDataAdapter,
MediaSourceFactory sourceFactory, MediaDescriptionConverter mediaDescriptionConverter,
MediaDescriptionEqualityChecker equalityChecker) { MediaDescriptionEqualityChecker equalityChecker) {
this.mediaController = mediaController; this.mediaController = mediaController;
this.queueMediaSource = queueMediaSource;
this.queueDataAdapter = queueDataAdapter; this.queueDataAdapter = queueDataAdapter;
this.sourceFactory = sourceFactory; this.mediaDescriptionConverter = mediaDescriptionConverter;
this.equalityChecker = equalityChecker; this.equalityChecker = equalityChecker;
} }
@ -165,10 +157,10 @@ public final class TimelineQueueEditor
@Override @Override
public void onAddQueueItem(Player player, MediaDescriptionCompat description, int index) { public void onAddQueueItem(Player player, MediaDescriptionCompat description, int index) {
@Nullable MediaSource mediaSource = sourceFactory.createMediaSource(description); @Nullable MediaItem mediaItem = mediaDescriptionConverter.convert(description);
if (mediaSource != null) { if (mediaItem != null) {
queueDataAdapter.add(index, description); 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++) { for (int i = 0; i < queue.size(); i++) {
if (equalityChecker.equals(queue.get(i).getDescription(), description)) { if (equalityChecker.equals(queue.get(i).getDescription(), description)) {
queueDataAdapter.remove(i); queueDataAdapter.remove(i);
queueMediaSource.removeMediaSource(i); player.removeMediaItem(i);
return; return;
} }
} }
@ -200,9 +192,8 @@ public final class TimelineQueueEditor
int to = extras.getInt(EXTRA_TO_INDEX, C.INDEX_UNSET); int to = extras.getInt(EXTRA_TO_INDEX, C.INDEX_UNSET);
if (from != C.INDEX_UNSET && to != C.INDEX_UNSET) { if (from != C.INDEX_UNSET && to != C.INDEX_UNSET) {
queueDataAdapter.move(from, to); queueDataAdapter.move(from, to);
queueMediaSource.moveMediaSource(from, to); player.moveMediaItem(from, to);
} }
return true; return true;
} }
} }