simplify PlayerManager

PiperOrigin-RevId: 303170259
This commit is contained in:
bachinger 2020-03-26 19:28:30 +00:00 committed by Oliver Woodman
parent 2842eb3eb4
commit 777d99da8a

View File

@ -29,7 +29,6 @@ import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.ext.cast.CastPlayer; import com.google.android.exoplayer2.ext.cast.CastPlayer;
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener; import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
@ -70,7 +69,6 @@ import java.util.ArrayList;
private final CastPlayer castPlayer; private final CastPlayer castPlayer;
private final ArrayList<MediaItem> mediaQueue; private final ArrayList<MediaItem> mediaQueue;
private final Listener listener; private final Listener listener;
private final ConcatenatingMediaSource concatenatingMediaSource;
private TrackGroupArray lastSeenTrackGroupArray; private TrackGroupArray lastSeenTrackGroupArray;
private int currentItemIndex; private int currentItemIndex;
@ -96,7 +94,6 @@ import java.util.ArrayList;
this.castControlView = castControlView; this.castControlView = castControlView;
mediaQueue = new ArrayList<>(); mediaQueue = new ArrayList<>();
currentItemIndex = C.INDEX_UNSET; currentItemIndex = C.INDEX_UNSET;
concatenatingMediaSource = new ConcatenatingMediaSource();
trackSelector = new DefaultTrackSelector(context); trackSelector = new DefaultTrackSelector(context);
exoPlayer = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build(); exoPlayer = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
@ -120,7 +117,7 @@ import java.util.ArrayList;
* @param itemIndex The index of the item to play. * @param itemIndex The index of the item to play.
*/ */
public void selectQueueItem(int itemIndex) { public void selectQueueItem(int itemIndex) {
setCurrentItem(itemIndex, C.TIME_UNSET, true); setCurrentItem(itemIndex);
} }
/** Returns the index of the currently played item. */ /** Returns the index of the currently played item. */
@ -135,10 +132,7 @@ import java.util.ArrayList;
*/ */
public void addItem(MediaItem item) { public void addItem(MediaItem item) {
mediaQueue.add(item); mediaQueue.add(item);
concatenatingMediaSource.addMediaSource(defaultMediaSourceFactory.createMediaSource(item)); currentPlayer.addMediaItem(item);
if (currentPlayer == castPlayer) {
castPlayer.addMediaItem(item);
}
} }
/** Returns the size of the media queue. */ /** Returns the size of the media queue. */
@ -167,16 +161,7 @@ import java.util.ArrayList;
if (itemIndex == -1) { if (itemIndex == -1) {
return false; return false;
} }
concatenatingMediaSource.removeMediaSource(itemIndex); currentPlayer.removeMediaItem(itemIndex);
if (currentPlayer == castPlayer) {
if (castPlayer.getPlaybackState() != Player.STATE_IDLE) {
Timeline castTimeline = castPlayer.getCurrentTimeline();
if (castTimeline.getPeriodCount() <= itemIndex) {
return false;
}
castPlayer.removeMediaItem(itemIndex);
}
}
mediaQueue.remove(itemIndex); mediaQueue.remove(itemIndex);
if (itemIndex == currentItemIndex && itemIndex == mediaQueue.size()) { if (itemIndex == currentItemIndex && itemIndex == mediaQueue.size()) {
maybeSetCurrentItemAndNotify(C.INDEX_UNSET); maybeSetCurrentItemAndNotify(C.INDEX_UNSET);
@ -198,17 +183,9 @@ import java.util.ArrayList;
if (fromIndex == -1) { if (fromIndex == -1) {
return false; return false;
} }
// Player update.
concatenatingMediaSource.moveMediaSource(fromIndex, newIndex);
if (currentPlayer == castPlayer && castPlayer.getPlaybackState() != Player.STATE_IDLE) {
Timeline castTimeline = castPlayer.getCurrentTimeline();
int periodCount = castTimeline.getPeriodCount();
if (periodCount <= fromIndex || periodCount <= newIndex) {
return false;
}
castPlayer.moveMediaItem(fromIndex, newIndex);
}
// Player update.
currentPlayer.moveMediaItem(fromIndex, newIndex);
mediaQueue.add(newIndex, mediaQueue.remove(fromIndex)); mediaQueue.add(newIndex, mediaQueue.remove(fromIndex));
// Index update. // Index update.
@ -241,7 +218,6 @@ import java.util.ArrayList;
public void release() { public void release() {
currentItemIndex = C.INDEX_UNSET; currentItemIndex = C.INDEX_UNSET;
mediaQueue.clear(); mediaQueue.clear();
concatenatingMediaSource.clear();
castPlayer.setSessionAvailabilityListener(null); castPlayer.setSessionAvailabilityListener(null);
castPlayer.release(); castPlayer.release();
localPlayerView.setPlayer(null); localPlayerView.setPlayer(null);
@ -345,32 +321,26 @@ import java.util.ArrayList;
this.currentPlayer = currentPlayer; this.currentPlayer = currentPlayer;
// Media queue management. // Media queue management.
if (currentPlayer == exoPlayer) { currentPlayer.setMediaItems(mediaQueue, windowIndex, playbackPositionMs);
exoPlayer.setMediaSource(concatenatingMediaSource, /* resetPosition= */ true); currentPlayer.setPlayWhenReady(playWhenReady);
exoPlayer.prepare(); currentPlayer.prepare();
}
// Playback transition.
if (windowIndex != C.INDEX_UNSET) {
setCurrentItem(windowIndex, playbackPositionMs, playWhenReady);
}
} }
/** /**
* Starts playback of the item at the given position. * Starts playback of the item at the given index.
* *
* @param itemIndex The index of the item to play. * @param itemIndex The index of the item to play.
* @param positionMs The position at which playback should start.
* @param playWhenReady Whether the player should proceed when ready to do so.
*/ */
private void setCurrentItem(int itemIndex, long positionMs, boolean playWhenReady) { private void setCurrentItem(int itemIndex) {
maybeSetCurrentItemAndNotify(itemIndex); maybeSetCurrentItemAndNotify(itemIndex);
if (currentPlayer == castPlayer && castPlayer.getCurrentTimeline().isEmpty()) { if (currentPlayer.getCurrentTimeline().getWindowCount() != mediaQueue.size()) {
castPlayer.setMediaItems(mediaQueue, itemIndex, positionMs); // This only happens with the cast player. The receiver app in the cast device clears the
// timeline when the last item of the timeline has been played to end.
currentPlayer.setMediaItems(mediaQueue, itemIndex, C.TIME_UNSET);
} else { } else {
currentPlayer.seekTo(itemIndex, positionMs); currentPlayer.seekTo(itemIndex, C.TIME_UNSET);
currentPlayer.setPlayWhenReady(playWhenReady);
} }
currentPlayer.setPlayWhenReady(true);
} }
private void maybeSetCurrentItemAndNotify(int currentItemIndex) { private void maybeSetCurrentItemAndNotify(int currentItemIndex) {