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
import android.graphics.drawable.Icon
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Cancel
import androidx.compose.material.icons.filled.OpenInBrowser
import androidx.compose.material.icons.filled.OpenInNew
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
@ -18,15 +16,12 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.PermissionChecker
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import app.myzel394.locationtest.ui.utils.PermissionHelper
import app.myzel394.locationtest.ui.utils.openAppSystemSettings
import kotlinx.serialization.json.JsonNull.content
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PermissionRequester(
permission: Array<String>,
@ -36,20 +31,23 @@ fun PermissionRequester(
) {
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)) {
onPermissionAvailable()
} else {
showPermissionDenied = true
}
}
if (showPermissionDenied) {
if (showExplanationDialog) {
AlertDialog(
onDismissRequest = {
showPermissionDenied = false
showExplanationDialog = false
},
icon = icon,
title = {
@ -61,7 +59,7 @@ fun PermissionRequester(
confirmButton = {
Button(
onClick = {
showPermissionDenied = false
showExplanationDialog = false
context.openAppSystemSettings()
}
) {
@ -77,7 +75,7 @@ fun PermissionRequester(
dismissButton = {
Button(
onClick = {
showPermissionDenied = false
showExplanationDialog = false
},
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 androidx.core.app.ActivityCompat
fun Context.openAppSystemSettings() {
startActivity(Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts("package", packageName, null)
})
}
// From @Bnyro
object PermissionHelper {
fun checkPermissions(context: Context, permissions: Array<String>): Boolean {
permissions.forEach {
if (!hasPermission(context, it)) {
if (!hasGranted(context, it)) {
ActivityCompat.requestPermissions(
context as Activity,
arrayOf(it),
@ -31,10 +24,25 @@ object PermissionHelper {
return true
}
fun hasPermission(context: Context, permission: String): Boolean {
return ActivityCompat.checkSelfPermission(
context,
permission
) == PackageManager.PERMISSION_GRANTED
fun hasGranted(context: Context, permission: String): Boolean =
ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
fun hasPermanentlyDenied(context: Context, permission: String): Boolean =
!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)
})
}