From c39e8eb43c0101099c44ca417a7e08ff9dc5b2c4 Mon Sep 17 00:00:00 2001 From: tarsin Date: Sat, 13 May 2023 18:14:06 +0800 Subject: [PATCH] Fuck off the silly Android launcher and callback :) --- .../com/hippo/ehviewer/ui/MainActivity.kt | 4 +- .../main/java/com/hippo/util/LauncherUtils.kt | 39 ++++++------------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt index fdd6ddc8a..a226442ef 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt @@ -73,7 +73,7 @@ import com.hippo.util.addTextToClipboard import com.hippo.util.getClipboardManager import com.hippo.util.getParcelableExtraCompat import com.hippo.util.getUrlFromClipboard -import com.hippo.util.initPermission +import com.hippo.util.initLauncher import com.hippo.yorozuya.IOUtils import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.lang.launchUI @@ -92,7 +92,7 @@ class MainActivity : EhActivity() { private val availableNetworks = mutableListOf() init { - initPermission() + initLauncher() } private fun saveImageToTempFile(uri: Uri): File? { diff --git a/app/src/main/java/com/hippo/util/LauncherUtils.kt b/app/src/main/java/com/hippo/util/LauncherUtils.kt index bee70e04c..5e0236f88 100644 --- a/app/src/main/java/com/hippo/util/LauncherUtils.kt +++ b/app/src/main/java/com/hippo/util/LauncherUtils.kt @@ -9,42 +9,25 @@ import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType import androidx.core.content.ContextCompat +import arrow.atomic.Atomic import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume -private lateinit var requestPermissionLauncher: ActivityResultLauncher -private lateinit var pickVisualMediaLauncher: ActivityResultLauncher -private lateinit var callback: (Boolean) -> Unit -private lateinit var callback2: (Uri?) -> Unit +// Fuck off the silly Android launcher and callback :) -fun ComponentActivity.initPermission() { - requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission(), ::permissionCallback) - pickVisualMediaLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia(), ::pickVisualMediaCallback) -} +private typealias LauncherAndCallback = Atomic, (V) -> Unit>> +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 fun permissionCallback(v: Boolean) { - callback(v) -} - -private fun pickVisualMediaCallback(v: Uri?) { - callback2(v) +fun ComponentActivity.initLauncher() { + requestPermission = Atomic(registerForActivityResult(ActivityResultContracts.RequestPermission()) { requestPermission.get().second(it) } to {}) + pickVisualMedia = Atomic(registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { pickVisualMedia.get().second(it) } to {}) } suspend fun Context.requestPermission(key: String): Boolean { if (ContextCompat.checkSelfPermission(this, key) == PackageManager.PERMISSION_GRANTED) return true - return suspendCancellableCoroutine { cont -> - callback = { - cont.resume(it) - } - requestPermissionLauncher.launch(key) - } + return requestPermission.await(key) } -suspend fun pickVisualMedia(type: VisualMediaType): Uri? { - return suspendCancellableCoroutine { cont -> - callback2 = { - cont.resume(it) - } - pickVisualMediaLauncher.launch(PickVisualMediaRequest.Builder().setMediaType(type).build()) - } -} +suspend fun pickVisualMedia(type: VisualMediaType): Uri? = pickVisualMedia.await(PickVisualMediaRequest.Builder().setMediaType(type).build())