-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathPermissionHandler.kt
More file actions
116 lines (102 loc) · 3.57 KB
/
PermissionHandler.kt
File metadata and controls
116 lines (102 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.rngooglemapsplus
import android.Manifest
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import com.facebook.react.bridge.ReactContext
import com.facebook.react.bridge.UiThreadUtil
import com.facebook.react.modules.core.PermissionAwareActivity
import com.facebook.react.modules.core.PermissionListener
import com.margelo.nitro.core.Promise
private const val REQ_LOCATION = 1001
class PermissionHandler(
private val context: ReactContext,
) {
fun requestLocationPermission(): Promise<RNLocationPermissionResult> {
val promise = Promise<RNLocationPermissionResult>()
val perms =
arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
)
val alreadyGranted =
ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_COARSE_LOCATION,
) == PackageManager.PERMISSION_GRANTED
if (alreadyGranted) {
promise.resolve(RNLocationPermissionResult(RNAndroidLocationPermissionResult.GRANTED, null))
return promise
}
UiThreadUtil.runOnUiThread {
val hostActivity = context.currentActivity
if (hostActivity !is PermissionAwareActivity) {
promise.resolve(RNLocationPermissionResult(RNAndroidLocationPermissionResult.DENIED, null))
return@runOnUiThread
}
hostActivity.requestPermissions(
perms,
REQ_LOCATION,
object : PermissionListener {
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray,
): Boolean {
if (requestCode != REQ_LOCATION) return false
var coarseGranted = false
var fineGranted = false
for (i in permissions.indices) {
val p = permissions[i]
val r = grantResults.getOrNull(i) ?: continue
if (p == Manifest.permission.ACCESS_COARSE_LOCATION && r == PackageManager.PERMISSION_GRANTED) {
coarseGranted = true
}
if (p == Manifest.permission.ACCESS_FINE_LOCATION && r == PackageManager.PERMISSION_GRANTED) {
fineGranted = true
}
}
val hostActivity =
context.currentActivity ?: run {
promise.resolve(
RNLocationPermissionResult(
RNAndroidLocationPermissionResult.DENIED,
null,
),
)
return true
}
val granted = coarseGranted || fineGranted
if (granted) {
promise.resolve(
RNLocationPermissionResult(
RNAndroidLocationPermissionResult.GRANTED,
null,
),
)
} else {
val neverAskAgain =
!hostActivity.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION)
if (neverAskAgain) {
promise.resolve(
RNLocationPermissionResult(
RNAndroidLocationPermissionResult.NEVER_ASK_AGAIN,
null,
),
)
} else {
promise.resolve(
RNLocationPermissionResult(
RNAndroidLocationPermissionResult.DENIED,
null,
),
)
}
}
return true
}
},
)
}
return promise
}
}