From e3a4c91458202fed4852fa0d751257329155397d Mon Sep 17 00:00:00 2001 From: Zyrouge Date: Sat, 7 Dec 2024 13:06:45 +0530 Subject: [PATCH] refactor: revamp db operations --- .../zyrouge/symphony/services/Settings.kt | 2 +- .../services/database/store/PlaylistStore.kt | 4 +- .../symphony/services/groove/Groove.kt | 24 ++++++++-- .../symphony/services/groove/Playlist.kt | 4 +- .../groove/repositories/PlaylistRepository.kt | 46 +++++++++++-------- .../ui/components/AddToPlaylistDialog.kt | 19 +++----- .../components/PlaylistInformationDialog.kt | 3 ++ .../symphony/ui/components/PlaylistTile.kt | 21 +++------ .../ui/components/RenamePlaylistDialog.kt | 7 +-- .../github/zyrouge/symphony/ui/view/Home.kt | 7 ++- .../zyrouge/symphony/ui/view/Playlist.kt | 13 ++---- .../github/zyrouge/symphony/ui/view/Queue.kt | 4 +- .../symphony/ui/view/home/Playlists.kt | 13 ++---- .../ui/view/settings/GrooveSettingsView.kt | 29 ++++++------ 14 files changed, 95 insertions(+), 101 deletions(-) diff --git a/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt b/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt index e3cdac3b..13226de2 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/services/Settings.kt @@ -196,7 +196,7 @@ class Settings(private val symphony: Symphony) { val lastUsedPlaylistsSortBy = EnumEntry( "last_used_playlists_sort_by", enumEntries(), - PlaylistRepository.SortBy.TITLE, + PlaylistRepository.SortBy.CUSTOM, ) val lastUsedPlaylistsSortReverse = BooleanEntry("last_used_playlists_sort_reverse", false) val lastUsedPlaylistsHorizontalGridColumns = IntEntry( diff --git a/app/src/main/java/io/github/zyrouge/symphony/services/database/store/PlaylistStore.kt b/app/src/main/java/io/github/zyrouge/symphony/services/database/store/PlaylistStore.kt index 21b4987c..6ca761e0 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/services/database/store/PlaylistStore.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/services/database/store/PlaylistStore.kt @@ -15,8 +15,8 @@ interface PlaylistStore { @Update suspend fun update(vararg playlist: Playlist): Int - @Query("DELETE FROM playlists WHERE id IN (:playlistIds)") - suspend fun delete(playlistIds: Collection): Int + @Query("DELETE FROM playlists WHERE id = :playlistId") + suspend fun delete(playlistId: String): Int @Query("SELECT * FROM playlists") suspend fun entries(): Map<@MapColumn("id") String, Playlist> diff --git a/app/src/main/java/io/github/zyrouge/symphony/services/groove/Groove.kt b/app/src/main/java/io/github/zyrouge/symphony/services/groove/Groove.kt index 0035217f..a8835f10 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/services/groove/Groove.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/services/groove/Groove.kt @@ -58,9 +58,27 @@ class Groove(private val symphony: Symphony) : Symphony.Hooks { }.join() } - suspend fun refetch() { - reset() - fetch() + private suspend fun clearCache() { + symphony.database.songCache.clear() + symphony.database.artworkCache.clear() + symphony.database.lyricsCache.clear() + } + + data class FetchOptions( + val resetInMemoryCache: Boolean = false, + val resetPersistentCache: Boolean = false, + ) + + fun fetch(options: FetchOptions) { + coroutineScope.launch { + if (options.resetInMemoryCache) { + reset() + } + if (options.resetPersistentCache) { + clearCache() + } + fetch() + } } override fun onSymphonyReady() { diff --git a/app/src/main/java/io/github/zyrouge/symphony/services/groove/Playlist.kt b/app/src/main/java/io/github/zyrouge/symphony/services/groove/Playlist.kt index 66eea8b0..4810fc9c 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/services/groove/Playlist.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/services/groove/Playlist.kt @@ -60,7 +60,7 @@ data class Playlist( companion object { private const val PRIMARY_STORAGE = "primary:" - fun parse(symphony: Symphony, uri: Uri): Playlist { + fun parse(symphony: Symphony, playlistId: String?, uri: Uri): Playlist { val file = DocumentFileX.fromSingleUri(symphony.applicationContext, uri)!! val content = symphony.applicationContext.contentResolver.openInputStream(uri) ?.use { String(it.readBytes()) } ?: "" @@ -68,7 +68,7 @@ data class Playlist( .map { it.trim() } .filter { it.isNotEmpty() && it[0] != '#' } .toList() - val id = symphony.groove.playlist.idGenerator.next() + val id = playlistId ?: symphony.groove.playlist.idGenerator.next() val path = DocumentFileX.getParentPathOfSingleUri(file.uri) ?: file.name return Playlist( id = id, diff --git a/app/src/main/java/io/github/zyrouge/symphony/services/groove/repositories/PlaylistRepository.kt b/app/src/main/java/io/github/zyrouge/symphony/services/groove/repositories/PlaylistRepository.kt index 176c72a9..8eaae973 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/services/groove/repositories/PlaylistRepository.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/services/groove/repositories/PlaylistRepository.kt @@ -62,7 +62,7 @@ class PlaylistRepository(private val symphony: Symphony) { val playlist = when { x.isLocal -> { ActivityUtils.makePersistableReadableUri(context, x.uri!!) - Playlist.parse(symphony, x.uri) + Playlist.parse(symphony, x.id, x.uri) } else -> x @@ -140,22 +140,26 @@ class PlaylistRepository(private val symphony: Symphony) { path = null, ) - suspend fun add(playlist: Playlist) { + fun add(playlist: Playlist) { cache[playlist.id] = playlist _all.update { it + playlist.id } emitUpdateId() emitCount() - symphony.database.playlists.insert(playlist) + symphony.groove.coroutineScope.launch { + symphony.database.playlists.insert(playlist) + } } - suspend fun delete(id: String) { - cache.remove(id)?.let { - it.uri?.let { uri -> - runCatching { - ActivityUtils.makePersistableReadableUri(symphony.applicationContext, uri) - } + fun delete(id: String) { + Logger.error( + "PlaylistRepository", + "cache ${cache.containsKey(id)}" + ) + cache.remove(id)?.uri?.let { + runCatching { + ActivityUtils.makePersistableReadableUri(symphony.applicationContext, it) } } _all.update { @@ -163,10 +167,12 @@ class PlaylistRepository(private val symphony: Symphony) { } emitUpdateId() emitCount() - symphony.database.playlists.delete(listOf(id)) + symphony.groove.coroutineScope.launch { + symphony.database.playlists.delete(id) + } } - suspend fun update(id: String, songIds: List) { + fun update(id: String, songIds: List) { val playlist = get(id) ?: return val updated = Playlist( id = id, @@ -183,7 +189,9 @@ class PlaylistRepository(private val symphony: Symphony) { songIds } } - symphony.database.playlists.update(updated) + symphony.groove.coroutineScope.launch { + symphony.database.playlists.update(updated) + } } // NOTE: maybe we shouldn't use groove's coroutine scope? @@ -193,9 +201,7 @@ class PlaylistRepository(private val symphony: Symphony) { if (songIds.contains(songId)) { return } - symphony.groove.coroutineScope.launch { - update(favorites.id, songIds.mutate { add(songId) }) - } + update(favorites.id, songIds.mutate { add(songId) }) } fun unfavorite(songId: String) { @@ -204,9 +210,7 @@ class PlaylistRepository(private val symphony: Symphony) { if (!songIds.contains(songId)) { return } - symphony.groove.coroutineScope.launch { - update(favorites.id, songIds.mutate { remove(songId) }) - } + update(favorites.id, songIds.mutate { remove(songId) }) } fun isFavoritesPlaylist(playlist: Playlist) = playlist.id == FAVORITE_PLAYLIST @@ -220,11 +224,13 @@ class PlaylistRepository(private val symphony: Symphony) { } } - suspend fun renamePlaylist(playlist: Playlist, title: String) { + fun renamePlaylist(playlist: Playlist, title: String) { val renamed = playlist.withTitle(title) cache[playlist.id] = renamed emitUpdateId() - symphony.database.playlists.update(renamed) + symphony.groove.coroutineScope.launch { + symphony.database.playlists.update(renamed) + } } internal fun onScanFinish() { diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/AddToPlaylistDialog.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/AddToPlaylistDialog.kt index 2b410fcb..afc83a04 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/AddToPlaylistDialog.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/AddToPlaylistDialog.kt @@ -17,14 +17,12 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import io.github.zyrouge.symphony.ui.helpers.ViewContext import io.github.zyrouge.symphony.utils.mutate -import kotlinx.coroutines.launch @Composable fun AddToPlaylistDialog( @@ -32,7 +30,6 @@ fun AddToPlaylistDialog( songIds: List, onDismissRequest: () -> Unit, ) { - val coroutineScope = rememberCoroutineScope() var showNewPlaylistDialog by remember { mutableStateOf(false) } val allPlaylistsIds by context.symphony.groove.playlist.all.collectAsState() val playlists by remember(allPlaylistsIds) { @@ -83,13 +80,11 @@ fun AddToPlaylistDialog( ) }, onClick = { - coroutineScope.launch { - context.symphony.groove.playlist.update( - playlist.id, - playlistSongIds.mutate { addAll(songIds) }, - ) - onDismissRequest() - } + context.symphony.groove.playlist.update( + playlist.id, + playlistSongIds.mutate { addAll(songIds) }, + ) + onDismissRequest() } ) } @@ -115,9 +110,7 @@ fun AddToPlaylistDialog( context = context, onDone = { playlist -> showNewPlaylistDialog = false - coroutineScope.launch { - context.symphony.groove.playlist.add(playlist) - } + context.symphony.groove.playlist.add(playlist) }, onDismissRequest = { showNewPlaylistDialog = false diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistInformationDialog.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistInformationDialog.kt index 8de13300..616a091c 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistInformationDialog.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistInformationDialog.kt @@ -13,6 +13,9 @@ fun PlaylistInformationDialog( InformationDialog( context, content = { + InformationKeyValue(context.symphony.t.Id) { + LongPressCopyableText(context, playlist.id) + } InformationKeyValue(context.symphony.t.Title) { LongPressCopyableText(context, playlist.title) } diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistTile.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistTile.kt index 1e638349..f75da412 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistTile.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/PlaylistTile.kt @@ -35,7 +35,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -51,7 +50,6 @@ import io.github.zyrouge.symphony.ui.helpers.ViewContext import io.github.zyrouge.symphony.ui.theme.ThemeColors import io.github.zyrouge.symphony.ui.view.PlaylistViewRoute import io.github.zyrouge.symphony.utils.Logger -import kotlinx.coroutines.launch @Composable fun PlaylistTile(context: ViewContext, playlist: Playlist) { @@ -139,7 +137,6 @@ fun PlaylistDropdownMenu( onDelete: (() -> Unit) = {}, onDismissRequest: () -> Unit, ) { - val coroutineScope = rememberCoroutineScope() val savePlaylistLauncher = rememberLauncherForActivityResult( ActivityResultContracts.CreateDocument(MediaExposer.MIMETYPE_M3U) ) { uri -> @@ -314,11 +311,9 @@ fun PlaylistDropdownMenu( context, selectedSongIds = playlist.getSongIds(context.symphony), onDone = { - coroutineScope.launch { - context.symphony.groove.playlist.update(playlist.id, it) - onSongsChanged() - showSongsPicker = false - } + context.symphony.groove.playlist.update(playlist.id, it) + onSongsChanged() + showSongsPicker = false } ) } @@ -333,12 +328,10 @@ fun PlaylistDropdownMenu( Text(context.symphony.t.AreYouSureThatYouWantToDeleteThisPlaylist) }, onResult = { result -> - coroutineScope.launch { - showDeleteDialog = false - if (result) { - onDelete() - context.symphony.groove.playlist.delete(playlist.id) - } + showDeleteDialog = false + if (result) { + onDelete() + context.symphony.groove.playlist.delete(playlist.id) } } ) diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/components/RenamePlaylistDialog.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/components/RenamePlaylistDialog.kt index 45c38a4a..cf26165b 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/components/RenamePlaylistDialog.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/components/RenamePlaylistDialog.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -21,7 +20,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import io.github.zyrouge.symphony.services.groove.Playlist import io.github.zyrouge.symphony.ui.helpers.ViewContext -import kotlinx.coroutines.launch @Composable fun RenamePlaylistDialog( @@ -30,7 +28,6 @@ fun RenamePlaylistDialog( onRename: () -> Unit = {}, onDismissRequest: () -> Unit, ) { - val coroutineScope = rememberCoroutineScope() var input by remember { mutableStateOf(playlist.title) } val focusRequester = remember { FocusRequester() } @@ -70,9 +67,7 @@ fun RenamePlaylistDialog( onClick = { onRename() onDismissRequest() - coroutineScope.launch { - context.symphony.groove.playlist.renamePlaylist(playlist, input) - } + context.symphony.groove.playlist.renamePlaylist(playlist, input) } ) { Text(context.symphony.t.Done) diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/view/Home.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/view/Home.kt index 14f164b9..6d2fd1d2 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/view/Home.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/view/Home.kt @@ -91,7 +91,6 @@ import io.github.zyrouge.symphony.ui.view.home.GenresView import io.github.zyrouge.symphony.ui.view.home.PlaylistsView import io.github.zyrouge.symphony.ui.view.home.SongsView import io.github.zyrouge.symphony.ui.view.home.TreeView -import kotlinx.coroutines.launch import kotlinx.serialization.Serializable enum class HomePage( @@ -229,9 +228,9 @@ fun HomeView(context: ViewContext) { onClick = { showOptionsDropdown = false context.symphony.radio.stop() - coroutineScope.launch { - context.symphony.groove.refetch() - } + context.symphony.groove.fetch( + Groove.FetchOptions(resetInMemoryCache = true), + ) } ) DropdownMenuItem( diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/view/Playlist.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/view/Playlist.kt index 7beb77e0..cef2d1a5 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/view/Playlist.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/view/Playlist.kt @@ -23,7 +23,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -36,7 +35,6 @@ import io.github.zyrouge.symphony.ui.components.TopAppBarMinimalTitle import io.github.zyrouge.symphony.ui.helpers.ViewContext import io.github.zyrouge.symphony.ui.theme.ThemeColors import io.github.zyrouge.symphony.utils.mutate -import kotlinx.coroutines.launch import kotlinx.serialization.Serializable @Serializable @@ -45,7 +43,6 @@ data class PlaylistViewRoute(val playlistId: String) @OptIn(ExperimentalMaterial3Api::class) @Composable fun PlaylistView(context: ViewContext, route: PlaylistViewRoute) { - val coroutineScope = rememberCoroutineScope() val allPlaylistIds by context.symphony.groove.playlist.all.collectAsState() val updateId by context.symphony.groove.playlist.updateId.collectAsState() var updateCounter by remember { mutableIntStateOf(0) } @@ -148,12 +145,10 @@ fun PlaylistView(context: ViewContext, route: PlaylistViewRoute) { }, onClick = { onDismissRequest() - coroutineScope.launch { - context.symphony.groove.playlist.update( - it.id, - songIds.mutate { remove(song.id) }, - ) - } + context.symphony.groove.playlist.update( + it.id, + songIds.mutate { remove(song.id) }, + ) } ) } diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/view/Queue.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/view/Queue.kt index 7edc9d42..9c0a07d6 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/view/Queue.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/view/Queue.kt @@ -189,9 +189,7 @@ fun QueueView(context: ViewContext) { initialSongIds = queue.toList(), onDone = { playlist -> showSaveDialog = false - coroutineScope.launch { - context.symphony.groove.playlist.add(playlist) - } + context.symphony.groove.playlist.add(playlist) }, onDismissRequest = { showSaveDialog = false diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Playlists.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Playlists.kt index cfed81cf..67792c96 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Playlists.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/view/home/Playlists.kt @@ -21,7 +21,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -34,11 +33,9 @@ import io.github.zyrouge.symphony.ui.components.PlaylistGrid import io.github.zyrouge.symphony.ui.helpers.ViewContext import io.github.zyrouge.symphony.utils.ActivityUtils import io.github.zyrouge.symphony.utils.Logger -import kotlinx.coroutines.launch @Composable fun PlaylistsView(context: ViewContext) { - val coroutineScope = rememberCoroutineScope() val isUpdating by context.symphony.groove.playlist.isUpdating.collectAsState() val playlists by context.symphony.groove.playlist.all.collectAsState() val playlistsCount by context.symphony.groove.playlist.count.collectAsState() @@ -50,10 +47,8 @@ fun PlaylistsView(context: ViewContext) { uris.forEach { x -> try { ActivityUtils.makePersistableReadableUri(context.symphony.applicationContext, x) - val playlist = Playlist.parse(context.symphony, x) - coroutineScope.launch { - context.symphony.groove.playlist.add(playlist) - } + val playlist = Playlist.parse(context.symphony, null, x) + context.symphony.groove.playlist.add(playlist) } catch (err: Exception) { Logger.error("PlaylistView", "import failed (activity result)", err) Toast.makeText( @@ -90,9 +85,7 @@ fun PlaylistsView(context: ViewContext) { context, onDone = { playlist -> showPlaylistCreator = false - coroutineScope.launch { - context.symphony.groove.playlist.add(playlist) - } + context.symphony.groove.playlist.add(playlist) }, onDismissRequest = { showPlaylistCreator = false diff --git a/app/src/main/java/io/github/zyrouge/symphony/ui/view/settings/GrooveSettingsView.kt b/app/src/main/java/io/github/zyrouge/symphony/ui/view/settings/GrooveSettingsView.kt index 30fefb41..6e134311 100644 --- a/app/src/main/java/io/github/zyrouge/symphony/ui/view/settings/GrooveSettingsView.kt +++ b/app/src/main/java/io/github/zyrouge/symphony/ui/view/settings/GrooveSettingsView.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Color import io.github.zyrouge.symphony.Symphony +import io.github.zyrouge.symphony.services.groove.Groove import io.github.zyrouge.symphony.ui.components.AdaptiveSnackbar import io.github.zyrouge.symphony.ui.components.IconButtonPlaceholder import io.github.zyrouge.symphony.ui.components.TopAppBarMinimalTitle @@ -60,7 +61,6 @@ import io.github.zyrouge.symphony.ui.helpers.TransitionDurations import io.github.zyrouge.symphony.ui.helpers.ViewContext import io.github.zyrouge.symphony.ui.view.SettingsViewRoute import io.github.zyrouge.symphony.utils.ImagePreserver -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.serialization.Serializable @@ -141,7 +141,7 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { initialValues = mediaFolders, onChange = { values -> context.symphony.settings.mediaFolders.setValue(values) - refetchMediaLibrary(coroutineScope, context.symphony) + refreshMediaLibrary(context.symphony) } ) } @@ -165,7 +165,7 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { else -> value } ) - refetchMediaLibrary(coroutineScope, context.symphony) + refreshMediaLibrary(context.symphony) } ) HorizontalDivider() @@ -207,7 +207,7 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { initialValues = blacklistFolders, onChange = { values -> context.symphony.settings.blacklistFolders.setValue(values) - refetchMediaLibrary(coroutineScope, context.symphony) + refreshMediaLibrary(context.symphony) } ) HorizontalDivider() @@ -223,7 +223,7 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { initialValues = whitelistFolders, onChange = { values -> context.symphony.settings.whitelistFolders.setValue(values) - refetchMediaLibrary(coroutineScope, context.symphony) + refreshMediaLibrary(context.symphony) } ) HorizontalDivider() @@ -238,7 +238,7 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { values = artistTagSeparators.toList(), onChange = { context.symphony.settings.artistTagSeparators.setValue(it.toSet()) - refetchMediaLibrary(coroutineScope, context.symphony) + refreshMediaLibrary(context.symphony) }, ) HorizontalDivider() @@ -253,7 +253,7 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { values = genreTagSeparators.toList(), onChange = { context.symphony.settings.genreTagSeparators.setValue(it.toSet()) - refetchMediaLibrary(coroutineScope, context.symphony) + refreshMediaLibrary(context.symphony) }, ) HorizontalDivider() @@ -306,11 +306,8 @@ fun GrooveSettingsView(context: ViewContext, route: GrooveSettingsViewRoute) { Text(context.symphony.t.ClearSongCache) }, onClick = { + refreshMediaLibrary(context.symphony, true) coroutineScope.launch { - context.symphony.database.songCache.clear() - context.symphony.database.artworkCache.clear() - context.symphony.database.lyricsCache.clear() - refetchMediaLibrary(coroutineScope, context.symphony) snackbarHostState.showSnackbar( context.symphony.t.SongCacheCleared, withDismissAction = true, @@ -331,10 +328,14 @@ fun ImagePreserver.Quality.label(context: ViewContext) = when (this) { ImagePreserver.Quality.Loseless -> context.symphony.t.Loseless } -private fun refetchMediaLibrary(coroutineScope: CoroutineScope, symphony: Symphony) { +private fun refreshMediaLibrary(symphony: Symphony, clearCache: Boolean = false) { symphony.radio.stop() - coroutineScope.launch { - symphony.groove.refetch() + symphony.groove.coroutineScope.launch { + val options = Groove.FetchOptions( + resetInMemoryCache = true, + resetPersistentCache = clearCache, + ) + symphony.groove.fetch(options) } }