Commit a840f973 by ibaker Committed by Ian Baker

Add copies of PlayerControlView's public listeners to PlayerView

Developers are expected to (eventually) only use methods on
PlayerView (and not PlayerControlView) to interact with the UI
controller.

PiperOrigin-RevId: 445361488
parent a433163b
...@@ -47,7 +47,6 @@ import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; ...@@ -47,7 +47,6 @@ import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.ads.AdsLoader;
import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; 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.ui.StyledPlayerView;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.util.DebugTextViewHelper; import com.google.android.exoplayer2.util.DebugTextViewHelper;
...@@ -61,7 +60,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -61,7 +60,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** An activity that plays media using {@link ExoPlayer}. */ /** An activity that plays media using {@link ExoPlayer}. */
public class PlayerActivity extends AppCompatActivity public class PlayerActivity extends AppCompatActivity
implements OnClickListener, StyledPlayerControlView.VisibilityListener { implements OnClickListener, StyledPlayerView.ControllerVisibilityListener {
// Saved instance state keys. // Saved instance state keys.
...@@ -245,10 +244,10 @@ public class PlayerActivity extends AppCompatActivity ...@@ -245,10 +244,10 @@ public class PlayerActivity extends AppCompatActivity
} }
} }
// StyledPlayerControlView.VisibilityListener implementation // StyledPlayerView.ControllerVisibilityListener implementation
@Override @Override
public void onVisibilityChange(int visibility) { public void onVisibilityChanged(int visibility) {
debugRootView.setVisibility(visibility); debugRootView.setVisibility(visibility);
} }
......
...@@ -190,7 +190,13 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -190,7 +190,13 @@ public class StyledPlayerControlView extends FrameLayout {
ExoPlayerLibraryInfo.registerModule("goog.exo.ui"); 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 { public interface VisibilityListener {
/** /**
...@@ -214,9 +220,12 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -214,9 +220,12 @@ public class StyledPlayerControlView extends FrameLayout {
} }
/** /**
* Listener to be invoked to inform the fullscreen mode is changed. Application should handle the * @deprecated Register a {@link StyledPlayerView.FullscreenButtonClickListener} via {@link
* fullscreen mode accordingly. * StyledPlayerView#setFullscreenButtonClickListener(StyledPlayerView.FullscreenButtonClickListener)}
* instead. Using {@link StyledPlayerControlView} as a standalone class without {@link
* StyledPlayerView} is deprecated.
*/ */
@Deprecated
public interface OnFullScreenModeChangedListener { public interface OnFullScreenModeChangedListener {
/** /**
* Called to indicate a fullscreen mode change. * Called to indicate a fullscreen mode change.
...@@ -246,7 +255,10 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -246,7 +255,10 @@ public class StyledPlayerControlView extends FrameLayout {
private static final int SETTINGS_AUDIO_TRACK_SELECTION_POSITION = 1; private static final int SETTINGS_AUDIO_TRACK_SELECTION_POSITION = 1;
private final ComponentListener componentListener; private final ComponentListener componentListener;
@SuppressWarnings("deprecation") // Using the deprecated type for now.
private final CopyOnWriteArrayList<VisibilityListener> visibilityListeners; private final CopyOnWriteArrayList<VisibilityListener> visibilityListeners;
@Nullable private final View previousButton; @Nullable private final View previousButton;
@Nullable private final View nextButton; @Nullable private final View nextButton;
@Nullable private final View playPauseButton; @Nullable private final View playPauseButton;
...@@ -680,20 +692,26 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -680,20 +692,26 @@ public class StyledPlayerControlView extends FrameLayout {
} }
/** /**
* Adds a {@link VisibilityListener}. * @deprecated Register a {@link StyledPlayerView.ControllerVisibilityListener} via {@link
* * StyledPlayerView#setControllerVisibilityListener(StyledPlayerView.ControllerVisibilityListener)}
* @param listener The listener to be notified about visibility changes. * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link
* StyledPlayerView} is deprecated.
*/ */
@SuppressWarnings("deprecation")
@Deprecated
public void addVisibilityListener(VisibilityListener listener) { public void addVisibilityListener(VisibilityListener listener) {
checkNotNull(listener); checkNotNull(listener);
visibilityListeners.add(listener); visibilityListeners.add(listener);
} }
/** /**
* Removes a {@link VisibilityListener}. * @deprecated Register a {@link StyledPlayerView.ControllerVisibilityListener} via {@link
* * StyledPlayerView#setControllerVisibilityListener(StyledPlayerView.ControllerVisibilityListener)}
* @param listener The listener to be removed. * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link
* StyledPlayerView} is deprecated.
*/ */
@SuppressWarnings("deprecation")
@Deprecated
public void removeVisibilityListener(VisibilityListener listener) { public void removeVisibilityListener(VisibilityListener listener) {
visibilityListeners.remove(listener); visibilityListeners.remove(listener);
} }
...@@ -892,12 +910,13 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -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 * @deprecated Register a {@link StyledPlayerView.FullscreenButtonClickListener} via {@link
* needs to be set in order to display the fullscreen button. * StyledPlayerView#setFullscreenButtonClickListener(StyledPlayerView.FullscreenButtonClickListener)}
* * instead. Using {@link StyledPlayerControlView} as a standalone class without {@link
* @param listener The listener to be called. A value of <code>null</code> removes any existing * StyledPlayerView} is deprecated.
* listener and hides the fullscreen button.
*/ */
@SuppressWarnings("deprecation")
@Deprecated
public void setOnFullScreenModeChangedListener( public void setOnFullScreenModeChangedListener(
@Nullable OnFullScreenModeChangedListener listener) { @Nullable OnFullScreenModeChangedListener listener) {
onFullScreenModeChangedListener = listener; onFullScreenModeChangedListener = listener;
...@@ -933,6 +952,7 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -933,6 +952,7 @@ public class StyledPlayerControlView extends FrameLayout {
return getVisibility() == VISIBLE; return getVisibility() == VISIBLE;
} }
@SuppressWarnings("deprecation") // Calling the deprecated listener for now.
/* package */ void notifyOnVisibilityChange() { /* package */ void notifyOnVisibilityChange() {
for (VisibilityListener visibilityListener : visibilityListeners) { for (VisibilityListener visibilityListener : visibilityListeners) {
visibilityListener.onVisibilityChange(getVisibility()); visibilityListener.onVisibilityChange(getVisibility());
......
...@@ -168,6 +168,32 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -168,6 +168,32 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
*/ */
public class StyledPlayerView extends FrameLayout implements AdViewProvider { 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 * Determines when the buffering view is shown. One of {@link #SHOW_BUFFERING_NEVER}, {@link
* #SHOW_BUFFERING_WHEN_PLAYING} or {@link #SHOW_BUFFERING_ALWAYS}. * #SHOW_BUFFERING_WHEN_PLAYING} or {@link #SHOW_BUFFERING_ALWAYS}.
...@@ -211,7 +237,16 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { ...@@ -211,7 +237,16 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
@Nullable private Player player; @Nullable private Player player;
private boolean useController; 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; private boolean useArtwork;
@Nullable private Drawable defaultArtwork; @Nullable private Drawable defaultArtwork;
private @ShowBuffering int showBuffering; private @ShowBuffering int showBuffering;
...@@ -833,33 +868,78 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { ...@@ -833,33 +868,78 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
/** /**
* Sets the {@link StyledPlayerControlView.VisibilityListener}. * Sets the {@link StyledPlayerControlView.VisibilityListener}.
* *
* <p>Removes any listener set by {@link
* #setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)}.
*
* @param listener The listener to be notified about visibility changes, or null to remove the * @param listener The listener to be notified about visibility changes, or null to remove the
* current listener. * 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}.
*
* <p>Removes any listener set by {@link
* #setControllerVisibilityListener(ControllerVisibilityListener)}.
*
* @deprecated Use {@link #setControllerVisibilityListener(ControllerVisibilityListener)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
public void setControllerVisibilityListener( public void setControllerVisibilityListener(
@Nullable StyledPlayerControlView.VisibilityListener listener) { @Nullable StyledPlayerControlView.VisibilityListener listener) {
Assertions.checkStateNotNull(controller); Assertions.checkStateNotNull(controller);
if (this.controllerVisibilityListener == listener) { if (this.legacyControllerVisibilityListener == listener) {
return; 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) { if (listener != null) {
controller.addVisibilityListener(listener); controller.addVisibilityListener(listener);
} }
setControllerVisibilityListener((ControllerVisibilityListener) null);
}
/**
* Sets the {@link FullscreenButtonClickListener}.
*
* <p>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}. * Sets the {@link StyledPlayerControlView.OnFullScreenModeChangedListener}.
* *
* <p>Clears any listener set by {@link
* #setFullscreenButtonClickListener(FullscreenButtonClickListener)}.
*
* @param listener The listener to be notified when the fullscreen button is clicked, or null to * @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. * remove the current listener and hide the fullscreen button.
* @deprecated Use {@link #setFullscreenButtonClickListener(FullscreenButtonClickListener)}
* instead.
*/ */
@Deprecated
public void setControllerOnFullScreenModeChangedListener( public void setControllerOnFullScreenModeChangedListener(
@Nullable StyledPlayerControlView.OnFullScreenModeChangedListener listener) { @Nullable StyledPlayerControlView.OnFullScreenModeChangedListener listener) {
Assertions.checkStateNotNull(controller); Assertions.checkStateNotNull(controller);
this.fullscreenButtonClickListener = null;
controller.setOnFullScreenModeChangedListener(listener); controller.setOnFullScreenModeChangedListener(listener);
} }
...@@ -1387,11 +1467,15 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { ...@@ -1387,11 +1467,15 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
|| keyCode == KeyEvent.KEYCODE_DPAD_CENTER; || keyCode == KeyEvent.KEYCODE_DPAD_CENTER;
} }
// Implementing the deprecated StyledPlayerControlView.VisibilityListener and
// StyledPlayerControlView.OnFullScreenModeChangedListener for now.
@SuppressWarnings("deprecation")
private final class ComponentListener private final class ComponentListener
implements Player.Listener, implements Player.Listener,
OnLayoutChangeListener, OnLayoutChangeListener,
OnClickListener, OnClickListener,
StyledPlayerControlView.VisibilityListener { StyledPlayerControlView.VisibilityListener,
StyledPlayerControlView.OnFullScreenModeChangedListener {
private final Period period; private final Period period;
private @Nullable Object lastPeriodUidWithTracks; private @Nullable Object lastPeriodUidWithTracks;
...@@ -1501,6 +1585,18 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { ...@@ -1501,6 +1585,18 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider {
@Override @Override
public void onVisibilityChange(int visibility) { public void onVisibilityChange(int visibility) {
updateContentDescription(); updateContentDescription();
if (controllerVisibilityListener != null) {
controllerVisibilityListener.onVisibilityChanged(visibility);
}
}
// StyledPlayerControlView.OnFullScreenModeChangedListener implementation
@Override
public void onFullScreenModeChanged(boolean isFullScreen) {
if (fullscreenButtonClickListener != null) {
fullscreenButtonClickListener.onFullscreenButtonClick(isFullScreen);
}
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment