mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
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
This commit is contained in:
parent
704dae097a
commit
4bb6036cf6
21 changed files with 158 additions and 93 deletions
|
|
@ -7,6 +7,8 @@
|
||||||
* Add `play` and `pause` methods to `Player`.
|
* Add `play` and `pause` methods to `Player`.
|
||||||
* Add `Player.getCurrentLiveOffset` to conveniently return the live offset.
|
* Add `Player.getCurrentLiveOffset` to conveniently return the live offset.
|
||||||
* Add `Player.onPlayWhenReadyChanged` with reasons.
|
* Add `Player.onPlayWhenReadyChanged` with reasons.
|
||||||
|
* Add `Player.onPlaybackStateChanged` and deprecate
|
||||||
|
`Player.onPlayerStateChanged`.
|
||||||
* Make `MediaSourceEventListener.LoadEventInfo` and
|
* Make `MediaSourceEventListener.LoadEventInfo` and
|
||||||
`MediaSourceEventListener.MediaLoadData` top-level classes.
|
`MediaSourceEventListener.MediaLoadData` top-level classes.
|
||||||
* Rename `MediaCodecRenderer.onOutputFormatChanged` to
|
* Rename `MediaCodecRenderer.onOutputFormatChanged` to
|
||||||
|
|
|
||||||
|
|
@ -267,7 +267,7 @@ import java.util.Map;
|
||||||
// Player.EventListener implementation.
|
// Player.EventListener implementation.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
updateCurrentItemIndex();
|
updateCurrentItemIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -689,7 +689,7 @@ public class PlayerActivity extends AppCompatActivity
|
||||||
private class PlayerEventListener implements Player.EventListener {
|
private class PlayerEventListener implements Player.EventListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
if (playbackState == Player.STATE_ENDED) {
|
if (playbackState == Player.STATE_ENDED) {
|
||||||
showControls();
|
showControls();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -724,18 +724,23 @@ public final class CastPlayer extends BasePlayer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private void setPlayerStateAndNotifyIfChanged(
|
private void setPlayerStateAndNotifyIfChanged(
|
||||||
boolean playWhenReady,
|
boolean playWhenReady,
|
||||||
@Player.PlayWhenReadyChangeReason int playWhenReadyChangeReason,
|
@Player.PlayWhenReadyChangeReason int playWhenReadyChangeReason,
|
||||||
@Player.State int playbackState) {
|
@Player.State int playbackState) {
|
||||||
boolean playWhenReadyChanged = this.playWhenReady.value != playWhenReady;
|
boolean playWhenReadyChanged = this.playWhenReady.value != playWhenReady;
|
||||||
if (playWhenReadyChanged || this.playbackState != playbackState) {
|
boolean playbackStateChanged = this.playbackState != playbackState;
|
||||||
|
if (playWhenReadyChanged || playbackStateChanged) {
|
||||||
this.playbackState = playbackState;
|
this.playbackState = playbackState;
|
||||||
this.playWhenReady.value = playWhenReady;
|
this.playWhenReady.value = playWhenReady;
|
||||||
notificationsBatch.add(
|
notificationsBatch.add(
|
||||||
new ListenerNotificationTask(
|
new ListenerNotificationTask(
|
||||||
listener -> {
|
listener -> {
|
||||||
listener.onPlayerStateChanged(playWhenReady, playbackState);
|
listener.onPlayerStateChanged(playWhenReady, playbackState);
|
||||||
|
if (playbackStateChanged) {
|
||||||
|
listener.onPlaybackStateChanged(playbackState);
|
||||||
|
}
|
||||||
if (playWhenReadyChanged) {
|
if (playWhenReadyChanged) {
|
||||||
listener.onPlayWhenReadyChanged(playWhenReady, playWhenReadyChangeReason);
|
listener.onPlayWhenReadyChanged(playWhenReady, playWhenReadyChangeReason);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,7 @@ public class CastPlayerTest {
|
||||||
remoteMediaClientListener = listenerArgumentCaptor.getValue();
|
remoteMediaClientListener = listenerArgumentCaptor.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Test
|
@Test
|
||||||
public void testSetPlayWhenReady_masksRemoteState() {
|
public void testSetPlayWhenReady_masksRemoteState() {
|
||||||
when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult);
|
when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult);
|
||||||
|
|
@ -104,6 +105,7 @@ public class CastPlayerTest {
|
||||||
verifyNoMoreInteractions(mockListener);
|
verifyNoMoreInteractions(mockListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Test
|
@Test
|
||||||
public void testSetPlayWhenReadyMasking_updatesUponResultChange() {
|
public void testSetPlayWhenReadyMasking_updatesUponResultChange() {
|
||||||
when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult);
|
when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult);
|
||||||
|
|
@ -125,6 +127,7 @@ public class CastPlayerTest {
|
||||||
assertThat(castPlayer.getPlayWhenReady()).isFalse();
|
assertThat(castPlayer.getPlayWhenReady()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Test
|
@Test
|
||||||
public void testSetPlayWhenReady_correctChangeReasonOnPause() {
|
public void testSetPlayWhenReady_correctChangeReasonOnPause() {
|
||||||
when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult);
|
when(mockRemoteMediaClient.play()).thenReturn(mockPendingResult);
|
||||||
|
|
@ -142,6 +145,7 @@ public class CastPlayerTest {
|
||||||
.onPlayWhenReadyChanged(false, Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST);
|
.onPlayWhenReadyChanged(false, Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Test
|
@Test
|
||||||
public void testPlayWhenReady_changesOnStatusUpdates() {
|
public void testPlayWhenReady_changesOnStatusUpdates() {
|
||||||
assertThat(castPlayer.getPlayWhenReady()).isFalse();
|
assertThat(castPlayer.getPlayWhenReady()).isFalse();
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import static org.junit.Assert.fail;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||||
|
|
@ -88,8 +89,8 @@ public class FlacPlaybackTest {
|
||||||
private final Uri uri;
|
private final Uri uri;
|
||||||
private final AudioSink audioSink;
|
private final AudioSink audioSink;
|
||||||
|
|
||||||
private ExoPlayer player;
|
@Nullable private ExoPlayer player;
|
||||||
private ExoPlaybackException playbackException;
|
@Nullable private ExoPlaybackException playbackException;
|
||||||
|
|
||||||
public TestPlaybackRunnable(Uri uri, Context context, AudioSink audioSink) {
|
public TestPlaybackRunnable(Uri uri, Context context, AudioSink audioSink) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
|
|
@ -121,7 +122,7 @@ public class FlacPlaybackTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
if (playbackState == Player.STATE_ENDED
|
if (playbackState == Player.STATE_ENDED
|
||||||
|| (playbackState == Player.STATE_IDLE && playbackException != null)) {
|
|| (playbackState == Player.STATE_IDLE && playbackException != null)) {
|
||||||
player.release();
|
player.release();
|
||||||
|
|
|
||||||
|
|
@ -92,14 +92,18 @@ import java.util.ArrayList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets the {@link Player.State} of this player. */
|
/** Sets the {@link Player.State} of this player. */
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void setState(@Player.State int state, boolean playWhenReady) {
|
public void setState(@Player.State int state, boolean playWhenReady) {
|
||||||
boolean playWhenReadyChanged = this.playWhenReady != playWhenReady;
|
boolean playWhenReadyChanged = this.playWhenReady != playWhenReady;
|
||||||
boolean playerStateChanged = this.state != state || playWhenReadyChanged;
|
boolean playbackStateChanged = this.state != state;
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.playWhenReady = playWhenReady;
|
this.playWhenReady = playWhenReady;
|
||||||
if (playerStateChanged) {
|
if (playbackStateChanged || playWhenReadyChanged) {
|
||||||
for (Player.EventListener listener : listeners) {
|
for (Player.EventListener listener : listeners) {
|
||||||
listener.onPlayerStateChanged(playWhenReady, state);
|
listener.onPlayerStateChanged(playWhenReady, state);
|
||||||
|
if (playbackStateChanged) {
|
||||||
|
listener.onPlaybackStateChanged(state);
|
||||||
|
}
|
||||||
if (playWhenReadyChanged) {
|
if (playWhenReadyChanged) {
|
||||||
listener.onPlayWhenReadyChanged(
|
listener.onPlayWhenReadyChanged(
|
||||||
playWhenReady, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST);
|
playWhenReady, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST);
|
||||||
|
|
|
||||||
|
|
@ -272,7 +272,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab
|
||||||
// Player.EventListener implementation.
|
// Player.EventListener implementation.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
notifyStateChanged();
|
notifyStateChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import static org.junit.Assert.fail;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||||
|
|
@ -67,8 +68,8 @@ public class OpusPlaybackTest {
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final Uri uri;
|
private final Uri uri;
|
||||||
|
|
||||||
private ExoPlayer player;
|
@Nullable private ExoPlayer player;
|
||||||
private ExoPlaybackException playbackException;
|
@Nullable private ExoPlaybackException playbackException;
|
||||||
|
|
||||||
public TestPlaybackRunnable(Uri uri, Context context) {
|
public TestPlaybackRunnable(Uri uri, Context context) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
|
|
@ -97,7 +98,7 @@ public class OpusPlaybackTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
if (playbackState == Player.STATE_ENDED
|
if (playbackState == Player.STATE_ENDED
|
||||||
|| (playbackState == Player.STATE_IDLE && playbackException != null)) {
|
|| (playbackState == Player.STATE_IDLE && playbackException != null)) {
|
||||||
player.release();
|
player.release();
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import static org.junit.Assert.fail;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
|
|
@ -102,8 +103,8 @@ public class VpxPlaybackTest {
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final Uri uri;
|
private final Uri uri;
|
||||||
|
|
||||||
private ExoPlayer player;
|
@Nullable private ExoPlayer player;
|
||||||
private ExoPlaybackException playbackException;
|
@Nullable private ExoPlaybackException playbackException;
|
||||||
|
|
||||||
public TestPlaybackRunnable(Uri uri, Context context) {
|
public TestPlaybackRunnable(Uri uri, Context context) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
|
|
@ -137,7 +138,7 @@ public class VpxPlaybackTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
if (playbackState == Player.STATE_ENDED
|
if (playbackState == Player.STATE_ENDED
|
||||||
|| (playbackState == Player.STATE_IDLE && playbackException != null)) {
|
|| (playbackState == Player.STATE_IDLE && playbackException != null)) {
|
||||||
player.release();
|
player.release();
|
||||||
|
|
|
||||||
|
|
@ -430,6 +430,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST);
|
PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void setPlayWhenReady(
|
public void setPlayWhenReady(
|
||||||
boolean playWhenReady,
|
boolean playWhenReady,
|
||||||
@PlaybackSuppressionReason int playbackSuppressionReason,
|
@PlaybackSuppressionReason int playbackSuppressionReason,
|
||||||
|
|
@ -454,8 +455,6 @@ import java.util.concurrent.TimeoutException;
|
||||||
listener -> {
|
listener -> {
|
||||||
if (playWhenReadyChanged) {
|
if (playWhenReadyChanged) {
|
||||||
listener.onPlayerStateChanged(playWhenReady, playbackState);
|
listener.onPlayerStateChanged(playWhenReady, playbackState);
|
||||||
}
|
|
||||||
if (playWhenReadyChanged) {
|
|
||||||
listener.onPlayWhenReadyChanged(playWhenReady, playWhenReadyChangeReason);
|
listener.onPlayWhenReadyChanged(playWhenReady, playWhenReadyChangeReason);
|
||||||
}
|
}
|
||||||
if (suppressionReasonChanged) {
|
if (suppressionReasonChanged) {
|
||||||
|
|
@ -880,6 +879,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
/* isPlayingChanged= */ previousIsPlaying != isPlaying));
|
/* isPlayingChanged= */ previousIsPlaying != isPlaying));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private void setMediaItemsInternal(
|
private void setMediaItemsInternal(
|
||||||
List<MediaSource> mediaItems,
|
List<MediaSource> mediaItems,
|
||||||
int startWindowIndex,
|
int startWindowIndex,
|
||||||
|
|
@ -933,6 +933,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
listener.onTimelineChanged(timeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED);
|
listener.onTimelineChanged(timeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED);
|
||||||
if (playbackStateChanged) {
|
if (playbackStateChanged) {
|
||||||
listener.onPlayerStateChanged(currentPlayWhenReady, finalMaskingPlaybackState);
|
listener.onPlayerStateChanged(currentPlayWhenReady, finalMaskingPlaybackState);
|
||||||
|
listener.onPlaybackStateChanged(finalMaskingPlaybackState);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -952,6 +953,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
return holders;
|
return holders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private void removeMediaItemsInternal(int fromIndex, int toIndex) {
|
private void removeMediaItemsInternal(int fromIndex, int toIndex) {
|
||||||
Assertions.checkArgument(
|
Assertions.checkArgument(
|
||||||
fromIndex >= 0 && toIndex >= fromIndex && toIndex <= mediaSourceHolders.size());
|
fromIndex >= 0 && toIndex >= fromIndex && toIndex <= mediaSourceHolders.size());
|
||||||
|
|
@ -980,6 +982,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
listener.onTimelineChanged(timeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED);
|
listener.onTimelineChanged(timeline, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED);
|
||||||
if (transitionsToEnded) {
|
if (transitionsToEnded) {
|
||||||
listener.onPlayerStateChanged(currentPlayWhenReady, STATE_ENDED);
|
listener.onPlayerStateChanged(currentPlayWhenReady, STATE_ENDED);
|
||||||
|
listener.onPlaybackStateChanged(STATE_ENDED);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -1167,6 +1170,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
previousPlaybackInfo.trackSelectorResult != playbackInfo.trackSelectorResult;
|
previousPlaybackInfo.trackSelectorResult != playbackInfo.trackSelectorResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (timelineChanged) {
|
if (timelineChanged) {
|
||||||
|
|
@ -1196,7 +1200,10 @@ import java.util.concurrent.TimeoutException;
|
||||||
if (playbackStateChanged) {
|
if (playbackStateChanged) {
|
||||||
invokeAll(
|
invokeAll(
|
||||||
listenerSnapshot,
|
listenerSnapshot,
|
||||||
listener -> listener.onPlayerStateChanged(playWhenReady, playbackInfo.playbackState));
|
listener -> {
|
||||||
|
listener.onPlayerStateChanged(playWhenReady, playbackInfo.playbackState);
|
||||||
|
listener.onPlaybackStateChanged(playbackInfo.playbackState);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (isPlayingChanged) {
|
if (isPlayingChanged) {
|
||||||
invokeAll(
|
invokeAll(
|
||||||
|
|
|
||||||
|
|
@ -410,14 +410,19 @@ public interface Player {
|
||||||
default void onLoadingChanged(boolean isLoading) {}
|
default void onLoadingChanged(boolean isLoading) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the value returned from either {@link #getPlayWhenReady()} or {@link
|
* @deprecated Use {@link #onPlaybackStateChanged(int)} and {@link
|
||||||
* #getPlaybackState()} changes.
|
* #onPlayWhenReadyChanged(boolean, int)} instead.
|
||||||
*
|
|
||||||
* @param playWhenReady Whether playback will proceed when ready.
|
|
||||||
* @param playbackState The new {@link State playback state}.
|
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
default void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {}
|
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.
|
* 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
|
* 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
|
* to happen after any necessary changes to the player state were reported to {@link
|
||||||
* #onPlayerStateChanged(boolean, int)}.
|
* #onPlaybackStateChanged(int)}.
|
||||||
*/
|
*/
|
||||||
default void onSeekProcessed() {}
|
default void onSeekProcessed() {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
private static int getPlayWhenReadyChangeReason(boolean playWhenReady, int playerCommand) {
|
||||||
return playWhenReady && playerCommand != AudioFocusManager.PLAYER_COMMAND_PLAY_WHEN_READY
|
return playWhenReady && playerCommand != AudioFocusManager.PLAYER_COMMAND_PLAY_WHEN_READY
|
||||||
? PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS
|
? PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS
|
||||||
|
|
@ -1920,17 +1936,14 @@ public class SimpleExoPlayer extends BasePlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {
|
public void onPlaybackStateChanged(@State int playbackState) {
|
||||||
switch (playbackState) {
|
updateWakeLock();
|
||||||
case Player.STATE_READY:
|
}
|
||||||
case Player.STATE_BUFFERING:
|
|
||||||
wakeLockManager.setStayAwake(playWhenReady);
|
@Override
|
||||||
break;
|
public void onPlayWhenReadyChanged(
|
||||||
case Player.STATE_ENDED:
|
boolean playWhenReady, @PlayWhenReadyChangeReason int reason) {
|
||||||
case Player.STATE_IDLE:
|
updateWakeLock();
|
||||||
wakeLockManager.setStayAwake(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -438,6 +438,7 @@ public class AnalyticsCollector
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Override
|
@Override
|
||||||
public final void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public final void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
||||||
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
|
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
|
@Override
|
||||||
public final void onPlayWhenReadyChanged(
|
public final void onPlayWhenReadyChanged(
|
||||||
boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) {
|
boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) {
|
||||||
|
|
|
||||||
|
|
@ -124,15 +124,21 @@ public interface AnalyticsListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the player state changed.
|
* @deprecated Use {@link #onPlaybackStateChanged(EventTime, int)} and {@link
|
||||||
*
|
* #onPlayWhenReadyChanged(EventTime, boolean, int)} instead.
|
||||||
* @param eventTime The event time.
|
|
||||||
* @param playWhenReady Whether the playback will proceed when ready.
|
|
||||||
* @param playbackState The new {@link Player.State playback state}.
|
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
default void onPlayerStateChanged(
|
default void onPlayerStateChanged(
|
||||||
EventTime eventTime, boolean playWhenReady, @Player.State int playbackState) {}
|
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.
|
* Called when the value changed that indicates whether playback will proceed when ready.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -96,8 +96,7 @@ public class EventLogger implements AnalyticsListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(
|
public void onPlaybackStateChanged(EventTime eventTime, @Player.State int state) {
|
||||||
EventTime eventTime, boolean playWhenReady, @Player.State int state) {
|
|
||||||
logd(eventTime, "state", getStateString(state));
|
logd(eventTime, "state", getStateString(state));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -551,7 +551,7 @@ public final class ExoPlayerTest {
|
||||||
private int currentPlaybackState = Player.STATE_IDLE;
|
private int currentPlaybackState = Player.STATE_IDLE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
currentPlaybackState = playbackState;
|
currentPlaybackState = playbackState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1149,7 +1149,6 @@ public final class ExoPlayerTest {
|
||||||
.start()
|
.start()
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
testRunner.assertPlaybackStatesEqual(
|
testRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_BUFFERING,
|
Player.STATE_BUFFERING,
|
||||||
Player.STATE_READY,
|
Player.STATE_READY,
|
||||||
Player.STATE_IDLE,
|
Player.STATE_IDLE,
|
||||||
|
|
@ -2465,7 +2464,7 @@ public final class ExoPlayerTest {
|
||||||
final EventListener eventListener1 =
|
final EventListener eventListener1 =
|
||||||
new EventListener() {
|
new EventListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
eventListener1States.add(playbackState);
|
eventListener1States.add(playbackState);
|
||||||
if (playbackState == Player.STATE_READY) {
|
if (playbackState == Player.STATE_READY) {
|
||||||
playerReference.get().stop(/* reset= */ true);
|
playerReference.get().stop(/* reset= */ true);
|
||||||
|
|
@ -2475,7 +2474,7 @@ public final class ExoPlayerTest {
|
||||||
final EventListener eventListener2 =
|
final EventListener eventListener2 =
|
||||||
new EventListener() {
|
new EventListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
eventListener2States.add(playbackState);
|
eventListener2States.add(playbackState);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -2512,23 +2511,33 @@ public final class ExoPlayerTest {
|
||||||
final AtomicReference<Player> playerReference = new AtomicReference<>();
|
final AtomicReference<Player> playerReference = new AtomicReference<>();
|
||||||
final List<Boolean> eventListenerPlayWhenReady = new ArrayList<>();
|
final List<Boolean> eventListenerPlayWhenReady = new ArrayList<>();
|
||||||
final List<Integer> eventListenerStates = new ArrayList<>();
|
final List<Integer> eventListenerStates = new ArrayList<>();
|
||||||
|
List<Integer> sequence = new ArrayList<>();
|
||||||
final EventListener eventListener =
|
final EventListener eventListener =
|
||||||
new EventListener() {
|
new EventListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTimelineChanged(Timeline timeline, int reason) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
if (timeline.isEmpty()) {
|
eventListenerStates.add(playbackState);
|
||||||
playerReference.get().pause();
|
if (playbackState == Player.STATE_READY) {
|
||||||
|
playerReference.get().stop(/* reset= */ true);
|
||||||
|
sequence.add(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onTimelineChanged(Timeline timeline, int reason) {
|
||||||
eventListenerPlayWhenReady.add(playWhenReady);
|
if (timeline.isEmpty()) {
|
||||||
eventListenerStates.add(playbackState);
|
playerReference.get().pause();
|
||||||
if (playbackState == Player.STATE_READY) {
|
sequence.add(1);
|
||||||
playerReference.get().stop(/* reset= */ true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayWhenReadyChanged(
|
||||||
|
boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) {
|
||||||
|
eventListenerPlayWhenReady.add(playWhenReady);
|
||||||
|
sequence.add(2);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
ActionSchedule actionSchedule =
|
ActionSchedule actionSchedule =
|
||||||
new ActionSchedule.Builder("testRecursivePlayerChanges")
|
new ActionSchedule.Builder("testRecursivePlayerChanges")
|
||||||
|
|
@ -2548,10 +2557,10 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
|
|
||||||
assertThat(eventListenerStates)
|
assertThat(eventListenerStates)
|
||||||
.containsExactly(
|
.containsExactly(Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_IDLE)
|
||||||
Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_IDLE, Player.STATE_IDLE)
|
|
||||||
.inOrder();
|
.inOrder();
|
||||||
assertThat(eventListenerPlayWhenReady).containsExactly(true, true, true, false).inOrder();
|
assertThat(eventListenerPlayWhenReady).containsExactly(false).inOrder();
|
||||||
|
assertThat(sequence).containsExactly(0, 1, 2).inOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -2563,7 +2572,7 @@ public final class ExoPlayerTest {
|
||||||
final EventListener eventListener =
|
final EventListener eventListener =
|
||||||
new EventListener() {
|
new EventListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, int state) {
|
public void onPlaybackStateChanged(int state) {
|
||||||
if (state == Player.STATE_IDLE) {
|
if (state == Player.STATE_IDLE) {
|
||||||
playerReference.get().setMediaSource(secondMediaSource);
|
playerReference.get().setMediaSource(secondMediaSource);
|
||||||
}
|
}
|
||||||
|
|
@ -2625,7 +2634,7 @@ public final class ExoPlayerTest {
|
||||||
EventListener eventListener =
|
EventListener eventListener =
|
||||||
new EventListener() {
|
new EventListener() {
|
||||||
@Override
|
@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) {
|
if (playbackState == Player.STATE_READY && clockAtStartMs.get() == C.TIME_UNSET) {
|
||||||
clockAtStartMs.set(clock.elapsedRealtime());
|
clockAtStartMs.set(clock.elapsedRealtime());
|
||||||
}
|
}
|
||||||
|
|
@ -3649,7 +3658,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
|
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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.assertTimelinesSame(dummyTimeline, timeline, Timeline.EMPTY);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED /* media item set (masked timeline) */,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED /* media item set (masked timeline) */,
|
||||||
|
|
@ -3747,7 +3756,6 @@ public final class ExoPlayerTest {
|
||||||
playbackStates);
|
playbackStates);
|
||||||
assertArrayEquals(new int[] {1, 0, 1, 2}, timelineWindowCounts);
|
assertArrayEquals(new int[] {1, 0, 1, 2}, timelineWindowCounts);
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_BUFFERING /* first buffering state after prepare */,
|
Player.STATE_BUFFERING /* first buffering state after prepare */,
|
||||||
Player.STATE_READY,
|
Player.STATE_READY,
|
||||||
Player.STATE_ENDED);
|
Player.STATE_ENDED);
|
||||||
|
|
@ -3818,7 +3826,6 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
|
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_BUFFERING, // first buffering
|
Player.STATE_BUFFERING, // first buffering
|
||||||
Player.STATE_READY,
|
Player.STATE_READY,
|
||||||
Player.STATE_ENDED, // clear playlist
|
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);
|
new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE}, playbackStateHolder);
|
||||||
assertArrayEquals(new int[] {1, 0, 1}, windowCountHolder);
|
assertArrayEquals(new int[] {1, 0, 1}, windowCountHolder);
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_BUFFERING, // first buffering
|
Player.STATE_BUFFERING, // first buffering
|
||||||
Player.STATE_READY,
|
Player.STATE_READY,
|
||||||
Player.STATE_IDLE, // stop
|
Player.STATE_IDLE, // stop
|
||||||
|
|
@ -3925,7 +3931,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
|
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_IDLE, Player.STATE_ENDED);
|
exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED);
|
||||||
exoPlayerTestRunner.assertTimelinesSame();
|
exoPlayerTestRunner.assertTimelinesSame();
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual();
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual();
|
||||||
assertArrayEquals(new int[] {1}, currentWindowIndices);
|
assertArrayEquals(new int[] {1}, currentWindowIndices);
|
||||||
|
|
@ -3949,7 +3955,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
|
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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.assertTimelinesSame(dummyTimeline, timeline);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED /* media item set (masked timeline) */,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED /* media item set (masked timeline) */,
|
||||||
|
|
@ -4065,7 +4071,7 @@ public final class ExoPlayerTest {
|
||||||
.start()
|
.start()
|
||||||
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(1, 4);
|
exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -4497,7 +4503,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_IDLE, Player.STATE_ENDED);
|
exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED);
|
||||||
assertArrayEquals(
|
assertArrayEquals(
|
||||||
new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE},
|
new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE},
|
||||||
maskingPlaybackStates);
|
maskingPlaybackStates);
|
||||||
|
|
@ -4542,7 +4548,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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);
|
assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||||
|
|
@ -4580,7 +4586,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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);
|
assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||||
|
|
@ -4618,7 +4624,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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);
|
assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||||
|
|
@ -4691,7 +4697,6 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_ENDED,
|
Player.STATE_ENDED,
|
||||||
Player.STATE_BUFFERING,
|
Player.STATE_BUFFERING,
|
||||||
Player.STATE_READY,
|
Player.STATE_READY,
|
||||||
|
|
@ -4749,7 +4754,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// 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);
|
assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||||
|
|
@ -4790,7 +4795,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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);
|
assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||||
|
|
@ -4831,7 +4836,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
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);
|
assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||||
|
|
@ -4917,8 +4922,6 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_IDLE, // Pause.
|
|
||||||
Player.STATE_BUFFERING,
|
Player.STATE_BUFFERING,
|
||||||
Player.STATE_READY, // Ready after initial prepare.
|
Player.STATE_READY, // Ready after initial prepare.
|
||||||
Player.STATE_ENDED, // Ended after setting empty source without seek.
|
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_READY, // Ready after setting media item with seek.
|
||||||
Player.STATE_BUFFERING,
|
Player.STATE_BUFFERING,
|
||||||
Player.STATE_READY, // Ready again after re-setting source.
|
Player.STATE_READY, // Ready again after re-setting source.
|
||||||
Player.STATE_BUFFERING,
|
|
||||||
Player.STATE_BUFFERING, // Play.
|
Player.STATE_BUFFERING, // Play.
|
||||||
Player.STATE_READY, // Ready after setting media item without seek.
|
Player.STATE_READY, // Ready after setting media item without seek.
|
||||||
Player.STATE_ENDED);
|
Player.STATE_ENDED);
|
||||||
|
|
@ -4997,12 +4999,9 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_IDLE, // Pause.
|
|
||||||
Player.STATE_ENDED, // Empty source has been prepared.
|
Player.STATE_ENDED, // Empty source has been prepared.
|
||||||
Player.STATE_BUFFERING, // After setting another source.
|
Player.STATE_BUFFERING, // After setting another source.
|
||||||
Player.STATE_READY,
|
Player.STATE_READY,
|
||||||
Player.STATE_READY, // Play.
|
|
||||||
Player.STATE_ENDED);
|
Player.STATE_ENDED);
|
||||||
assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates);
|
assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates);
|
||||||
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
exoPlayerTestRunner.assertTimelineChangeReasonsEqual(
|
||||||
|
|
@ -5393,7 +5392,6 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
// Expect reset of masking to first window.
|
// Expect reset of masking to first window.
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE,
|
|
||||||
Player.STATE_BUFFERING,
|
Player.STATE_BUFFERING,
|
||||||
Player.STATE_READY, // Ready after initial prepare.
|
Player.STATE_READY, // Ready after initial prepare.
|
||||||
Player.STATE_ENDED, // ended after removing current window index
|
Player.STATE_ENDED, // ended after removing current window index
|
||||||
|
|
@ -5436,7 +5434,7 @@ public final class ExoPlayerTest {
|
||||||
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
.blockUntilActionScheduleFinished(TIMEOUT_MS)
|
||||||
.blockUntilEnded(TIMEOUT_MS);
|
.blockUntilEnded(TIMEOUT_MS);
|
||||||
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
exoPlayerTestRunner.assertPlaybackStatesEqual(
|
||||||
Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED);
|
Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,13 @@ public class DebugTextViewHelper implements Player.EventListener, Runnable {
|
||||||
// Player.EventListener implementation.
|
// Player.EventListener implementation.
|
||||||
|
|
||||||
@Override
|
@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();
|
updateAndPost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1380,7 +1380,13 @@ public class PlayerNotificationManager {
|
||||||
private class PlayerListener implements Player.EventListener {
|
private class PlayerListener implements Player.EventListener {
|
||||||
|
|
||||||
@Override
|
@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();
|
postStartOrUpdateNotification();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -843,7 +843,7 @@ public abstract class Action {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for a specified playWhenReady value, returning either immediately or after a call to
|
* 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 {
|
public static final class WaitForPlayWhenReady extends Action {
|
||||||
|
|
||||||
|
|
@ -874,8 +874,8 @@ public abstract class Action {
|
||||||
player.addListener(
|
player.addListener(
|
||||||
new Player.EventListener() {
|
new Player.EventListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(
|
public void onPlayWhenReadyChanged(
|
||||||
boolean playWhenReady, @Player.State int playbackState) {
|
boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) {
|
||||||
if (targetPlayWhenReady == playWhenReady) {
|
if (targetPlayWhenReady == playWhenReady) {
|
||||||
player.removeListener(this);
|
player.removeListener(this);
|
||||||
nextAction.schedule(player, trackSelector, surface, handler);
|
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
|
* 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 {
|
public static final class WaitForPlaybackState extends Action {
|
||||||
|
|
||||||
|
|
@ -925,8 +925,7 @@ public abstract class Action {
|
||||||
player.addListener(
|
player.addListener(
|
||||||
new Player.EventListener() {
|
new Player.EventListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
boolean playWhenReady, @Player.State int playbackState) {
|
|
||||||
if (targetPlaybackState == playbackState) {
|
if (targetPlaybackState == playbackState) {
|
||||||
player.removeListener(this);
|
player.removeListener(this);
|
||||||
nextAction.schedule(player, trackSelector, surface, handler);
|
nextAction.schedule(player, trackSelector, surface, handler);
|
||||||
|
|
|
||||||
|
|
@ -609,8 +609,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that the playback states reported by {@link
|
* Asserts that the playback states reported by {@link
|
||||||
* Player.EventListener#onPlayerStateChanged(boolean, int)} are equal to the provided playback
|
* Player.EventListener#onPlaybackStateChanged(int)} are equal to the provided playback states.
|
||||||
* states.
|
|
||||||
*/
|
*/
|
||||||
public void assertPlaybackStatesEqual(Integer... states) {
|
public void assertPlaybackStatesEqual(Integer... states) {
|
||||||
assertThat(playbackStates).containsExactlyElementsIn(Arrays.asList(states)).inOrder();
|
assertThat(playbackStates).containsExactlyElementsIn(Arrays.asList(states)).inOrder();
|
||||||
|
|
@ -706,7 +705,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, @Player.State int playbackState) {
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
playbackStates.add(playbackState);
|
playbackStates.add(playbackState);
|
||||||
playerWasPrepared |= playbackState != Player.STATE_IDLE;
|
playerWasPrepared |= playbackState != Player.STATE_IDLE;
|
||||||
if (playbackState == Player.STATE_ENDED
|
if (playbackState == Player.STATE_ENDED
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue