From 6c314c4cd5b76e5effe14259f4ea62d47f5d467f Mon Sep 17 00:00:00 2001 From: Guoen Yong Date: Fri, 8 Aug 2025 10:47:47 +0800 Subject: [PATCH 1/2] chore: add isPlaybackPrepared to fix preroll flashes issue when resuming a VOD --- constants.gradle | 4 +-- .../java/androidx/media3/ui/PlayerView.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/constants.gradle b/constants.gradle index 91337593da..b932bf49d6 100644 --- a/constants.gradle +++ b/constants.gradle @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. project.ext { - releaseVersion = '1.4.1-dr5' - releaseVersionCode = 1_004_001_5_00 + releaseVersion = '1.4.1-dr6' + releaseVersionCode = 1_004_001_6_00 minSdkVersion = 19 // See https://developer.android.com/training/cars/media/automotive-os#automotive-module automotiveMinSdkVersion = 28 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 90abd55857..8dc4003ea3 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java @@ -339,6 +339,9 @@ public interface FullscreenButtonClickListener { private boolean controllerHideOnTouch; private int textureViewRotation; + /** Indicates if the playback media is currently prepared. */ + private boolean isPlaybackPrepared = true; + public PlayerView(Context context) { this(context, /* attrs= */ null); } @@ -1308,6 +1311,22 @@ public void setLimitedSeekRange(LimitedSeekRange limitedSeekRange) { } } + /** + * Sets whether the the playback media is currently prepared. + * Emmit PREPARING state if first timeline is ready. + * Emmit PREPARED state if first frame is rendered or the initial resume has completed if have. + * + * @param prepared Indicates if the playback media is currently prepared. + */ + public void setPlaybackPrepared(boolean prepared) { + if (prepared && !isPlaybackPrepared) { + mainLooperHandler.postDelayed(() -> isPlaybackPrepared = true, 200L); + componentListener.hideShutterView(); + } else if (!prepared && isPlaybackPrepared) { + isPlaybackPrepared = false; + } + } + /** * Sets the {@link AspectRatioFrameLayout.AspectRatioListener}. * @@ -1904,6 +1923,12 @@ public void onSurfaceSizeChanged(int width, int height) { @Override public void onRenderedFirstFrame() { + if (isPlaybackPrepared) { + hideShutterView(); + } + } + + private void hideShutterView() { if (shutterView != null) { shutterView.setVisibility(INVISIBLE); if (hasSelectedImageTrack()) { From a0f648b6d8815ab399f2d202062641a82808947c Mon Sep 17 00:00:00 2001 From: Guoen Yong Date: Mon, 11 Aug 2025 21:45:37 +0800 Subject: [PATCH 2/2] chore: fix review comments --- libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java | 2 -- 1 file changed, 2 deletions(-) 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 8dc4003ea3..b9390b7525 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java @@ -1313,8 +1313,6 @@ public void setLimitedSeekRange(LimitedSeekRange limitedSeekRange) { /** * Sets whether the the playback media is currently prepared. - * Emmit PREPARING state if first timeline is ready. - * Emmit PREPARED state if first frame is rendered or the initial resume has completed if have. * * @param prepared Indicates if the playback media is currently prepared. */