From 7e558f44785718785ca68982ec3846d824d49c30 Mon Sep 17 00:00:00 2001 From: GG Bond Date: Fri, 3 May 2024 08:01:01 +0800 Subject: [PATCH] `DialogState.bgWork` doesn't show dialog if `work` doesn't suspend --- .../kotlin/com/hippo/ehviewer/util/Progress.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt index 8cf10b95d..f0e0c31e2 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt @@ -11,7 +11,6 @@ import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -19,6 +18,9 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import com.hippo.ehviewer.R.string import com.hippo.ehviewer.ui.tools.DialogState +import kotlin.coroutines.Continuation +import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED +import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn @Composable fun ProgressDialog() { @@ -44,10 +46,13 @@ fun ProgressDialog() { } } -suspend fun DialogState.bgWork(work: suspend () -> R) = dialog { cont -> - ProgressDialog() - LaunchedEffect(work) { - val result = runCatching { work() } - cont.resumeWith(result) +suspend fun DialogState.bgWork(work: suspend () -> R) = try { + suspendCoroutineUninterceptedOrReturn { cont -> + @Suppress("UNCHECKED_CAST") + (work as (Continuation) -> Any?)(cont).also { r -> + if (r == COROUTINE_SUSPENDED) content = { ProgressDialog() } + } } +} finally { + dismiss() }