From 764aacc52a731be80dc0a56da79ed24906fd019c Mon Sep 17 00:00:00 2001 From: Marcel Dopita Date: Sun, 4 Dec 2022 15:53:38 +0100 Subject: [PATCH] Controller progress bar --- .../androidx/media3/ui/PlayerControlView.java | 4 ++ .../ui/PlayerControlViewLayoutManager.java | 37 ++++++++++++++++++- .../java/androidx/media3/ui/PlayerView.java | 12 ++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java index 02848f41439..0ced7db353a 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java @@ -1125,6 +1125,10 @@ public void show() { controlViewLayoutManager.show(); } + public void showProgress() { + controlViewLayoutManager.showProgress(); + } + /** Hides the controller. */ public void hide() { controlViewLayoutManager.hide(); diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlViewLayoutManager.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlViewLayoutManager.java index 2f0c7ff9f1e..4bd61fa4a05 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlViewLayoutManager.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerControlViewLayoutManager.java @@ -83,6 +83,8 @@ private boolean needToShowBars; private boolean animationEnabled; + float translationYForProgressBar; + @SuppressWarnings({"nullness:method.invocation", "nullness:methodref.receiver.bound"}) public PlayerControlViewLayoutManager(PlayerControlView playerControlView) { this.playerControlView = playerControlView; @@ -194,7 +196,7 @@ public void onAnimationStart(Animator animation) { }); Resources resources = playerControlView.getResources(); - float translationYForProgressBar = + translationYForProgressBar = resources.getDimension(R.dimen.exo_styled_bottom_bar_height) - resources.getDimension(R.dimen.exo_styled_progress_bar_height); float translationYForNoBars = resources.getDimension(R.dimen.exo_styled_bottom_bar_height); @@ -461,6 +463,16 @@ private void setUxState(int uxState) { } } + private void setUxStateSilently(int uxState) { + int prevUxState = this.uxState; + this.uxState = uxState; + if (uxState == UX_STATE_NONE_VISIBLE) { + playerControlView.setVisibility(View.GONE); + } else if (prevUxState == UX_STATE_NONE_VISIBLE) { + playerControlView.setVisibility(View.VISIBLE); + } + } + public void onLayout(boolean changed, int left, int top, int right, int bottom) { if (controlsBackground != null) { // The background view should occupy the entirety of the parent. This is done in code rather @@ -526,6 +538,29 @@ private void showAllBars() { resetHideCallbacks(); } + public void showProgress() { + switch (uxState) { + case UX_STATE_ALL_VISIBLE: + hideMainBarAnimator.start(); + break; + case UX_STATE_NONE_VISIBLE: + setUxStateSilently(UX_STATE_ONLY_PROGRESS_VISIBLE); + + if (timeBar instanceof DefaultTimeBar) { + DefaultTimeBar defaultTimeBar = (DefaultTimeBar) timeBar; + defaultTimeBar.hideScrubber(false); + } + + timeBar.setTranslationY(translationYForProgressBar); + bottomBar.setTranslationY(translationYForProgressBar); + break; + } + } + + public boolean isProgress() { + return uxState == UX_STATE_ONLY_PROGRESS_VISIBLE; + } + private void hideAllBars() { hideAllBarsAnimator.start(); } diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java index 327712ce883..f65fb827a09 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java @@ -989,6 +989,18 @@ public void hideController() { } } + public void hideControllerImmediately() { + if (controller != null) { + controller.hideImmediately(); + } + } + + public void showProgress() { + if (controller != null) { + controller.showProgress(); + } + } + /** * Returns the playback controls timeout. The playback controls are automatically hidden after * this duration of time has elapsed without user input and with playback or buffering in