11package com.meticha.permissions_compose
22
3-
43import android.annotation.SuppressLint
54import android.app.Activity
65import android.content.Context
@@ -22,14 +21,13 @@ import androidx.compose.ui.platform.LocalContext
2221import androidx.core.app.ActivityCompat
2322import java.lang.ref.WeakReference
2423
25-
2624@SuppressLint(" ComposableNaming" )
2725@Composable
2826fun rememberAppPermissionState (permissions : List <AppPermission >): PermissionState {
2927 val context = LocalContext .current
3028 val activity = requireNotNull(LocalActivity .current)
3129
32- val permissionState = remember(permissions) { PermissionState (permissions) }
30+ val permissionState = remember(key1 = permissions) { PermissionState (permissionList = permissions) }
3331
3432 // Provide context access through composable scope
3533 permissionState.contextRef = WeakReference (context)
@@ -38,7 +36,7 @@ fun rememberAppPermissionState(permissions: List<AppPermission>): PermissionStat
3836 * Check if the permissions are added in the manifest file
3937 */
4038 permissions.forEach {
41- if (! checkPermissionAddedInManifest(it, context)) {
39+ if (! checkPermissionAddedInManifest(permission = it, context)) {
4240 throw PermissionNotAddedException (it.permission)
4341 }
4442 }
@@ -49,18 +47,21 @@ fun rememberAppPermissionState(permissions: List<AppPermission>): PermissionStat
4947 )
5048
5149 // Set up permission launcher
52- permissionState.launcher = rememberLauncherForActivityResult(
53- ActivityResultContracts .RequestPermission ()
54- ) { isGranted ->
55- when {
56- isGranted -> {
57- permissionState.next()
58- permissionState.allRequiredGranted()
59- }
50+ permissionState.launcher =
51+ rememberLauncherForActivityResult(
52+ contract = ActivityResultContracts .RequestPermission ()
53+ ) { isGranted ->
54+ when {
55+ isGranted -> {
56+ permissionState.next()
57+ permissionState.allRequiredGranted()
58+ }
6059
61- else -> handlePermissionDenial(permissionState, activity)
60+ else -> {
61+ handlePermissionDenial(permissionState, activity)
62+ }
63+ }
6264 }
63- }
6465
6566 // Display permission rationale popup if needed
6667 permissionState.currentPermission?.let { permission ->
@@ -75,7 +76,6 @@ fun rememberAppPermissionState(permissions: List<AppPermission>): PermissionStat
7576 permissionState.requestPermission()
7677 }
7778 )
78-
7979 } else {
8080 ShowPopup (
8181 message = permission.description,
@@ -98,7 +98,6 @@ fun rememberAppPermissionState(permissions: List<AppPermission>): PermissionStat
9898 openAppSettings(context)
9999 }
100100 )
101-
102101 } else {
103102 ShowSettings (
104103 message = permission.description,
@@ -116,25 +115,30 @@ fun rememberAppPermissionState(permissions: List<AppPermission>): PermissionStat
116115 return permissionState
117116}
118117
119-
120118/* *
121119 * Handles permission denial, showing appropriate UI based on denial context
122120 */
123- private fun handlePermissionDenial (permissionState : PermissionState , activity : Activity ) {
121+ private fun handlePermissionDenial (
122+ permissionState : PermissionState ,
123+ activity : Activity
124+ ) {
124125 permissionState.currentPermission?.let { currentPermission ->
125126 when {
126127 currentPermission.isRequired &&
127- ActivityCompat .shouldShowRequestPermissionRationale(
128- activity,
129- currentPermission.permission
130- ) ->
128+ ActivityCompat .shouldShowRequestPermissionRationale(
129+ activity,
130+ currentPermission.permission
131+ ) -> {
131132 permissionState.showRationalePopUp = true
133+ }
132134
133- currentPermission.isRequired ->
135+ currentPermission.isRequired -> {
134136 permissionState.showSettingsPopUp = true
137+ }
135138
136- else ->
139+ else -> {
137140 permissionState.next()
141+ }
138142 }
139143 }
140144}
@@ -154,7 +158,7 @@ private fun openAppSettings(context: Context) {
154158 * Manages the state of permission requests and their UI flows
155159 */
156160class PermissionState (
157- permissionList : List <AppPermission >,
161+ permissionList : List <AppPermission >
158162) {
159163 // WeakReference to context to avoid memory leaks
160164 lateinit var contextRef: WeakReference <Context >
@@ -166,31 +170,32 @@ class PermissionState(
166170 private var pendingPermissions = mutableStateListOf<AppPermission >()
167171
168172 // Currently processing permission
169- internal var currentPermission by mutableStateOf<AppPermission ?>(null )
173+ internal var currentPermission by mutableStateOf<AppPermission ?>(value = null )
170174
171175 // UI state
172- internal var showRationalePopUp by mutableStateOf(false )
173- internal var showSettingsPopUp by mutableStateOf(false )
174- internal var resumedFromSettings by mutableStateOf(false )
176+ internal var showRationalePopUp by mutableStateOf(value = false )
177+ internal var showSettingsPopUp by mutableStateOf(value = false )
178+ internal var resumedFromSettings by mutableStateOf(value = false )
175179
176180 // Permission states
177- private var isRequiredPermissionGranted by mutableStateOf(false )
181+ private var isRequiredPermissionGranted by mutableStateOf(value = false )
178182
179183 // Permission request launcher
180184 internal var launcher: ManagedActivityResultLauncher <String , Boolean >? = null
181185
182186 init {
183- allPermissions.addAll(permissionList)
184- pendingPermissions.addAll(permissionList)
187+ allPermissions.addAll(elements = permissionList)
188+ pendingPermissions.addAll(elements = permissionList)
185189 }
186190
187191 /* *
188192 * Checks if all required permissions are actually granted
189193 */
190194 fun allRequiredGranted (): Boolean {
191- isRequiredPermissionGranted = allPermissions
192- .filter { it.isRequired }
193- .all { isGranted(it.permission) }
195+ isRequiredPermissionGranted =
196+ allPermissions
197+ .filter { it.isRequired }
198+ .all { isGranted(it.permission) }
194199 return isRequiredPermissionGranted
195200 }
196201
@@ -212,7 +217,7 @@ class PermissionState(
212217 if (isGranted(permission.permission)) {
213218 next() // Permission already granted, move to next
214219 } else {
215- launcher?.launch(permission.permission)
220+ launcher?.launch(input = permission.permission)
216221 }
217222 }
218223 }
@@ -223,8 +228,8 @@ class PermissionState(
223228 */
224229 internal fun next () {
225230 if (pendingPermissions.isNotEmpty()) {
226- pendingPermissions.removeAt(0 )
231+ pendingPermissions.removeAt(index = 0 )
227232 }
228233 requestPermission()
229234 }
230- }
235+ }
0 commit comments