From 35b8ab411d59912bc5210a85e166a916a790138a Mon Sep 17 00:00:00 2001 From: jbibik Date: Tue, 4 Jun 2024 05:08:09 -0700 Subject: [PATCH] Add isReleased() to the Exoplayer This avoids having to add AnalyticsListener and catching the `onPlayerReleased` callback. The `Exoplayer.release()` method is blocking and one can be sure that the player is released if the call returned. However, the method is useful for UI testing and asserting that the player is released after a certain UI action, e.g. closing the activity or detaching a window. PiperOrigin-RevId: 640114416 --- RELEASENOTES.md | 2 ++ .../androidx/media3/exoplayer/ExoPlayer.java | 17 +++++++++++++++++ .../media3/exoplayer/ExoPlayerImpl.java | 6 ++++++ .../media3/exoplayer/SimpleExoPlayer.java | 5 +++++ .../media3/test/utils/StubExoPlayer.java | 5 +++++ 5 files changed, 35 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index af497ee3e0..f36a95d081 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -60,6 +60,8 @@ resulted in `Source Error` and `IllegalArgumentException`. * Use data class for `LoadControl` methods instead of individual parameters. + * Add `ExoPlayer.isReleased()` to check whether `Exoplayer.release()` has + been called. * Transformer: * Work around a decoder bug where the number of audio channels was capped at stereo when handling PCM input. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java index 60bfdfbbdc..e9fab67679 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java @@ -1956,6 +1956,23 @@ public interface ExoPlayer extends Player { @UnstableApi boolean isTunnelingEnabled(); + /** + * {@inheritDoc} + * + *

The exception to the above rule is {@link #isReleased()} which can be called on a released + * player. + */ + @Override + void release(); + + /** + * Returns whether {@link #release()} has been called on the player. + * + *

This method is allowed to be called after {@link #release()}. + */ + @UnstableApi + boolean isReleased(); + /** * Sets the {@link ImageOutput} where rendered images will be forwarded. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java index f5e9fc929f..8170930b44 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java @@ -1105,6 +1105,12 @@ import java.util.concurrent.TimeoutException; playerReleased = true; } + @Override + public boolean isReleased() { + verifyApplicationThread(); + return playerReleased; + } + @Override public PlayerMessage createMessage(Target target) { verifyApplicationThread(); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java index 13d456e981..b91bc3fbfd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java @@ -1346,6 +1346,11 @@ public class SimpleExoPlayer extends BasePlayer return player.isTunnelingEnabled(); } + @Override + public boolean isReleased() { + return player.isReleased(); + } + @Override public void setImageOutput(ImageOutput imageOutput) { blockUntilConstructorFinished(); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java index be84bb2ce9..89d01f87d0 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/StubExoPlayer.java @@ -428,6 +428,11 @@ public class StubExoPlayer extends StubPlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public boolean isReleased() { + throw new UnsupportedOperationException(); + } + @Override public void setImageOutput(ImageOutput imageOutput) { throw new UnsupportedOperationException();