Skip to content

Commit fe53099

Browse files
committed
Add permission utils
1 parent b45c871 commit fe53099

File tree

3 files changed

+131
-4
lines changed

3 files changed

+131
-4
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.kylecorry.trailsensecore.infrastructure.system
2+
3+
data class PermissionRationale(val title: String, val reason: String)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.kylecorry.trailsensecore.infrastructure.system
2+
3+
import android.Manifest
4+
import android.app.Activity
5+
import android.content.Context
6+
import android.content.pm.PackageManager
7+
import android.os.Build
8+
import androidx.core.app.ActivityCompat
9+
import androidx.core.content.ContextCompat
10+
11+
object PermissionUtils {
12+
13+
fun isBackgroundLocationEnabled(context: Context): Boolean {
14+
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
15+
isLocationEnabled(context)
16+
} else {
17+
hasPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
18+
}
19+
}
20+
21+
fun isLocationEnabled(context: Context): Boolean {
22+
return hasPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
23+
}
24+
25+
fun hasPermission(context: Context, permission: String): Boolean {
26+
return ContextCompat.checkSelfPermission(
27+
context,
28+
permission
29+
) == PackageManager.PERMISSION_GRANTED
30+
}
31+
32+
fun requestPermissions(activity: Activity, permissions: List<String>, requestCode: Int) {
33+
if (permissions.isEmpty()) {
34+
activity.onRequestPermissionsResult(
35+
requestCode,
36+
permissions.toTypedArray(),
37+
intArrayOf()
38+
)
39+
return
40+
}
41+
ActivityCompat.requestPermissions(activity, permissions.toTypedArray(), requestCode)
42+
}
43+
44+
fun requestPermissionsWithRationale(
45+
activity: Activity,
46+
permissions: List<String>,
47+
rationale: PermissionRationale,
48+
requestCode: Int,
49+
buttonGrant: String,
50+
buttonDeny: String
51+
) {
52+
UiUtils.alertWithCancel(
53+
activity,
54+
rationale.title,
55+
rationale.reason,
56+
buttonGrant,
57+
buttonDeny
58+
) { cancelled ->
59+
if (!cancelled) {
60+
requestPermissions(activity, permissions, requestCode)
61+
} else {
62+
activity.onRequestPermissionsResult(
63+
requestCode,
64+
permissions.toTypedArray(),
65+
intArrayOf(PackageManager.PERMISSION_DENIED)
66+
)
67+
}
68+
}
69+
}
70+
71+
}

app/src/main/java/com/kylecorry/trailsensecore/infrastructure/system/UiUtils.kt

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,31 @@ import androidx.core.content.res.ResourcesCompat
1414

1515
object UiUtils {
1616

17+
fun alert(
18+
context: Context,
19+
title: String,
20+
content: String,
21+
onClose: (() -> Unit)? = null
22+
): AlertDialog {
23+
return alert(context, title, content, R.string.ok, onClose)
24+
}
25+
1726
fun alert(
1827
context: Context,
1928
title: String,
2029
content: String,
2130
@StringRes okString: Int,
2231
onClose: (() -> Unit)? = null
32+
): AlertDialog {
33+
return alert(context, title, content, context.getString(okString), onClose)
34+
}
35+
36+
fun alert(
37+
context: Context,
38+
title: String,
39+
content: String,
40+
okString: String,
41+
onClose: (() -> Unit)? = null
2342
): AlertDialog {
2443
val builder = AlertDialog.Builder(context)
2544
builder.apply {
@@ -42,22 +61,56 @@ object UiUtils {
4261
context: Context,
4362
title: String,
4463
content: String,
45-
@StringRes okString: Int,
46-
@StringRes cancelString: Int,
64+
@StringRes buttonOk: Int,
65+
@StringRes buttonCancel: Int,
66+
onClose: ((cancelled: Boolean) -> Unit)? = null
67+
): AlertDialog {
68+
return alertWithCancel(
69+
context,
70+
title,
71+
content,
72+
context.getString(buttonOk),
73+
context.getString(buttonCancel),
74+
onClose
75+
)
76+
}
77+
78+
fun alertWithCancel(
79+
context: Context,
80+
title: String,
81+
content: String,
82+
onClose: ((cancelled: Boolean) -> Unit)? = null
83+
): AlertDialog {
84+
return alertWithCancel(
85+
context,
86+
title,
87+
content,
88+
R.string.ok,
89+
R.string.cancel,
90+
onClose
91+
)
92+
}
93+
94+
fun alertWithCancel(
95+
context: Context,
96+
title: String,
97+
content: String,
98+
buttonOk: String,
99+
buttonCancel: String,
47100
onClose: ((cancelled: Boolean) -> Unit)? = null
48101
): AlertDialog {
49102
val builder = AlertDialog.Builder(context)
50103
builder.apply {
51104
setMessage(content)
52105
setTitle(title)
53106
setPositiveButton(
54-
okString
107+
buttonOk
55108
) { dialog, _ ->
56109
onClose?.invoke(false)
57110
dialog.dismiss()
58111
}
59112
setNegativeButton(
60-
cancelString
113+
buttonCancel
61114
) { dialog, _ ->
62115
onClose?.invoke(true)
63116
dialog.dismiss()

0 commit comments

Comments
 (0)