Fix clearing database freezes the app (#8492)

(cherry picked from commit 6ce54eb845d5333cc3fc202f59585816b61b29da)

# Conflicts:
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/ClearDatabaseScreen.kt
This commit is contained in:
AntsyLich 2022-11-10 18:59:31 +06:00 committed by Jobobby04
parent 433f492f4c
commit b144593129

View File

@ -23,6 +23,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -51,6 +52,8 @@ import eu.kanade.presentation.util.selectedBackground
import eu.kanade.tachiyomi.Database import eu.kanade.tachiyomi.Database
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.lang.withNonCancellableContext
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
@ -65,6 +68,7 @@ class ClearDatabaseScreen : Screen {
val navigator = LocalNavigator.currentOrThrow val navigator = LocalNavigator.currentOrThrow
val model = rememberScreenModel { ClearDatabaseScreenModel() } val model = rememberScreenModel { ClearDatabaseScreenModel() }
val state by model.state.collectAsState() val state by model.state.collectAsState()
val scope = rememberCoroutineScope()
when (val s = state) { when (val s = state) {
is ClearDatabaseScreenModel.State.Loading -> LoadingScreen() is ClearDatabaseScreenModel.State.Loading -> LoadingScreen()
@ -78,12 +82,14 @@ class ClearDatabaseScreen : Screen {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
// SY --> scope.launchUI {
model.removeMangaBySourceId(keepReadManga) // SY -->
// SY <-- model.removeMangaBySourceId(keepReadManga)
model.clearSelection() // SY <--
model.hideConfirmation() model.clearSelection()
context.toast(R.string.clear_database_completed) model.hideConfirmation()
context.toast(R.string.clear_database_completed)
}
}, },
) { ) {
Text(text = stringResource(android.R.string.ok)) Text(text = stringResource(android.R.string.ok))
@ -246,8 +252,8 @@ private class ClearDatabaseScreenModel : StateScreenModel<ClearDatabaseScreenMod
} }
} }
fun removeMangaBySourceId(/* SY --> */keepReadManga: Boolean /* SY <-- */) { suspend fun removeMangaBySourceId(/* SY --> */keepReadManga: Boolean /* SY <-- */) = withNonCancellableContext {
val state = state.value as? State.Ready ?: return val state = state.value as? State.Ready ?: return@withNonCancellableContext
// SY --> // SY -->
if (keepReadManga) { if (keepReadManga) {
database.mangasQueries.deleteMangasNotInLibraryAndNotReadBySourceIds(state.selection) database.mangasQueries.deleteMangasNotInLibraryAndNotReadBySourceIds(state.selection)