Fuck off the silly Android launcher and callback :)

This commit is contained in:
tarsin committed 2023-05-13 18:14:06 +08:00
1 parent ae3caf84b5
commit c39e8eb43c
2 files changed
+13 -30

No files matched your search

@@ -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<Network>()
init {
initPermission()
initLauncher()
}
private fun saveImageToTempFile(uri: Uri): File? {
@@ -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<String>
private lateinit var pickVisualMediaLauncher: ActivityResultLauncher<PickVisualMediaRequest>
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<K, V> = Atomic<Pair<ActivityResultLauncher<K>, (V) -> Unit>>
private lateinit var requestPermission: LauncherAndCallback<String, Boolean>
private lateinit var pickVisualMedia: LauncherAndCallback<PickVisualMediaRequest, Uri?>
private suspend fun <K, V> LauncherAndCallback<K, V>.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())