11package com.zoontek.rnpermissions
22
3- import android.Manifest
43import android.app.AlarmManager
54import android.content.Context
65import android.content.Intent
@@ -34,31 +33,29 @@ object RNPermissionsModuleImpl {
3433 private const val UNAVAILABLE = " unavailable"
3534 private const val BLOCKED = " blocked"
3635
37- private fun isPermissionAvailable (context : ReactApplicationContext , permission : String ): Boolean {
38- val fieldName = permission
39- .removePrefix(" android.permission." )
40- .removePrefix(" com.android.voicemail.permission." )
41-
42- val availableInManifest = runCatching {
43- Manifest .permission::class .java.getField(fieldName)
44- }.isSuccess
45-
46- val manager = context.packageManager
47-
48- val groups = manager.getAllPermissionGroups(0 ).toMutableList().apply {
49- add(null ) // Add ungrouped permissions
50- }
51-
52- val availableInGroups = groups.any { group ->
53- runCatching {
54- manager.queryPermissionsByGroup(group?.name, 0 )
55- }.getOrDefault(emptyList()).any {
56- it?.name == permission
57- }
58- }
59-
60- return availableInManifest || availableInGroups
61- }
36+ // Based on https://developer.android.com/reference/android/Manifest.permission
37+ // Permissions not explicitly listed are considered available (API < 21)
38+ private val minimumApi = mapOf (
39+ " android.permission.ACCEPT_HANDOVER" to 28 ,
40+ " android.permission.ACCESS_BACKGROUND_LOCATION" to 29 ,
41+ " android.permission.ACCESS_MEDIA_LOCATION" to 29 ,
42+ " android.permission.ACTIVITY_RECOGNITION" to 29 ,
43+ " android.permission.ANSWER_PHONE_CALLS" to 26 ,
44+ " android.permission.BLUETOOTH_ADVERTISE" to 31 ,
45+ " android.permission.BLUETOOTH_CONNECT" to 31 ,
46+ " android.permission.BLUETOOTH_SCAN" to 31 ,
47+ " android.permission.BODY_SENSORS_BACKGROUND" to 33 ,
48+ " android.permission.NEARBY_WIFI_DEVICES" to 33 ,
49+ " android.permission.READ_MEDIA_AUDIO" to 33 ,
50+ " android.permission.READ_MEDIA_IMAGES" to 33 ,
51+ " android.permission.READ_MEDIA_VIDEO" to 33 ,
52+ " android.permission.READ_MEDIA_VISUAL_USER_SELECTED" to 34 ,
53+ " android.permission.READ_PHONE_NUMBERS" to 26 ,
54+ " android.permission.UWB_RANGING" to 31
55+ )
56+
57+ private fun isPermissionAvailable (permission : String ): Boolean =
58+ Build .VERSION .SDK_INT >= minimumApi.getOrDefault(permission, Build .VERSION_CODES .BASE )
6259
6360 fun openSettings (reactContext : ReactApplicationContext , type : String? , promise : Promise ) {
6461 try {
@@ -100,7 +97,7 @@ object RNPermissionsModuleImpl {
10097 }
10198
10299 fun check (reactContext : ReactApplicationContext , permission : String , promise : Promise ) {
103- if (! isPermissionAvailable(reactContext, permission)) {
100+ if (! isPermissionAvailable(permission)) {
104101 return promise.resolve(UNAVAILABLE )
105102 }
106103
@@ -135,7 +132,7 @@ object RNPermissionsModuleImpl {
135132 output.putString(
136133 permission,
137134 when {
138- ! isPermissionAvailable(reactContext, permission) -> UNAVAILABLE
135+ ! isPermissionAvailable(permission) -> UNAVAILABLE
139136 context.checkSelfPermission(permission) == PackageManager .PERMISSION_GRANTED -> GRANTED
140137 else -> DENIED
141138 }
@@ -152,7 +149,7 @@ object RNPermissionsModuleImpl {
152149 permission : String ,
153150 promise : Promise
154151 ) {
155- if (! isPermissionAvailable(reactContext, permission)) {
152+ if (! isPermissionAvailable(permission)) {
156153 return promise.resolve(UNAVAILABLE )
157154 }
158155
@@ -214,7 +211,7 @@ object RNPermissionsModuleImpl {
214211 for (i in 0 until permissions.size()) {
215212 val permission = permissions.getString(i)
216213
217- if (! isPermissionAvailable(reactContext, permission)) {
214+ if (! isPermissionAvailable(permission)) {
218215 output.putString(permission, UNAVAILABLE )
219216 checkedPermissionsCount++
220217 } else if (context.checkSelfPermission(permission) == PackageManager .PERMISSION_GRANTED ) {
0 commit comments