From c82c2b3cfba4809daaa5f31a82f303c11a140596 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 18 Jul 2023 21:11:12 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../common/analytics/topup/TopUpController.kt | 2 +- .../di/domain/wallets/WalletsDomainModule.kt | 7 ++++ .../common/feedback/AdditionalFeedbackInfo.kt | 9 ++--- .../tangem/tap/di/domain/CardDomainModule.kt | 28 +++++++++++++++ .../com/tangem/tap/domain/extensions/Card.kt | 23 ++---------- .../tap/domain/tokens/UserTokensRepository.kt | 2 +- .../details/redux/DetailsMiddleware.kt | 4 +-- .../tap/features/home/redux/HomeMiddleware.kt | 2 +- .../features/onboarding/OnboardingHelper.kt | 2 +- .../twins/redux/TwinCardsMiddleware.kt | 2 +- .../products/twins/ui/TwinsCardsFragment.kt | 10 ++---- .../redux/OnboardingWalletMiddleware.kt | 2 +- .../saveWallet/redux/SaveWalletMiddleware.kt | 2 +- .../tap/features/wallet/redux/WalletState.kt | 17 +-------- .../redux/middlewares/WalletMiddleware.kt | 2 +- .../wallet/redux/reducers/WalletReducer.kt | 8 +++-- .../redux/WalletSelectorMiddleware.kt | 4 +-- .../welcome/redux/WelcomeMiddleware.kt | 2 +- .../tangem/tap/proxy/UserWalletManagerImpl.kt | 2 +- data/card/build.gradle.kts | 1 + .../card/DefaultCardSdkConfigRepository.kt | 9 +++-- .../com/tangem/data/card/di/CardDataModule.kt | 11 ++++-- .../card/GetAccessCodeSavingStatusUseCase.kt | 15 ++++++++ .../domain/card/GetBiometricsStatusUseCase.kt | 15 ++++++++ .../card/SetAccessCodeRequestPolicyUseCase.kt | 17 +++++++++ .../repository/CardSdkConfigRepository.kt | 3 ++ domain/legacy/build.gradle.kts | 1 + .../com/tangem/domain/userwallets/Artwork.kt | 14 ++++++++ .../userwallets}/GetCardImageUseCase.kt | 3 +- .../domain/userwallets}/UserWalletBuilder.kt | 6 ++-- .../userwallets}/UserWalletIdBuilder.kt | 2 +- domain/wallets/build.gradle.kts | 1 + .../domain/wallets/models/SaveWalletError.kt | 10 ++++++ .../wallets/usecase/SaveWalletUseCase.kt | 28 +++++++++++++++ features/wallet/impl/build.gradle.kts | 1 + .../wallet/viewmodels/WalletViewModel.kt | 36 +++++++++++++++++-- 36 files changed, 223 insertions(+), 80 deletions(-) create mode 100644 domain/card/src/main/kotlin/com/tangem/domain/card/GetAccessCodeSavingStatusUseCase.kt create mode 100644 domain/card/src/main/kotlin/com/tangem/domain/card/GetBiometricsStatusUseCase.kt create mode 100644 domain/card/src/main/kotlin/com/tangem/domain/card/SetAccessCodeRequestPolicyUseCase.kt create mode 100644 domain/legacy/src/main/java/com/tangem/domain/userwallets/Artwork.kt rename {app/src/main/java/com/tangem/tap/domain/userWalletList => domain/legacy/src/main/java/com/tangem/domain/userwallets}/GetCardImageUseCase.kt (95%) rename {app/src/main/java/com/tangem/tap/domain/model/builders => domain/legacy/src/main/java/com/tangem/domain/userwallets}/UserWalletBuilder.kt (88%) rename {app/src/main/java/com/tangem/tap/domain/model/builders => domain/legacy/src/main/java/com/tangem/domain/userwallets}/UserWalletIdBuilder.kt (98%) create mode 100644 domain/wallets/src/main/java/com/tangem/domain/wallets/models/SaveWalletError.kt create mode 100644 domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SaveWalletUseCase.kt diff --git a/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt b/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt index bdd315bc3d..ba23fa52dd 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt @@ -9,6 +9,7 @@ import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.tap.common.analytics.converters.TopUpEventConverter @@ -17,7 +18,6 @@ import com.tangem.tap.common.extensions.copy import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.walletCurrencies.WalletCurrenciesManager import com.tangem.tap.domain.walletStores.WalletStoresManager import com.tangem.tap.features.wallet.models.Currency diff --git a/app/src/main/java/com/tangem/tap/common/di/domain/wallets/WalletsDomainModule.kt b/app/src/main/java/com/tangem/tap/common/di/domain/wallets/WalletsDomainModule.kt index f945462b83..bcf08adf87 100644 --- a/app/src/main/java/com/tangem/tap/common/di/domain/wallets/WalletsDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/common/di/domain/wallets/WalletsDomainModule.kt @@ -2,6 +2,7 @@ package com.tangem.tap.common.di.domain.wallets import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.domain.wallets.usecase.GetWalletsUseCase +import com.tangem.domain.wallets.usecase.SaveWalletUseCase import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -17,4 +18,10 @@ object WalletsDomainModule { fun providesGetWalletsUseCase(walletsStateHolder: WalletsStateHolder): GetWalletsUseCase { return GetWalletsUseCase(walletsStateHolder = walletsStateHolder) } + + @Provides + @ViewModelScoped + fun providesSaveWalletUseCase(walletsStateHolder: WalletsStateHolder): SaveWalletUseCase { + return SaveWalletUseCase(walletsStateHolder = walletsStateHolder) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt index 7d138f1610..947691b26f 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt @@ -1,17 +1,12 @@ package com.tangem.tap.common.feedback import android.os.Build -import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.AmountType -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.Token -import com.tangem.blockchain.common.Wallet -import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.* import com.tangem.blockchain.common.address.Address import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.tap.common.extensions.stripZeroPlainString -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder class AdditionalFeedbackInfo { class EmailWalletInfo( 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 27d0e3e8df..4af9f75d50 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 @@ -1,6 +1,10 @@ package com.tangem.tap.di.domain +import com.tangem.domain.card.GetAccessCodeSavingStatusUseCase +import com.tangem.domain.card.GetBiometricsStatusUseCase import com.tangem.domain.card.ScanCardProcessor +import com.tangem.domain.card.SetAccessCodeRequestPolicyUseCase +import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.tap.domain.scanCard.DefaultScanCardProcessor import dagger.Module import dagger.Provides @@ -15,4 +19,28 @@ internal object CardDomainModule { @Provides @Singleton fun provideScanCardUseCase(): ScanCardProcessor = DefaultScanCardProcessor() + + @Provides + @Singleton + fun provideGetBiometricsStatusUseCase( + cardSdkConfigRepository: CardSdkConfigRepository, + ): GetBiometricsStatusUseCase { + return GetBiometricsStatusUseCase(cardSdkConfigRepository = cardSdkConfigRepository) + } + + @Provides + @Singleton + fun provideSetAccessCodeRequestPolicyUseCase( + cardSdkConfigRepository: CardSdkConfigRepository, + ): SetAccessCodeRequestPolicyUseCase { + return SetAccessCodeRequestPolicyUseCase(cardSdkConfigRepository = cardSdkConfigRepository) + } + + @Provides + @Singleton + fun provideGetAccessCodeSavingStatusUseCase( + cardSdkConfigRepository: CardSdkConfigRepository, + ): GetAccessCodeSavingStatusUseCase { + return GetAccessCodeSavingStatusUseCase(cardSdkConfigRepository = cardSdkConfigRepository) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt index f963c6f982..363565bf3e 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt @@ -1,24 +1,17 @@ package com.tangem.tap.domain.extensions -import com.tangem.common.card.FirmwareVersion import com.tangem.common.extensions.toHexString import com.tangem.common.services.Result -import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.common.TwinCardNumber import com.tangem.domain.common.getTwinCardNumber +import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.userwallets.Artwork import com.tangem.operations.attestation.CardVerifyAndGetInfo import com.tangem.operations.attestation.OnlineCardVerifier -import com.tangem.tap.features.wallet.redux.Artwork val CardDTO.remainingSignatures: Int? get() = this.wallets.firstOrNull()?.remainingSignatures -val CardDTO.isWalletDataSupported: Boolean - get() = this.firmwareVersion.major >= 4 - -val CardDTO.isFirmwareMultiwalletAllowed: Boolean - get() = firmwareVersion >= FirmwareVersion.MultiWalletAvailable && settings.maxWalletsCount > 1 - val CardDTO.isHdWalletAllowedByApp: Boolean get() = settings.isHDWalletAllowed @@ -58,16 +51,4 @@ suspend fun CardDTO.getOrLoadCardArtworkUrl(cardInfo: Result ifAnyError() } -} - -fun CardDTO.getArtworkUrl(artworkId: String?): String? { - return when { - artworkId != null -> { - OnlineCardVerifier.getUrlForArtwork(cardId, cardPublicKey.toHexString(), artworkId) - } - - cardId.startsWith(Artwork.SERGIO_CARD_ID) -> Artwork.SERGIO_CARD_URL - cardId.startsWith(Artwork.MARTA_CARD_ID) -> Artwork.MARTA_CARD_URL - else -> null - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt index c4c01684bf..6842f8a94c 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt @@ -10,7 +10,7 @@ import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.datasource.files.AndroidFileReader import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.models.scan.CardDTO -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.tap.domain.tokens.converters.CurrencyConverter import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.wallet.models.Currency diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index e665b7cee3..478d0cb1bd 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -12,6 +12,8 @@ import com.tangem.core.navigation.NavigationAction import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletBuilder +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam @@ -23,8 +25,6 @@ import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.domain.model.builders.UserWalletBuilder -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.domain.userWalletList.di.provideRuntimeImplementation import com.tangem.tap.domain.userWalletList.isLockedSync diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 547440e96f..15a3f5c172 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -9,6 +9,7 @@ import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletBuilder import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.common.analytics.events.Shop @@ -19,7 +20,6 @@ import com.tangem.tap.common.extensions.eraseContext import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.features.home.BELARUS_COUNTRY_CODE import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.home.redux.HomeMiddleware.BUY_WALLET_URL diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 477ab679c6..baf5ed2fcf 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -10,12 +10,12 @@ import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletBuilder import com.tangem.tap.* import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.extensions.removeContext import com.tangem.tap.common.extensions.setContext -import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.features.saveWallet.redux.SaveWalletAction import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index af0338bb49..b768c53091 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -9,6 +9,7 @@ import com.tangem.core.navigation.NavigationAction import com.tangem.domain.common.extensions.withMainContext import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding @@ -19,7 +20,6 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.makePrimaryWalletManager -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.twins.TwinCardsManager import com.tangem.tap.domain.userWalletList.isLockedSync import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt index 77bc7f7310..2fa0a10909 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt @@ -17,15 +17,12 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.ShareElement import com.tangem.core.ui.fragments.setStatusBarColor import com.tangem.datasource.asset.AssetReader -import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.common.TwinCardNumber +import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.Artwork import com.tangem.sdk.ui.widget.leapfrogWidget.LeapfrogWidget import com.tangem.tap.common.analytics.events.Onboarding -import com.tangem.tap.common.extensions.beginDelayedTransition -import com.tangem.tap.common.extensions.getDrawableCompat -import com.tangem.tap.common.extensions.hide -import com.tangem.tap.common.extensions.show -import com.tangem.tap.common.extensions.stripZeroPlainString +import com.tangem.tap.common.extensions.* import com.tangem.tap.common.toggleWidget.RefreshBalanceWidget import com.tangem.tap.common.transitions.InternalNoteLayoutTransition import com.tangem.tap.domain.twins.TwinsCardWidget @@ -35,7 +32,6 @@ import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletM import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep -import com.tangem.tap.features.wallet.redux.Artwork import com.tangem.tap.store import com.tangem.wallet.R import com.tangem.wallet.databinding.LayoutOnboardingContainerTopBinding diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index fe5800266a..2057707f3d 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -13,6 +13,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.Artwork import com.tangem.feature.onboarding.data.model.CreateWalletResponse import com.tangem.feature.onboarding.presentation.wallet2.analytics.SeedPhraseSource import com.tangem.operations.backup.BackupService @@ -29,7 +30,6 @@ import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.wallet.models.toCurrencies -import com.tangem.tap.features.wallet.redux.Artwork import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.launch import org.rekotlin.Action diff --git a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt index 370e759dff..8261f5bef3 100644 --- a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt @@ -9,6 +9,7 @@ import com.tangem.common.flatMap import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction +import com.tangem.domain.userwallets.UserWalletBuilder import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam @@ -18,7 +19,6 @@ import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.domain.userWalletList.isLockable import com.tangem.tap.features.wallet.redux.WalletAction diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 2135a4ab7d..0048c80636 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -1,11 +1,11 @@ package com.tangem.tap.features.wallet.redux -import android.graphics.Bitmap import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.WalletManager import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.userwallets.Artwork import com.tangem.tap.common.entities.Button import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.toggleWidget.WidgetState @@ -118,19 +118,4 @@ enum class ErrorType { sealed class WalletMainButton(enabled: Boolean) : Button(enabled) { class SendButton(enabled: Boolean) : WalletMainButton(enabled) -} - -data class Artwork( - val artworkId: String, - val artwork: Bitmap? = null, -) { - companion object { - const val DEFAULT_IMG_URL = "https://app.tangem.com/cards/card_default.png" - const val SERGIO_CARD_URL = "https://app.tangem.com/cards/card_tg059.png" - const val MARTA_CARD_URL = "https://app.tangem.com/cards/card_tg083.png" - const val SERGIO_CARD_ID = "BC01" - const val MARTA_CARD_ID = "BC02" - const val TWIN_CARD_1 = "https://app.tangem.com/cards/card_tg085.png" - const val TWIN_CARD_2 = "https://app.tangem.com/cards/card_tg086.png" - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 2bdd72972f..a96e7e6197 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -12,6 +12,7 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.datasource.connection.NetworkConnectionManager +import com.tangem.domain.userwallets.GetCardImageUseCase import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Basic @@ -23,7 +24,6 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel -import com.tangem.tap.domain.userWalletList.GetCardImageUseCase import com.tangem.tap.domain.userWalletList.lockIfLockable import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.home.redux.HomeAction diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index ac44f59413..e91e0a1194 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -4,12 +4,16 @@ import com.tangem.blockchain.common.Wallet import com.tangem.blockchain.common.address.AddressType import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.userwallets.Artwork import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.TapError import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel import com.tangem.tap.features.wallet.models.Currency -import com.tangem.tap.features.wallet.redux.* +import com.tangem.tap.features.wallet.redux.ErrorType +import com.tangem.tap.features.wallet.redux.ProgressState +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.userWalletsListManager import org.rekotlin.Action @@ -115,7 +119,7 @@ private fun internalReduce(action: Action, state: AppState, appStateHolder: AppS if (selectedUserWallet == action.userWalletId) { newState = newState.copy( - cardImage = Artwork(artworkId = action.url, artwork = newState.cardImage?.artwork), + cardImage = Artwork(artworkId = action.url), ) } } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index a331a52719..acac8cd6a8 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -6,6 +6,8 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletBuilder +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.tap.* @@ -18,8 +20,6 @@ import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.model.WalletStoreModel -import com.tangem.tap.domain.model.builders.UserWalletBuilder -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.userWalletList.unlockIfLockable import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index c10e1bcad2..f18499bf50 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -8,6 +8,7 @@ import com.tangem.common.flatMap import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.userwallets.UserWalletBuilder import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Basic @@ -15,7 +16,6 @@ import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState -import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.userWalletList.unlockIfLockable import com.tangem.tap.features.intentHandler.handlers.WalletConnectLinkIntentHandler import com.tangem.tap.features.signin.redux.SignInAction diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index 1938886ede..432dc559a1 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -10,6 +10,7 @@ import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toCoinId import com.tangem.domain.common.extensions.toNetworkId +import com.tangem.domain.userwallets.UserWalletIdBuilder import com.tangem.lib.crypto.UserWalletManager import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.Currency.NativeToken @@ -17,7 +18,6 @@ import com.tangem.lib.crypto.models.Currency.NonNativeToken import com.tangem.lib.crypto.models.ProxyAmount import com.tangem.lib.crypto.models.ProxyFiatCurrency import com.tangem.tap.common.extensions.dispatchOnMain -import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.userWalletsListManager import com.tangem.tap.walletCurrenciesManager diff --git a/data/card/build.gradle.kts b/data/card/build.gradle.kts index 69bbb44e78..26b3010f2e 100644 --- a/data/card/build.gradle.kts +++ b/data/card/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { implementation(deps.tangem.card.android) implementation(deps.tangem.card.core) + implementation(projects.data.source.preferences) implementation(projects.domain.card) implementation(projects.domain.models) } \ No newline at end of file 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 e263616c2f..321a48b0bf 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 @@ -5,18 +5,21 @@ import com.tangem.common.UserCodeType import com.tangem.common.core.CardIdDisplayFormat import com.tangem.common.core.UserCodeRequestPolicy import com.tangem.data.card.sdk.CardSdkProvider +import com.tangem.data.source.preferences.PreferencesDataSource import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.models.scan.ProductType /** - * Implementation of repository for managing with CardSDK config + * Implementation of repository for managing of CardSDK config * - * @property cardSdkProvider CardSDK instance provider + * @property cardSdkProvider CardSDK instance provider + * @property preferencesDataSource application shared preferences * [REDACTED_AUTHOR] */ internal class DefaultCardSdkConfigRepository( private val cardSdkProvider: CardSdkProvider, + private val preferencesDataSource: PreferencesDataSource, ) : CardSdkConfigRepository { @Deprecated("Use CardSdkConfigRepository's methods instead of this property") @@ -50,4 +53,6 @@ internal class DefaultCardSdkConfigRepository( -> CardIdDisplayFormat.Full } } + + override fun isAccessCodeSavingEnabled(): Boolean = preferencesDataSource.shouldSaveAccessCodes } \ No newline at end of file diff --git a/data/card/src/main/java/com/tangem/data/card/di/CardDataModule.kt b/data/card/src/main/java/com/tangem/data/card/di/CardDataModule.kt index 4ed7adf268..11f63f4a31 100644 --- a/data/card/src/main/java/com/tangem/data/card/di/CardDataModule.kt +++ b/data/card/src/main/java/com/tangem/data/card/di/CardDataModule.kt @@ -2,6 +2,7 @@ package com.tangem.data.card.di import com.tangem.data.card.DefaultCardSdkConfigRepository import com.tangem.data.card.sdk.CardSdkProvider +import com.tangem.data.source.preferences.PreferencesDataSource import com.tangem.domain.card.repository.CardSdkConfigRepository import dagger.Module import dagger.Provides @@ -15,7 +16,13 @@ internal object CardDataModule { @Provides @Singleton - fun provideCardSdkConfigRepository(cardSdkProvider: CardSdkProvider): CardSdkConfigRepository { - return DefaultCardSdkConfigRepository(cardSdkProvider = cardSdkProvider) + fun provideCardSdkConfigRepository( + cardSdkProvider: CardSdkProvider, + preferencesDataSource: PreferencesDataSource, + ): CardSdkConfigRepository { + return DefaultCardSdkConfigRepository( + cardSdkProvider = cardSdkProvider, + preferencesDataSource = preferencesDataSource, + ) } } \ No newline at end of file diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/GetAccessCodeSavingStatusUseCase.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/GetAccessCodeSavingStatusUseCase.kt new file mode 100644 index 0000000000..538ac0f240 --- /dev/null +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/GetAccessCodeSavingStatusUseCase.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.card + +import com.tangem.domain.card.repository.CardSdkConfigRepository + +/** + * Use case for getting access code saving status + * + * @property cardSdkConfigRepository repository for managing of CardSDK config + * +[REDACTED_AUTHOR] + */ +class GetAccessCodeSavingStatusUseCase(private val cardSdkConfigRepository: CardSdkConfigRepository) { + + operator fun invoke(): Boolean = cardSdkConfigRepository.isAccessCodeSavingEnabled() +} \ No newline at end of file diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/GetBiometricsStatusUseCase.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/GetBiometricsStatusUseCase.kt new file mode 100644 index 0000000000..a917d6f691 --- /dev/null +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/GetBiometricsStatusUseCase.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.card + +import com.tangem.domain.card.repository.CardSdkConfigRepository + +/** + * Check if config has biometrics request policy + * + * @property cardSdkConfigRepository repository for managing of CardSDK config + * +[REDACTED_AUTHOR] + */ +class GetBiometricsStatusUseCase(private val cardSdkConfigRepository: CardSdkConfigRepository) { + + operator fun invoke(): Boolean = cardSdkConfigRepository.isBiometricsRequestPolicy() +} \ No newline at end of file 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 new file mode 100644 index 0000000000..e10f624726 --- /dev/null +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/SetAccessCodeRequestPolicyUseCase.kt @@ -0,0 +1,17 @@ +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 11fa7e26e1..1190a2952d 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 @@ -25,4 +25,7 @@ interface CardSdkConfigRepository { /** Update the card ID display format according to the [productType] of the scanned card */ fun updateCardIdDisplayFormat(productType: ProductType) + + /** Check if access code saving is enabled */ + fun isAccessCodeSavingEnabled(): Boolean } \ No newline at end of file diff --git a/domain/legacy/build.gradle.kts b/domain/legacy/build.gradle.kts index e9449ad7de..525d2c8504 100644 --- a/domain/legacy/build.gradle.kts +++ b/domain/legacy/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { implementation(project(":common")) implementation(project(":libs:auth")) implementation(project(":domain:models")) + implementation(projects.domain.wallets.models) /** Tangem libraries */ implementation(deps.tangem.blockchain) { diff --git a/domain/legacy/src/main/java/com/tangem/domain/userwallets/Artwork.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/Artwork.kt new file mode 100644 index 0000000000..d788aed532 --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/Artwork.kt @@ -0,0 +1,14 @@ +package com.tangem.domain.userwallets + +data class Artwork(val artworkId: String) { + + companion object { + const val DEFAULT_IMG_URL = "https://app.tangem.com/cards/card_default.png" + const val SERGIO_CARD_URL = "https://app.tangem.com/cards/card_tg059.png" + const val MARTA_CARD_URL = "https://app.tangem.com/cards/card_tg083.png" + const val SERGIO_CARD_ID = "BC01" + const val MARTA_CARD_ID = "BC02" + const val TWIN_CARD_1 = "https://app.tangem.com/cards/card_tg085.png" + const val TWIN_CARD_2 = "https://app.tangem.com/cards/card_tg086.png" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/GetCardImageUseCase.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/GetCardImageUseCase.kt similarity index 95% rename from app/src/main/java/com/tangem/tap/domain/userWalletList/GetCardImageUseCase.kt rename to domain/legacy/src/main/java/com/tangem/domain/userwallets/GetCardImageUseCase.kt index 9d218c840f..afa5eaaa37 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/GetCardImageUseCase.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/GetCardImageUseCase.kt @@ -1,4 +1,4 @@ -package com.tangem.tap.domain.userWalletList +package com.tangem.domain.userwallets import com.tangem.common.extensions.toHexString import com.tangem.common.services.Result @@ -6,7 +6,6 @@ import com.tangem.domain.common.TwinCardNumber import com.tangem.domain.common.TwinsHelper import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.operations.attestation.TangemApi -import com.tangem.tap.features.wallet.redux.Artwork /** * Use case for getting card image url diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt similarity index 88% rename from app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt rename to domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt index 7fa72a04fa..565930ae9d 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt @@ -1,12 +1,10 @@ -package com.tangem.tap.domain.model.builders +package com.tangem.domain.userwallets -import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.wallets.models.UserWallet -import com.tangem.tap.domain.userWalletList.GetCardImageUseCase class UserWalletBuilder( private val scanResponse: ScanResponse, @@ -24,7 +22,7 @@ class UserWalletBuilder( ProductType.Start2Coin -> "Start2Coin" ProductType.Wallet -> when { card.isBackupNotAllowed -> "Tangem card" - card.isStart2Coin -> "Start2Coin" + cardTypesResolver.isStart2Coin() -> "Start2Coin" else -> "Wallet" } } diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt similarity index 98% rename from app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt rename to domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt index 30b4ef4407..cad0957152 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletIdBuilder.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt @@ -1,4 +1,4 @@ -package com.tangem.tap.domain.model.builders +package com.tangem.domain.userwallets import com.tangem.common.extensions.calculateSha256 import com.tangem.common.extensions.hexToBytes diff --git a/domain/wallets/build.gradle.kts b/domain/wallets/build.gradle.kts index a9a1449956..31807a9a48 100644 --- a/domain/wallets/build.gradle.kts +++ b/domain/wallets/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { // endregion // region Other libraries + implementation(deps.arrow.core) implementation(deps.kotlin.coroutines) // endregion } \ No newline at end of file diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/models/SaveWalletError.kt b/domain/wallets/src/main/java/com/tangem/domain/wallets/models/SaveWalletError.kt new file mode 100644 index 0000000000..97ff31ef11 --- /dev/null +++ b/domain/wallets/src/main/java/com/tangem/domain/wallets/models/SaveWalletError.kt @@ -0,0 +1,10 @@ +package com.tangem.domain.wallets.models + +/** +[REDACTED_AUTHOR] + */ +sealed interface SaveWalletError { + + // TODO: Finalize in next PRs + object CommonError : SaveWalletError +} \ No newline at end of file diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SaveWalletUseCase.kt b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SaveWalletUseCase.kt new file mode 100644 index 0000000000..3afdb23663 --- /dev/null +++ b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SaveWalletUseCase.kt @@ -0,0 +1,28 @@ +package com.tangem.domain.wallets.usecase + +import arrow.core.Either +import arrow.core.left +import arrow.core.right +import com.tangem.common.doOnFailure +import com.tangem.common.doOnSuccess +import com.tangem.domain.wallets.legacy.WalletsStateHolder +import com.tangem.domain.wallets.models.SaveWalletError +import com.tangem.domain.wallets.models.UserWallet + +/** + * Use case for saving user wallet + * + * @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager' + * +[REDACTED_AUTHOR] + */ +class SaveWalletUseCase(private val walletsStateHolder: WalletsStateHolder) { + + suspend operator fun invoke(userWallet: UserWallet, canOverride: Boolean = false): Either { + requireNotNull(walletsStateHolder.userWalletsListManager).save(userWallet, canOverride) + .doOnSuccess { return Unit.right() } + .doOnFailure { return SaveWalletError.CommonError.left() } + + return Unit.right() + } +} \ No newline at end of file diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index c216409615..55e9edc0c3 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(deps.compose.reorderable) /** Other libraries */ + implementation(deps.arrow.core) implementation(deps.kotlin.immutable.collections) implementation(deps.tangem.card.core) implementation(deps.tangem.blockchain) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index 9ee5a8a430..d47726ddeb 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -9,8 +9,13 @@ import androidx.lifecycle.viewModelScope import arrow.core.Either import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess +import com.tangem.domain.card.GetAccessCodeSavingStatusUseCase +import com.tangem.domain.card.GetBiometricsStatusUseCase import com.tangem.domain.card.ScanCardProcessor +import com.tangem.domain.card.SetAccessCodeRequestPolicyUseCase import com.tangem.domain.tokens.GetTokenListUseCase +import com.tangem.domain.userwallets.UserWalletBuilder +import com.tangem.domain.wallets.usecase.SaveWalletUseCase import com.tangem.domain.tokens.error.TokensError import com.tangem.domain.tokens.model.TokenList import com.tangem.domain.wallets.models.UserWalletId @@ -35,8 +40,13 @@ import kotlin.properties.Delegates * [REDACTED_AUTHOR] */ +@Suppress("LongParameterList") @HiltViewModel internal class WalletViewModel @Inject constructor( + private val saveWalletUseCase: SaveWalletUseCase, + private val getBiometricsStatusUseCase: GetBiometricsStatusUseCase, + private val setAccessCodeRequestPolicyUseCase: SetAccessCodeRequestPolicyUseCase, + private val getAccessCodeSavingStatusUseCase: GetAccessCodeSavingStatusUseCase, private val getTokenListUseCase: GetTokenListUseCase, private val scanCardProcessor: ScanCardProcessor, private val dispatchers: CoroutineDispatcherProvider, @@ -85,10 +95,32 @@ internal class WalletViewModel @Inject constructor( } private fun onScanCardClick() { + val prevRequestPolicyStatus = getBiometricsStatusUseCase() + + // Update access the code policy according access code saving status + setAccessCodeRequestPolicyUseCase(isBiometricsRequestPolicy = getAccessCodeSavingStatusUseCase()) + viewModelScope.launch(dispatchers.io) { scanCardProcessor.scan(allowsRequestAccessCodeFromRepository = true) - .doOnSuccess { /* [REDACTED_TODO_COMMENT] */ } - .doOnFailure { /* [REDACTED_TODO_COMMENT] */ } + .doOnSuccess { + // If card's public key is null then user wallet will be null + val userWallet = UserWalletBuilder(scanResponse = it).build() + + if (userWallet != null) { + saveWalletUseCase(userWallet) + .onLeft { + // Rollback policy if card saving was failed + setAccessCodeRequestPolicyUseCase(prevRequestPolicyStatus) + } + } else { + // Rollback policy if card saving was failed + setAccessCodeRequestPolicyUseCase(prevRequestPolicyStatus) + } + } + .doOnFailure { + // Rollback policy if card scanning was failed + setAccessCodeRequestPolicyUseCase(prevRequestPolicyStatus) + } } }