Add ExoPlayer.retry convenience method

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=211463309
This commit is contained in:
olly 2018-09-04 08:47:59 -07:00 committed by Oliver Woodman
parent 7959a691ad
commit c57fe1897c
5 changed files with 43 additions and 10 deletions

View File

@ -7,8 +7,9 @@
`compileOptions { targetCompatibility JavaVersion.VERSION_1_8 }` to their `compileOptions { targetCompatibility JavaVersion.VERSION_1_8 }` to their
gradle settings to ensure bytecode compatibility. gradle settings to ensure bytecode compatibility.
* Set `compileSdkVersion` and `targetSdkVersion` to 28. * Set `compileSdkVersion` and `targetSdkVersion` to 28.
* Added support for automatic audio focus handling via * Support for automatic audio focus handling via
`SimpleExoPlayer.setAudioAttributes`. `SimpleExoPlayer.setAudioAttributes`.
* Added `ExoPlayer.retry` convenience method.
* Add `AudioListener` for listening to changes in audio configuration during * Add `AudioListener` for listening to changes in audio configuration during
playback ([#3994](https://github.com/google/ExoPlayer/issues/3994)). playback ([#3994](https://github.com/google/ExoPlayer/issues/3994)).
* Add `LoadErrorHandlingPolicy` to allow configuration of load error handling * Add `LoadErrorHandlingPolicy` to allow configuration of load error handling

View File

@ -188,6 +188,12 @@ public interface ExoPlayer extends Player {
*/ */
Looper getApplicationLooper(); Looper getApplicationLooper();
/**
* Retries a failed or stopped playback. Does nothing if the player has been reset, or if playback
* has not failed or been stopped.
*/
void retry();
/** /**
* Prepares the player to play the provided {@link MediaSource}. Equivalent to * Prepares the player to play the provided {@link MediaSource}. Equivalent to
* {@code prepare(mediaSource, true, true)}. * {@code prepare(mediaSource, true, true)}.

View File

@ -65,6 +65,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
private final Timeline.Period period; private final Timeline.Period period;
private final ArrayDeque<PlaybackInfoUpdate> pendingPlaybackInfoUpdates; private final ArrayDeque<PlaybackInfoUpdate> pendingPlaybackInfoUpdates;
private MediaSource mediaSource;
private boolean playWhenReady; private boolean playWhenReady;
private boolean internalPlayWhenReady; private boolean internalPlayWhenReady;
private @RepeatMode int repeatMode; private @RepeatMode int repeatMode;
@ -191,14 +192,23 @@ import java.util.concurrent.CopyOnWriteArraySet;
return playbackError; return playbackError;
} }
@Override
public void retry() {
if (mediaSource != null
&& (playbackError != null || playbackInfo.playbackState == Player.STATE_IDLE)) {
prepare(mediaSource, /* resetPosition= */ false, /* resetState= */ false);
}
}
@Override @Override
public void prepare(MediaSource mediaSource) { public void prepare(MediaSource mediaSource) {
prepare(mediaSource, true, true); prepare(mediaSource, /* resetPosition= */ true, /* resetState= */ true);
} }
@Override @Override
public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) {
playbackError = null; playbackError = null;
this.mediaSource = mediaSource;
PlaybackInfo playbackInfo = PlaybackInfo playbackInfo =
getResetPlaybackInfo( getResetPlaybackInfo(
resetPosition, resetState, /* playbackState= */ Player.STATE_BUFFERING); resetPosition, resetState, /* playbackState= */ Player.STATE_BUFFERING);
@ -384,6 +394,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
public void stop(boolean reset) { public void stop(boolean reset) {
if (reset) { if (reset) {
playbackError = null; playbackError = null;
mediaSource = null;
} }
PlaybackInfo playbackInfo = PlaybackInfo playbackInfo =
getResetPlaybackInfo( getResetPlaybackInfo(
@ -410,6 +421,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
Log.i(TAG, "Release " + Integer.toHexString(System.identityHashCode(this)) + " [" Log.i(TAG, "Release " + Integer.toHexString(System.identityHashCode(this)) + " ["
+ ExoPlayerLibraryInfo.VERSION_SLASHY + "] [" + Util.DEVICE_DEBUG_INFO + "] [" + ExoPlayerLibraryInfo.VERSION_SLASHY + "] [" + Util.DEVICE_DEBUG_INFO + "] ["
+ ExoPlayerLibraryInfo.registeredModules() + "]"); + ExoPlayerLibraryInfo.registeredModules() + "]");
mediaSource = null;
internalPlayer.release(); internalPlayer.release();
eventHandler.removeCallbacksAndMessages(null); eventHandler.removeCallbacksAndMessages(null);
} }

View File

@ -832,6 +832,14 @@ public class SimpleExoPlayer
return player.getPlaybackError(); return player.getPlaybackError();
} }
@Override
public void retry() {
if (mediaSource != null
&& (getPlaybackError() != null || getPlaybackState() == Player.STATE_IDLE)) {
prepare(mediaSource, /* resetPosition= */ false, /* resetState= */ false);
}
}
@Override @Override
public void prepare(MediaSource mediaSource) { public void prepare(MediaSource mediaSource) {
prepare(mediaSource, /* resetPosition= */ true, /* resetState= */ true); prepare(mediaSource, /* resetPosition= */ true, /* resetState= */ true);
@ -839,14 +847,12 @@ public class SimpleExoPlayer
@Override @Override
public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) {
if (this.mediaSource != mediaSource) {
if (this.mediaSource != null) { if (this.mediaSource != null) {
this.mediaSource.removeEventListener(analyticsCollector); this.mediaSource.removeEventListener(analyticsCollector);
analyticsCollector.resetForNewMediaSource(); analyticsCollector.resetForNewMediaSource();
} }
mediaSource.addEventListener(eventHandler, analyticsCollector);
this.mediaSource = mediaSource; this.mediaSource = mediaSource;
} mediaSource.addEventListener(eventHandler, analyticsCollector);
@AudioFocusManager.PlayerCommand @AudioFocusManager.PlayerCommand
int playerCommand = audioFocusManager.handlePrepare(getPlayWhenReady()); int playerCommand = audioFocusManager.handlePrepare(getPlayWhenReady());
updatePlayWhenReady(getPlayWhenReady(), playerCommand); updatePlayWhenReady(getPlayWhenReady(), playerCommand);
@ -949,8 +955,10 @@ public class SimpleExoPlayer
player.stop(reset); player.stop(reset);
if (mediaSource != null) { if (mediaSource != null) {
mediaSource.removeEventListener(analyticsCollector); mediaSource.removeEventListener(analyticsCollector);
mediaSource = null;
analyticsCollector.resetForNewMediaSource(); analyticsCollector.resetForNewMediaSource();
if (reset) {
mediaSource = null;
}
} }
audioFocusManager.handleStop(); audioFocusManager.handleStop();
currentCues = Collections.emptyList(); currentCues = Collections.emptyList();
@ -969,6 +977,7 @@ public class SimpleExoPlayer
} }
if (mediaSource != null) { if (mediaSource != null) {
mediaSource.removeEventListener(analyticsCollector); mediaSource.removeEventListener(analyticsCollector);
mediaSource = null;
} }
bandwidthMeter.removeEventListener(analyticsCollector); bandwidthMeter.removeEventListener(analyticsCollector);
currentCues = Collections.emptyList(); currentCues = Collections.emptyList();

View File

@ -79,6 +79,11 @@ public abstract class StubExoPlayer implements ExoPlayer {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public void retry() {
throw new UnsupportedOperationException();
}
@Override @Override
public void prepare(MediaSource mediaSource) { public void prepare(MediaSource mediaSource) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();