mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-18 23:05:26 +02:00
fix: Improve permission requester
This commit is contained in:
parent
ba70c4b605
commit
46f74e8a8b
@ -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)
|
||||
}
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user