diff --git a/app/src/main/java/com/hippo/util/LauncherUtils.kt b/app/src/main/java/com/hippo/util/LauncherUtils.kt index 5e0236f88..219dd7de3 100644 --- a/app/src/main/java/com/hippo/util/LauncherUtils.kt +++ b/app/src/main/java/com/hippo/util/LauncherUtils.kt @@ -10,15 +10,20 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType import androidx.core.content.ContextCompat import arrow.atomic.Atomic +import arrow.atomic.update import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume // Fuck off the silly Android launcher and callback :) private typealias LauncherAndCallback = Atomic, (V) -> Unit>> +private fun 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) } +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 fun ComponentActivity.initLauncher() { requestPermission = Atomic(registerForActivityResult(ActivityResultContracts.RequestPermission()) { requestPermission.get().second(it) } to {})