diff --git a/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt b/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt index 69debea9..75c803f5 100644 --- a/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt +++ b/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt @@ -104,9 +104,6 @@ interface LibraryDao { limit: Int, ): List - @Query("SELECT id FROM songs WHERE sourceId = :sourceId") - suspend fun songIds(sourceId: Long): List - @Query("SELECT id FROM songs WHERE sourceId = :sourceId AND id > :afterId ORDER BY id LIMIT :limit") suspend fun songIdsAfter( sourceId: Long, diff --git a/app/src/main/kotlin/com/subtracks/di/AppModule.kt b/app/src/main/kotlin/com/subtracks/di/AppModule.kt index df615e77..bacbb952 100644 --- a/app/src/main/kotlin/com/subtracks/di/AppModule.kt +++ b/app/src/main/kotlin/com/subtracks/di/AppModule.kt @@ -46,7 +46,7 @@ fun appModule( single { MediaSessionConnection(context.applicationContext, get()) } single { PlaybackController(get(), get(), get()) } viewModel { RootViewModel(get()) } - viewModel { LibraryViewModel(get(), get(), get(), get()) } + viewModel { LibraryViewModel(get(), get(), get(), get(), get()) } viewModel { SettingsViewModel(get(), get()) } viewModel { AddSourceViewModel(get(), get()) } viewModel { params -> AlbumDetailViewModel(get(), get(), get(), params.get()) } diff --git a/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt b/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt index 5073f681..551af84f 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt @@ -186,14 +186,16 @@ fun LibraryRoute( viewModel: LibraryViewModel = koinViewModel(), playbackController: PlaybackController = koinInject(), ) { - var selectedTab by rememberSaveable { mutableStateOf(LibraryTab.Albums) } - var previousTab by rememberSaveable { mutableStateOf(LibraryTab.Albums) } + var selectedTabName by rememberSaveable { mutableStateOf(LibraryTab.Albums.name) } + var previousTabName by rememberSaveable { mutableStateOf(LibraryTab.Albums.name) } + val selectedTab = LibraryTab.entries.firstOrNull { it.name == selectedTabName } ?: LibraryTab.Albums + val previousTab = LibraryTab.entries.firstOrNull { it.name == previousTabName } ?: LibraryTab.Albums val syncing by viewModel.syncing.collectAsStateWithLifecycle() val listTab = selectedTab.listTab() LaunchedEffect(selectedTab) { if (previousTab != selectedTab) { viewModel.setSearch(previousTab.listTab(), "") - previousTab = selectedTab + previousTabName = selectedTab.name } } val listQuery by viewModel.listQuery(listTab).collectAsStateWithLifecycle() @@ -208,7 +210,6 @@ fun LibraryRoute( val artwork = rememberArtworkColors(playbackController.coverArt(playback.item, thumbnail = true)) val itemActions = ItemActions( - playSong = { viewModel.playSong(it.id) }, playAlbum = { viewModel.playAlbum(it.id) }, shuffleAlbum = { viewModel.shuffleAlbum(it.id) }, playPlaylist = { viewModel.playPlaylist(it.id) }, @@ -219,7 +220,7 @@ fun LibraryRoute( ) LibraryScreen( selectedTab = selectedTab, - onTabSelected = { selectedTab = it }, + onTabSelected = { selectedTabName = it.name }, syncing = syncing, bottomInset = bottomInset, artwork = artwork, diff --git a/app/src/main/kotlin/com/subtracks/ui/library/LibraryViewModel.kt b/app/src/main/kotlin/com/subtracks/ui/library/LibraryViewModel.kt index 795b1a74..40a16174 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/LibraryViewModel.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/LibraryViewModel.kt @@ -18,6 +18,7 @@ import com.subtracks.data.repo.LibraryRepository import com.subtracks.data.repo.SourceRepository import com.subtracks.data.sync.SyncManager import com.subtracks.data.sync.SyncStatus +import com.subtracks.playback.PlaybackController import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -35,6 +36,7 @@ class LibraryViewModel( private val libraryRepository: LibraryRepository, private val sourceRepository: SourceRepository, private val syncManager: SyncManager, + private val playbackController: PlaybackController, private val userPreferences: UserPreferences, ) : ViewModel() { private val listQueries: Map> = diff --git a/app/src/test/kotlin/com/subtracks/data/sync/SyncServiceTest.kt b/app/src/test/kotlin/com/subtracks/data/sync/SyncServiceTest.kt index 80746a77..ec9aaf85 100644 --- a/app/src/test/kotlin/com/subtracks/data/sync/SyncServiceTest.kt +++ b/app/src/test/kotlin/com/subtracks/data/sync/SyncServiceTest.kt @@ -69,7 +69,7 @@ class SyncServiceTest { .allRows() .size, ) - assertEquals(2, db.libraryDao().songIds(1).size) + assertEquals(2, songIds(1).size) assertEquals( 1, db @@ -92,7 +92,7 @@ class SyncServiceTest { .allRows() .map { it.id }, ) - assertEquals(listOf("s1"), db.libraryDao().songIds(1)) + assertEquals(listOf("s1"), songIds(1)) } @Test @@ -113,7 +113,7 @@ class SyncServiceTest { assertEquals(2, db.libraryDao().artistIds(1).size) assertEquals(1, db.libraryDao().albumIds(1).size) - assertEquals(1, db.libraryDao().songIds(1).size) + assertEquals(1, songIds(1).size) assertEquals(1, db.libraryDao().playlistIds(1).size) assertEquals( 1, @@ -298,7 +298,7 @@ class SyncServiceTest { SyncService(db, source).sync() assertEquals((1..5).map { "a$it" }, db.libraryDao().artistIds(1).sorted()) - assertEquals((1..5).map { "s$it" }, db.libraryDao().songIds(1).sorted()) + assertEquals((1..5).map { "s$it" }, songIds(1).sorted()) source.artists = (1..3).map { artist("a$it") } source.songs = (1..3).map { song("s$it") } @@ -306,7 +306,7 @@ class SyncServiceTest { SyncService(db, source).sync() assertEquals((1..3).map { "a$it" }, db.libraryDao().artistIds(1).sorted()) - assertEquals((1..3).map { "s$it" }, db.libraryDao().songIds(1).sorted()) + assertEquals((1..3).map { "s$it" }, songIds(1).sorted()) } @Test @@ -485,7 +485,7 @@ class SyncServiceTest { SyncService(db, sourceOne).sync() assertEquals(listOf("b1"), db.libraryDao().artistIds(2)) - assertEquals(listOf("s2"), db.libraryDao().songIds(2)) + assertEquals(listOf("s2"), songIds(2)) assertEquals(listOf("p2"), db.libraryDao().playlistIds(2)) assertEquals( 1, @@ -587,6 +587,11 @@ class SyncServiceTest { } } + private suspend fun songIds(sourceId: Long): List = + db + .libraryDao() + .songIdsAfter(sourceId, "", Int.MAX_VALUE) + private suspend fun storedDiscKeys(): List = db .libraryDao()