fix: Improve permission requester

This commit is contained in:
Myzel394 2023-08-06 13:42:02 +02:00
parent ba70c4b605
commit 46f74e8a8b
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
2 changed files with 33 additions and 27 deletions

View File

@ -1,12 +1,10 @@
package app.myzel394.locationtest.ui.components.atoms package app.myzel394.locationtest.ui.components.atoms
import android.graphics.drawable.Icon
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Cancel import androidx.compose.material.icons.filled.Cancel
import androidx.compose.material.icons.filled.OpenInBrowser
import androidx.compose.material.icons.filled.OpenInNew import androidx.compose.material.icons.filled.OpenInNew
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
@ -18,15 +16,12 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.core.content.PermissionChecker
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import app.myzel394.locationtest.ui.utils.PermissionHelper import app.myzel394.locationtest.ui.utils.PermissionHelper
import app.myzel394.locationtest.ui.utils.openAppSystemSettings import app.myzel394.locationtest.ui.utils.openAppSystemSettings
import kotlinx.serialization.json.JsonNull.content
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun PermissionRequester( fun PermissionRequester(
permission: Array<String>, permission: Array<String>,
@ -36,20 +31,23 @@ fun PermissionRequester(
) { ) {
val context = LocalContext.current val context = LocalContext.current
var showPermissionDenied by remember { mutableStateOf(false) } var showExplanationDialog by remember { mutableStateOf(false) }
fun callback() {
if (PermissionHelper.hasPermanentlyDenied(context, permission)) {
showExplanationDialog = true
return
}
val callback = {
if (PermissionHelper.checkPermissions(context, permission)) { if (PermissionHelper.checkPermissions(context, permission)) {
onPermissionAvailable() onPermissionAvailable()
} else {
showPermissionDenied = true
} }
} }
if (showPermissionDenied) { if (showExplanationDialog) {
AlertDialog( AlertDialog(
onDismissRequest = { onDismissRequest = {
showPermissionDenied = false showExplanationDialog = false
}, },
icon = icon, icon = icon,
title = { title = {
@ -61,7 +59,7 @@ fun PermissionRequester(
confirmButton = { confirmButton = {
Button( Button(
onClick = { onClick = {
showPermissionDenied = false showExplanationDialog = false
context.openAppSystemSettings() context.openAppSystemSettings()
} }
) { ) {
@ -77,7 +75,7 @@ fun PermissionRequester(
dismissButton = { dismissButton = {
Button( Button(
onClick = { onClick = {
showPermissionDenied = false showExplanationDialog = false
}, },
colors = ButtonDefaults.textButtonColors(), colors = ButtonDefaults.textButtonColors(),
) { ) {
@ -92,5 +90,5 @@ fun PermissionRequester(
} }
) )
} }
content(callback) content(::callback)
} }

View File

@ -8,18 +8,11 @@ import android.net.Uri
import android.provider.Settings import android.provider.Settings
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
fun Context.openAppSystemSettings() {
startActivity(Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts("package", packageName, null)
})
}
// From @Bnyro // From @Bnyro
object PermissionHelper { object PermissionHelper {
fun checkPermissions(context: Context, permissions: Array<String>): Boolean { fun checkPermissions(context: Context, permissions: Array<String>): Boolean {
permissions.forEach { permissions.forEach {
if (!hasPermission(context, it)) { if (!hasGranted(context, it)) {
ActivityCompat.requestPermissions( ActivityCompat.requestPermissions(
context as Activity, context as Activity,
arrayOf(it), arrayOf(it),
@ -31,10 +24,25 @@ object PermissionHelper {
return true return true
} }
fun hasPermission(context: Context, permission: String): Boolean { fun hasGranted(context: Context, permission: String): Boolean =
return ActivityCompat.checkSelfPermission( ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
context,
permission fun hasPermanentlyDenied(context: Context, permission: String): Boolean =
) == PackageManager.PERMISSION_GRANTED !hasGranted(context, permission) &&
!ActivityCompat.shouldShowRequestPermissionRationale(context as Activity, permission)
fun hasPermanentlyDenied(context: Context, permission: Array<String>): Boolean {
permission.forEach {
if (hasPermanentlyDenied(context, it))
return true
}
return false
} }
} }
fun Context.openAppSystemSettings() {
startActivity(Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts("package", packageName, null)
})
}