11package ru.mintrocket.lib.mintpermissions.internal.statuses
22
33import android.content.Context
4+ import android.util.Log
45import androidx.activity.ComponentActivity
56import androidx.core.app.ActivityCompat
67import kotlinx.coroutines.CoroutineDispatcher
78import kotlinx.coroutines.Dispatchers
89import kotlinx.coroutines.withContext
10+ import ru.mintrocket.lib.mintpermissions.BuildConfig
911import ru.mintrocket.lib.mintpermissions.internal.ext.getPackagePermissions
1012import ru.mintrocket.lib.mintpermissions.internal.ext.isPermissionGranted
1113import ru.mintrocket.lib.mintpermissions.models.MintPermission
@@ -29,7 +31,9 @@ internal class StatusProvider(
2931 ): List <MintPermissionStatus > {
3032 return withContext(dispatcher) {
3133 permissions.map { permission ->
32- val isGranted = activity.isPermissionGranted(permission)
34+ val isGranted = safePermission {
35+ activity.isPermissionGranted(permission)
36+ }
3337 toStatus(permission, isGranted, activity)
3438 }
3539 }
@@ -39,20 +43,41 @@ internal class StatusProvider(
3943 permission : MintPermission ,
4044 isGranted : Boolean ,
4145 activity : ComponentActivity
42- ) = when {
43- isGranted -> MintPermissionStatus .Granted (permission)
44- ActivityCompat .shouldShowRequestPermissionRationale(activity, permission) -> {
45- MintPermissionStatus .NeedsRationale (permission)
46+ ): MintPermissionStatus {
47+ val isNeedsRationale by lazy {
48+ safePermission {
49+ ActivityCompat .shouldShowRequestPermissionRationale(activity, permission)
50+ }
4651 }
47- getCachedPackagePermissions(activity).contains(permission) -> {
48- MintPermissionStatus .Denied (permission)
52+ return when {
53+ isGranted -> MintPermissionStatus .Granted (permission)
54+ isNeedsRationale -> {
55+ MintPermissionStatus .NeedsRationale (permission)
56+ }
57+ getCachedPackagePermissions(activity).contains(permission) -> {
58+ MintPermissionStatus .Denied (permission)
59+ }
60+ else -> MintPermissionStatus .NotFound (permission)
4961 }
50- else -> MintPermissionStatus .NotFound (permission)
5162 }
5263
5364 private fun getCachedPackagePermissions (context : Context ): List <MintPermission > {
5465 val permissions = cachedPackagePermissions ? : context.getPackagePermissions()
5566 cachedPackagePermissions = permissions
5667 return permissions
5768 }
69+
70+ // Needs only for android 23. System can throw exception if declared permission not supported
71+ // find "unknown permission" in
72+ // https://android.googlesource.com/platform/frameworks/base/+/aa2ffea8baea65c13ac2b841b3d581f28261dd2b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
73+ private fun safePermission (block : () -> Boolean ): Boolean {
74+ return try {
75+ block()
76+ } catch (ex: IllegalArgumentException ) {
77+ if (BuildConfig .DEBUG ) {
78+ Log .e(" StatusProvider" , " MintPermissions caught exception, but it is ok. $ex " )
79+ }
80+ false
81+ }
82+ }
5883}
0 commit comments