Skip to content

Commit

Permalink
Added video preview and add comments for biometric authentication and…
Browse files Browse the repository at this point in the history
… auto-launch settings functions
  • Loading branch information
Khokhlinvladimir committed Aug 13, 2024
1 parent b48960a commit 1c8f888
Show file tree
Hide file tree
Showing 15 changed files with 79 additions and 22 deletions.
13 changes: 10 additions & 3 deletions app/src/main/java/com/android/authentication/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,16 @@ class MainActivity : ComponentActivity() {
application = application
)

//TODO: Добавить показывать шторку биометрической аутентификации или нет
// диалог о включении биометрии
// исправить баг с вызовом шторки и тапом по экрану который возвращает на стартовый экран
/**
* Enables or disables automatic biometric authentication dialog launch on validation screen start.
*
* @param enabled True to enable automatic biometric launch, false to disable.
* @param application The application context.
*/
val autoLaunchBiometricEnabled = pinCodeStateManager.autoLaunchBiometricEnabled(
enabled = true,
application = application
)

Surface(
modifier = Modifier.fillMaxSize(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,26 @@ package com.android.pinlibrary.ui.components

import android.hardware.biometrics.BiometricPrompt
import android.os.Build
import android.util.Log
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import com.android.pinlibrary.ui.systemdesign.indicator.RoundedBoxesRow
import com.android.pinlibrary.utils.biometric.BiometricScannerScreen
import com.android.pinlibrary.utils.enums.PinCodeScenario
Expand All @@ -36,10 +46,22 @@ fun PinCodeContent(
val buttonArray = remember { mutableStateListOf<Int>() }
var quantity by remember { mutableIntStateOf(0) }
var showBiometricScreen by remember { mutableStateOf(false) }
val lifecycleOwner = LocalLifecycleOwner.current

DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_CREATE) {
showBiometricScreen = settingsManager.isAutoLaunchBiometricEnabled()
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}

LaunchedEffect(onNumberClickListener) {
onNumberClickListener = NumberListener { keyboardEnum ->
Log.d("TAGSS", "keyboardEnum = $keyboardEnum, showBiometricScreen = $showBiometricScreen")
when (keyboardEnum) {
KeyboardButtonEnum.BUTTON_FINGERPRINT -> showBiometricScreen = true
else -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.android.pinlibrary.utils.preferences

interface ISettingsManager {
fun isBiometricEnabled(): Boolean
fun isAutoLaunchBiometricEnabled(): Boolean
fun setAutoLaunchBiometricEnabled(enabled: Boolean)
fun setBiometricEnabled(enabled: Boolean)
fun getMaxPinAttempts(): Int
fun setMaxPinAttempts(maxAttempts: Int)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@ class SettingsManager(context: Context) : ISettingsManager {
editor.apply()
}

override fun isAutoLaunchBiometricEnabled(): Boolean {
return sharedPreferences.getBoolean(AUTO_LAUNCH_BIOMETRIC_ENABLED_KEY, true)
/** Enabled by default */
}

override fun setAutoLaunchBiometricEnabled(enabled: Boolean) {
val editor = sharedPreferences.edit()
editor.putBoolean(AUTO_LAUNCH_BIOMETRIC_ENABLED_KEY, enabled)
editor.apply()
}

override fun getMaxPinAttempts(): Int {
return sharedPreferences.getInt(MAX_PIN_ATTEMPTS_KEY, 5)
/** Default 5 attempts */
Expand All @@ -42,6 +53,7 @@ class SettingsManager(context: Context) : ISettingsManager {

companion object {
private const val BIOMETRIC_ENABLED_KEY = "biometric_enabled"
private const val AUTO_LAUNCH_BIOMETRIC_ENABLED_KEY = "auto_launch_biometric_enabled"
private const val MAX_PIN_ATTEMPTS_KEY = "max_pin_attempts"
private const val PIN_LENGTH_KEY = "pin_length"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ interface IPinCodeStateManager {
fun isPinCodeSaved(application: Application): Boolean

fun setBiometricEnabled(enabled: Boolean, application: Application): Boolean
fun autoLaunchBiometricEnabled(enabled: Boolean, application: Application): Boolean
fun setMaxPinAttempts(maxAttempts: Int, application: Application): Int
fun setPinLength(pinLength: Int, application: Application): Int

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,19 @@ class PinCodeStateManager private constructor() : IPinCodeStateManager {
return settingsManager.isBiometricEnabled()
}

/**
* Set the value of the "Auto-launch biometric authentication" option and return the current value.
*
* @param enabled true to enable automatic biometric dialog on validation start; false to disable.
* @param application Application context.
* @return true if automatic biometric launch is enabled; false otherwise.
*/
override fun autoLaunchBiometricEnabled(enabled: Boolean, application: Application): Boolean {
val settingsManager = SettingsManager(context = application)
settingsManager.setAutoLaunchBiometricEnabled(enabled)
return settingsManager.isAutoLaunchBiometricEnabled()
}

/**
* Set the maximum number of pin code entry attempts and return the current value.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package com.android.pinlibrary.utils.state.changepin

sealed class ChangePinScreenIntent {

object InitialState : ChangePinScreenIntent()
data object InitialState : ChangePinScreenIntent()
data class EnterCurrentPin(val currentPin: String) : ChangePinScreenIntent()
data class EnterNewPin(val newPin: String) : ChangePinScreenIntent()
data class ConfirmNewPin(val newPin: String) : ChangePinScreenIntent()
object ChangePin : ChangePinScreenIntent()
data object ChangePin : ChangePinScreenIntent()
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.android.pinlibrary.utils.state.changepin

sealed class ChangePinScreenState {
object InitialState : ChangePinScreenState()
data object InitialState : ChangePinScreenState()
data class EnteringCurrentPin(val currentPin: String) : ChangePinScreenState()
data class EnteringNewPin(val newPin: String) : ChangePinScreenState()
data class ConfirmingNewPin(val newPin: String) : ChangePinScreenState()
object PinChangedSuccess : ChangePinScreenState()
data object PinChangedSuccess : ChangePinScreenState()
data class ErrorState(val errorMessage: String) : ChangePinScreenState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.android.pinlibrary.utils.state.createpin

sealed class CreatePinScreenIntent {

object InitialState : CreatePinScreenIntent()
data object InitialState : CreatePinScreenIntent()
data class EnterPin(val pin: String) : CreatePinScreenIntent()
data class ConfirmPin(val pin: String) : CreatePinScreenIntent()
object CreatePin : CreatePinScreenIntent()
data object CreatePin : CreatePinScreenIntent()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package com.android.pinlibrary.utils.state.createpin

sealed class CreatePinScreenState {

object InitialState : CreatePinScreenState()
data object InitialState : CreatePinScreenState()
data class EnteringPinState(val pin: String) : CreatePinScreenState()
data class ConfirmingPinState(val pin: String) : CreatePinScreenState()
object PinCreatedState : CreatePinScreenState()
data object PinCreatedState : CreatePinScreenState()
data class ErrorState(val errorMessage: String) : CreatePinScreenState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.android.pinlibrary.utils.state.deletepin

sealed class DeletePinScreenIntent {

object InitialState : DeletePinScreenIntent()
data object InitialState : DeletePinScreenIntent()
data class EnterPin(val pin: String) : DeletePinScreenIntent()
object DeletePin : DeletePinScreenIntent()
data object DeletePin : DeletePinScreenIntent()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.android.pinlibrary.utils.state.deletepin

sealed class DeletePinScreenState {

object InitialState : DeletePinScreenState()
data object InitialState : DeletePinScreenState()
data class EnteringPinState(val pin: String) : DeletePinScreenState()
object PinDeletedState : DeletePinScreenState()
data object PinDeletedState : DeletePinScreenState()
data class ErrorState(val errorMessage: String) : DeletePinScreenState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.android.pinlibrary.utils.state.validationpin

sealed class ValidationPinScreenIntent {

object InitialState : ValidationPinScreenIntent()
data object InitialState : ValidationPinScreenIntent()
data class EnterPin(val pin: String) : ValidationPinScreenIntent()
object ValidatePin : ValidationPinScreenIntent()
data object ValidatePin : ValidationPinScreenIntent()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.android.pinlibrary.utils.state.validationpin

sealed class ValidationPinScreenState {

object InitialState : ValidationPinScreenState()
data object InitialState : ValidationPinScreenState()
data class EnteringPinState(val pin: String) : ValidationPinScreenState()
data class ErrorState(val errorMessage: String) : ValidationPinScreenState()
object PinValidatedState : ValidationPinScreenState()
data object PinValidatedState : ValidationPinScreenState()
}
Binary file added screens/preview_english.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 1c8f888

Please sign in to comment.