From 37dcad7d6faf57fcbd56ab4519c85b34ed15c02f Mon Sep 17 00:00:00 2001 From: tarsin Date: Sat, 13 May 2023 18:22:30 +0800 Subject: [PATCH] Always do activity launch in Dispatcher.Main --- app/src/main/java/com/hippo/util/LauncherUtils.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/hippo/util/LauncherUtils.kt b/app/src/main/java/com/hippo/util/LauncherUtils.kt index 219dd7de3..b43c4bc38 100644 --- a/app/src/main/java/com/hippo/util/LauncherUtils.kt +++ b/app/src/main/java/com/hippo/util/LauncherUtils.kt @@ -11,6 +11,7 @@ import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia import androidx.core.content.ContextCompat import arrow.atomic.Atomic import arrow.atomic.update +import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume @@ -20,10 +21,12 @@ private typealias LauncherAndCallback = Atomic LauncherAndCallback.cleanup() = update { it.copy {} } private lateinit var requestPermission: LauncherAndCallback private lateinit var pickVisualMedia: LauncherAndCallback -private suspend fun LauncherAndCallback.await(key: K) = suspendCancellableCoroutine { cont -> - updateAndGet { prev -> prev.copy { cont.resume(it) } }.first.launch(key) - cont.invokeOnCancellation { cleanup() } // Drop continuation when cancelled -}.apply { cleanup() } // Drop continuation when completed +private suspend fun LauncherAndCallback.await(key: K) = withUIContext { + suspendCancellableCoroutine { cont -> + updateAndGet { prev -> prev.copy { cont.resume(it) } }.first.launch(key) + cont.invokeOnCancellation { cleanup() } // Drop continuation when cancelled + }.apply { cleanup() } // Drop continuation when completed +} fun ComponentActivity.initLauncher() { requestPermission = Atomic(registerForActivityResult(ActivityResultContracts.RequestPermission()) { requestPermission.get().second(it) } to {})