diff --git a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 9d05500dd6..a8f04e5113 100644 --- a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -183,6 +183,14 @@ public final class SimpleExoPlayer implements ExoPlayer { return renderers[index].getTrackType(); } + /** + * Clears any {@link Surface}, {@link SurfaceHolder}, {@link SurfaceView} or {@link TextureView} + * currently set on the player. + */ + public void clearVideoSurface() { + setVideoSurface(null); + } + /** * Sets the {@link Surface} onto which video will be rendered. The caller is responsible for * tracking the lifecycle of the surface, and must clear the surface by calling @@ -240,6 +248,9 @@ public final class SimpleExoPlayer implements ExoPlayer { if (textureView == null) { setVideoSurfaceInternal(null); } else { + if (textureView.getSurfaceTextureListener() != null) { + Log.w(TAG, "Replacing existing SurfaceTextureListener."); + } SurfaceTexture surfaceTexture = textureView.getSurfaceTexture(); setVideoSurfaceInternal(surfaceTexture == null ? null : new Surface(surfaceTexture)); textureView.setSurfaceTextureListener(componentListener); @@ -593,13 +604,17 @@ public final class SimpleExoPlayer implements ExoPlayer { } private void removeSurfaceCallbacks() { - if (this.textureView != null) { - this.textureView.setSurfaceTextureListener(null); - this.textureView = null; + if (textureView != null) { + if (textureView.getSurfaceTextureListener() != componentListener) { + Log.w(TAG, "SurfaceTextureListener already unset or replaced."); + } else { + textureView.setSurfaceTextureListener(null); + } + textureView = null; } - if (this.surfaceHolder != null) { - this.surfaceHolder.removeCallback(componentListener); - this.surfaceHolder = null; + if (surfaceHolder != null) { + surfaceHolder.removeCallback(componentListener); + surfaceHolder = null; } } diff --git a/library/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java b/library/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java index f6d8742fa5..13c5d14df0 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java +++ b/library/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java @@ -140,6 +140,9 @@ public class PlaybackControlView extends FrameLayout { * @param player the {@code ExoPlayer} to control. */ public void setPlayer(ExoPlayer player) { + if (this.player == player) { + return; + } if (this.player != null) { this.player.removeListener(componentListener); } diff --git a/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java b/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java index 3f08a04af8..cd0acb77fa 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java +++ b/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java @@ -112,6 +112,9 @@ public final class SimpleExoPlayerView extends FrameLayout { * @param player The {@link SimpleExoPlayer} to use. */ public void setPlayer(SimpleExoPlayer player) { + if (this.player == player) { + return; + } if (this.player != null) { this.player.setTextOutput(null); this.player.setVideoListener(null); @@ -131,7 +134,9 @@ public final class SimpleExoPlayerView extends FrameLayout { } else { shutterView.setVisibility(VISIBLE); } - setUseController(useController); + if (useController) { + controller.setPlayer(player); + } } /** @@ -142,6 +147,9 @@ public final class SimpleExoPlayerView extends FrameLayout { * @param useController If {@code false} the playback control is never used. */ public void setUseController(boolean useController) { + if (this.useController == useController) { + return; + } this.useController = useController; if (useController) { controller.setPlayer(player);