Commit 58e01671 by bachinger Committed by Andrew Lewis

Use onEvents in MediaSessionConnector to avoid multiple updates.

#exofixit

PiperOrigin-RevId: 344065556
parent c17d1091
...@@ -15,6 +15,13 @@ ...@@ -15,6 +15,13 @@
*/ */
package com.google.android.exoplayer2.ext.mediasession; package com.google.android.exoplayer2.ext.mediasession;
import static com.google.android.exoplayer2.Player.EVENT_IS_PLAYING_CHANGED;
import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_PARAMETERS_CHANGED;
import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_STATE_CHANGED;
import static com.google.android.exoplayer2.Player.EVENT_PLAY_WHEN_READY_CHANGED;
import static com.google.android.exoplayer2.Player.EVENT_REPEAT_MODE_CHANGED;
import static com.google.android.exoplayer2.Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
...@@ -38,7 +45,6 @@ import com.google.android.exoplayer2.ControlDispatcher; ...@@ -38,7 +45,6 @@ import com.google.android.exoplayer2.ControlDispatcher;
import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
...@@ -1074,69 +1080,59 @@ public final class MediaSessionConnector { ...@@ -1074,69 +1080,59 @@ public final class MediaSessionConnector {
// Player.EventListener implementation. // Player.EventListener implementation.
@Override @Override
public void onTimelineChanged(Timeline timeline, @Player.TimelineChangeReason int reason) { public void onEvents(Player player, Player.Events events) {
Player player = Assertions.checkNotNull(MediaSessionConnector.this.player); boolean invalidatePlaybackState = false;
boolean invalidateMetadata = false;
if (events.contains(Player.EVENT_POSITION_DISCONTINUITY)) {
if (currentWindowIndex != player.getCurrentWindowIndex()) {
if (queueNavigator != null) {
queueNavigator.onCurrentWindowIndexChanged(player);
}
invalidateMetadata = true;
}
invalidatePlaybackState = true;
}
if (events.contains(Player.EVENT_TIMELINE_CHANGED)) {
int windowCount = player.getCurrentTimeline().getWindowCount(); int windowCount = player.getCurrentTimeline().getWindowCount();
int windowIndex = player.getCurrentWindowIndex(); int windowIndex = player.getCurrentWindowIndex();
if (queueNavigator != null) { if (queueNavigator != null) {
queueNavigator.onTimelineChanged(player); queueNavigator.onTimelineChanged(player);
invalidateMediaSessionPlaybackState(); invalidatePlaybackState = true;
} else if (currentWindowCount != windowCount || currentWindowIndex != windowIndex) { } else if (currentWindowCount != windowCount || currentWindowIndex != windowIndex) {
// active queue item and queue navigation actions may need to be updated // active queue item and queue navigation actions may need to be updated
invalidateMediaSessionPlaybackState(); invalidatePlaybackState = true;
} }
currentWindowCount = windowCount; currentWindowCount = windowCount;
currentWindowIndex = windowIndex; invalidateMetadata = true;
invalidateMediaSessionMetadata();
} }
@Override // Update currentWindowIndex after comparisons above.
public void onPlaybackStateChanged(@Player.State int playbackState) { currentWindowIndex = player.getCurrentWindowIndex();
invalidateMediaSessionPlaybackState();
}
@Override
public void onPlayWhenReadyChanged(
boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) {
invalidateMediaSessionPlaybackState();
}
@Override
public void onIsPlayingChanged(boolean isPlaying) {
invalidateMediaSessionPlaybackState();
}
@Override if (events.containsAny(
public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { EVENT_PLAYBACK_STATE_CHANGED,
invalidateMediaSessionPlaybackState(); EVENT_PLAY_WHEN_READY_CHANGED,
EVENT_IS_PLAYING_CHANGED,
EVENT_REPEAT_MODE_CHANGED,
EVENT_PLAYBACK_PARAMETERS_CHANGED)) {
invalidatePlaybackState = true;
} }
@Override // The queue needs to be updated by the queue navigator first. The queue navigator also
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { // delivers the active queue item that is used to update the playback state.
invalidateMediaSessionPlaybackState(); if (events.containsAny(EVENT_SHUFFLE_MODE_ENABLED_CHANGED)) {
invalidateMediaSessionQueue(); invalidateMediaSessionQueue();
invalidatePlaybackState = true;
} }
// Invalidate the playback state before invalidating metadata because the active queue item of
@Override // the session playback state needs to be updated before the MediaMetadataProvider uses it.
public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { if (invalidatePlaybackState) {
Player player = Assertions.checkNotNull(MediaSessionConnector.this.player);
if (currentWindowIndex != player.getCurrentWindowIndex()) {
if (queueNavigator != null) {
queueNavigator.onCurrentWindowIndexChanged(player);
}
currentWindowIndex = player.getCurrentWindowIndex();
// Update playback state after queueNavigator.onCurrentWindowIndexChanged has been called
// and before updating metadata.
invalidateMediaSessionPlaybackState(); invalidateMediaSessionPlaybackState();
invalidateMediaSessionMetadata();
return;
} }
invalidateMediaSessionPlaybackState(); if (invalidateMetadata) {
invalidateMediaSessionMetadata();
} }
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
invalidateMediaSessionPlaybackState();
} }
// MediaSessionCompat.Callback implementation. // MediaSessionCompat.Callback implementation.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment