From 4bb6036cf6271bb85969ed6739ed4fc8afd8bfff Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 3 Feb 2020 15:46:56 +0000 Subject: [PATCH] add playback state changed listener This change deprecates Player.onPlayerStateChanged(boolean pwr, int state). It removes deprecation for trivial cases. I'll remove other deprecated usages (mostly in ui module) in follow-up CLs to not bloat this CL. PiperOrigin-RevId: 292917872 --- RELEASENOTES.md | 2 + .../exoplayer2/castdemo/PlayerManager.java | 2 +- .../exoplayer2/demo/PlayerActivity.java | 2 +- .../exoplayer2/ext/cast/CastPlayer.java | 7 +- .../exoplayer2/ext/cast/CastPlayerTest.java | 4 + .../exoplayer2/ext/flac/FlacPlaybackTest.java | 7 +- .../exoplayer2/ext/ima/FakePlayer.java | 8 +- .../ext/leanback/LeanbackPlayerAdapter.java | 2 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 7 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 7 +- .../android/exoplayer2/ExoPlayerImpl.java | 13 +++- .../com/google/android/exoplayer2/Player.java | 17 ++-- .../android/exoplayer2/SimpleExoPlayer.java | 35 ++++++--- .../analytics/AnalyticsCollector.java | 9 +++ .../analytics/AnalyticsListener.java | 16 ++-- .../android/exoplayer2/util/EventLogger.java | 3 +- .../android/exoplayer2/ExoPlayerTest.java | 78 +++++++++---------- .../exoplayer2/ui/DebugTextViewHelper.java | 8 +- .../ui/PlayerNotificationManager.java | 8 +- .../android/exoplayer2/testutil/Action.java | 11 ++- .../testutil/ExoPlayerTestRunner.java | 5 +- 21 files changed, 158 insertions(+), 93 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ac573cc81d..7ee8eae82d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -7,6 +7,8 @@ * Add `play` and `pause` methods to `Player`. * Add `Player.getCurrentLiveOffset` to conveniently return the live offset. * Add `Player.onPlayWhenReadyChanged` with reasons. + * Add `Player.onPlaybackStateChanged` and deprecate + `Player.onPlayerStateChanged`. * Make `MediaSourceEventListener.LoadEventInfo` and `MediaSourceEventListener.MediaLoadData` top-level classes. * Rename `MediaCodecRenderer.onOutputFormatChanged` to diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 85104e0d18..7331b78bc6 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -267,7 +267,7 @@ import java.util.Map; // Player.EventListener implementation. @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { updateCurrentItemIndex(); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 6aa56341f5..729302e2af 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -689,7 +689,7 @@ public class PlayerActivity extends AppCompatActivity private class PlayerEventListener implements Player.EventListener { @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { if (playbackState == Player.STATE_ENDED) { showControls(); } diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 1202cf1c81..bb3f80b9cf 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -724,18 +724,23 @@ public final class CastPlayer extends BasePlayer { } } + @SuppressWarnings("deprecation") private void setPlayerStateAndNotifyIfChanged( boolean playWhenReady, @Player.PlayWhenReadyChangeReason int playWhenReadyChangeReason, @Player.State int playbackState) { boolean playWhenReadyChanged = this.playWhenReady.value != playWhenReady; - if (playWhenReadyChanged || this.playbackState != playbackState) { + boolean playbackStateChanged = this.playbackState != playbackState; + if (playWhenReadyChanged || playbackStateChanged) { this.playbackState = playbackState; this.playWhenReady.value = playWhenReady; notificationsBatch.add( new ListenerNotificationTask( listener -> { listener.onPlayerStateChanged(playWhenReady, playbackState); + if (playbackStateChanged) { + listener.onPlaybackStateChanged(playbackState); + } if (playWhenReadyChanged) { listener.onPlayWhenReadyChanged(playWhenReady, playWhenReadyChangeReason); } diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index 55a9b22f9b..64f6a9e028 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -80,6 +80,7 @@ public class CastPlayerTest { remoteMediaClientListener = listenerArgumentCaptor.getValue(); } + @SuppressWarnings("deprecation") @Test public void testSetPlayWhenReady_masksRemoteState() { when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult); @@ -104,6 +105,7 @@ public class CastPlayerTest { verifyNoMoreInteractions(mockListener); } + @SuppressWarnings("deprecation") @Test public void testSetPlayWhenReadyMasking_updatesUponResultChange() { when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult); @@ -125,6 +127,7 @@ public class CastPlayerTest { assertThat(castPlayer.getPlayWhenReady()).isFalse(); } + @SuppressWarnings("deprecation") @Test public void testSetPlayWhenReady_correctChangeReasonOnPause() { when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult); @@ -142,6 +145,7 @@ public class CastPlayerTest { .onPlayWhenReadyChanged(false, Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST); } + @SuppressWarnings("deprecation") @Test public void testPlayWhenReady_changesOnStatusUpdates() { assertThat(castPlayer.getPlayWhenReady()).isFalse(); diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index f596231014..0b33a8a618 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.fail; import android.content.Context; import android.net.Uri; import android.os.Looper; +import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.ExoPlaybackException; @@ -88,8 +89,8 @@ public class FlacPlaybackTest { private final Uri uri; private final AudioSink audioSink; - private ExoPlayer player; - private ExoPlaybackException playbackException; + @Nullable private ExoPlayer player; + @Nullable private ExoPlaybackException playbackException; public TestPlaybackRunnable(Uri uri, Context context, AudioSink audioSink) { this.uri = uri; @@ -121,7 +122,7 @@ public class FlacPlaybackTest { } @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { if (playbackState == Player.STATE_ENDED || (playbackState == Player.STATE_IDLE && playbackException != null)) { player.release(); diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index b89b23516c..4c98233acb 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -92,14 +92,18 @@ import java.util.ArrayList; } /** Sets the {@link Player.State} of this player. */ + @SuppressWarnings("deprecation") public void setState(@Player.State int state, boolean playWhenReady) { boolean playWhenReadyChanged = this.playWhenReady != playWhenReady; - boolean playerStateChanged = this.state != state || playWhenReadyChanged; + boolean playbackStateChanged = this.state != state; this.state = state; this.playWhenReady = playWhenReady; - if (playerStateChanged) { + if (playbackStateChanged || playWhenReadyChanged) { for (Player.EventListener listener : listeners) { listener.onPlayerStateChanged(playWhenReady, state); + if (playbackStateChanged) { + listener.onPlaybackStateChanged(state); + } if (playWhenReadyChanged) { listener.onPlayWhenReadyChanged( playWhenReady, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST); diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index 7c2285c57e..e385cd52e9 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -272,7 +272,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab // Player.EventListener implementation. @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { notifyStateChanged(); } diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index 3b5239e2fa..7168dbb717 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.fail; import android.content.Context; import android.net.Uri; import android.os.Looper; +import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.ExoPlaybackException; @@ -67,8 +68,8 @@ public class OpusPlaybackTest { private final Context context; private final Uri uri; - private ExoPlayer player; - private ExoPlaybackException playbackException; + @Nullable private ExoPlayer player; + @Nullable private ExoPlaybackException playbackException; public TestPlaybackRunnable(Uri uri, Context context) { this.uri = uri; @@ -97,7 +98,7 @@ public class OpusPlaybackTest { } @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { if (playbackState == Player.STATE_ENDED || (playbackState == Player.STATE_IDLE && playbackException != null)) { player.release(); diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index ed8bd00fca..44dec0270f 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.fail; import android.content.Context; import android.net.Uri; import android.os.Looper; +import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; @@ -102,8 +103,8 @@ public class VpxPlaybackTest { private final Context context; private final Uri uri; - private ExoPlayer player; - private ExoPlaybackException playbackException; + @Nullable private ExoPlayer player; + @Nullable private ExoPlaybackException playbackException; public TestPlaybackRunnable(Uri uri, Context context) { this.uri = uri; @@ -137,7 +138,7 @@ public class VpxPlaybackTest { } @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { if (playbackState == Player.STATE_ENDED || (playbackState == Player.STATE_IDLE && playbackException != null)) { player.release(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 161ea9c6ee..6b216297af 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -430,6 +430,7 @@ import java.util.concurrent.TimeoutException; PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST); } + @SuppressWarnings("deprecation") public void setPlayWhenReady( boolean playWhenReady, @PlaybackSuppressionReason int playbackSuppressionReason, @@ -454,8 +455,6 @@ import java.util.concurrent.TimeoutException; listener -> { if (playWhenReadyChanged) { listener.onPlayerStateChanged(playWhenReady, playbackState); - } - if (playWhenReadyChanged) { listener.onPlayWhenReadyChanged(playWhenReady, playWhenReadyChangeReason); } if (suppressionReasonChanged) { @@ -880,6 +879,7 @@ import java.util.concurrent.TimeoutException; /* isPlayingChanged= */ previousIsPlaying != isPlaying)); } + @SuppressWarnings("deprecation") private void setMediaItemsInternal( List mediaItems, int startWindowIndex, @@ -933,6 +933,7 @@ import java.util.concurrent.TimeoutException; listener.onTimelineChanged(timeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED); if (playbackStateChanged) { listener.onPlayerStateChanged(currentPlayWhenReady, finalMaskingPlaybackState); + listener.onPlaybackStateChanged(finalMaskingPlaybackState); } }); } @@ -952,6 +953,7 @@ import java.util.concurrent.TimeoutException; return holders; } + @SuppressWarnings("deprecation") private void removeMediaItemsInternal(int fromIndex, int toIndex) { Assertions.checkArgument( fromIndex >= 0 && toIndex >= fromIndex && toIndex <= mediaSourceHolders.size()); @@ -980,6 +982,7 @@ import java.util.concurrent.TimeoutException; listener.onTimelineChanged(timeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED); if (transitionsToEnded) { listener.onPlayerStateChanged(currentPlayWhenReady, STATE_ENDED); + listener.onPlaybackStateChanged(STATE_ENDED); } }); } @@ -1167,6 +1170,7 @@ import java.util.concurrent.TimeoutException; previousPlaybackInfo.trackSelectorResult != playbackInfo.trackSelectorResult; } + @SuppressWarnings("deprecation") @Override public void run() { if (timelineChanged) { @@ -1196,7 +1200,10 @@ import java.util.concurrent.TimeoutException; if (playbackStateChanged) { invokeAll( listenerSnapshot, - listener -> listener.onPlayerStateChanged(playWhenReady, playbackInfo.playbackState)); + listener -> { + listener.onPlayerStateChanged(playWhenReady, playbackInfo.playbackState); + listener.onPlaybackStateChanged(playbackInfo.playbackState); + }); } if (isPlayingChanged) { invokeAll( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Player.java b/library/core/src/main/java/com/google/android/exoplayer2/Player.java index c6bdb424e9..98d4b8ab21 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Player.java @@ -410,14 +410,19 @@ public interface Player { default void onLoadingChanged(boolean isLoading) {} /** - * Called when the value returned from either {@link #getPlayWhenReady()} or {@link - * #getPlaybackState()} changes. - * - * @param playWhenReady Whether playback will proceed when ready. - * @param playbackState The new {@link State playback state}. + * @deprecated Use {@link #onPlaybackStateChanged(int)} and {@link + * #onPlayWhenReadyChanged(boolean, int)} instead. */ + @Deprecated default void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {} + /** + * Called when the value returned from {@link #getPlaybackState()} changes. + * + * @param state The new playback {@link State state}. + */ + default void onPlaybackStateChanged(@State int state) {} + /** * Called when the value returned from {@link #getPlayWhenReady()} changes. * @@ -492,7 +497,7 @@ public interface Player { /** * Called when all pending seek requests have been processed by the player. This is guaranteed * to happen after any necessary changes to the player state were reported to {@link - * #onPlayerStateChanged(boolean, int)}. + * #onPlaybackStateChanged(int)}. */ default void onSeekProcessed() {} } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 75ff86378d..d3c7d66d28 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1662,6 +1662,22 @@ public class SimpleExoPlayer extends BasePlayer } } + private void updateWakeLock() { + @State int playbackState = getPlaybackState(); + switch (playbackState) { + case Player.STATE_READY: + case Player.STATE_BUFFERING: + wakeLockManager.setStayAwake(getPlayWhenReady()); + break; + case Player.STATE_ENDED: + case Player.STATE_IDLE: + wakeLockManager.setStayAwake(false); + break; + default: + throw new IllegalStateException(); + } + } + private static int getPlayWhenReadyChangeReason(boolean playWhenReady, int playerCommand) { return playWhenReady && playerCommand != AudioFocusManager.PLAYER_COMMAND_PLAY_WHEN_READY ? PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS @@ -1920,17 +1936,14 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) { - switch (playbackState) { - case Player.STATE_READY: - case Player.STATE_BUFFERING: - wakeLockManager.setStayAwake(playWhenReady); - break; - case Player.STATE_ENDED: - case Player.STATE_IDLE: - wakeLockManager.setStayAwake(false); - break; - } + public void onPlaybackStateChanged(@State int playbackState) { + updateWakeLock(); + } + + @Override + public void onPlayWhenReadyChanged( + boolean playWhenReady, @PlayWhenReadyChangeReason int reason) { + updateWakeLock(); } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 7cfa532e83..b5456e6d87 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -438,6 +438,7 @@ public class AnalyticsCollector } } + @SuppressWarnings("deprecation") @Override public final void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); @@ -446,6 +447,14 @@ public class AnalyticsCollector } } + @Override + public final void onPlaybackStateChanged(@Player.State int state) { + EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); + for (AnalyticsListener listener : listeners) { + listener.onPlaybackStateChanged(eventTime, state); + } + } + @Override public final void onPlayWhenReadyChanged( boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java index 5f49fd22a9..387c8d0988 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java @@ -124,15 +124,21 @@ public interface AnalyticsListener { } /** - * Called when the player state changed. - * - * @param eventTime The event time. - * @param playWhenReady Whether the playback will proceed when ready. - * @param playbackState The new {@link Player.State playback state}. + * @deprecated Use {@link #onPlaybackStateChanged(EventTime, int)} and {@link + * #onPlayWhenReadyChanged(EventTime, boolean, int)} instead. */ + @Deprecated default void onPlayerStateChanged( EventTime eventTime, boolean playWhenReady, @Player.State int playbackState) {} + /** + * Called when the playback state changed. + * + * @param eventTime The event time. + * @param state The new {@link Player.State playback state}. + */ + default void onPlaybackStateChanged(EventTime eventTime, @Player.State int state) {} + /** * Called when the value changed that indicates whether playback will proceed when ready. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 3cf118d943..ca5280d494 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -96,8 +96,7 @@ public class EventLogger implements AnalyticsListener { } @Override - public void onPlayerStateChanged( - EventTime eventTime, boolean playWhenReady, @Player.State int state) { + public void onPlaybackStateChanged(EventTime eventTime, @Player.State int state) { logd(eventTime, "state", getStateString(state)); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index bc41d55386..ca772f85e2 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -551,7 +551,7 @@ public final class ExoPlayerTest { private int currentPlaybackState = Player.STATE_IDLE; @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { currentPlaybackState = playbackState; } @@ -1149,7 +1149,6 @@ public final class ExoPlayerTest { .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_IDLE, @@ -2465,7 +2464,7 @@ public final class ExoPlayerTest { final EventListener eventListener1 = new EventListener() { @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { eventListener1States.add(playbackState); if (playbackState == Player.STATE_READY) { playerReference.get().stop(/* reset= */ true); @@ -2475,7 +2474,7 @@ public final class ExoPlayerTest { final EventListener eventListener2 = new EventListener() { @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { eventListener2States.add(playbackState); } }; @@ -2512,23 +2511,33 @@ public final class ExoPlayerTest { final AtomicReference playerReference = new AtomicReference<>(); final List eventListenerPlayWhenReady = new ArrayList<>(); final List eventListenerStates = new ArrayList<>(); + List sequence = new ArrayList<>(); final EventListener eventListener = new EventListener() { + @Override - public void onTimelineChanged(Timeline timeline, int reason) { - if (timeline.isEmpty()) { - playerReference.get().pause(); + public void onPlaybackStateChanged(@Player.State int playbackState) { + eventListenerStates.add(playbackState); + if (playbackState == Player.STATE_READY) { + playerReference.get().stop(/* reset= */ true); + sequence.add(0); } } @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { - eventListenerPlayWhenReady.add(playWhenReady); - eventListenerStates.add(playbackState); - if (playbackState == Player.STATE_READY) { - playerReference.get().stop(/* reset= */ true); + public void onTimelineChanged(Timeline timeline, int reason) { + if (timeline.isEmpty()) { + playerReference.get().pause(); + sequence.add(1); } } + + @Override + public void onPlayWhenReadyChanged( + boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) { + eventListenerPlayWhenReady.add(playWhenReady); + sequence.add(2); + } }; ActionSchedule actionSchedule = new ActionSchedule.Builder("testRecursivePlayerChanges") @@ -2548,10 +2557,10 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); assertThat(eventListenerStates) - .containsExactly( - Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_IDLE, Player.STATE_IDLE) + .containsExactly(Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_IDLE) .inOrder(); - assertThat(eventListenerPlayWhenReady).containsExactly(true, true, true, false).inOrder(); + assertThat(eventListenerPlayWhenReady).containsExactly(false).inOrder(); + assertThat(sequence).containsExactly(0, 1, 2).inOrder(); } @Test @@ -2563,7 +2572,7 @@ public final class ExoPlayerTest { final EventListener eventListener = new EventListener() { @Override - public void onPlayerStateChanged(boolean playWhenReady, int state) { + public void onPlaybackStateChanged(int state) { if (state == Player.STATE_IDLE) { playerReference.get().setMediaSource(secondMediaSource); } @@ -2625,7 +2634,7 @@ public final class ExoPlayerTest { EventListener eventListener = new EventListener() { @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { if (playbackState == Player.STATE_READY && clockAtStartMs.get() == C.TIME_UNSET) { clockAtStartMs.set(clock.elapsedRealtime()); } @@ -3649,7 +3658,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); exoPlayerTestRunner.assertTimelinesSame(dummyTimeline, timeline, Timeline.EMPTY); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED /* media item set (masked timeline) */, @@ -3747,7 +3756,6 @@ public final class ExoPlayerTest { playbackStates); assertArrayEquals(new int[] {1, 0, 1, 2}, timelineWindowCounts); exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING /* first buffering state after prepare */, Player.STATE_READY, Player.STATE_ENDED); @@ -3818,7 +3826,6 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, // first buffering Player.STATE_READY, Player.STATE_ENDED, // clear playlist @@ -3883,7 +3890,6 @@ public final class ExoPlayerTest { new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE}, playbackStateHolder); assertArrayEquals(new int[] {1, 0, 1}, windowCountHolder); exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, // first buffering Player.STATE_READY, Player.STATE_IDLE, // stop @@ -3925,7 +3931,7 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_IDLE, Player.STATE_ENDED); + exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); exoPlayerTestRunner.assertTimelinesSame(); exoPlayerTestRunner.assertTimelineChangeReasonsEqual(); assertArrayEquals(new int[] {1}, currentWindowIndices); @@ -3949,7 +3955,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); exoPlayerTestRunner.assertTimelinesSame(dummyTimeline, timeline); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED /* media item set (masked timeline) */, @@ -4065,7 +4071,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - exoPlayerTestRunner.assertPlaybackStatesEqual(1, 4); + exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); } @Test @@ -4497,7 +4503,7 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. - exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_IDLE, Player.STATE_ENDED); + exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); assertArrayEquals( new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE}, maskingPlaybackStates); @@ -4542,7 +4548,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -4580,7 +4586,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -4618,7 +4624,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -4691,7 +4697,6 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_ENDED, Player.STATE_BUFFERING, Player.STATE_READY, @@ -4749,7 +4754,7 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. - exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_IDLE, Player.STATE_ENDED); + exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -4790,7 +4795,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -4831,7 +4836,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -4917,8 +4922,6 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, - Player.STATE_IDLE, // Pause. Player.STATE_BUFFERING, Player.STATE_READY, // Ready after initial prepare. Player.STATE_ENDED, // Ended after setting empty source without seek. @@ -4931,7 +4934,6 @@ public final class ExoPlayerTest { Player.STATE_READY, // Ready after setting media item with seek. Player.STATE_BUFFERING, Player.STATE_READY, // Ready again after re-setting source. - Player.STATE_BUFFERING, Player.STATE_BUFFERING, // Play. Player.STATE_READY, // Ready after setting media item without seek. Player.STATE_ENDED); @@ -4997,12 +4999,9 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, - Player.STATE_IDLE, // Pause. Player.STATE_ENDED, // Empty source has been prepared. Player.STATE_BUFFERING, // After setting another source. Player.STATE_READY, - Player.STATE_READY, // Play. Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( @@ -5393,7 +5392,6 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); // Expect reset of masking to first window. exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, // Ready after initial prepare. Player.STATE_ENDED, // ended after removing current window index @@ -5436,7 +5434,7 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); exoPlayerTestRunner.assertPlaybackStatesEqual( - Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); + Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); } @Test diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java index 0841296193..cd5713624b 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java @@ -79,7 +79,13 @@ public class DebugTextViewHelper implements Player.EventListener, Runnable { // Player.EventListener implementation. @Override - public final void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public final void onPlaybackStateChanged(@Player.State int playbackState) { + updateAndPost(); + } + + @Override + public final void onPlayWhenReadyChanged( + boolean playWhenReady, @Player.PlayWhenReadyChangeReason int playbackState) { updateAndPost(); } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index 9f0c8280c4..c9fb3c4efa 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -1380,7 +1380,13 @@ public class PlayerNotificationManager { private class PlayerListener implements Player.EventListener { @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { + postStartOrUpdateNotification(); + } + + @Override + public void onPlayWhenReadyChanged( + boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) { postStartOrUpdateNotification(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java index 4a2e7da96f..59a72b906b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java @@ -843,7 +843,7 @@ public abstract class Action { /** * Waits for a specified playWhenReady value, returning either immediately or after a call to - * {@link Player.EventListener#onPlayerStateChanged(boolean, int)}. + * {@link Player.EventListener#onPlayWhenReadyChanged(boolean, int)}. */ public static final class WaitForPlayWhenReady extends Action { @@ -874,8 +874,8 @@ public abstract class Action { player.addListener( new Player.EventListener() { @Override - public void onPlayerStateChanged( - boolean playWhenReady, @Player.State int playbackState) { + public void onPlayWhenReadyChanged( + boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) { if (targetPlayWhenReady == playWhenReady) { player.removeListener(this); nextAction.schedule(player, trackSelector, surface, handler); @@ -894,7 +894,7 @@ public abstract class Action { /** * Waits for a specified playback state, returning either immediately or after a call to {@link - * Player.EventListener#onPlayerStateChanged(boolean, int)}. + * Player.EventListener#onPlaybackStateChanged(int)}. */ public static final class WaitForPlaybackState extends Action { @@ -925,8 +925,7 @@ public abstract class Action { player.addListener( new Player.EventListener() { @Override - public void onPlayerStateChanged( - boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { if (targetPlaybackState == playbackState) { player.removeListener(this); nextAction.schedule(player, trackSelector, surface, handler); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index 28cf8bab66..ac5126906c 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -609,8 +609,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc /** * Asserts that the playback states reported by {@link - * Player.EventListener#onPlayerStateChanged(boolean, int)} are equal to the provided playback - * states. + * Player.EventListener#onPlaybackStateChanged(int)} are equal to the provided playback states. */ public void assertPlaybackStatesEqual(Integer... states) { assertThat(playbackStates).containsExactlyElementsIn(Arrays.asList(states)).inOrder(); @@ -706,7 +705,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc } @Override - public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) { + public void onPlaybackStateChanged(@Player.State int playbackState) { playbackStates.add(playbackState); playerWasPrepared |= playbackState != Player.STATE_IDLE; if (playbackState == Player.STATE_ENDED