From 3affe7e049add2b18b1e0aaec4384e6ce13684a1 Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Sat, 3 Oct 2026 02:01:15 +0000 Subject: [PATCH] play the starred list from the home row, and reorder the home sections --- .../subtracks/playback/PlaybackController.kt | 10 +++++ .../com/subtracks/ui/home/HomeScreen.kt | 45 ++++++++++--------- .../com/subtracks/ui/home/HomeViewModel.kt | 8 +++- .../subtracks/ui/home/HomeScreenshotTest.kt | 2 +- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt b/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt index 6d9d5de7..5e34eb24 100644 --- a/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt +++ b/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt @@ -210,6 +210,16 @@ class PlaybackController( songId: String, ) = playContext(queueRepository.songEntry(sourceId, songId), 0) + fun playSongs( + sourceId: Long, + songIds: List, + startIndex: Int, + ) { + if (songIds.isEmpty()) return + val entries = songIds.map { id -> QueueEntry(position = 0, sourceId = sourceId, kind = QueueKind.Song, refId = id) } + play(entries, startIndex.toLong().coerceIn(0L, songIds.lastIndex.toLong())) + } + fun playPlaylist( sourceId: Long, playlistId: String, diff --git a/app/src/main/kotlin/com/subtracks/ui/home/HomeScreen.kt b/app/src/main/kotlin/com/subtracks/ui/home/HomeScreen.kt index acd01b8d..0ebffdac 100644 --- a/app/src/main/kotlin/com/subtracks/ui/home/HomeScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/home/HomeScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AssistChip @@ -61,7 +62,7 @@ enum class HomeSection( Decades("Decades"), RecentlyStarredSongs("Recently starred"), RecentlyAddedAlbums("Recently added"), - Rediscover("On repeat"), + Rediscover("Rediscover"), ; companion object { @@ -103,7 +104,7 @@ fun HomeRoute( bottomInset = bottomInset, onAlbumClick = onAlbumClick, onArtistClick = onArtistClick, - onSongClick = viewModel::play, + onPlayStarred = viewModel::playStarred, onLongClick = { contextMenuHost?.show(it, actions) }, onMore = onMore, onGenreClick = onGenreClick, @@ -121,7 +122,7 @@ fun HomeScreen( bottomInset: Dp = 0.dp, onAlbumClick: (Album) -> Unit = {}, onArtistClick: (Artist) -> Unit = {}, - onSongClick: (Song) -> Unit = {}, + onPlayStarred: (List, Int) -> Unit = { _, _ -> }, onLongClick: (MenuTarget) -> Unit = {}, onMore: (HomeSection) -> Unit = {}, onGenreClick: (String) -> Unit = {}, @@ -148,8 +149,8 @@ fun HomeScreen( contentPadding = PaddingValues(top = topInset + 8.dp, bottom = bottomInset + 24.dp), ) { albumRow( - HomeSection.RecentlyPlayedAlbums, - feed.recentlyPlayedAlbums, + HomeSection.RecentlyAddedAlbums, + feed.recentlyAddedAlbums, coverArt, onAlbumClick, onLongClick, @@ -163,6 +164,15 @@ fun HomeScreen( onLongClick, onMore, ) + starredSongs( + HomeSection.RecentlyStarredSongs, + feed.recentlyStarredSongs, + coverArt, + playingSongId, + onPlayStarred, + onLongClick, + onMore, + ) albumRow( HomeSection.MostPlayedAlbums, feed.mostPlayedAlbums, @@ -171,6 +181,7 @@ fun HomeScreen( onLongClick, onMore, ) + genreBlock(HomeSection.Genres, feed.genres, onGenreClick, onMore) artistRow( HomeSection.MostPlayedArtists, feed.mostPlayedArtists, @@ -179,28 +190,18 @@ fun HomeScreen( onLongClick, onMore, ) - genreBlock(HomeSection.Genres, feed.genres, onGenreClick, onMore) decadeRow(HomeSection.Decades, feed.decades, onDecadeClick, onMore) - starredSongs( - HomeSection.RecentlyStarredSongs, - feed.recentlyStarredSongs, - coverArt, - playingSongId, - onSongClick, - onLongClick, - onMore, - ) albumRow( - HomeSection.RecentlyAddedAlbums, - feed.recentlyAddedAlbums, + HomeSection.Rediscover, + feed.rediscoverAlbums, coverArt, onAlbumClick, onLongClick, onMore, ) albumRow( - HomeSection.Rediscover, - feed.rediscoverAlbums, + HomeSection.RecentlyPlayedAlbums, + feed.recentlyPlayedAlbums, coverArt, onAlbumClick, onLongClick, @@ -360,7 +361,7 @@ private fun LazyListScope.starredSongs( songs: List, coverArt: (String?, Boolean) -> CoverArtRef?, playingSongId: String?, - onSongClick: (Song) -> Unit, + onPlayStarred: (List, Int) -> Unit, onLongClick: (MenuTarget) -> Unit, onMore: (HomeSection) -> Unit, ) { @@ -368,7 +369,7 @@ private fun LazyListScope.starredSongs( item(key = "${section.name}-header") { HomeSectionHeader(section.title) { onMore(section) } } - items(songs, key = { it.song.id }) { item -> + itemsIndexed(songs, key = { _, item -> item.song.id }) { index, item -> SongRow( song = item.song, coverArtId = item.coverArt, @@ -377,7 +378,7 @@ private fun LazyListScope.starredSongs( durationSeconds = item.song.duration, modifier = Modifier.combinedClickable( - onClick = { onSongClick(item.song) }, + onClick = { onPlayStarred(songs.map { it.song }, index) }, onLongClick = { onLongClick(MenuTarget.Song(item.song, coverArt(item.coverArt, true))) }, ), ) diff --git a/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt b/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt index 977619da..3cede552 100644 --- a/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt +++ b/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt @@ -101,8 +101,12 @@ class HomeViewModel( thumbnail: Boolean, ): CoverArtRef? = sourceRepository.coverArt(coverArt, thumbnail) - fun play(song: Song) { - viewModelScope.playSongInContext(libraryRepository, playbackController, song) + fun playStarred( + songs: List, + startIndex: Int, + ) { + val sourceId = songs.getOrNull(startIndex)?.sourceId ?: return + playbackController.playSongs(sourceId, songs.map { it.id }, startIndex) } fun sync() = syncManager.requestSync() diff --git a/app/src/test/kotlin/com/subtracks/ui/home/HomeScreenshotTest.kt b/app/src/test/kotlin/com/subtracks/ui/home/HomeScreenshotTest.kt index 01fdcda2..dbad054e 100644 --- a/app/src/test/kotlin/com/subtracks/ui/home/HomeScreenshotTest.kt +++ b/app/src/test/kotlin/com/subtracks/ui/home/HomeScreenshotTest.kt @@ -43,7 +43,7 @@ class HomeScreenshotTest { } } composeRule.waitUntil(timeoutMillis = 5_000) { - composeRule.onAllNodesWithText("Recently played").fetchSemanticsNodes().isNotEmpty() + composeRule.onAllNodesWithText("Recently added").fetchSemanticsNodes().isNotEmpty() } composeRule.onRoot().captureRoboImage("src/test/screenshots/home.png") }