diff --git a/app/src/main/java/app/myzel394/locationtest/ui/components/atoms/PermissionRequester.kt b/app/src/main/java/app/myzel394/locationtest/ui/components/atoms/PermissionRequester.kt index 9145f1b..e33695c 100644 --- a/app/src/main/java/app/myzel394/locationtest/ui/components/atoms/PermissionRequester.kt +++ b/app/src/main/java/app/myzel394/locationtest/ui/components/atoms/PermissionRequester.kt @@ -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, @@ -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) } \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/locationtest/ui/utils/PermissionHelper.kt b/app/src/main/java/app/myzel394/locationtest/ui/utils/PermissionHelper.kt index be514bb..a339f32 100644 --- a/app/src/main/java/app/myzel394/locationtest/ui/utils/PermissionHelper.kt +++ b/app/src/main/java/app/myzel394/locationtest/ui/utils/PermissionHelper.kt @@ -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): 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): 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) + }) +}