-
Notifications
You must be signed in to change notification settings - Fork 12
/
PermissionHandler.kt
130 lines (105 loc) · 6.52 KB
/
PermissionHandler.kt
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
@file:JvmName("PermissionHandler")
package com.techwolf.android.permissionhandler
import android.app.Activity
import android.content.pm.PackageManager
import android.support.v13.app.FragmentCompat
import android.support.v4.app.ActivityCompat
import android.support.v4.app.ActivityCompat.requestPermissions
import android.support.v4.app.ActivityCompat.shouldShowRequestPermissionRationale
import android.support.v4.content.PermissionChecker
fun isLollipopOrBellow(): Boolean = (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.LOLLIPOP)
/**************************************
* HANDLE PERMISSIONS IN FRAGMENTS *
*************************************/
inline fun android.app.Fragment.isPermissionGranted(permission: AppPermission) = (PermissionChecker.checkSelfPermission(activity, permission.permissionName) == PackageManager.PERMISSION_GRANTED)
inline fun android.app.Fragment.isRationaleNeeded(permission: AppPermission) = FragmentCompat.shouldShowRequestPermissionRationale(this, permission.permissionName)
inline fun android.app.Fragment.requestPermission(permission: AppPermission) = FragmentCompat.requestPermissions(this, arrayOf(permission.permissionName), permission.requestCode)
inline fun android.app.Fragment.handlePermission(permission: AppPermission,
onGranted: (AppPermission) -> Unit,
onDenied: (AppPermission) -> Unit,
onRationaleNeeded: (AppPermission) -> Unit) {
when {
isLollipopOrBellow() || isPermissionGranted(permission) -> onGranted(permission)
isRationaleNeeded(permission) -> onRationaleNeeded(permission)
else -> onDenied(permission)
}
}
inline fun android.app.Fragment.handlePermission(permission: AppPermission,
onGranted: (AppPermission) -> Unit,
onRationaleNeeded: (AppPermission) -> Unit) {
when {
isLollipopOrBellow() || isPermissionGranted(permission) -> onGranted(permission)
isRationaleNeeded(permission) -> onRationaleNeeded(permission)
else -> requestPermission(permission)
}
}
/**************************************
* HANDLE PERMISSIONS IN v4 FRAGMENTS *
*************************************/
inline fun android.support.v4.app.Fragment.isPermissionGranted(permission: AppPermission) = (PermissionChecker.checkSelfPermission(activity, permission.permissionName) == PackageManager.PERMISSION_GRANTED)
inline fun android.support.v4.app.Fragment.isRationaleNeeded(permission: AppPermission) = shouldShowRequestPermissionRationale(activity, permission.permissionName)
inline fun android.support.v4.app.Fragment.requestPermission(permission: AppPermission) = requestPermissions(arrayOf(permission.permissionName), permission.requestCode)
inline fun android.support.v4.app.Fragment.handlePermission(permission: AppPermission,
onGranted: (AppPermission) -> Unit,
onDenied: (AppPermission) -> Unit,
onRationaleNeeded: (AppPermission) -> Unit) {
when {
isLollipopOrBellow() || isPermissionGranted(permission) -> onGranted(permission)
isRationaleNeeded(permission) -> onRationaleNeeded(permission)
else -> onDenied(permission)
}
}
inline fun android.support.v4.app.Fragment.handlePermission(permission: AppPermission,
onGranted: (AppPermission) -> Unit,
onRationaleNeeded: (AppPermission) -> Unit) {
when {
isLollipopOrBellow() || isPermissionGranted(permission) -> onGranted(permission)
isRationaleNeeded(permission) -> onRationaleNeeded(permission)
else -> requestPermission(permission)
}
}
/************************************
* HANDLE PERMISSIONS IN ACTIVITIES *
***********************************/
inline fun Activity.isPermissionGranted(permission: AppPermission) = (PermissionChecker.checkSelfPermission(this, permission.permissionName) == PackageManager.PERMISSION_GRANTED)
inline fun Activity.isRationaleNeeded(permission: AppPermission) = ActivityCompat.shouldShowRequestPermissionRationale(this, permission.permissionName)
inline fun Activity.requestPermission(permission: AppPermission) = requestPermissions(this, arrayOf(permission.permissionName), permission.requestCode)
inline fun Activity.handlePermission(permission: AppPermission,
onGranted: (AppPermission) -> Unit,
onDenied: (AppPermission) -> Unit,
onRationaleNeeded: (AppPermission) -> Unit) {
when {
isLollipopOrBellow() || isPermissionGranted(permission) -> onGranted(permission)
isRationaleNeeded(permission) -> onRationaleNeeded(permission)
else -> onDenied(permission)
}
}
inline fun Activity.handlePermission(permission: AppPermission,
onGranted: (AppPermission) -> Unit,
onRationaleNeeded: (AppPermission) -> Unit) {
when {
isLollipopOrBellow() || isPermissionGranted(permission) -> onGranted(permission)
isRationaleNeeded(permission) -> onRationaleNeeded(permission)
else -> requestPermission(permission)
}
}
/*********************************************
* HANDLE onRequestPermissionResult CALLBACK *
********************************************/
fun onRequestPermissionsResultReceived(requestCode: Int, permissions: Array<out String>,
grantResults: IntArray,
onPermissionGranted: (AppPermission) -> Unit,
onPermissionDenied: (AppPermission) -> Unit) {
AppPermission.permissions.find {
it.requestCode == requestCode
}?.let {
val permissionGrantResult = mapPermissionsAndResults(permissions, grantResults)[it.permissionName]
if (PackageManager.PERMISSION_GRANTED == permissionGrantResult) {
onPermissionGranted(it)
} else {
onPermissionDenied(it)
}
}
}
private fun mapPermissionsAndResults(permissions: Array<out String>, grantResults: IntArray): Map<String, Int>
= permissions.mapIndexedTo(mutableListOf<Pair<String, Int>>()) { index, permission -> permission to grantResults[index] }.toMap()