Make media session extension depend on common module only
PiperOrigin-RevId: 359001281
This commit is contained in:
parent
95fcfdd71d
commit
45b0c98128
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
*
|
||||
* <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.
|
||||
@ -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.
|
||||
* <p>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;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user