Skip to content

Commit 5fca2c6

Browse files
authored
Merge pull request #10 from merail/develop
Delegates for requesters
2 parents 3b3223c + f531044 commit 5fca2c6

19 files changed

+219
-139
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ captures/
6262
.idea/appInsightsSettings.xml
6363
.idea/render.experimental.xml
6464
.idea/androidTestResultsUserPreferences.xml
65+
.idea/deploymentTargetSelector.xml
66+
.idea/other.xml
6567

6668
# Keystore files
6769
# *.jks

app/build.gradle.kts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ android {
2020
buildTypes {
2121
release {
2222
isMinifyEnabled = false
23-
proguardFiles(getDefaultProguardFile(
24-
"proguard-android-optimize.txt"),
25-
"proguard-rules.pro"
23+
proguardFiles(
24+
getDefaultProguardFile("proguard-android-optimize.txt"),
25+
"proguard-rules.pro",
2626
)
2727
}
2828
}
@@ -54,7 +54,7 @@ afterEvaluate {
5454
}
5555

5656
dependencies {
57-
implementation("androidx.appcompat:appcompat:1.6.1")
58-
implementation("com.google.android.material:material:1.11.0")
59-
implementation("androidx.core:core-ktx:1.13.0")
57+
implementation("androidx.appcompat:appcompat:1.7.0")
58+
implementation("com.google.android.material:material:1.12.0")
59+
implementation("androidx.core:core-ktx:1.13.1")
6060
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package merail.tools.permissions
2+
3+
import androidx.activity.ComponentActivity
4+
import androidx.lifecycle.LifecycleEventObserver
5+
import androidx.lifecycle.LifecycleOwner
6+
import merail.tools.permissions.exceptions.WrongTimeAccessException
7+
import kotlin.properties.ReadOnlyProperty
8+
import kotlin.reflect.KProperty
9+
10+
abstract class RequesterDelegate<T>(
11+
activity: ComponentActivity,
12+
) : ReadOnlyProperty<LifecycleOwner, T>, LifecycleEventObserver {
13+
14+
var value: T? = null
15+
16+
init {
17+
@Suppress("LeakingThis")
18+
activity.lifecycle.addObserver(this)
19+
}
20+
21+
override fun getValue(
22+
thisRef: LifecycleOwner,
23+
property: KProperty<*>,
24+
): T {
25+
thisRef.lifecycle.addObserver(this)
26+
return value ?: throw WrongTimeAccessException()
27+
}
28+
}

app/src/main/java/merail/tools/permissions/core/common/Utils.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ internal fun Activity.isPermissionDeclaredInManifest(
1010
) = packageManager.getPackageInfo(
1111
packageName,
1212
PackageManager.GET_PERMISSIONS,
13-
).requestedPermissions
14-
?.any {
15-
it == permission
16-
} ?: false
13+
).requestedPermissions?.any {
14+
it == permission
15+
} ?: false

app/src/main/java/merail/tools/permissions/core/special/SpecialPermissionType.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import android.provider.MediaStore
99
import android.provider.Settings
1010
import androidx.activity.ComponentActivity
1111
import androidx.core.content.ContextCompat
12-
import merail.tools.permissions.core.common.SdkIncompatibilityException
12+
import merail.tools.permissions.exceptions.SdkIncompatibilityException
1313
import merail.tools.permissions.core.common.SettingsOpener
1414

1515

Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
package merail.tools.permissions.core.common
1+
package merail.tools.permissions.exceptions
22

33
internal class SdkIncompatibilityException : Exception()
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package merail.tools.permissions.exceptions
2+
3+
class WrongTimeAccessException(
4+
override val message: String = "The requester wasn't initialized yet. Try to access it after Activity.onCreate method completion",
5+
) : Exception(message)

app/src/main/java/merail/tools/permissions/WrongTimeInitializationException.kt renamed to app/src/main/java/merail/tools/permissions/exceptions/WrongTimeInitializationException.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package merail.tools.permissions
1+
package merail.tools.permissions.exceptions
22

33
class WrongTimeInitializationException(
44
override val message: String = "You should initialize RuntimePermissionRequester in Activity.onCreate method!",

app/src/main/java/merail/tools/permissions/role/RoleRequester.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import androidx.activity.ComponentActivity
99
import androidx.activity.result.ActivityResultLauncher
1010
import androidx.activity.result.contract.ActivityResultContracts
1111
import androidx.annotation.RequiresApi
12-
import merail.tools.permissions.WrongTimeInitializationException
1312
import merail.tools.permissions.core.role.RoleResultObserver
13+
import merail.tools.permissions.exceptions.WrongTimeInitializationException
1414

1515
@RequiresApi(Build.VERSION_CODES.Q)
1616
class RoleRequester(
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package merail.tools.permissions.role
2+
3+
import android.os.Build
4+
import androidx.activity.ComponentActivity
5+
import androidx.lifecycle.Lifecycle
6+
import androidx.lifecycle.LifecycleOwner
7+
import merail.tools.permissions.RequesterDelegate
8+
9+
fun ComponentActivity.roleRequester(
10+
requestedRole: String,
11+
) = RoleRequesterDelegate(
12+
activity = this,
13+
requestedRole = requestedRole,
14+
)
15+
16+
class RoleRequesterDelegate(
17+
private val activity: ComponentActivity,
18+
private val requestedRole: String,
19+
) : RequesterDelegate<RoleRequester>(
20+
activity = activity,
21+
) {
22+
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
23+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
24+
if (event == Lifecycle.Event.ON_CREATE) {
25+
if (value == null) {
26+
value = RoleRequester(
27+
activity = activity,
28+
requestedRole = requestedRole,
29+
)
30+
}
31+
}
32+
}
33+
}
34+
}

app/src/main/java/merail/tools/permissions/runtime/RuntimePermissionRequester.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import androidx.activity.result.ActivityResultLauncher
77
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
88
import androidx.core.app.ActivityCompat
99
import merail.tools.permissions.PermissionRequester
10-
import merail.tools.permissions.WrongTimeInitializationException
10+
import merail.tools.permissions.exceptions.WrongTimeInitializationException
1111
import merail.tools.permissions.core.runtime.RuntimePermissionResultObserver
1212

1313
class RuntimePermissionRequester(
@@ -80,5 +80,4 @@ class RuntimePermissionRequester(
8080
this.onRuntimePermissionsRequestResult = onRuntimePermissionsRequestResult
8181
requestPermissionLauncher.launch(requestedPermissions)
8282
}
83-
8483
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package merail.tools.permissions.runtime
2+
3+
import androidx.activity.ComponentActivity
4+
import androidx.lifecycle.Lifecycle
5+
import androidx.lifecycle.LifecycleOwner
6+
import merail.tools.permissions.RequesterDelegate
7+
8+
fun ComponentActivity.runtimePermissionRequester(
9+
requestedPermissions: Array<String>,
10+
) = RuntimePermissionRequesterDelegate(
11+
activity = this,
12+
requestedPermissions = requestedPermissions,
13+
)
14+
15+
fun ComponentActivity.runtimePermissionRequester(
16+
requestedPermission: String,
17+
) = RuntimePermissionRequesterDelegate(
18+
activity = this,
19+
requestedPermissions = arrayOf(requestedPermission),
20+
)
21+
22+
class RuntimePermissionRequesterDelegate(
23+
private val activity: ComponentActivity,
24+
private val requestedPermissions: Array<String>,
25+
) : RequesterDelegate<RuntimePermissionRequester>(
26+
activity = activity,
27+
) {
28+
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
29+
if (event == Lifecycle.Event.ON_CREATE) {
30+
if (value == null) {
31+
value = RuntimePermissionRequester(
32+
activity = activity,
33+
requestedPermissions = requestedPermissions,
34+
)
35+
}
36+
}
37+
}
38+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package merail.tools.permissions.special
2+
3+
import androidx.activity.ComponentActivity
4+
import androidx.lifecycle.Lifecycle
5+
import androidx.lifecycle.LifecycleOwner
6+
import merail.tools.permissions.RequesterDelegate
7+
8+
fun ComponentActivity.specialPermissionRequester(
9+
requestedPermission: String,
10+
) = SpecialPermissionRequesterDelegate(
11+
activity = this,
12+
requestedPermission = requestedPermission,
13+
)
14+
15+
class SpecialPermissionRequesterDelegate(
16+
private val activity: ComponentActivity,
17+
private val requestedPermission: String,
18+
) : RequesterDelegate<SpecialPermissionRequester>(
19+
activity = activity,
20+
) {
21+
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
22+
if (event == Lifecycle.Event.ON_CREATE) {
23+
if (value == null) {
24+
value = SpecialPermissionRequester(
25+
activity = activity,
26+
requestedPermission = requestedPermission,
27+
)
28+
}
29+
}
30+
}
31+
}

build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugins {
2-
id("com.android.library") version "8.3.1" apply false
3-
id("org.jetbrains.kotlin.android") version "1.9.23" apply false
4-
id("com.android.application") version "8.3.1" apply false
2+
id("com.android.library") version "8.3.2" apply false
3+
id("org.jetbrains.kotlin.android") version "1.9.25" apply false
4+
id("com.android.application") version "8.3.2" apply false
55
}

dev/build.gradle.kts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,24 @@ android {
2424
)
2525
}
2626
}
27+
2728
compileOptions {
2829
sourceCompatibility = JavaVersion.VERSION_17
2930
targetCompatibility = JavaVersion.VERSION_17
3031
}
32+
3133
kotlinOptions {
3234
jvmTarget = "17"
3335
}
36+
3437
buildFeatures {
3538
compose = true
3639
}
40+
3741
composeOptions {
38-
kotlinCompilerExtensionVersion = "1.5.11"
42+
kotlinCompilerExtensionVersion = "1.5.15"
3943
}
44+
4045
packaging {
4146
resources {
4247
excludes += "/META-INF/{AL2.0,LGPL2.1}"
@@ -45,10 +50,10 @@ android {
4550
}
4651

4752
dependencies {
48-
implementation("androidx.core:core-ktx:1.13.0")
49-
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
50-
implementation("androidx.activity:activity-compose:1.9.0")
51-
implementation(platform("androidx.compose:compose-bom:2024.04.01"))
53+
implementation("androidx.core:core-ktx:1.13.1")
54+
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6")
55+
implementation("androidx.activity:activity-compose:1.9.3")
56+
implementation(platform("androidx.compose:compose-bom:2024.10.00"))
5257
implementation("androidx.compose.ui:ui")
5358
implementation("androidx.compose.ui:ui-tooling")
5459
implementation("androidx.compose.ui:ui-tooling-preview")

0 commit comments

Comments
 (0)