From d05fb6fc072ca328cbe2a2d9879992e11afdc45e Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Thu, 12 Nov 2026 07:53:06 +0000 Subject: [PATCH] playback: resolve the pending tap preference inside the start lock --- .../subtracks/playback/PlaybackController.kt | 17 +++++------ .../playback/PlaybackControllerTest.kt | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt b/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt index 716a800c..97fb0419 100644 --- a/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt +++ b/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt @@ -992,29 +992,26 @@ class PlaybackController( } scope.launch { startLock.withLock { - startLocked(entry, startPosition, behavior ?: preferences.songTapBehavior().first()) + startLocked(entry, startPosition, behavior) } } } private suspend fun startPending(pending: PendingPlay) { - start(pending.entry, pending.position, pending.behavior ?: preferences.songTapBehavior().first()) + startLock.withLock { + startLocked(pending.entry, pending.position, pending.behavior) + } } - private suspend fun start( - entry: QueueEntry, - startPosition: Long, - behavior: SongTapBehavior, - ) = startLock.withLock { startLocked(entry, startPosition, behavior) } - private suspend fun startLocked( entry: QueueEntry, startPosition: Long, - behavior: SongTapBehavior, + behavior: SongTapBehavior?, ) { + val resolved = behavior ?: preferences.songTapBehavior().first() val modes = queueRepository.modes() val shuffle = - when (behavior) { + when (resolved) { SongTapBehavior.InOrder -> false SongTapBehavior.KeepShuffle -> modes.shuffle SongTapBehavior.Shuffle -> true diff --git a/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt b/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt index 4ce8bca1..4f836e22 100644 --- a/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt +++ b/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt @@ -2613,6 +2613,34 @@ class PlaybackControllerTest { assertEquals(1L, slowController.state.value.position) } + @Test + fun aSongTappedWhileThePlayerConnectsKeepsItsOrder() { + seedAlbum(3, sourceId = 1) + val (slowPrefs, entered, gate) = gatedSongTapPreferences() + val slowController = + PlaybackController( + sources, + queues, + FakePlayerConnection(handle), + downloads, + slowPrefs, + scope = CoroutineScope(SupervisorJob() + dispatcher).also { extraScopes += it }, + ) + + slowController.playAlbum(1, "al1", 0) + runBlocking { entered.await() } + slowController.playAlbum(1, "al1", 1) + gate.complete(Unit) + runBlocking { delay(1_000) } + + assertEquals( + "s2", + slowController.state.value.item + ?.id, + ) + assertEquals(1L, slowController.state.value.position) + } + @Test fun jumpingInTheQueueWhileShuffledKeepsTheOrder() { seedAlbum(5, sourceId = 1)