Skip to content

Commit 6788c7a

Browse files
authored
Merge pull request #17 from joyner-perez/feature/upgrade_libs_and_clean_project
Upgrade libs and clean project
2 parents e289ed1 + 04ce4e1 commit 6788c7a

12 files changed

Lines changed: 96 additions & 88 deletions

File tree

.idea/gradle.xml

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/ktlint-plugin.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle.kts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2-
31
plugins {
42
alias(libs.plugins.android.application)
53
alias(libs.plugins.kotlin.compose)
@@ -23,20 +21,14 @@ android {
2321
release {
2422
isMinifyEnabled = false
2523
proguardFiles(
26-
getDefaultProguardFile("proguard-android-optimize.txt"),
27-
"proguard-rules.pro"
24+
getDefaultProguardFile(name = "proguard-android-optimize.txt"),
25+
"proguard-rules.pro",
2826
)
2927
}
3028
}
3129
compileOptions {
32-
sourceCompatibility = JavaVersion.VERSION_11
33-
targetCompatibility = JavaVersion.VERSION_11
34-
}
35-
36-
kotlin {
37-
compilerOptions {
38-
jvmTarget = JvmTarget.JVM_11
39-
}
30+
sourceCompatibility = JavaVersion.VERSION_21
31+
targetCompatibility = JavaVersion.VERSION_21
4032
}
4133

4234
buildFeatures {
@@ -62,4 +54,4 @@ dependencies {
6254
androidTestImplementation(libs.androidx.ui.test.junit4)
6355
debugImplementation(libs.androidx.ui.tooling)
6456
debugImplementation(libs.androidx.ui.test.manifest)
65-
}
57+
}

gradle/libs.versions.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
[versions]
2-
agp = "9.0.0"
2+
agp = "9.0.1"
33
kotlin = "2.3.10"
44
coreKtx = "1.17.0"
55
junit = "4.13.2"
66
junitVersion = "1.3.0"
77
espressoCore = "3.7.0"
88
lifecycleRuntimeKtx = "2.10.0"
9-
activityCompose = "1.12.3"
10-
composeBom = "2026.01.01"
9+
activityCompose = "1.12.4"
10+
composeBom = "2026.02.00"
11+
mavenPublishPlugin = "0.36.0"
1112
permissionsCompose = "1.0.5"
1213

1314
[libraries]

permissions-compose/build.gradle.kts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
33
plugins {
44
alias(libs.plugins.android.library)
55
alias(libs.plugins.kotlin.compose)
6-
id("com.vanniktech.maven.publish") version "0.36.0"
6+
id("com.vanniktech.maven.publish") version libs.versions.mavenPublishPlugin.get()
77
}
88

99
android {
@@ -21,8 +21,8 @@ android {
2121
release {
2222
isMinifyEnabled = false
2323
proguardFiles(
24-
getDefaultProguardFile("proguard-android-optimize.txt"),
25-
"proguard-rules.pro"
24+
getDefaultProguardFile(name = "proguard-android-optimize.txt"),
25+
"proguard-rules.pro",
2626
)
2727
}
2828
}
@@ -58,14 +58,14 @@ mavenPublishing {
5858
publishToMavenCentral()
5959
signAllPublications()
6060

61-
coordinates("com.meticha", "permissions_compose", "1.0.5")
61+
coordinates(groupId = "com.meticha", artifactId = "permissions_compose", version = libs.versions.permissionsCompose.get())
6262

6363
pom {
6464
name = "permissions_compose"
6565
description =
6666
"A lightweight Android library that simplifies runtime permission management in Jetpack Compose applications."
6767
inceptionYear = "2025"
68-
version = "1.0.5"
68+
version = libs.versions.permissionsCompose.get()
6969
url = "https://github.com/meticha/permissions-compose.git"
7070
licenses {
7171
license {
@@ -88,4 +88,3 @@ mavenPublishing {
8888
}
8989
}
9090
}
91-

permissions-compose/src/main/java/com/meticha/permissions_compose/AppPermission.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,3 @@ data class AppPermission(
55
val description: String,
66
val isRequired: Boolean
77
)
8-

permissions-compose/src/main/java/com/meticha/permissions_compose/CustomDialog.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,3 @@ object PermissionManagerConfig {
5454
_customSettingsUI = null
5555
}
5656
}
57-
58-
59-
60-

permissions-compose/src/main/java/com/meticha/permissions_compose/DefaultDialogs.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.meticha.permissions_compose
22

3-
43
import androidx.compose.material3.AlertDialog
54
import androidx.compose.material3.Button
65
import androidx.compose.material3.Text

permissions-compose/src/main/java/com/meticha/permissions_compose/PermissionLifecycleEffect.kt

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.DisposableEffect
66
import androidx.lifecycle.Lifecycle
77
import androidx.lifecycle.LifecycleEventObserver
8-
import androidx.lifecycle.LifecycleOwner
98
import androidx.lifecycle.compose.LocalLifecycleOwner
109

11-
1210
/**
1311
* Monitors lifecycle events to handle permission state after returning from Settings
1412
*/
@@ -17,18 +15,18 @@ fun PermissionLifeCycleCheckEffect(
1715
permissionState: PermissionState,
1816
lifecycleEvent: Lifecycle.Event = Lifecycle.Event.ON_RESUME
1917
) {
20-
21-
val observer = LifecycleEventObserver { _, event ->
22-
Log.e("COMPOSE PERMISSION", "Event: $event")
23-
if (event == lifecycleEvent) {
24-
if (permissionState.resumedFromSettings) {
25-
permissionState.requestPermission()
26-
permissionState.resumedFromSettings = false
18+
val observer =
19+
LifecycleEventObserver { _, event ->
20+
Log.e("COMPOSE PERMISSION", "Event: $event")
21+
if (event == lifecycleEvent) {
22+
if (permissionState.resumedFromSettings) {
23+
permissionState.requestPermission()
24+
permissionState.resumedFromSettings = false
25+
}
2726
}
2827
}
29-
}
3028
val lifecycleOwner = LocalLifecycleOwner.current
31-
DisposableEffect(lifecycleOwner) {
29+
DisposableEffect(key1 = lifecycleOwner) {
3230
lifecycleOwner.lifecycle.addObserver(observer)
3331
onDispose {
3432
lifecycleOwner.lifecycle.removeObserver(observer)

permissions-compose/src/main/java/com/meticha/permissions_compose/PermissionState.kt

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.meticha.permissions_compose
22

3-
43
import android.annotation.SuppressLint
54
import android.app.Activity
65
import android.content.Context
@@ -22,14 +21,13 @@ import androidx.compose.ui.platform.LocalContext
2221
import androidx.core.app.ActivityCompat
2322
import java.lang.ref.WeakReference
2423

25-
2624
@SuppressLint("ComposableNaming")
2725
@Composable
2826
fun 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
*/
156160
class 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

Comments
 (0)