-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathBiometricsView.kt
More file actions
78 lines (74 loc) · 2.49 KB
/
BiometricsView.kt
File metadata and controls
78 lines (74 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package to.bitkit.ui.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import to.bitkit.R
import to.bitkit.ui.shared.modifiers.clickableAlpha
import to.bitkit.ui.theme.AppThemeSurface
import to.bitkit.ui.utils.BiometricPrompt
@Composable
fun BiometricsView(
onSuccess: (() -> Unit)? = null,
onFailure: (() -> Unit)? = null,
) {
var shouldShowPrompt by remember { mutableStateOf(true) }
val scope = rememberCoroutineScope()
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxSize()
.clickableAlpha {
// trick to show biometric prompt again on UI click
scope.launch {
shouldShowPrompt = false
delay(5)
shouldShowPrompt = true
}
}
.testTag("Biometrics")
) {
if (shouldShowPrompt) {
BiometricPrompt(
onSuccess = { onSuccess?.invoke() },
onError = { onFailure?.invoke() },
)
}
Icon(
painter = painterResource(R.drawable.ic_fingerprint),
contentDescription = null,
modifier = Modifier.size(64.dp),
)
VerticalSpacer(16.dp)
Subtitle(
text = run {
val biometricsName = stringResource(R.string.security__bio)
stringResource(R.string.security__bio_auth_with).replace("{biometricsName}", biometricsName)
}
)
}
}
@Preview(showBackground = true)
@Composable
private fun Preview() {
AppThemeSurface {
BiometricsView()
}
}