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();