From adabe21d63f1b87f214b3ddaae98de13e2cf53ae Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Fri, 9 Oct 2026 08:27:51 +0000 Subject: [PATCH] library: cover starred/downloaded shuffle in tests, dedupe list predicate --- .../subtracks/ui/components/ViewportFill.kt | 6 ++- .../com/subtracks/ui/home/HomeListScreen.kt | 6 +-- .../playback/PlaybackControllerTest.kt | 47 +++++++++++++++++++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/ui/components/ViewportFill.kt b/app/src/main/kotlin/com/subtracks/ui/components/ViewportFill.kt index ae1f1024..0aef0428 100644 --- a/app/src/main/kotlin/com/subtracks/ui/components/ViewportFill.kt +++ b/app/src/main/kotlin/com/subtracks/ui/components/ViewportFill.kt @@ -101,8 +101,9 @@ fun ScrollToTopOnRequest( ) { var previous by remember { mutableStateOf(request) } LaunchedEffect(request) { - if (request != null && previous != null && request != previous) state.animateScrollToItem(0) + val stale = previous previous = request + if (request != null && stale != null && request != stale) state.animateScrollToItem(0) } } @@ -113,7 +114,8 @@ fun ScrollToTopOnRequest( ) { var previous by remember { mutableStateOf(request) } LaunchedEffect(request) { - if (request != null && previous != null && request != previous) state.animateScrollToItem(0) + val stale = previous previous = request + if (request != null && stale != null && request != stale) state.animateScrollToItem(0) } } diff --git a/app/src/main/kotlin/com/subtracks/ui/home/HomeListScreen.kt b/app/src/main/kotlin/com/subtracks/ui/home/HomeListScreen.kt index 8be5031f..78353645 100644 --- a/app/src/main/kotlin/com/subtracks/ui/home/HomeListScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/home/HomeListScreen.kt @@ -148,10 +148,6 @@ fun HomeListScreen( val resources = LocalResources.current val scope = rememberCoroutineScope() val songListState = rememberLazyListState() - val isSongList = - request.downloaded == OfflineListKind.Songs || - request.section == HomeSection.RecentlyStarredSongs || - request.genre != null Scaffold( modifier = modifier, topBar = { @@ -163,7 +159,7 @@ fun HomeListScreen( } }, modifier = - if (isSongList) { + if (onShuffle != null) { Modifier.clickable(onClickLabel = stringResource(R.string.scroll_to_top)) { scope.launch { songListState.animateScrollToItem(0) } } diff --git a/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt b/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt index d35f087d..e7a7275e 100644 --- a/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt +++ b/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt @@ -2413,6 +2413,40 @@ class PlaybackControllerTest { assertEquals(setOf("r1", "r2"), handle.items.map { it.id }.toSet()) } + @Test + fun shuffleStarredPlaysOnlyStarredSongs() { + seedStarred() + + controller.shuffleStarred(1) + await { controller.state.value.item != null && controller.state.value.shuffle } + + assertTrue(controller.state.value.shuffle) + assertEquals( + QueueKind.Starred, + controller.state.value.context + ?.kind, + ) + assertEquals(setOf("t1", "t2"), handle.items.map { it.id }.toSet()) + } + + @Test + fun shuffleDownloadedPlaysOnlyDownloadedSongs() { + seedAlbum(3, sourceId = 1) + markDownloaded(1, "s1") + markDownloaded(1, "s3") + + controller.shuffleDownloaded(1) + await { controller.state.value.item != null && controller.state.value.shuffle } + + assertTrue(controller.state.value.shuffle) + assertEquals( + QueueKind.Downloaded, + controller.state.value.context + ?.kind, + ) + assertEquals(setOf("s1", "s3"), handle.items.map { it.id }.toSet()) + } + @Test fun artistQueueRowsFollowTheFlatShuffleIdOrder() { seedArtist() @@ -3142,6 +3176,19 @@ class PlaybackControllerTest { } } + private fun seedStarred() { + runBlocking { + db.sourcesDao().upsertSource(Source(1, "source 1", "http://localhost:1", true, 1)) + db.libraryDao().upsertSongs( + listOf( + Song(1, "t1", "al1", "ar1", "Star 1", "Album", "Artist", 100, 1, 1, 1_700_000_000L, null), + Song(1, "t2", "al1", "ar1", "Star 2", "Album", "Artist", 100, 2, 1, 1_700_000_000L, null), + Song(1, "n1", "al1", "ar1", "Plain 1", "Album", "Artist", 100, 3, 1, null, null), + ), + ) + } + } + private fun seedAlbumTracks( albumId: String, count: Int,