diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index bc6dd6a75f..d19381bf3f 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -184,6 +184,9 @@
* UI
* Remove deperecated `exo_simple_player_view.xml` and
`exo_playback_control_view.xml` from resource.
+ * Add setter methods to `PlayerView` and `PlayerControlView` to set
+ whether the rewind, fast forward, previous and next buttons are shown
+ ([#7410](https://github.com/google/ExoPlayer/issues/7410)).
* Move logic of prev, next, fast forward and rewind to ControlDispatcher
([#6926](https://github.com/google/ExoPlayer/issues/6926)).
* Update `TrackSelectionDialogBuilder` to use AndroidX Compat Dialog
@@ -211,10 +214,10 @@
([#7306](https://github.com/google/ExoPlayer/issues/7306)).
* Fix issue in `AudioTrackPositionTracker` that could cause negative positions
to be reported at the start of playback and immediately after seeking
- ([#7456](https://github.com/google/ExoPlayer/issues/7456).
+ ([#7456](https://github.com/google/ExoPlayer/issues/7456)).
* Fix further cases where downloads would sometimes not resume after their
network requirements are met
- ([#7453](https://github.com/google/ExoPlayer/issues/7453).
+ ([#7453](https://github.com/google/ExoPlayer/issues/7453)).
* DASH:
* Merge trick play adaptation sets (i.e., adaptation sets marked with
`http://dashif.org/guidelines/trickmode`) into the same `TrackGroup` as
@@ -295,11 +298,12 @@
to the `DefaultAudioSink` constructor
([#7134](https://github.com/google/ExoPlayer/issues/7134)).
* Workaround issue that could cause slower than realtime playback of AAC
- on Android 10 ([#6671](https://github.com/google/ExoPlayer/issues/6671).
+ on Android 10
+ ([#6671](https://github.com/google/ExoPlayer/issues/6671)).
* Fix case where another app spuriously holding transient audio focus
could prevent ExoPlayer from acquiring audio focus for an indefinite
period of time
- ([#7182](https://github.com/google/ExoPlayer/issues/7182).
+ ([#7182](https://github.com/google/ExoPlayer/issues/7182)).
* Fix case where the player volume could be permanently ducked if audio
focus was released whilst ducking.
* Fix playback of WAV files with trailing non-media bytes
@@ -1248,7 +1252,7 @@
([#4492](https://github.com/google/ExoPlayer/issues/4492) and
[#4634](https://github.com/google/ExoPlayer/issues/4634)).
* Fix issue where removing looping media from a playlist throws an exception
- ([#4871](https://github.com/google/ExoPlayer/issues/4871).
+ ([#4871](https://github.com/google/ExoPlayer/issues/4871)).
* Fix issue where the preferred audio or text track would not be selected if
mapped onto a secondary renderer of the corresponding type
([#4711](http://github.com/google/ExoPlayer/issues/4711)).
@@ -1679,7 +1683,7 @@
resources when the playback thread has quit by the time the loading task has
completed.
* ID3: Better handle malformed ID3 data
- ([#3792](https://github.com/google/ExoPlayer/issues/3792).
+ ([#3792](https://github.com/google/ExoPlayer/issues/3792)).
* Support 14-bit mode and little endianness in DTS PES packets
([#3340](https://github.com/google/ExoPlayer/issues/3340)).
* Demo app: Add ability to download not DRM protected content.
diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java
index 778f033f0c..4b9de374c3 100644
--- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java
+++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java
@@ -66,6 +66,26 @@ import java.util.concurrent.CopyOnWriteArrayList;
*
Corresponding method: {@link #setShowTimeoutMs(int)}
* Default: {@link #DEFAULT_SHOW_TIMEOUT_MS}
*
+ * {@code show_rewind_button} - Whether the rewind button is shown.
+ *
+ * - Corresponding method: {@link #setShowRewindButton(boolean)}
+ *
- Default: true
+ *
+ * {@code show_fastforward_button} - Whether the fast forward button is shown.
+ *
+ * - Corresponding method: {@link #setShowFastForwardButton(boolean)}
+ *
- Default: true
+ *
+ * {@code show_previous_button} - Whether the previous button is shown.
+ *
+ * - Corresponding method: {@link #setShowPreviousButton(boolean)}
+ *
- Default: true
+ *
+ * {@code show_next_button} - Whether the next button is shown.
+ *
+ * - Corresponding method: {@link #setShowNextButton(boolean)}
+ *
- Default: true
+ *
* {@code rewind_increment} - The duration of the rewind applied when the user taps the
* rewind button, in milliseconds. Use zero to disable the rewind button.
*
@@ -305,6 +325,10 @@ public class PlayerControlView extends FrameLayout {
private int showTimeoutMs;
private int timeBarMinUpdateIntervalMs;
private @RepeatModeUtil.RepeatToggleModes int repeatToggleModes;
+ private boolean showRewindButton;
+ private boolean showFastForwardButton;
+ private boolean showPreviousButton;
+ private boolean showNextButton;
private boolean showShuffleButton;
private long hideAtMs;
private long[] adGroupTimesMs;
@@ -341,6 +365,10 @@ public class PlayerControlView extends FrameLayout {
repeatToggleModes = DEFAULT_REPEAT_TOGGLE_MODES;
timeBarMinUpdateIntervalMs = DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS;
hideAtMs = C.TIME_UNSET;
+ showRewindButton = true;
+ showFastForwardButton = true;
+ showPreviousButton = true;
+ showNextButton = true;
showShuffleButton = false;
int rewindMs = DefaultControlDispatcher.DEFAULT_REWIND_MS;
int fastForwardMs = DefaultControlDispatcher.DEFAULT_FAST_FORWARD_MS;
@@ -357,6 +385,15 @@ public class PlayerControlView extends FrameLayout {
controllerLayoutId =
a.getResourceId(R.styleable.PlayerControlView_controller_layout_id, controllerLayoutId);
repeatToggleModes = getRepeatToggleModes(a, repeatToggleModes);
+ showRewindButton =
+ a.getBoolean(R.styleable.PlayerControlView_show_rewind_button, showRewindButton);
+ showFastForwardButton =
+ a.getBoolean(
+ R.styleable.PlayerControlView_show_fastforward_button, showFastForwardButton);
+ showPreviousButton =
+ a.getBoolean(R.styleable.PlayerControlView_show_previous_button, showPreviousButton);
+ showNextButton =
+ a.getBoolean(R.styleable.PlayerControlView_show_next_button, showNextButton);
showShuffleButton =
a.getBoolean(R.styleable.PlayerControlView_show_shuffle_button, showShuffleButton);
setTimeBarMinUpdateInterval(
@@ -592,6 +629,46 @@ public class PlayerControlView extends FrameLayout {
}
}
+ /**
+ * Sets whether the rewind button is shown.
+ *
+ * @param showRewindButton Whether the rewind button is shown.
+ */
+ public void setShowRewindButton(boolean showRewindButton) {
+ this.showRewindButton = showRewindButton;
+ updateNavigation();
+ }
+
+ /**
+ * Sets whether the fast forward button is shown.
+ *
+ * @param showFastForwardButton Whether the fast forward button is shown.
+ */
+ public void setShowFastForwardButton(boolean showFastForwardButton) {
+ this.showFastForwardButton = showFastForwardButton;
+ updateNavigation();
+ }
+
+ /**
+ * Sets whether the previous button is shown.
+ *
+ * @param showPreviousButton Whether the previous button is shown.
+ */
+ public void setShowPreviousButton(boolean showPreviousButton) {
+ this.showPreviousButton = showPreviousButton;
+ updateNavigation();
+ }
+
+ /**
+ * Sets whether the next button is shown.
+ *
+ * @param showNextButton Whether the next button is shown.
+ */
+ public void setShowNextButton(boolean showNextButton) {
+ this.showNextButton = showNextButton;
+ updateNavigation();
+ }
+
/**
* @deprecated Use {@link #setControlDispatcher(ControlDispatcher)} with {@link
* DefaultControlDispatcher#DefaultControlDispatcher(long, long)}.
@@ -832,10 +909,10 @@ public class PlayerControlView extends FrameLayout {
}
}
- setButtonEnabled(enablePrevious, previousButton);
- setButtonEnabled(enableRewind, rewindButton);
- setButtonEnabled(enableFastForward, fastForwardButton);
- setButtonEnabled(enableNext, nextButton);
+ updateButton(showPreviousButton, enablePrevious, previousButton);
+ updateButton(showRewindButton, enableRewind, rewindButton);
+ updateButton(showFastForwardButton, enableFastForward, fastForwardButton);
+ updateButton(showNextButton, enableNext, nextButton);
if (timeBar != null) {
timeBar.setEnabled(enableSeeking);
}
@@ -847,19 +924,19 @@ public class PlayerControlView extends FrameLayout {
}
if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE) {
- repeatToggleButton.setVisibility(GONE);
+ updateButton(/* visible= */ false, /* enabled= */ false, repeatToggleButton);
return;
}
@Nullable Player player = this.player;
if (player == null) {
- setButtonEnabled(false, repeatToggleButton);
+ updateButton(/* visible= */ true, /* enabled= */ false, repeatToggleButton);
repeatToggleButton.setImageDrawable(repeatOffButtonDrawable);
repeatToggleButton.setContentDescription(repeatOffButtonContentDescription);
return;
}
- setButtonEnabled(true, repeatToggleButton);
+ updateButton(/* visible= */ true, /* enabled= */ true, repeatToggleButton);
switch (player.getRepeatMode()) {
case Player.REPEAT_MODE_OFF:
repeatToggleButton.setImageDrawable(repeatOffButtonDrawable);
@@ -886,13 +963,13 @@ public class PlayerControlView extends FrameLayout {
@Nullable Player player = this.player;
if (!showShuffleButton) {
- shuffleButton.setVisibility(GONE);
+ updateButton(/* visible= */ false, /* enabled= */ false, shuffleButton);
} else if (player == null) {
- setButtonEnabled(false, shuffleButton);
+ updateButton(/* visible= */ true, /* enabled= */ false, shuffleButton);
shuffleButton.setImageDrawable(shuffleOffButtonDrawable);
shuffleButton.setContentDescription(shuffleOffContentDescription);
} else {
- setButtonEnabled(true, shuffleButton);
+ updateButton(/* visible= */ true, /* enabled= */ true, shuffleButton);
shuffleButton.setImageDrawable(
player.getShuffleModeEnabled() ? shuffleOnButtonDrawable : shuffleOffButtonDrawable);
shuffleButton.setContentDescription(
@@ -1029,13 +1106,13 @@ public class PlayerControlView extends FrameLayout {
}
}
- private void setButtonEnabled(boolean enabled, @Nullable View view) {
+ private void updateButton(boolean visible, boolean enabled, @Nullable View view) {
if (view == null) {
return;
}
view.setEnabled(enabled);
view.setAlpha(enabled ? buttonAlphaEnabled : buttonAlphaDisabled);
- view.setVisibility(VISIBLE);
+ view.setVisibility(visible ? VISIBLE : GONE);
}
private void seekToTimeBarPosition(Player player, long positionMs) {
diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java
index 6ee2e3f6a4..a307bd5fd2 100644
--- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java
+++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java
@@ -1000,6 +1000,46 @@ public class PlayerView extends FrameLayout implements AdsLoader.AdViewProvider
controller.setControlDispatcher(controlDispatcher);
}
+ /**
+ * Sets whether the rewind button is shown.
+ *
+ * @param showRewindButton Whether the rewind button is shown.
+ */
+ public void setShowRewindButton(boolean showRewindButton) {
+ Assertions.checkStateNotNull(controller);
+ controller.setShowRewindButton(showRewindButton);
+ }
+
+ /**
+ * Sets whether the fast forward button is shown.
+ *
+ * @param showFastForwardButton Whether the fast forward button is shown.
+ */
+ public void setShowFastForwardButton(boolean showFastForwardButton) {
+ Assertions.checkStateNotNull(controller);
+ controller.setShowFastForwardButton(showFastForwardButton);
+ }
+
+ /**
+ * Sets whether the previous button is shown.
+ *
+ * @param showPreviousButton Whether the previous button is shown.
+ */
+ public void setShowPreviousButton(boolean showPreviousButton) {
+ Assertions.checkStateNotNull(controller);
+ controller.setShowPreviousButton(showPreviousButton);
+ }
+
+ /**
+ * Sets whether the next button is shown.
+ *
+ * @param showNextButton Whether the next button is shown.
+ */
+ public void setShowNextButton(boolean showNextButton) {
+ Assertions.checkStateNotNull(controller);
+ controller.setShowNextButton(showNextButton);
+ }
+
/**
* @deprecated Use {@link #setControlDispatcher(ControlDispatcher)} with {@link
* DefaultControlDispatcher#DefaultControlDispatcher(long, long)}.
diff --git a/library/ui/src/main/res/values/attrs.xml b/library/ui/src/main/res/values/attrs.xml
index e0a6b7faf4..b064a71b3c 100644
--- a/library/ui/src/main/res/values/attrs.xml
+++ b/library/ui/src/main/res/values/attrs.xml
@@ -44,6 +44,10 @@
+
+
+
+
@@ -115,6 +119,10 @@
+
+
+
+