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
|
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)
|
||||||
}
|
}
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user