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

app/src/main/java/merail/tools/permissions/core/common/SdkIncompatibilityException.kt renamed to app/src/main/java/merail/tools/permissions/exceptions/SdkIncompatibilityException.kt

Lines changed: 1 addition & 1 deletion
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+
}

0 commit comments

Comments
 (0)