diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricFailReasonConverter.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricFailReasonConverter.kt new file mode 100644 index 0000000000..9e5eaa4bcb --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricFailReasonConverter.kt @@ -0,0 +1,28 @@ +package com.tangem.tap.domain.userWalletList.repository.implementation + +import com.tangem.common.core.TangemError +import com.tangem.core.analytics.models.Basic +import com.tangem.domain.wallets.legacy.UserWalletsListError +import com.tangem.utils.converter.Converter + +object BiometricFailReasonConverter : Converter { + + override fun convert(value: TangemError): Basic.BiometryFailed.BiometricFailReason { + if (value !is UserWalletsListError) { + return Basic.BiometryFailed.BiometricFailReason.Other(value.customMessage) + } + return when (value) { + UserWalletsListError.AllKeysInvalidated -> + Basic.BiometryFailed.BiometricFailReason.AllKeysInvalidated + UserWalletsListError.BiometricsAuthenticationDisabled -> + Basic.BiometryFailed.BiometricFailReason.BiometricsAuthenticationDisabled + is UserWalletsListError.BiometricsAuthenticationLockout -> + if (value.isPermanent) { + Basic.BiometryFailed.BiometricFailReason.AuthenticationLockoutPermanent + } else { + Basic.BiometryFailed.BiometricFailReason.AuthenticationLockout + } + else -> Basic.BiometryFailed.BiometricFailReason.Other(value.customMessage) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt index 6f7c82d446..96b486a33f 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt @@ -7,6 +7,9 @@ import com.tangem.common.* import com.tangem.common.authentication.storage.AuthenticatedStorage import com.tangem.common.core.TangemSdkError import com.tangem.common.services.secure.SecureStorage +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.domain.wallets.legacy.UserWalletsListError import com.tangem.domain.wallets.models.UserWalletId import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey @@ -19,6 +22,7 @@ internal class BiometricUserWalletsKeysRepository( moshi: Moshi, private val authenticatedStorage: AuthenticatedStorage, private val secureStorage: SecureStorage, + private val analyticsEventHandler: AnalyticsEventHandler, ) : UserWalletsKeysRepository { private val encryptionKeyAdapter: JsonAdapter = moshi.adapter( @@ -32,7 +36,7 @@ internal class BiometricUserWalletsKeysRepository( return withContext(Dispatchers.IO) { getAllInternal() .mapFailure { error -> - when (error) { + val mappedError = when (error) { is TangemSdkError.AuthenticationLockout -> UserWalletsListError.BiometricsAuthenticationLockout(isPermanent = false) is TangemSdkError.AuthenticationPermanentLockout -> @@ -43,6 +47,13 @@ internal class BiometricUserWalletsKeysRepository( UserWalletsListError.BiometricsAuthenticationDisabled else -> error } + analyticsEventHandler.send( + Basic.BiometryFailed( + source = AnalyticsParam.ScreensSources.SignIn, + reason = BiometricFailReasonConverter.convert(mappedError), + ), + ) + mappedError } } } diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt index 8f2960f7a1..d919ecafc1 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt @@ -78,4 +78,23 @@ sealed class Basic( AnalyticsParam.SOURCE to source.value, ), ) + + class BiometryFailed( + source: AnalyticsParam.ScreensSources, + reason: BiometricFailReason, + ) : Basic( + event = "Biometry Failed", + params = mapOf( + AnalyticsParam.SOURCE to source.value, + "Reason" to reason.value, + ), + ) { + sealed class BiometricFailReason(val value: String) { + data object AuthenticationLockout : BiometricFailReason("BiometricsAuthenticationLockout") + data object AuthenticationLockoutPermanent : BiometricFailReason("BiometricsAuthenticationLockoutPermanent") + data object BiometricsAuthenticationDisabled : BiometricFailReason("BiometricsAuthenticationDisabled") + data object AllKeysInvalidated : BiometricFailReason("AllKeysInvalidated") + data class Other(val reason: String) : BiometricFailReason(reason) + } + } } \ No newline at end of file