Skip to content

Commit 71e61ed

Browse files
committed
Android Toolkit - First version.
1 parent 3ae0b15 commit 71e61ed

File tree

178 files changed

+7664
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

178 files changed

+7664
-1
lines changed

Access/.gitignore

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
*.iml
2+
.gradle
3+
/local.properties
4+
/.idea/caches
5+
/.idea/libraries
6+
/.idea/modules.xml
7+
/.idea/workspace.xml
8+
/.idea/navEditor.xml
9+
/.idea/assetWizardSettings.xml
10+
.DS_Store
11+
/build
12+
/captures
13+
.externalNativeBuild
14+
.cxx
15+
16+
.idea
17+
.idea/*
18+
gradle
19+
gradlew
20+
gradlew.bat
21+
local.properties

Access/Core/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

Access/Core/build.gradle

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
apply plugin: 'com.android.library'
2+
apply plugin: 'kotlin-android'
3+
4+
android {
5+
6+
compileSdkVersion 33
7+
8+
defaultConfig {
9+
10+
minSdkVersion 23
11+
targetSdkVersion 33
12+
13+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
14+
}
15+
16+
compileOptions {
17+
18+
sourceCompatibility JavaVersion.VERSION_1_8
19+
targetCompatibility JavaVersion.VERSION_1_8
20+
}
21+
22+
kotlinOptions {
23+
24+
jvmTarget = '1.8'
25+
}
26+
27+
buildTypes {
28+
29+
release {
30+
31+
minifyEnabled false
32+
}
33+
34+
debug {
35+
36+
minifyEnabled false
37+
}
38+
}
39+
packagingOptions {
40+
resources {
41+
excludes += ['META-INF/DEPENDENCIES', 'META-INF/LICENSE', 'META-INF/LICENSE.txt', 'META-INF/license.txt', 'META-INF/NOTICE', 'META-INF/NOTICE.txt', 'META-INF/notice.txt', 'META-INF/ASL2.0', 'META-INF/*.kotlin_module']
42+
}
43+
}
44+
namespace 'com.redelf.access'
45+
46+
}
47+
48+
dependencies {
49+
50+
implementation project(":Commons:Core")
51+
52+
implementation "androidx.biometric:biometric:1.2.0-alpha05"
53+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
5+
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
6+
</manifest>
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
package com.redelf.access
2+
3+
import com.redelf.access.implementation.AccessActivity
4+
import com.redelf.access.implementation.FaceRecognitionAccess
5+
import com.redelf.access.implementation.FingerprintAccess
6+
import com.redelf.access.implementation.GenericAccess
7+
import com.redelf.access.implementation.IrisAccess
8+
import com.redelf.access.implementation.pin.PinAccess
9+
import com.redelf.access.implementation.pin.PinAccessActivity
10+
import com.redelf.access.installation.Installation
11+
import com.redelf.access.installation.InstallationCheckCallback
12+
import com.redelf.commons.callback.CallbackOperation
13+
import com.redelf.commons.callback.Callbacks
14+
import com.redelf.commons.capability.CapabilityCheckCallback
15+
import com.redelf.commons.execution.Cancellation
16+
import com.redelf.commons.execution.CommonExecution
17+
import com.redelf.commons.execution.CommonExecutionCallback
18+
import com.redelf.commons.execution.Executor
19+
import com.redelf.commons.lifecycle.Initialization
20+
import com.redelf.commons.lifecycle.LifecycleCallback
21+
import timber.log.Timber
22+
import java.util.concurrent.atomic.AtomicBoolean
23+
import java.util.concurrent.atomic.AtomicReference
24+
25+
class Access(builder: AccessBuilder) :
26+
27+
CommonExecution,
28+
Cancellation,
29+
Initialization<Unit>,
30+
Installation {
31+
32+
companion object {
33+
34+
fun getGeneric(ctx: PinAccessActivity): Access {
35+
36+
var priority = -1
37+
val generic = GenericAccess(++priority, ctx)
38+
39+
return AccessBuilder()
40+
.addAccessMethod(generic)
41+
.build()
42+
}
43+
44+
fun getDefault(ctx: AccessActivity): Access {
45+
46+
var priority = -1
47+
val iris = IrisAccess(++priority, ctx)
48+
val faceAccess = FaceRecognitionAccess(++priority, ctx)
49+
val fingerprintAccess = FingerprintAccess(++priority, ctx)
50+
val pinAccess = PinAccess(++priority, ctx)
51+
52+
return AccessBuilder()
53+
.addAccessMethod(pinAccess)
54+
.addAccessMethod(fingerprintAccess)
55+
.addAccessMethod(faceAccess)
56+
.addAccessMethod(iris)
57+
.build()
58+
}
59+
}
60+
61+
private val executor = Executor.MAIN
62+
private val methods = builder.methods
63+
private val initializing = AtomicBoolean()
64+
private var method = AtomicReference<AccessMethod>()
65+
private val callbacks = Callbacks<LifecycleCallback<Unit>>(identifier = "Access lifecycle")
66+
67+
private val initCallback = object : LifecycleCallback<Unit> {
68+
69+
override fun onInitialization(success: Boolean, vararg args: Unit) {
70+
71+
initializing.set(false)
72+
callbacks.doOnAll(object : CallbackOperation<LifecycleCallback<Unit>> {
73+
74+
override fun perform(callback: LifecycleCallback<Unit>) {
75+
76+
callback.onInitialization(success)
77+
callbacks.unregister(callback)
78+
}
79+
}, name = "Initialisation operation")
80+
}
81+
82+
override fun onShutdown(success: Boolean, vararg args: Unit) {
83+
84+
// Ignore.
85+
}
86+
}
87+
88+
@Throws(IllegalStateException::class)
89+
override fun execute(callback: CommonExecutionCallback) {
90+
91+
if (!isInitialized()) {
92+
93+
throw IllegalStateException("Not initialized")
94+
}
95+
method.get()?.execute(callback)
96+
}
97+
98+
override fun cancel() {
99+
100+
method.get()?.cancel()
101+
}
102+
103+
override fun isInitialized() = method.get() != null
104+
105+
override fun isInitializing() = isInitialized()
106+
107+
@Synchronized
108+
fun isExecuting(): Boolean {
109+
110+
method.get()?.let {
111+
112+
return it.isExecuting()
113+
}
114+
return false
115+
}
116+
117+
@Throws(IllegalStateException::class)
118+
override fun initialize(callback: LifecycleCallback<Unit>) {
119+
120+
if (isInitialized()) {
121+
122+
throw IllegalStateException("Already initialized")
123+
}
124+
callbacks.register(callback)
125+
if (initializing.get()) {
126+
127+
Timber.w("Already initializing")
128+
return
129+
}
130+
initializing.set(true)
131+
val action = Runnable {
132+
133+
val iterator = methods.iterator()
134+
135+
fun initialize(iterator: Iterator<AccessMethod>) {
136+
137+
if (iterator.hasNext()) {
138+
139+
val accessMethod = iterator.next()
140+
141+
val capabilityCallback = object : CapabilityCheckCallback {
142+
143+
override fun onCapabilityChecked(capable: Boolean) {
144+
145+
if (capable) {
146+
147+
method.set(accessMethod)
148+
initCallback.onInitialization(true)
149+
Timber.i("Access method: $method")
150+
} else {
151+
152+
initialize(iterator)
153+
}
154+
}
155+
}
156+
157+
accessMethod.checkCapability(capabilityCallback)
158+
159+
} else {
160+
161+
Timber.w("No access method obtained")
162+
initCallback.onInitialization(false)
163+
}
164+
}
165+
166+
initialize(iterator)
167+
}
168+
169+
executor.execute(action)
170+
}
171+
172+
@Throws(IllegalStateException::class)
173+
override fun install() {
174+
175+
if (!isInitialized()) {
176+
177+
initialize(
178+
179+
object : LifecycleCallback<Unit> {
180+
181+
override fun onInitialization(success: Boolean, vararg args: Unit) {
182+
183+
if (success) {
184+
185+
method.get()?.install()
186+
} else {
187+
188+
throw IllegalStateException("Failed to initialize")
189+
}
190+
}
191+
192+
override fun onShutdown(success: Boolean, vararg args: Unit) {
193+
194+
throw IllegalStateException("Unexpected shutdown")
195+
}
196+
}
197+
)
198+
return
199+
}
200+
method.get()?.install()
201+
}
202+
203+
@Throws(IllegalStateException::class)
204+
override fun checkInstalled(callback: InstallationCheckCallback) {
205+
206+
Timber.v("Check installed")
207+
208+
if (!isInitialized()) {
209+
210+
initialize(
211+
212+
object : LifecycleCallback<Unit> {
213+
214+
override fun onInitialization(success: Boolean, vararg args: Unit) {
215+
216+
if (success) {
217+
218+
method.get()?.checkInstalled(callback)
219+
220+
} else {
221+
222+
throw IllegalStateException("Failed to initialize")
223+
}
224+
}
225+
226+
override fun onShutdown(success: Boolean, vararg args: Unit) {
227+
228+
throw IllegalStateException("Unexpected shutdown")
229+
}
230+
231+
}
232+
)
233+
return
234+
}
235+
method.get()?.checkInstalled(callback)
236+
}
237+
238+
override fun toString(): String {
239+
240+
return "Access(methods=$methods)"
241+
}
242+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.redelf.access
2+
3+
import java.util.*
4+
5+
class AccessBuilder {
6+
7+
val methods = PriorityQueue<AccessMethod>()
8+
9+
@Throws(IllegalArgumentException::class)
10+
fun addAccessMethod(method: AccessMethod) : AccessBuilder {
11+
12+
methods.forEach {
13+
if (it::class == method::class) {
14+
15+
val name = method::class.simpleName
16+
throw IllegalArgumentException("Access method already present: $name")
17+
}
18+
}
19+
methods.add(method)
20+
return this
21+
}
22+
23+
fun build() = Access(this)
24+
}

0 commit comments

Comments
 (0)