From 3c0da086f5c5472a7c9956e59d0f8821beb0bc61 Mon Sep 17 00:00:00 2001 From: tarsin Date: Thu, 6 Apr 2023 14:19:51 +0800 Subject: [PATCH] Cleanup permission request --- .../com/hippo/ehviewer/ui/CommonOperations.kt | 12 ++++--- .../java/com/hippo/ehviewer/ui/EhActivity.kt | 22 ------------- .../com/hippo/ehviewer/ui/MainActivity.kt | 5 +++ .../java/com/hippo/util/PermissionUtils.kt | 31 +++++++++++++++++++ 4 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/hippo/util/PermissionUtils.kt diff --git a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt index e54bc020a..a4720c431 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt @@ -15,13 +15,13 @@ */ package com.hippo.ehviewer.ui +import android.Manifest import android.app.Activity import android.content.Intent import android.os.Build import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import com.hippo.app.ListCheckBoxDialogBuilder -import com.hippo.ehviewer.EhApplication.Companion.application import com.hippo.ehviewer.EhApplication.Companion.favouriteStatusRouter import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R @@ -32,7 +32,9 @@ import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.download.DownloadService import com.hippo.ehviewer.ui.scene.BaseScene import com.hippo.unifile.UniFile +import com.hippo.util.requestPermission import com.hippo.yorozuya.collect.LongList +import eu.kanade.tachiyomi.util.lang.launchNow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import com.hippo.ehviewer.download.DownloadManager as downloadManager @@ -132,10 +134,12 @@ object CommonOperations { galleryInfos: List, forceDefault: Boolean, ) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - application.topActivity?.checkAndRequestNotificationPermission() + launchNow { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + activity.requestPermission(Manifest.permission.POST_NOTIFICATIONS) + } + doStartDownload(activity, galleryInfos, forceDefault) } - doStartDownload(activity, galleryInfos, forceDefault) } private fun doStartDownload( diff --git a/app/src/main/java/com/hippo/ehviewer/ui/EhActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/EhActivity.kt index cd09c3d99..3dcea6d16 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/EhActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/EhActivity.kt @@ -15,17 +15,11 @@ */ package com.hippo.ehviewer.ui -import android.Manifest import android.content.Intent -import android.content.pm.PackageManager import android.content.res.Resources.Theme -import android.os.Build import android.os.Bundle -import androidx.activity.result.contract.ActivityResultContracts -import androidx.annotation.RequiresApi import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat import com.hippo.ehviewer.EhApplication import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings @@ -72,20 +66,4 @@ abstract class EhActivity : AppCompatActivity() { super.onResume() window.setSecureScreen(Settings.enabledSecurity) } - - private val requestPermissionLauncher = - registerForActivityResult(ActivityResultContracts.RequestPermission()) { Settings.putNotificationRequired() } - - @RequiresApi(Build.VERSION_CODES.TIRAMISU) - fun checkAndRequestNotificationPermission() { - if (ContextCompat.checkSelfPermission( - this, - Manifest.permission.POST_NOTIFICATIONS, - ) == PackageManager.PERMISSION_GRANTED - ) { - return - } - if (Settings.notificationRequired) return - requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) - } } 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 601ccb9d5..6daa167dc 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt @@ -75,6 +75,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.yorozuya.IOUtils import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.lang.launchUI @@ -92,6 +93,10 @@ class MainActivity : EhActivity() { private val connectivityManager by lazy { getSystemService()!! } private val availableNetworks = mutableListOf() + init { + initPermission() + } + private fun saveImageToTempFile(uri: Uri): File? { val src = ImageDecoder.createSource(contentResolver, uri) val bitmap = runCatching { diff --git a/app/src/main/java/com/hippo/util/PermissionUtils.kt b/app/src/main/java/com/hippo/util/PermissionUtils.kt new file mode 100644 index 000000000..60cf05f2e --- /dev/null +++ b/app/src/main/java/com/hippo/util/PermissionUtils.kt @@ -0,0 +1,31 @@ +package com.hippo.util + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import androidx.activity.ComponentActivity +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlin.coroutines.resume + +private lateinit var requestPermissionLauncher: ActivityResultLauncher +private lateinit var callback: (Boolean) -> Unit +fun ComponentActivity.initPermission() { + requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission(), ::permissionCallback) +} + +private fun permissionCallback(v: Boolean) { + callback(v) +} + +suspend fun Context.requestPermission(key: String): Boolean { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) return true + return suspendCancellableCoroutine { cont -> + callback = { + cont.resume(it) + } + requestPermissionLauncher.launch(key) + } +}