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)).
|
([#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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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}. */
|
||||||
* Factory to create {@link MediaSource}s.
|
public interface MediaDescriptionConverter {
|
||||||
*/
|
|
||||||
public interface MediaSourceFactory {
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
* <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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user