diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 50133dfc61..39cdd4a56a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -47,7 +47,6 @@ import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; -import com.google.android.exoplayer2.ui.StyledPlayerControlView; import com.google.android.exoplayer2.ui.StyledPlayerView; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.util.DebugTextViewHelper; @@ -61,7 +60,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** An activity that plays media using {@link ExoPlayer}. */ public class PlayerActivity extends AppCompatActivity - implements OnClickListener, StyledPlayerControlView.VisibilityListener { + implements OnClickListener, StyledPlayerView.ControllerVisibilityListener { // Saved instance state keys. @@ -245,10 +244,10 @@ public class PlayerActivity extends AppCompatActivity } } - // StyledPlayerControlView.VisibilityListener implementation + // StyledPlayerView.ControllerVisibilityListener implementation @Override - public void onVisibilityChange(int visibility) { + public void onVisibilityChanged(int visibility) { debugRootView.setVisibility(visibility); } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index fdc96e6121..58189e75ca 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -190,7 +190,13 @@ public class StyledPlayerControlView extends FrameLayout { ExoPlayerLibraryInfo.registerModule("goog.exo.ui"); } - /** Listener to be notified about changes of the visibility of the UI control. */ + /** + * @deprecated Register a {@link StyledPlayerView.ControllerVisibilityListener} via {@link + * StyledPlayerView#setControllerVisibilityListener(StyledPlayerView.ControllerVisibilityListener)} + * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link + * StyledPlayerView} is deprecated. + */ + @Deprecated public interface VisibilityListener { /** @@ -214,9 +220,12 @@ public class StyledPlayerControlView extends FrameLayout { } /** - * Listener to be invoked to inform the fullscreen mode is changed. Application should handle the - * fullscreen mode accordingly. + * @deprecated Register a {@link StyledPlayerView.FullscreenButtonClickListener} via {@link + * StyledPlayerView#setFullscreenButtonClickListener(StyledPlayerView.FullscreenButtonClickListener)} + * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link + * StyledPlayerView} is deprecated. */ + @Deprecated public interface OnFullScreenModeChangedListener { /** * Called to indicate a fullscreen mode change. @@ -246,7 +255,10 @@ public class StyledPlayerControlView extends FrameLayout { private static final int SETTINGS_AUDIO_TRACK_SELECTION_POSITION = 1; private final ComponentListener componentListener; + + @SuppressWarnings("deprecation") // Using the deprecated type for now. private final CopyOnWriteArrayList visibilityListeners; + @Nullable private final View previousButton; @Nullable private final View nextButton; @Nullable private final View playPauseButton; @@ -680,20 +692,26 @@ public class StyledPlayerControlView extends FrameLayout { } /** - * Adds a {@link VisibilityListener}. - * - * @param listener The listener to be notified about visibility changes. + * @deprecated Register a {@link StyledPlayerView.ControllerVisibilityListener} via {@link + * StyledPlayerView#setControllerVisibilityListener(StyledPlayerView.ControllerVisibilityListener)} + * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link + * StyledPlayerView} is deprecated. */ + @SuppressWarnings("deprecation") + @Deprecated public void addVisibilityListener(VisibilityListener listener) { checkNotNull(listener); visibilityListeners.add(listener); } /** - * Removes a {@link VisibilityListener}. - * - * @param listener The listener to be removed. + * @deprecated Register a {@link StyledPlayerView.ControllerVisibilityListener} via {@link + * StyledPlayerView#setControllerVisibilityListener(StyledPlayerView.ControllerVisibilityListener)} + * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link + * StyledPlayerView} is deprecated. */ + @SuppressWarnings("deprecation") + @Deprecated public void removeVisibilityListener(VisibilityListener listener) { visibilityListeners.remove(listener); } @@ -892,12 +910,13 @@ public class StyledPlayerControlView extends FrameLayout { } /** - * Sets a listener to be called when the fullscreen mode should be changed. A non-null listener - * needs to be set in order to display the fullscreen button. - * - * @param listener The listener to be called. A value of null removes any existing - * listener and hides the fullscreen button. + * @deprecated Register a {@link StyledPlayerView.FullscreenButtonClickListener} via {@link + * StyledPlayerView#setFullscreenButtonClickListener(StyledPlayerView.FullscreenButtonClickListener)} + * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link + * StyledPlayerView} is deprecated. */ + @SuppressWarnings("deprecation") + @Deprecated public void setOnFullScreenModeChangedListener( @Nullable OnFullScreenModeChangedListener listener) { onFullScreenModeChangedListener = listener; @@ -933,6 +952,7 @@ public class StyledPlayerControlView extends FrameLayout { return getVisibility() == VISIBLE; } + @SuppressWarnings("deprecation") // Calling the deprecated listener for now. /* package */ void notifyOnVisibilityChange() { for (VisibilityListener visibilityListener : visibilityListeners) { visibilityListener.onVisibilityChange(getVisibility()); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 2ec5a6a5e9..7e79982bb9 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -168,6 +168,32 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; */ public class StyledPlayerView extends FrameLayout implements AdViewProvider { + /** Listener to be notified about changes of the visibility of the UI controls. */ + public interface ControllerVisibilityListener { + + /** + * Called when the visibility changes. + * + * @param visibility The new visibility. Either {@link View#VISIBLE} or {@link View#GONE}. + */ + void onVisibilityChanged(int visibility); + } + + /** + * Listener invoked when the fullscreen button is clicked. The implementation is responsible for + * changing the UI layout. + */ + public interface FullscreenButtonClickListener { + + /** + * Called when the fullscreen button is clicked. + * + * @param isFullScreen {@code true} if the video rendering surface should be fullscreen, {@code + * false} otherwise. + */ + void onFullscreenButtonClick(boolean isFullScreen); + } + /** * Determines when the buffering view is shown. One of {@link #SHOW_BUFFERING_NEVER}, {@link * #SHOW_BUFFERING_WHEN_PLAYING} or {@link #SHOW_BUFFERING_ALWAYS}. @@ -211,7 +237,16 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { @Nullable private Player player; private boolean useController; - @Nullable private StyledPlayerControlView.VisibilityListener controllerVisibilityListener; + + // At most one of controllerVisibilityListener and legacyControllerVisibilityListener is non-null. + @Nullable private ControllerVisibilityListener controllerVisibilityListener; + + @SuppressWarnings("deprecation") + @Nullable + private StyledPlayerControlView.VisibilityListener legacyControllerVisibilityListener; + + @Nullable private FullscreenButtonClickListener fullscreenButtonClickListener; + private boolean useArtwork; @Nullable private Drawable defaultArtwork; private @ShowBuffering int showBuffering; @@ -833,33 +868,78 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { /** * Sets the {@link StyledPlayerControlView.VisibilityListener}. * + *

Removes any listener set by {@link + * #setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)}. + * * @param listener The listener to be notified about visibility changes, or null to remove the * current listener. */ + @SuppressWarnings("deprecation") // Clearing the legacy listener. + public void setControllerVisibilityListener(@Nullable ControllerVisibilityListener listener) { + this.controllerVisibilityListener = listener; + setControllerVisibilityListener((StyledPlayerControlView.VisibilityListener) null); + } + + /** + * Sets the {@link StyledPlayerControlView.VisibilityListener}. + * + *

Removes any listener set by {@link + * #setControllerVisibilityListener(ControllerVisibilityListener)}. + * + * @deprecated Use {@link #setControllerVisibilityListener(ControllerVisibilityListener)} instead. + */ + @SuppressWarnings("deprecation") + @Deprecated public void setControllerVisibilityListener( @Nullable StyledPlayerControlView.VisibilityListener listener) { Assertions.checkStateNotNull(controller); - if (this.controllerVisibilityListener == listener) { + if (this.legacyControllerVisibilityListener == listener) { return; } - if (this.controllerVisibilityListener != null) { - controller.removeVisibilityListener(this.controllerVisibilityListener); + + if (this.legacyControllerVisibilityListener != null) { + controller.removeVisibilityListener(this.legacyControllerVisibilityListener); } - this.controllerVisibilityListener = listener; + this.legacyControllerVisibilityListener = listener; if (listener != null) { controller.addVisibilityListener(listener); } + setControllerVisibilityListener((ControllerVisibilityListener) null); + } + + /** + * Sets the {@link FullscreenButtonClickListener}. + * + *

Clears any listener set by {@link + * #setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)}. + * + * @param listener The listener to be notified when the fullscreen button is clicked, or null to + * remove the current listener and hide the fullscreen button. + */ + @SuppressWarnings( + "deprecation") // Calling the deprecated method on StyledPlayerControlView for now. + public void setFullscreenButtonClickListener(@Nullable FullscreenButtonClickListener listener) { + Assertions.checkStateNotNull(controller); + this.fullscreenButtonClickListener = listener; + controller.setOnFullScreenModeChangedListener(componentListener); } /** * Sets the {@link StyledPlayerControlView.OnFullScreenModeChangedListener}. * + *

Clears any listener set by {@link + * #setFullscreenButtonClickListener(FullscreenButtonClickListener)}. + * * @param listener The listener to be notified when the fullscreen button is clicked, or null to * remove the current listener and hide the fullscreen button. + * @deprecated Use {@link #setFullscreenButtonClickListener(FullscreenButtonClickListener)} + * instead. */ + @Deprecated public void setControllerOnFullScreenModeChangedListener( @Nullable StyledPlayerControlView.OnFullScreenModeChangedListener listener) { Assertions.checkStateNotNull(controller); + this.fullscreenButtonClickListener = null; controller.setOnFullScreenModeChangedListener(listener); } @@ -1387,11 +1467,15 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { || keyCode == KeyEvent.KEYCODE_DPAD_CENTER; } + // Implementing the deprecated StyledPlayerControlView.VisibilityListener and + // StyledPlayerControlView.OnFullScreenModeChangedListener for now. + @SuppressWarnings("deprecation") private final class ComponentListener implements Player.Listener, OnLayoutChangeListener, OnClickListener, - StyledPlayerControlView.VisibilityListener { + StyledPlayerControlView.VisibilityListener, + StyledPlayerControlView.OnFullScreenModeChangedListener { private final Period period; private @Nullable Object lastPeriodUidWithTracks; @@ -1501,6 +1585,18 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { @Override public void onVisibilityChange(int visibility) { updateContentDescription(); + if (controllerVisibilityListener != null) { + controllerVisibilityListener.onVisibilityChanged(visibility); + } + } + + // StyledPlayerControlView.OnFullScreenModeChangedListener implementation + + @Override + public void onFullScreenModeChanged(boolean isFullScreen) { + if (fullscreenButtonClickListener != null) { + fullscreenButtonClickListener.onFullscreenButtonClick(isFullScreen); + } } } }