home: swap to downloaded sections in offline mode

This commit is contained in:
austinried
2026-10-04 00:30:06 +00:00
parent 43c90c3453
commit c44987ff31
7 changed files with 386 additions and 36 deletions
@@ -9,7 +9,9 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.subtracks.data.model.Album
import com.subtracks.data.model.Artist
import com.subtracks.data.model.DownloadStatus
import com.subtracks.data.model.Song
import com.subtracks.data.model.SongDownload
import com.subtracks.data.model.Source
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest
@@ -163,6 +165,30 @@ class LibraryHomeDaoTest {
)
}
@Test
fun downloadedSongsOnlyIncludeCompletedDownloadsWithCoverArt() =
runTest {
val sourceId = source()
val dao = db.libraryDao()
dao.upsertAlbums(listOf(album(sourceId, "al1", "Album", coverArt = "cover-1")))
dao.upsertSongs(
listOf(
song(sourceId, "s1", "One"),
song(sourceId, "s2", "Two"),
song(sourceId, "s3", "Three"),
),
)
val downloads = db.downloadDao()
downloads.upsert(SongDownload(sourceId, "s1", DownloadStatus.Completed))
downloads.upsert(SongDownload(sourceId, "s2", DownloadStatus.Queued))
downloads.upsert(SongDownload(sourceId, "s3", DownloadStatus.Completed))
val downloaded = dao.downloadedSongs(sourceId).first()
assertEquals(listOf("s1", "s3"), downloaded.map { it.song.id })
assertEquals("cover-1", downloaded.first().coverArt)
assertEquals(listOf("s1", "s3"), dao.downloadedSongIds(sourceId))
}
@Test
fun songsByGenreMatchesTheGenreRelationsWithFallback() =
runTest {
@@ -18,6 +18,7 @@ import com.github.takahirom.roborazzi.captureRoboImage
import com.subtracks.data.model.Album
import com.subtracks.data.model.AlbumSongItem
import com.subtracks.data.model.Artist
import com.subtracks.data.model.Playlist
import com.subtracks.data.model.Song
import com.subtracks.ui.theme.SubtracksTheme
import kotlinx.coroutines.flow.flowOf
@@ -143,6 +144,28 @@ class HomeScreenshotTest {
played = played,
)
@Test
fun homeOffline() {
composeRule.setContent {
SubtracksTheme {
Surface(modifier = Modifier.fillMaxSize()) {
OfflineHomeScreen(
albums = remember { flowOf(PagingData.from(listOf(listAlbum("Offline Album", 0)))) }.collectAsLazyPagingItems(),
artists = remember { flowOf(PagingData.from(listOf(listArtist("Offline Artist", 0)))) }.collectAsLazyPagingItems(),
playlists = remember { flowOf(PagingData.empty<Playlist>()) }.collectAsLazyPagingItems(),
songs = songs(),
coverArt = { _, _ -> null },
playingSongId = null,
)
}
}
}
composeRule.waitUntil(timeoutMillis = 5_000) {
composeRule.onAllNodesWithText("Downloaded albums").fetchSemanticsNodes().isNotEmpty()
}
composeRule.onRoot().captureRoboImage("src/test/screenshots/home_offline.png")
}
private fun listAlbum(
name: String,
created: Long,