diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index f0846aa025..d44fd31078 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -27,6 +27,7 @@
* Add option to specify multiple preferred audio or text languages.
* Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`.
* UI:
+ * Miscellaneous fixes for `StyledPlayerControlView` in minimal mode.
* Show overflow button in `StyledPlayerControlView` only when there is not
enough space.
* Update StyledPlayer's control overlay scrim from 30% opacity to 60%
diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java
index 4e96d39e7c..ce041cba4e 100644
--- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java
+++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java
@@ -157,8 +157,6 @@ public class DefaultTimeBar extends View implements TimeBar {
public static final int BAR_GRAVITY_CENTER = 0;
/** Vertical gravity for progress bar to be located at the bottom in the view. */
public static final int BAR_GRAVITY_BOTTOM = 1;
- /** Vertical gravity for progress bar to be located at the top in the view. */
- public static final int BAR_GRAVITY_TOP = 2;
// LINT.ThenChange(../../../../../../../../../ui/src/main/res/values/attrs.xml)
/** The threshold in dps above the bar at which touch events trigger fine scrub mode. */
@@ -216,6 +214,7 @@ public class DefaultTimeBar extends View implements TimeBar {
private ValueAnimator scrubberScalingAnimator;
private float scrubberScale;
+ private boolean scrubberPaddingDisabled;
private boolean scrubbing;
private long scrubPosition;
private long duration;
@@ -370,7 +369,12 @@ public class DefaultTimeBar extends View implements TimeBar {
/** Shows the scrubber handle. */
public void showScrubber() {
- showScrubber(/* showAnimationDurationMs= */ 0);
+ if (scrubberScalingAnimator.isStarted()) {
+ scrubberScalingAnimator.cancel();
+ }
+ scrubberPaddingDisabled = false;
+ scrubberScale = 1;
+ invalidate(seekBounds);
}
/**
@@ -382,14 +386,20 @@ public class DefaultTimeBar extends View implements TimeBar {
if (scrubberScalingAnimator.isStarted()) {
scrubberScalingAnimator.cancel();
}
+ scrubberPaddingDisabled = false;
scrubberScalingAnimator.setFloatValues(scrubberScale, SHOWN_SCRUBBER_SCALE);
scrubberScalingAnimator.setDuration(showAnimationDurationMs);
scrubberScalingAnimator.start();
}
/** Hides the scrubber handle. */
- public void hideScrubber() {
- hideScrubber(/* hideAnimationDurationMs= */ 0);
+ public void hideScrubber(boolean disableScrubberPadding) {
+ if (scrubberScalingAnimator.isStarted()) {
+ scrubberScalingAnimator.cancel();
+ }
+ scrubberPaddingDisabled = disableScrubberPadding;
+ scrubberScale = 0;
+ invalidate(seekBounds);
}
/**
@@ -668,20 +678,25 @@ public class DefaultTimeBar extends View implements TimeBar {
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int width = right - left;
int height = bottom - top;
- int barY = (height - touchTargetHeight) / 2;
int seekLeft = getPaddingLeft();
int seekRight = width - getPaddingRight();
- int progressY;
+ int seekBoundsY;
+ int progressBarY;
+ int scrubberPadding = scrubberPaddingDisabled ? 0 : this.scrubberPadding;
if (barGravity == BAR_GRAVITY_BOTTOM) {
- progressY = barY + touchTargetHeight - (getPaddingBottom() + scrubberPadding + barHeight / 2);
- } else if (barGravity == BAR_GRAVITY_TOP) {
- progressY = barY + getPaddingTop() + scrubberPadding - barHeight / 2;
+ seekBoundsY = height - getPaddingBottom() - touchTargetHeight;
+ progressBarY =
+ height - getPaddingBottom() - barHeight - Math.max(scrubberPadding - (barHeight / 2), 0);
} else {
- progressY = barY + (touchTargetHeight - barHeight) / 2;
+ seekBoundsY = (height - touchTargetHeight) / 2;
+ progressBarY = (height - barHeight) / 2;
}
- seekBounds.set(seekLeft, barY, seekRight, barY + touchTargetHeight);
- progressBar.set(seekBounds.left + scrubberPadding, progressY,
- seekBounds.right - scrubberPadding, progressY + barHeight);
+ seekBounds.set(seekLeft, seekBoundsY, seekRight, seekBoundsY + touchTargetHeight);
+ progressBar.set(
+ seekBounds.left + scrubberPadding,
+ progressBarY,
+ seekBounds.right - scrubberPadding,
+ progressBarY + barHeight);
if (Util.SDK_INT >= 29) {
setSystemGestureExclusionRectsV29(width, height);
}
diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java
index c2abdca860..75139bf39d 100644
--- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java
+++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java
@@ -98,7 +98,7 @@ import java.util.List;
shownButtons = new ArrayList<>();
// Relating to Center View
- ViewGroup centerView = styledPlayerControlView.findViewById(R.id.exo_center_view);
+ View controlsBackground = styledPlayerControlView.findViewById(R.id.exo_controls_background);
centerControls = styledPlayerControlView.findViewById(R.id.exo_center_controls);
// Relating to Minimal Layout
@@ -137,8 +137,11 @@ import java.util.List;
fadeOutAnimator.addUpdateListener(
animation -> {
float animatedValue = (float) animation.getAnimatedValue();
- if (centerView != null) {
- centerView.setAlpha(animatedValue);
+ if (controlsBackground != null) {
+ controlsBackground.setAlpha(animatedValue);
+ }
+ if (centerControls != null) {
+ centerControls.setAlpha(animatedValue);
}
if (minimalControls != null) {
minimalControls.setAlpha(animatedValue);
@@ -155,8 +158,11 @@ import java.util.List;
@Override
public void onAnimationEnd(Animator animation) {
- if (centerView != null) {
- centerView.setVisibility(View.INVISIBLE);
+ if (controlsBackground != null) {
+ controlsBackground.setVisibility(View.INVISIBLE);
+ }
+ if (centerControls != null) {
+ centerControls.setVisibility(View.INVISIBLE);
}
if (minimalControls != null) {
minimalControls.setVisibility(View.INVISIBLE);
@@ -169,8 +175,11 @@ import java.util.List;
fadeInAnimator.addUpdateListener(
animation -> {
float animatedValue = (float) animation.getAnimatedValue();
- if (centerView != null) {
- centerView.setAlpha(animatedValue);
+ if (controlsBackground != null) {
+ controlsBackground.setAlpha(animatedValue);
+ }
+ if (centerControls != null) {
+ centerControls.setAlpha(animatedValue);
}
if (minimalControls != null) {
minimalControls.setAlpha(animatedValue);
@@ -180,8 +189,11 @@ import java.util.List;
new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
- if (centerView != null) {
- centerView.setVisibility(View.VISIBLE);
+ if (controlsBackground != null) {
+ controlsBackground.setVisibility(View.VISIBLE);
+ }
+ if (centerControls != null) {
+ centerControls.setVisibility(View.VISIBLE);
}
if (minimalControls != null) {
minimalControls.setVisibility(isMinimalMode ? View.VISIBLE : View.INVISIBLE);
@@ -595,13 +607,14 @@ import java.util.List;
.getDimensionPixelSize(R.dimen.exo_styled_progress_margin_bottom);
timeBarParams.bottomMargin = (isMinimalMode ? 0 : timeBarMarginBottom);
timeBar.setLayoutParams(timeBarParams);
- if (timeBar instanceof DefaultTimeBar
- && uxState != UX_STATE_ANIMATING_HIDE
- && uxState != UX_STATE_ANIMATING_SHOW) {
- if (isMinimalMode || uxState != UX_STATE_ALL_VISIBLE) {
- ((DefaultTimeBar) timeBar).hideScrubber();
- } else {
- ((DefaultTimeBar) timeBar).showScrubber();
+ if (timeBar instanceof DefaultTimeBar) {
+ DefaultTimeBar defaultTimeBar = (DefaultTimeBar) timeBar;
+ if (isMinimalMode) {
+ defaultTimeBar.hideScrubber(/* disableScrubberPadding= */ true);
+ } else if (uxState == UX_STATE_ONLY_PROGRESS_VISIBLE) {
+ defaultTimeBar.hideScrubber(/* disableScrubberPadding= */ false);
+ } else if (uxState != UX_STATE_ANIMATING_HIDE && uxState != UX_STATE_ANIMATING_SHOW) {
+ defaultTimeBar.showScrubber();
}
}
}
diff --git a/library/ui/src/main/res/layout/exo_styled_player_control_view.xml b/library/ui/src/main/res/layout/exo_styled_player_control_view.xml
index 5d314841c4..244323379d 100644
--- a/library/ui/src/main/res/layout/exo_styled_player_control_view.xml
+++ b/library/ui/src/main/res/layout/exo_styled_player_control_view.xml
@@ -15,42 +15,11 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:background="@color/exo_black_opacity_60"/>
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui/src/main/res/values/attrs.xml b/library/ui/src/main/res/values/attrs.xml
index 1776030417..f298f10a1e 100644
--- a/library/ui/src/main/res/values/attrs.xml
+++ b/library/ui/src/main/res/values/attrs.xml
@@ -80,7 +80,6 @@
-
diff --git a/library/ui/src/main/res/values/dimens.xml b/library/ui/src/main/res/values/dimens.xml
index 6109013596..da151715df 100644
--- a/library/ui/src/main/res/values/dimens.xml
+++ b/library/ui/src/main/res/values/dimens.xml
@@ -43,6 +43,7 @@
52dp
60dp
10dp
+ 4dp
32dp
64dp