diff --git a/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt index 55fb95de26..789f56e454 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt @@ -2,7 +2,6 @@ package com.tangem.tap.di.domain import com.tangem.domain.card.* import com.tangem.domain.card.repository.CardRepository -import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.card.repository.DerivationsRepository import com.tangem.domain.demo.DemoConfig import com.tangem.domain.demo.IsDemoCardUseCase @@ -22,14 +21,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) internal object CardDomainModule { - @Provides - @Singleton - fun provideSetAccessCodeRequestPolicyUseCase( - cardSdkConfigRepository: CardSdkConfigRepository, - ): SetAccessCodeRequestPolicyUseCase { - return SetAccessCodeRequestPolicyUseCase(cardSdkConfigRepository = cardSdkConfigRepository) - } - @Provides @Singleton fun provideSetCardWasScannedUseCase(cardRepository: CardRepository): SetCardWasScannedUseCase { diff --git a/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt index 6871b3101c..7dc5634128 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt @@ -182,12 +182,6 @@ internal object SettingsDomainModule { ): NeverRequestPermissionUseCase { return NeverRequestPermissionUseCase(repository = permissionRepository) } - - @Provides - @Singleton - fun provideShouldSaveAccessCodesUseCase(settingsRepository: SettingsRepository): ShouldSaveAccessCodesUseCase { - return ShouldSaveAccessCodesUseCase(settingsRepository = settingsRepository) - } // endregion @Provides diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt index bbf156324b..68d354a90c 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import arrow.core.getOrElse import com.tangem.common.CompletionResult import com.tangem.common.doOnSuccess import com.tangem.common.routing.AppRoute @@ -11,13 +12,16 @@ import com.tangem.common.routing.AppRouter import com.tangem.common.routing.bundle.unbundle import com.tangem.core.analytics.Analytics import com.tangem.domain.card.ScanCardProcessor +import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.getBackupCardsCount import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.wallets.builder.UserWalletIdBuilder import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.sdk.api.TangemSdkManager import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Settings @@ -34,17 +38,24 @@ import com.tangem.wallet.R import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import timber.log.Timber import javax.inject.Inject +@Suppress("LongParameterList") @HiltViewModel internal class CardSettingsViewModel @Inject constructor( private val scanCardProcessor: ScanCardProcessor, private val tangemSdkManager: TangemSdkManager, private val cardSettingsInteractor: CardSettingsInteractor, + private val getUserWalletUseCase: GetUserWalletUseCase, + private val cardSdkConfigRepository: CardSdkConfigRepository, + private val settingsRepository: SettingsRepository, savedStateHandle: SavedStateHandle, ) : ViewModel() { + private var previousBiometricsRequestPolicy: Boolean = false + private val userWalletId = savedStateHandle.get(AppRoute.CardSettings.USER_WALLET_ID_KEY) ?.unbundle(UserWalletId.serializer()) ?: error("User wallet ID is required for CardSettingsViewModel") @@ -52,12 +63,32 @@ internal class CardSettingsViewModel @Inject constructor( val screenState: MutableStateFlow = MutableStateFlow(getInitialState()) init { + updateAccessCodeRequestPolicy() + cardSettingsInteractor.scannedScanResponse .filterNotNull() .onEach(::updateCardDetails) .launchIn(viewModelScope) } + override fun onCleared() { + // Restore the previous value of access code request policy + cardSdkConfigRepository.isBiometricsRequestPolicy = previousBiometricsRequestPolicy + } + + private fun updateAccessCodeRequestPolicy() { + runBlocking { + // !!!IMPORTANT!!!: Do not forget to restore the previous value in onCleared() method + previousBiometricsRequestPolicy = cardSdkConfigRepository.isBiometricsRequestPolicy + + val userWallet = getUserWalletUseCase(userWalletId) + .getOrElse { error("User wallet $userWalletId not found") } + + cardSdkConfigRepository.isBiometricsRequestPolicy = userWallet.scanResponse.card.isAccessCodeSet && + settingsRepository.shouldSaveAccessCodes() + } + } + private fun getInitialState() = CardSettingsScreenState( cardDetails = null, onElementClick = ::handleClickingItem, diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt b/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt index 0df4db4753..9827fc5dbe 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeViewModel.kt @@ -12,10 +12,10 @@ import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.url.UrlOpener import com.tangem.domain.card.ScanCardProcessor -import com.tangem.domain.card.SetAccessCodeRequestPolicyUseCase +import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse -import com.tangem.domain.settings.ShouldSaveAccessCodesUseCase +import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.tokens.TokensAction import com.tangem.domain.wallets.builder.UserWalletBuilder import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase @@ -39,11 +39,11 @@ import javax.inject.Inject @Suppress("LongParameterList") @HiltViewModel internal class HomeViewModel @Inject constructor( - private val shouldSaveAccessCodesUseCase: ShouldSaveAccessCodesUseCase, - private val setAccessCodeRequestPolicyUseCase: SetAccessCodeRequestPolicyUseCase, private val scanCardProcessor: ScanCardProcessor, private val generateWalletNameUseCase: GenerateWalletNameUseCase, private val saveWalletUseCase: SaveWalletUseCase, + private val cardSdkConfigRepository: CardSdkConfigRepository, + private val settingsRepository: SettingsRepository, private val urlOpener: UrlOpener, private val analyticsEventHandler: AnalyticsEventHandler, ) : ViewModel() { @@ -73,7 +73,7 @@ internal class HomeViewModel @Inject constructor( private fun scanCard() { viewModelScope.launch { - setAccessCodeRequestPolicyUseCase(isBiometricsRequestPolicy = shouldSaveAccessCodesUseCase()) + cardSdkConfigRepository.isBiometricsRequestPolicy = settingsRepository.shouldSaveAccessCodes() scanCardProcessor.scan( analyticsSource = AnalyticsParam.ScreensSources.Intro, diff --git a/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt b/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt index cb9495d708..e4006b694a 100644 --- a/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt +++ b/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt @@ -26,6 +26,16 @@ internal class DefaultCardSdkConfigRepository( override val sdk: TangemSdk get() = cardSdkProvider.sdk + override var isBiometricsRequestPolicy: Boolean + get() = sdk.config.userCodeRequestPolicy is UserCodeRequestPolicy.AlwaysWithBiometrics + set(value) { + sdk.config.userCodeRequestPolicy = if (value) { + UserCodeRequestPolicy.AlwaysWithBiometrics(codeType = UserCodeType.AccessCode) + } else { + UserCodeRequestPolicy.Default + } + } + override fun setAccessCodeRequestPolicy(isBiometricsRequestPolicy: Boolean) { sdk.config.userCodeRequestPolicy = if (isBiometricsRequestPolicy) { UserCodeRequestPolicy.AlwaysWithBiometrics(codeType = UserCodeType.AccessCode) diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/SetAccessCodeRequestPolicyUseCase.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/SetAccessCodeRequestPolicyUseCase.kt deleted file mode 100644 index e10f624726..0000000000 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/SetAccessCodeRequestPolicyUseCase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.tangem.domain.card - -import com.tangem.domain.card.repository.CardSdkConfigRepository - -/** - * Set access code request policy by 'isBiometricsRequestPolicy' - * - * @property cardSdkConfigRepository repository for managing of CardSDK config - * -[REDACTED_AUTHOR] - */ -class SetAccessCodeRequestPolicyUseCase(private val cardSdkConfigRepository: CardSdkConfigRepository) { - - operator fun invoke(isBiometricsRequestPolicy: Boolean) { - cardSdkConfigRepository.setAccessCodeRequestPolicy(isBiometricsRequestPolicy) - } -} \ No newline at end of file diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/repository/CardSdkConfigRepository.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/repository/CardSdkConfigRepository.kt index ef277955c2..fd2f4e3b54 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/repository/CardSdkConfigRepository.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/repository/CardSdkConfigRepository.kt @@ -15,6 +15,9 @@ interface CardSdkConfigRepository { @Deprecated("Use CardSdkConfigRepository's methods instead of this property") val sdk: TangemSdk + /** Allow requesting access codes from biometrically protected storage */ + var isBiometricsRequestPolicy: Boolean + /** Set access code request policy by [isBiometricsRequestPolicy] */ fun setAccessCodeRequestPolicy(isBiometricsRequestPolicy: Boolean) diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/ShouldSaveAccessCodesUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/ShouldSaveAccessCodesUseCase.kt deleted file mode 100644 index b68ede4106..0000000000 --- a/domain/settings/src/main/java/com/tangem/domain/settings/ShouldSaveAccessCodesUseCase.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.tangem.domain.settings - -import com.tangem.domain.settings.repositories.SettingsRepository - -class ShouldSaveAccessCodesUseCase(private val settingsRepository: SettingsRepository) { - - suspend operator fun invoke(): Boolean = settingsRepository.shouldSaveAccessCodes() -} \ No newline at end of file