@@ -3,8 +3,12 @@ package com.getcode.util
33import android.content.Context
44import androidx.biometric.BiometricManager
55import androidx.biometric.BiometricPrompt
6+ import androidx.compose.runtime.getValue
7+ import androidx.compose.runtime.mutableStateOf
8+ import androidx.compose.runtime.setValue
69import androidx.fragment.app.FragmentActivity
710import com.getcode.R
11+ import kotlinx.coroutines.delay
812import kotlinx.coroutines.suspendCancellableCoroutine
913import timber.log.Timber
1014import java.util.concurrent.Executors
@@ -44,38 +48,49 @@ enum class BiometricsError {
4448}
4549
4650object Biometrics {
47- suspend fun prompt (context : Context ): Result <Unit > = suspendCancellableCoroutine { cont ->
48- val activity = context as FragmentActivity
49- val executor = Executors .newSingleThreadExecutor()
50- val biometricPrompt = BiometricPrompt (
51- activity,
52- executor,
53- object : BiometricPrompt .AuthenticationCallback () {
54- override fun onAuthenticationSucceeded (result : BiometricPrompt .AuthenticationResult ) {
55- Timber .d(" Biometric Authentication successful" )
56- cont.resume(Result .success(Unit ))
57- }
51+ var promptActive by mutableStateOf(false )
52+ private set
5853
59- override fun onAuthenticationError (errorCode : Int , errString : CharSequence ) {
60- val error = BiometricsException (errorCode, errString)
61- Timber .e(t = error.cause, message = " onAuthenticationErrorForBiometrics" )
62- cont.resume(Result .failure(error))
63- }
54+ suspend fun prompt (
55+ context : Context ,
56+ delay : Long = 0L,
57+ authenticators : Int = BiometricManager .Authenticators .BIOMETRIC_WEAK
58+ or BiometricManager .Authenticators .DEVICE_CREDENTIAL ,
59+ ): Result <Unit > {
60+ promptActive = true
61+ delay(delay)
62+ return suspendCancellableCoroutine { cont ->
63+ val activity = context as FragmentActivity
64+ val executor = Executors .newSingleThreadExecutor()
65+ val biometricPrompt = BiometricPrompt (
66+ activity,
67+ executor,
68+ object : BiometricPrompt .AuthenticationCallback () {
69+ override fun onAuthenticationSucceeded (result : BiometricPrompt .AuthenticationResult ) {
70+ Timber .d(" Biometric Authentication successful" )
71+ promptActive = false
72+ cont.resume(Result .success(Unit ))
73+ }
6474
65- override fun onAuthenticationFailed () {
66- Timber .e(" onAuthenticationFailedForBiometrics" )
67- }
68- })
75+ override fun onAuthenticationError (errorCode : Int , errString : CharSequence ) {
76+ val error = BiometricsException (errorCode, errString)
77+ Timber .e(t = error.cause, message = " onAuthenticationErrorForBiometrics" )
78+ promptActive = false
79+ cont.resume(Result .failure(error))
80+ }
6981
70- val promptInfo = BiometricPrompt .PromptInfo .Builder ()
71- .setTitle(context.getString(R .string.title_biometricAuthentication))
72- .setDescription(context.getString(R .string.description_biometricAuthentication))
73- .setAllowedAuthenticators(
74- BiometricManager .Authenticators .BIOMETRIC_WEAK
75- or BiometricManager .Authenticators .DEVICE_CREDENTIAL
76- )
77- .build()
82+ override fun onAuthenticationFailed () {
83+ Timber .e(" onAuthenticationFailedForBiometrics" )
84+ }
85+ })
7886
79- biometricPrompt.authenticate(promptInfo)
87+ val promptInfo = BiometricPrompt .PromptInfo .Builder ()
88+ .setTitle(context.getString(R .string.title_biometricAuthentication))
89+ .setDescription(context.getString(R .string.description_biometricAuthentication))
90+ .setAllowedAuthenticators(authenticators)
91+ .build()
92+
93+ biometricPrompt.authenticate(promptInfo)
94+ }
8095 }
8196}
0 commit comments