From dbfe9927bf79392224ae57a1d8977d97acea9e4a Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 26 Feb 2024 16:41:31 -0700 Subject: [PATCH] playback: fix broken state restore That didn't properly handle when the index was invalid and kept stale song entries. Resolves #723. --- .../service/PlaybackServiceFragment.kt | 4 +++ .../playback/state/PlaybackStateHolder.kt | 3 +++ .../playback/state/PlaybackStateManager.kt | 27 +++++++++++-------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt index f30d1f727..8b06a8a78 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt @@ -470,6 +470,10 @@ constructor( ack?.let { playbackManager.ack(this, it) } } + override fun reset() { + player.setMediaItems(emptyList()) + } + // --- PLAYER OVERRIDES --- override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt index 2374a421f..3cf5f44da 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt @@ -153,6 +153,9 @@ interface PlaybackStateHolder { * ack. */ fun applySavedState(parent: MusicParent?, rawQueue: RawQueue, ack: StateAck.NewPlayback?) + + /** Reset this instance to an empty state. */ + fun reset() } /** diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 6e98c36e3..4dd7bb690 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -717,6 +717,8 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { return } + val stateHolder = stateHolder ?: return + // The heap may not be the same if the song composition changed between state saves/reloads. // This also means that we must modify the shuffled mapping as well, in what it points to // and it's general composition. @@ -763,27 +765,30 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { "Queue inconsistency detected: Shuffled mapping indices out of heap bounds" } + if (index < 0) { + stateHolder.reset() + return + } + val rawQueue = RawQueue( heap = heap, shuffledMapping = shuffledMapping, heapIndex = if (shuffledMapping.isNotEmpty()) { - shuffledMapping[savedState.index] + shuffledMapping[index] } else { index }) - if (index > -1) { - // Valid state where something needs to be played, direct the stateholder to apply - // this new state. - val oldStateMirror = stateMirror - if (oldStateMirror.rawQueue != rawQueue) { - logD("Queue changed, must reload player") - stateHolder?.playing(false) - stateHolder?.applySavedState(parent, rawQueue, StateAck.NewPlayback) - stateHolder?.seekTo(savedState.positionMs) - } + // Valid state where something needs to be played, direct the stateholder to apply + // this new state. + val oldStateMirror = stateMirror + if (oldStateMirror.rawQueue != rawQueue) { + logD("Queue changed, must reload player") + stateHolder.playing(false) + stateHolder.applySavedState(parent, rawQueue, StateAck.NewPlayback) + stateHolder.seekTo(savedState.positionMs) } isInitialized = true