Some no-op LeanbackPlayerAdapter cleanup

- Have a single inner class for all listeners. This is inline
  with what we do elsewhere in the library.
- Avoid repeated getCallback() calls within methods.
- Seek to default position from ended state, rather than 0.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=165603927
This commit is contained in:
olly 2017-07-19 11:26:49 +01:00 committed by Oliver Woodman
parent e3f305b5c0
commit 106d88df41

View File

@ -26,7 +26,6 @@ import android.view.Surface;
import android.view.SurfaceHolder;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
@ -37,7 +36,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.util.ErrorMessageProvider;
/**
* Leanback {@link PlayerAdapter} implementation for {@link SimpleExoPlayer}.
* Leanback {@code PlayerAdapter} implementation for {@link SimpleExoPlayer}.
*/
public final class LeanbackPlayerAdapter extends PlayerAdapter {
@ -48,58 +47,49 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
private final Context context;
private final SimpleExoPlayer player;
private final Handler handler;
private final Runnable updatePlayerRunnable = new Runnable() {
@Override
public void run() {
getCallback().onCurrentPositionChanged(LeanbackPlayerAdapter.this);
getCallback().onBufferedPositionChanged(LeanbackPlayerAdapter.this);
handler.postDelayed(this, updatePeriod);
}
};
private final ComponentListener componentListener;
private final Runnable updatePlayerRunnable;
private ErrorMessageProvider<? super ExoPlaybackException> errorMessageProvider;
private SurfaceHolderGlueHost surfaceHolderGlueHost;
private boolean initialized;
private boolean hasSurface;
private boolean isBuffering;
private ErrorMessageProvider<? super ExoPlaybackException> errorMessageProvider;
private final int updatePeriod;
private final ExoPlayerEventListenerImpl exoPlayerListener = new ExoPlayerEventListenerImpl();
private final SimpleExoPlayer.VideoListener videoListener = new SimpleExoPlayer.VideoListener() {
@Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
float pixelWidthHeightRatio) {
getCallback().onVideoSizeChanged(LeanbackPlayerAdapter.this, width, height);
}
@Override
public void onRenderedFirstFrame() {
}
};
/**
* Constructor.
* Users are responsible for managing {@link SimpleExoPlayer} lifecycle. You must
* stop/release the player once you're done playing the media.
* Builds an instance. Note that the {@code PlayerAdapter} does not manage the lifecycle of the
* {@link SimpleExoPlayer} instance. The caller remains responsible for releasing the player when
* it's no longer required.
*
* @param context The current context (activity).
* @param player Instance of your exoplayer that needs to be configured.
* @param updatePeriodMs The delay between player control updates, in milliseconds.
*/
public LeanbackPlayerAdapter(Context context, SimpleExoPlayer player, int updatePeriod) {
public LeanbackPlayerAdapter(Context context, SimpleExoPlayer player, final int updatePeriodMs) {
this.context = context;
this.player = player;
this.handler = new Handler();
this.updatePeriod = updatePeriod;
handler = new Handler();
componentListener = new ComponentListener();
updatePlayerRunnable = new Runnable() {
@Override
public void run() {
Callback callback = getCallback();
callback.onCurrentPositionChanged(LeanbackPlayerAdapter.this);
callback.onBufferedPositionChanged(LeanbackPlayerAdapter.this);
handler.postDelayed(this, updatePeriodMs);
}
};
}
@Override
public void onAttachedToHost(PlaybackGlueHost host) {
if (host instanceof SurfaceHolderGlueHost) {
surfaceHolderGlueHost = ((SurfaceHolderGlueHost) host);
surfaceHolderGlueHost.setSurfaceHolderCallback(new VideoPlayerSurfaceHolderCallback());
surfaceHolderGlueHost.setSurfaceHolderCallback(componentListener);
}
notifyListeners();
player.addListener(exoPlayerListener);
player.addVideoListener(videoListener);
player.addListener(componentListener);
player.addVideoListener(componentListener);
}
private void notifyListeners() {
@ -110,15 +100,14 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
boolean hasEnded = playbackState == Player.STATE_ENDED;
initialized = isInitialized;
Callback callback = getCallback();
if (oldIsPrepared != isPrepared()) {
getCallback().onPreparedStateChanged(this);
callback.onPreparedStateChanged(this);
}
getCallback().onPlayStateChanged(this);
getCallback().onBufferingStateChanged(this, isBuffering || !initialized);
callback.onPlayStateChanged(this);
callback.onBufferingStateChanged(this, isBuffering || !initialized);
if (hasEnded) {
getCallback().onPlayCompleted(this);
callback.onPlayCompleted(this);
}
}
@ -134,8 +123,8 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
@Override
public void onDetachedFromHost() {
player.removeListener(exoPlayerListener);
player.removeVideoListener(videoListener);
player.removeListener(componentListener);
player.removeVideoListener(componentListener);
if (surfaceHolderGlueHost != null) {
surfaceHolderGlueHost.setSurfaceHolderCallback(null);
surfaceHolderGlueHost = null;
@ -151,10 +140,9 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
@Override
public void setProgressUpdatingEnabled(final boolean enabled) {
handler.removeCallbacks(updatePlayerRunnable);
if (!enabled) {
return;
if (enabled) {
handler.post(updatePlayerRunnable);
}
handler.postDelayed(updatePlayerRunnable, updatePeriod);
}
@Override
@ -164,8 +152,8 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
@Override
public long getDuration() {
long duration = player.getDuration();
return duration != C.TIME_UNSET ? duration : -1;
long durationMs = player.getDuration();
return durationMs != C.TIME_UNSET ? durationMs : -1;
}
@Override
@ -176,7 +164,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
@Override
public void play() {
if (player.getPlaybackState() == Player.STATE_ENDED) {
seekTo(0);
player.seekToDefaultPosition();
}
player.setPlayWhenReady(true);
getCallback().onPlayStateChanged(this);
@ -198,10 +186,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
return player.getBufferedPosition();
}
/**
* @return True if ExoPlayer is ready and got a SurfaceHolder if
* {@link PlaybackGlueHost} provides SurfaceHolder.
*/
@Override
public boolean isPrepared() {
return initialized && (surfaceHolderGlueHost == null || hasSurface);
@ -213,10 +197,11 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
getCallback().onPreparedStateChanged(this);
}
/**
* Implements {@link SurfaceHolder.Callback} that can then be set on the {@link PlaybackGlueHost}.
*/
private final class VideoPlayerSurfaceHolderCallback implements SurfaceHolder.Callback {
private final class ComponentListener implements Player.EventListener,
SimpleExoPlayer.VideoListener, SurfaceHolder.Callback {
// SurfaceHolder.Callback implementation.
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
setVideoSurface(surfaceHolder.getSurface());
@ -224,67 +209,82 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter {
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
// Do nothing.
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
setVideoSurface(null);
}
}
private final class ExoPlayerEventListenerImpl implements ExoPlayer.EventListener {
// Player.EventListener implementation.
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
LeanbackPlayerAdapter.this.notifyListeners();
notifyListeners();
}
@Override
public void onPlayerError(ExoPlaybackException exception) {
Callback callback = getCallback();
if (errorMessageProvider != null) {
Pair<Integer, String> message = errorMessageProvider.getErrorMessage(exception);
if (message != null) {
getCallback().onError(LeanbackPlayerAdapter.this,
message.first,
message.second);
return;
}
Pair<Integer, String> errorMessage = errorMessageProvider.getErrorMessage(exception);
callback.onError(LeanbackPlayerAdapter.this, errorMessage.first, errorMessage.second);
} else {
callback.onError(LeanbackPlayerAdapter.this, exception.type, context.getString(
R.string.lb_media_player_error, exception.type, exception.rendererIndex));
}
getCallback().onError(LeanbackPlayerAdapter.this,
exception.type,
context.getString(R.string.lb_media_player_error,
exception.type,
exception.rendererIndex));
}
@Override
public void onLoadingChanged(boolean isLoading) {
// Do nothing.
}
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
getCallback().onDurationChanged(LeanbackPlayerAdapter.this);
getCallback().onCurrentPositionChanged(LeanbackPlayerAdapter.this);
getCallback().onBufferedPositionChanged(LeanbackPlayerAdapter.this);
Callback callback = getCallback();
callback.onDurationChanged(LeanbackPlayerAdapter.this);
callback.onCurrentPositionChanged(LeanbackPlayerAdapter.this);
callback.onBufferedPositionChanged(LeanbackPlayerAdapter.this);
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
// Do nothing.
}
@Override
public void onPositionDiscontinuity() {
getCallback().onCurrentPositionChanged(LeanbackPlayerAdapter.this);
getCallback().onBufferedPositionChanged(LeanbackPlayerAdapter.this);
Callback callback = getCallback();
callback.onCurrentPositionChanged(LeanbackPlayerAdapter.this);
callback.onBufferedPositionChanged(LeanbackPlayerAdapter.this);
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters params) {
// Do nothing.
}
@Override
public void onRepeatModeChanged(int repeatMode) {
// Do nothing.
}
// SimpleExoplayerView.Callback implementation.
@Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
float pixelWidthHeightRatio) {
getCallback().onVideoSizeChanged(LeanbackPlayerAdapter.this, width, height);
}
@Override
public void onRenderedFirstFrame() {
// Do nothing.
}
}
}