diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 114746ccdb..f043370e21 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -20,7 +20,9 @@ import com.tangem.datasource.config.FeaturesLocalLoader import com.tangem.datasource.config.models.Config import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.DomainLayer +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.LogConfig +import com.tangem.domain.common.Provider import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory @@ -82,6 +84,7 @@ private val walletManagersRepository by lazy { ?.blockchainSdkConfig ?: BlockchainSdkConfig(), ), + cardTypeResolverProvider = Provider { store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) }, ) } private val walletAmountsRepository by lazy { @@ -96,6 +99,7 @@ val walletStoresManager by lazy { walletManagersRepository = walletManagersRepository, walletAmountsRepository = walletAmountsRepository, appCurrencyProvider = { store.state.globalState.appCurrency }, + cardTypeResolverProvider = Provider { store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) }, ) } val walletCurrenciesManager by lazy { @@ -105,6 +109,7 @@ val walletCurrenciesManager by lazy { walletManagersRepository = walletManagersRepository, walletAmountsRepository = walletAmountsRepository, appCurrencyProvider = { store.state.globalState.appCurrency }, + cardTypeResolverProvider = Provider { store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) }, ) } val totalFiatBalanceCalculator by lazy { @@ -147,6 +152,9 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var learn2earnInteractor: Learn2earnInteractor + @Inject + lateinit var cardTypeResolver: CardTypeResolver + override fun onCreate() { super.onCreate() @@ -163,6 +171,7 @@ class TapApplication : Application(), ImageLoaderFactory { walletFeatureToggles = walletFeatureToggles, walletConnectRepository = walletConnect2Repository, walletConnectSessionsRepository = walletConnectSessionsRepository, + cardTypeResolver = cardTypeResolver, ), ), ) @@ -219,6 +228,7 @@ class TapApplication : Application(), ImageLoaderFactory { }, walletStoresManagerProvider = { walletStoresManager }, topupWalletStorage = preferencesStorage.toppedUpWalletStorage, + cardTypeResolver = cardTypeResolver, ) store.dispatch(GlobalAction.SetTopUpController(topUpController)) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt index 0a7928efd5..5b60885d4b 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt @@ -2,15 +2,15 @@ package com.tangem.tap.common.analytics.converters import com.tangem.blockchain.common.Blockchain import com.tangem.common.Converter -import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.tap.common.analytics.events.AnalyticsParam /** [REDACTED_AUTHOR] */ -class ParamCardCurrencyConverter : Converter { +class ParamCardCurrencyConverter : Converter { - override fun convert(value: CardTypesResolver): AnalyticsParam.CardCurrency? { + override fun convert(value: CardTypeResolver): AnalyticsParam.CardCurrency? { if (value.isMultiwalletAllowed()) return AnalyticsParam.CardCurrency.MultiCurrency val type = when { diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt index 429b2e5ebc..29b374687f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt @@ -1,15 +1,15 @@ package com.tangem.tap.common.analytics.converters import com.tangem.common.Converter -import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.tap.common.analytics.events.Basic /** [REDACTED_AUTHOR] */ -class TopUpEventConverter : Converter { +class TopUpEventConverter : Converter { - override fun convert(value: CardTypesResolver): Basic.ToppedUp? { + override fun convert(value: CardTypeResolver): Basic.ToppedUp? { val paramCardCurrency = ParamCardCurrencyConverter().convert(value) ?: return null return Basic.ToppedUp(paramCardCurrency) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt index 864c9dadbb..e35f0f1143 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt @@ -2,7 +2,7 @@ package com.tangem.tap.common.analytics.paramsInterceptor import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.ParamsInterceptor -import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter @@ -16,6 +16,7 @@ import com.tangem.tap.features.demo.DemoHelper */ class CardContextInterceptor( private val scanResponse: ScanResponse?, + private val cardTypeResolver: CardTypeResolver, ) : ParamsInterceptor { override fun id(): String = CardContextInterceptor.id() @@ -35,7 +36,7 @@ class CardContextInterceptor( params[AnalyticsParam.PRODUCT_TYPE] = getProductType(scanResponse) params[AnalyticsParam.FIRMWARE] = card.firmwareVersion.stringValue - ParamCardCurrencyConverter().convert(scanResponse.cardTypesResolver)?.let { + ParamCardCurrencyConverter().convert(cardTypeResolver)?.let { params[AnalyticsParam.CURRENCY] = it.value } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt index 94c006d699..5cf8c767fb 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt @@ -2,17 +2,19 @@ package com.tangem.tap.common.analytics.paramsInterceptor import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.ParamsInterceptor +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.ScanResponse /** [REDACTED_AUTHOR] */ class LinkedCardContextInterceptor( - private val scanResponse: ScanResponse, + scanResponse: ScanResponse, + cardTypeResolver: CardTypeResolver, val parent: LinkedCardContextInterceptor? = null, ) : ParamsInterceptor { - private val contextInterceptor = CardContextInterceptor(scanResponse) + private val contextInterceptor = CardContextInterceptor(scanResponse, cardTypeResolver) override fun id(): String = LinkedCardContextInterceptor.id() 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 97edaae4c1..27cea44be1 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 @@ -5,9 +5,8 @@ import com.tangem.common.extensions.isZero import com.tangem.core.analytics.Analytics import com.tangem.data.source.preferences.model.DataSourceTopupInfo import com.tangem.data.source.preferences.storage.ToppedUpWalletStorage -import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.util.UserWalletId -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.converters.TopUpEventConverter import com.tangem.tap.common.analytics.events.AnalyticsParam @@ -32,6 +31,7 @@ class TopUpController( var scanResponseProvider: (() -> ScanResponse?)? = null, var walletStoresManagerProvider: (() -> WalletStoresManager)? = null, private val topupWalletStorage: ToppedUpWalletStorage, + private val cardTypeResolver: CardTypeResolver, ) : WalletCurrenciesManager.Listener { private var hadMissedDerivations: Boolean = false @@ -100,7 +100,7 @@ class TopUpController( } val cardBalanceState = BalanceCalculator(walletDataModels).calculate().toCardBalanceState() - send(userWalletId, cardBalanceState, scanResponse.cardTypesResolver) + send(userWalletId, cardBalanceState, cardTypeResolver) } } @@ -120,14 +120,14 @@ class TopUpController( fun send(scanResponse: ScanResponse, cardBalanceState: AnalyticsParam.CardBalanceState) { UserWalletIdBuilder.scanResponse(scanResponse).build()?.let { - send(it, cardBalanceState, scanResponse.cardTypesResolver) + send(it, cardBalanceState, cardTypeResolver) } } fun send( userWalletId: UserWalletId, cardBalanceState: AnalyticsParam.CardBalanceState, - cardTypesResolver: CardTypesResolver, + cardTypeResolver: CardTypeResolver, ) { val topupInfo = topupWalletStorage.restore(userWalletId.stringValue).guard { val topupInfo = DataSourceTopupInfo( @@ -152,7 +152,7 @@ class TopUpController( if (cardBalanceState.isToppedUp()) { topupWalletStorage.save(topupInfo.copy(cardBalanceState = DataSourceTopupInfo.CardBalanceState.Full)) - TopUpEventConverter().convert(cardTypesResolver)?.let { + TopUpEventConverter().convert(cardTypeResolver)?.let { Analytics.send(it) } } diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt b/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt index 8e79d07381..58c13e282c 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt @@ -1,6 +1,7 @@ package com.tangem.tap.common.extensions import com.tangem.core.analytics.Analytics +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.paramsInterceptor.LinkedCardContextInterceptor @@ -11,8 +12,8 @@ import com.tangem.tap.common.analytics.paramsInterceptor.LinkedCardContextInterc /** * Sets the new context */ -fun Analytics.setContext(scanResponse: ScanResponse) { - addParamsInterceptor(LinkedCardContextInterceptor(scanResponse)) +fun Analytics.setContext(scanResponse: ScanResponse, cardTypeResolver: CardTypeResolver) { + addParamsInterceptor(LinkedCardContextInterceptor(scanResponse, cardTypeResolver)) } /** @@ -25,9 +26,13 @@ fun Analytics.eraseContext() { /** * Adds a new context and keeps a previous context as the parent of the new one */ -fun Analytics.addContext(scanResponse: ScanResponse) { +fun Analytics.addContext(scanResponse: ScanResponse, cardTypeResolver: CardTypeResolver) { val currentContext = removeParamsInterceptor(LinkedCardContextInterceptor.id()) as? LinkedCardContextInterceptor - val newContext = LinkedCardContextInterceptor(scanResponse, parent = currentContext) + val newContext = LinkedCardContextInterceptor( + scanResponse = scanResponse, + cardTypeResolver = cardTypeResolver, + parent = currentContext, + ) addParamsInterceptor(newContext) } diff --git a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt index 96639f64e4..67ce9fa481 100644 --- a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt +++ b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt @@ -3,6 +3,7 @@ package com.tangem.tap.di import android.content.Context import androidx.fragment.app.FragmentActivity import com.tangem.TangemSdk +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.card.ScanCardUseCase import com.tangem.sdk.extensions.initWithBiometrics import com.tangem.tap.domain.TangemSdkManager @@ -27,8 +28,12 @@ internal object ActivityModule { @Provides @ActivityScoped - fun provideTangemSdkManager(@ActivityContext context: Context, tangemSdk: TangemSdk): TangemSdkManager { - return TangemSdkManager(tangemSdk, context) + fun provideTangemSdkManager( + @ActivityContext context: Context, + tangemSdk: TangemSdk, + cardTypeResolver: CardTypeResolver, + ): TangemSdkManager { + return TangemSdkManager(tangemSdk, context, cardTypeResolver) } @Provides diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index c395569c5c..83ddb84e62 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -14,7 +14,7 @@ import com.tangem.common.usersCode.UserCodeRepository import com.tangem.core.analytics.Analytics import com.tangem.crypto.bip39.DefaultMnemonic import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.operations.ScanTask @@ -38,7 +38,11 @@ import kotlinx.coroutines.withContext import kotlin.coroutines.resume @Suppress("TooManyFunctions") -class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Context) { +class TangemSdkManager( + private val tangemSdk: TangemSdk, + private val context: Context, + private val cardTypeResolver: CardTypeResolver, +) { private val userCodeRepository by lazy { UserCodeRepository( @@ -78,7 +82,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co suspend fun createProductWallet(scanResponse: ScanResponse): CompletionResult { return runTaskAsync( - CreateProductWalletTask(scanResponse.cardTypesResolver), + CreateProductWalletTask(cardTypeResolver), scanResponse.card.cardId, Message(context.getString(R.string.initial_message_create_wallet_body)), ) @@ -90,7 +94,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co ): CompletionResult { return when (val seedResult = DefaultMnemonic(mnemonic, tangemSdk.wordlist).generateSeed()) { is CompletionResult.Success -> runTaskAsync( - CreateProductWalletTask(scanResponse.cardTypesResolver, seedResult.data), + CreateProductWalletTask(cardTypeResolver, seedResult.data), scanResponse.card.cardId, Message(context.getString(R.string.initial_message_create_wallet_body)), ) @@ -228,7 +232,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co fun changeDisplayedCardIdNumbersCount(scanResponse: ScanResponse?) { tangemSdk.config.cardIdDisplayFormat = when { scanResponse == null -> CardIdDisplayFormat.Full - scanResponse.cardTypesResolver.isTangemTwins() -> CardIdDisplayFormat.LastLuhn(4) + cardTypeResolver.isTangemTwins() -> CardIdDisplayFormat.LastLuhn(4) else -> CardIdDisplayFormat.Full } } diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index 4e39b73bbe..ae8c0cc795 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -9,8 +9,6 @@ import com.tangem.common.doOnSuccess import com.tangem.core.analytics.Analytics import com.tangem.datasource.config.ConfigManager import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.common.util.cardTypesResolver -import com.tangem.domain.models.scan.ScanResponse import com.tangem.operations.attestation.Attestation import com.tangem.tap.* import com.tangem.tap.common.analytics.events.Basic @@ -25,6 +23,7 @@ import com.tangem.tap.features.disclaimer.createDisclaimer import com.tangem.tap.features.disclaimer.redux.DisclaimerAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.CoroutineScope @@ -58,7 +57,10 @@ class TapWalletManager( } private suspend fun loadUserWalletData(userWallet: UserWallet, refresh: Boolean, sendAnalyticsEvent: Boolean) { - Analytics.setContext(userWallet.scanResponse) + Analytics.setContext( + scanResponse = userWallet.scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) if (sendAnalyticsEvent) { Analytics.send(Basic.WalletOpened()) } @@ -68,7 +70,7 @@ class TapWalletManager( tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse) store.state.globalState.feedbackManager?.infoHolder?.setCardInfo(scanResponse) - updateConfigManager(scanResponse) + updateConfigManager() withMainContext { // Order is important store.dispatch(DisclaimerAction.SetDisclaimer(card.createDisclaimer())) @@ -135,10 +137,11 @@ class TapWalletManager( } } - fun updateConfigManager(data: ScanResponse) { + fun updateConfigManager() { val configManager = store.state.globalState.configManager + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (data.cardTypesResolver.isStart2Coin()) { + if (cardTypeResolver.isStart2Coin()) { configManager?.turnOff(ConfigManager.IS_TOP_UP_ENABLED) } else { configManager?.resetToDefault(ConfigManager.IS_TOP_UP_ENABLED) diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt index a9de7cb47a..c2776941b7 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt @@ -1,24 +1,19 @@ package com.tangem.tap.domain.extensions -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.DerivationParams -import com.tangem.blockchain.common.DerivationStyle -import com.tangem.blockchain.common.WalletManager -import com.tangem.blockchain.common.WalletManagerFactory +import com.tangem.blockchain.common.* import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toMapKey import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.domain.tokens.models.BlockchainNetwork -import com.tangem.tap.features.wallet.models.Currency fun WalletManagerFactory.makeWalletManagerForApp( scanResponse: ScanResponse, + cardTypeResolver: CardTypeResolver, blockchain: Blockchain, derivationParams: DerivationParams?, ): WalletManager? { @@ -34,7 +29,7 @@ fun WalletManagerFactory.makeWalletManagerForApp( val seedKey = wallet.extendedPublicKey return when { - scanResponse.cardTypesResolver.isTangemTwins() && scanResponse.secondTwinPublicKey != null -> { + cardTypeResolver.isTangemTwins() && scanResponse.secondTwinPublicKey != null -> { makeTwinWalletManager( walletPublicKey = wallet.publicKey, pairPublicKey = scanResponse.secondTwinPublicKey!!.hexToBytes(), @@ -68,17 +63,6 @@ fun WalletManagerFactory.makeWalletManagerForApp( } } -fun WalletManagerFactory.makeWalletManagerForApp( - scanResponse: ScanResponse, - blockchainNetwork: BlockchainNetwork, -): WalletManager? { - return makeWalletManagerForApp( - scanResponse, - blockchain = blockchainNetwork.blockchain, - derivationParams = getDerivationParams(blockchainNetwork.derivationPath, scanResponse.card), - ) -} - private fun getDerivationParams(derivationPath: String?, card: CardDTO): DerivationParams? { return derivationPath?.let { DerivationParams.Custom( @@ -93,32 +77,19 @@ private fun getDerivationParams(derivationPath: String?, card: CardDTO): Derivat } } -fun WalletManagerFactory.makeWalletManagerForApp(scanResponse: ScanResponse, currency: Currency): WalletManager? { - return makeWalletManagerForApp( - scanResponse, - blockchain = currency.blockchain, - derivationParams = getDerivationParams(currency.derivationPath, scanResponse.card), - ) -} - -fun WalletManagerFactory.makeWalletManagersForApp( +fun WalletManagerFactory.makePrimaryWalletManager( scanResponse: ScanResponse, - blockchains: List, -): List { - return blockchains - .filter { it.isBlockchain() } - .mapNotNull { this.makeWalletManagerForApp(scanResponse, it) } -} - -fun WalletManagerFactory.makePrimaryWalletManager(scanResponse: ScanResponse): WalletManager? { + cardTypeResolver: CardTypeResolver, +): WalletManager? { val blockchain = if (scanResponse.card.isTestCard) { - scanResponse.cardTypesResolver.getBlockchain().getTestnetVersion() ?: return null + cardTypeResolver.getBlockchain().getTestnetVersion() ?: return null } else { - scanResponse.cardTypesResolver.getBlockchain() + cardTypeResolver.getBlockchain() } val derivationParams = getDerivationParams(null, scanResponse.card) return makeWalletManagerForApp( scanResponse = scanResponse, + cardTypeResolver = cardTypeResolver, blockchain = blockchain, derivationParams = derivationParams, ) diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt index d4e6cbd1fc..6fc426781c 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt @@ -1,15 +1,16 @@ package com.tangem.tap.domain.model.builders +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.TapWorkarounds.isStart2Coin 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.common.TapWorkarounds.isStart2Coin -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.userWalletList.GetCardImageUseCase class UserWalletBuilder( private val scanResponse: ScanResponse, + private val cardTypeResolver: CardTypeResolver, private val getCardImageUseCase: GetCardImageUseCase = GetCardImageUseCase(), ) { private var backupCardsIds: Set = emptySet() @@ -46,7 +47,7 @@ class UserWalletBuilder( artworkUrl = getCardImageUseCase.invoke(card.cardId, card.cardPublicKey), cardsInWallet = backupCardsIds.plus(card.cardId), scanResponse = this, - isMultiCurrency = cardTypesResolver.isMultiwalletAllowed(), + isMultiCurrency = cardTypeResolver.isMultiwalletAllowed(), ) } } diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt index e7d01ecdb6..57838dad8d 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt @@ -1,14 +1,10 @@ package com.tangem.tap.domain.model.builders import com.tangem.blockchain.blockchains.polkadot.ExistentialDepositProvider -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.DerivationStyle -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.crypto.hdWallet.DerivationPath +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.TapWorkarounds.derivationStyle -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel @@ -29,19 +25,25 @@ interface WalletStoreBuilder { companion object { operator fun invoke( userWallet: UserWallet, + cardTypeResolver: CardTypeResolver, blockchainNetwork: BlockchainNetwork, ): BlockchainNetworkWalletStoreBuilder { - return BlockchainNetworkWalletStoreBuilderImpl(userWallet, blockchainNetwork) + return BlockchainNetworkWalletStoreBuilderImpl(userWallet, cardTypeResolver, blockchainNetwork) } - operator fun invoke(userWallet: UserWallet, walletManager: WalletManager): WalletMangerWalletStoreBuilder { - return WalletMangerWalletStoreBuilderImpl(userWallet, walletManager) + operator fun invoke( + userWallet: UserWallet, + cardTypeResolver: CardTypeResolver, + walletManager: WalletManager, + ): WalletMangerWalletStoreBuilder { + return WalletMangerWalletStoreBuilderImpl(userWallet, cardTypeResolver, walletManager) } } } private class BlockchainNetworkWalletStoreBuilderImpl( private val userWallet: UserWallet, + private val cardTypeResolver: CardTypeResolver, private val blockchainNetwork: BlockchainNetwork, ) : WalletStoreBuilder.BlockchainNetworkWalletStoreBuilder { private var walletManager: WalletManager? = null @@ -56,7 +58,7 @@ private class BlockchainNetworkWalletStoreBuilderImpl( val tokensWalletsData = blockchainNetwork.getTokensWalletsData( walletManager = walletManager, cardDerivationStyle = cardDerivationStyle, - primaryToken = userWallet.scanResponse.cardTypesResolver.getPrimaryToken(), + primaryToken = cardTypeResolver.getPrimaryToken(), ) return WalletStoreModel( @@ -73,6 +75,7 @@ private class BlockchainNetworkWalletStoreBuilderImpl( private class WalletMangerWalletStoreBuilderImpl( private val userWallet: UserWallet, + private val cardTypeResolver: CardTypeResolver, private val walletManager: WalletManager, ) : WalletStoreBuilder.WalletMangerWalletStoreBuilder { @@ -81,7 +84,7 @@ private class WalletMangerWalletStoreBuilderImpl( val blockchainWalletData = wallet.blockchain.toBlockchainWalletData(walletManager) val tokenWalletsData = wallet.getTokens().firstOrNull()?.toTokenWalletData( walletManager = walletManager, - primaryToken = userWallet.scanResponse.cardTypesResolver.getPrimaryToken(), + primaryToken = cardTypeResolver.getPrimaryToken(), ) return WalletStoreModel( diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index f885b4fa13..6009ec32df 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -7,6 +7,7 @@ import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.extensions.withMainContext import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ScanResponse @@ -22,6 +23,7 @@ import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -71,7 +73,11 @@ internal object LegacyScanProcessor { tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse) onScanStateChange(false) - sendAnalytics(analyticsEvent, scanResponse) + sendAnalytics( + analyticsEvent = analyticsEvent, + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) showDisclaimerIfNeed( scanResponse = scanResponse, @@ -89,10 +95,14 @@ internal object LegacyScanProcessor { } } - private fun sendAnalytics(analyticsEvent: AnalyticsEvent?, scanResponse: ScanResponse) { + private fun sendAnalytics( + analyticsEvent: AnalyticsEvent?, + scanResponse: ScanResponse, + cardTypeResolver: CardTypeResolver, + ) { analyticsEvent?.let { // this workaround needed to send CardWasScannedEvent without adding a context - val interceptor = CardContextInterceptor(scanResponse) + val interceptor = CardContextInterceptor(scanResponse, cardTypeResolver) val params = it.params.toMutableMap() interceptor.intercept(params) it.params = params.toMap() @@ -146,18 +156,25 @@ internal object LegacyScanProcessor { ) { val globalState = store.state.globalState val tapWalletManager = globalState.tapWalletManager - tapWalletManager.updateConfigManager(scanResponse) + tapWalletManager.updateConfigManager() store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(scanResponse)) - if (OnboardingHelper.isOnboardingCase(scanResponse)) { - Analytics.addContext(scanResponse) + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + if (OnboardingHelper.isOnboardingCase(scanResponse, cardTypeResolver)) { + Analytics.addContext( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) onWalletNotCreated() store.dispatchOnMain(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = true)) val appScreen = OnboardingHelper.whereToNavigate(scanResponse) navigateTo(appScreen) { onProgressStateChange(it) } } else { - Analytics.setContext(scanResponse) + Analytics.setContext( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) if (scanResponse.twinsIsTwinned() && !preferencesStorage.wasTwinsOnboardingShown()) { onWalletNotCreated() store.dispatchOnMain(TwinCardsAction.SetStepOfScreen(TwinCardsStep.WelcomeOnly(scanResponse))) diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt index 45a463343a..04249c892c 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt @@ -49,7 +49,12 @@ internal object UseCaseScanProcessor { val chains = buildList { add(ScanningFinishedChain { onScanStateChange(false) }) if (analyticsEvent != null) { - add(AnalyticsChain(analyticsEvent)) + add( + AnalyticsChain( + event = analyticsEvent, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ), + ) } add(DisclaimerChain(store, disclaimerWillShow)) add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager, preferencesStorage)) diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt index febc6a1525..d065b20148 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt @@ -4,6 +4,7 @@ import arrow.core.Either import arrow.core.right import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.AnalyticsEvent +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.card.ScanCardException import com.tangem.domain.core.chain.Chain import com.tangem.domain.models.scan.ScanResponse @@ -19,12 +20,16 @@ import com.tangem.tap.common.analytics.paramsInterceptor.CardContextInterceptor */ class AnalyticsChain( private val event: AnalyticsEvent, + private val cardTypeResolver: CardTypeResolver, ) : Chain { override suspend fun invoke( previousChainResult: ScanResponse, ): Either { - val interceptor = CardContextInterceptor(previousChainResult) + val interceptor = CardContextInterceptor( + scanResponse = previousChainResult, + cardTypeResolver = cardTypeResolver, + ) val params = event.params.toMutableMap() interceptor.intercept(params) event.params = params.toMap() diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt index ce46f2f527..d17b6c84c3 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt @@ -20,6 +20,7 @@ import com.tangem.tap.domain.TapWalletManager import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import org.rekotlin.Store @@ -44,18 +45,25 @@ class CheckForOnboardingChain( override suspend fun invoke( previousChainResult: ScanResponse, ): Either { - tapWalletManager.updateConfigManager(previousChainResult) + tapWalletManager.updateConfigManager() store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(previousChainResult)) + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) return when { - OnboardingHelper.isOnboardingCase(previousChainResult) -> { - Analytics.addContext(previousChainResult) + OnboardingHelper.isOnboardingCase(previousChainResult, cardTypeResolver) -> { + Analytics.addContext( + scanResponse = previousChainResult, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) store.dispatchOnMain(GlobalAction.Onboarding.Start(previousChainResult, canSkipBackup = true)) val appScreen = OnboardingHelper.whereToNavigate(previousChainResult) ScanChainException.OnboardingNeeded(appScreen).left() } else -> { - Analytics.setContext(previousChainResult) + Analytics.setContext( + scanResponse = previousChainResult, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) // If twins was twinned previously but twins welcome not shown if (previousChainResult.twinsIsTwinned() && !preferencesStore.wasTwinsOnboardingShown()) { store.dispatchOnMain( diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt index d23e9fde5c..23225a2a25 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt @@ -12,7 +12,7 @@ import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.map import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.models.scan.CardDTO @@ -55,7 +55,7 @@ private data class CreateWalletResponse( } class CreateProductWalletTask( - private val cardTypesResolver: CardTypesResolver, + private val cardTypeResolver: CardTypeResolver, private val seed: ByteArray? = null, ) : CardSessionRunnable { @@ -72,8 +72,8 @@ class CreateProductWalletTask( val cardDto = CardDTO(card) val commandProcessor = when { - cardTypesResolver.isTangemNote() -> CreateWalletTangemNote(cardTypesResolver) - cardTypesResolver.isTangemTwins() -> + cardTypeResolver.isTangemNote() -> CreateWalletTangemNote(cardTypeResolver) + cardTypeResolver.isTangemTwins() -> throw UnsupportedOperationException("Use the TwinCardsManager to create a wallet") else -> CreateWalletTangemWallet(seed) @@ -97,7 +97,7 @@ class CreateProductWalletTask( } } -private class CreateWalletTangemNote(private val cardTypesResolver: CardTypesResolver) : +private class CreateWalletTangemNote(private val cardTypeResolver: CardTypeResolver) : ProductCommandProcessor { override fun proceed( card: CardDTO, @@ -109,7 +109,7 @@ private class CreateWalletTangemNote(private val cardTypesResolver: CardTypesRes return } - val curvesSupportedByBlockchain = cardTypesResolver.getBlockchain().getSupportedCurves().toSet() + val curvesSupportedByBlockchain = cardTypeResolver.getBlockchain().getSupportedCurves().toSet() if (curvesSupportedByBlockchain.isEmpty()) { callback(CompletionResult.Failure(TangemSdkError.CardError())) return diff --git a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt index 0c6bfccf02..d754f7ecd7 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt @@ -1,5 +1,7 @@ package com.tangem.tap.domain.walletCurrencies.di +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.domain.tokens.UserTokensRepository import com.tangem.tap.domain.walletCurrencies.WalletCurrenciesManager @@ -8,12 +10,14 @@ import com.tangem.tap.domain.walletStores.repository.WalletAmountsRepository import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository +@Suppress("LongParameterList") fun WalletCurrenciesManager.Companion.provideDefaultImplementation( userTokensRepository: UserTokensRepository, walletStoresRepository: WalletStoresRepository, walletAmountsRepository: WalletAmountsRepository, walletManagersRepository: WalletManagersRepository, appCurrencyProvider: () -> FiatCurrency, + cardTypeResolverProvider: Provider, ): WalletCurrenciesManager { return DefaultWalletCurrenciesManager( userTokensRepository = userTokensRepository, @@ -21,5 +25,6 @@ fun WalletCurrenciesManager.Companion.provideDefaultImplementation( walletAmountsRepository = walletAmountsRepository, walletManagersRepository = walletManagersRepository, appCurrencyProvider = appCurrencyProvider, + cardTypeResolverProvider = cardTypeResolverProvider, ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt index 0bbd76b7bc..65103d09a2 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt @@ -2,6 +2,8 @@ package com.tangem.tap.domain.walletCurrencies.implementation import com.tangem.blockchain.common.DerivationStyle import com.tangem.common.* +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.util.UserWalletId import com.tangem.domain.models.scan.CardDTO @@ -26,6 +28,7 @@ internal class DefaultWalletCurrenciesManager( private val walletAmountsRepository: WalletAmountsRepository, private val walletManagersRepository: WalletManagersRepository, private val appCurrencyProvider: () -> FiatCurrency, + private val cardTypeResolverProvider: Provider, ) : WalletCurrenciesManager { private val listeners = mutableListOf() @@ -227,7 +230,11 @@ internal class DefaultWalletCurrenciesManager( .flatMap { walletManager -> walletStoresRepository.storeOrUpdate( userWalletId = userWallet.walletId, - walletStore = WalletStoreBuilder(userWallet, blockchainNetwork) + walletStore = WalletStoreBuilder( + userWallet = userWallet, + cardTypeResolver = cardTypeResolverProvider.invoke(), + blockchainNetwork = blockchainNetwork, + ) .walletManager(walletManager) .build(), ) diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt index d2a4789fb0..ae1ac2bb4c 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt @@ -1,24 +1,23 @@ package com.tangem.tap.domain.walletStores.di -import com.tangem.tap.domain.walletStores.WalletStoresManager -import com.tangem.tap.domain.walletStores.implementation.DummyWalletStoresManager +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.domain.tokens.UserTokensRepository +import com.tangem.tap.domain.walletStores.WalletStoresManager import com.tangem.tap.domain.walletStores.implementation.DefaultWalletStoresManager import com.tangem.tap.domain.walletStores.repository.WalletAmountsRepository import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository -fun WalletStoresManager.Companion.provideDummyImplementation(): WalletStoresManager { - return DummyWalletStoresManager() -} - +@Suppress("LongParameterList") fun WalletStoresManager.Companion.provideDefaultImplementation( userTokensRepository: UserTokensRepository, walletStoresRepository: WalletStoresRepository, walletAmountsRepository: WalletAmountsRepository, walletManagersRepository: WalletManagersRepository, appCurrencyProvider: () -> FiatCurrency, + cardTypeResolverProvider: Provider, ): WalletStoresManager { return DefaultWalletStoresManager( userTokensRepository = userTokensRepository, @@ -26,5 +25,6 @@ fun WalletStoresManager.Companion.provideDefaultImplementation( walletAmountsRepository = walletAmountsRepository, walletManagersRepository = walletManagersRepository, appCurrencyProvider = appCurrencyProvider, + cardTypeResolverProvider = cardTypeResolverProvider, ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt index 6081a25788..476fa8300c 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt @@ -2,12 +2,9 @@ package com.tangem.tap.domain.walletStores.implementation import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType -import com.tangem.common.CompletionResult -import com.tangem.common.doOnSuccess -import com.tangem.common.flatMap -import com.tangem.common.flatMapOnFailure -import com.tangem.common.fold -import com.tangem.common.map +import com.tangem.common.* +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider import com.tangem.domain.common.util.UserWalletId import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.domain.model.UserWallet @@ -35,6 +32,7 @@ internal class DefaultWalletStoresManager( private val walletAmountsRepository: WalletAmountsRepository, private val walletManagersRepository: WalletManagersRepository, private val appCurrencyProvider: () -> FiatCurrency, + private val cardTypeResolverProvider: Provider, ) : WalletStoresManager { private val state = MutableStateFlow(State()) @@ -151,7 +149,11 @@ internal class DefaultWalletStoresManager( { walletManager -> walletStoresRepository.storeOrUpdate( userWalletId = userWalletId, - walletStore = WalletStoreBuilder(userWallet, blockchainNetwork) + walletStore = WalletStoreBuilder( + userWallet = userWallet, + cardTypeResolver = cardTypeResolverProvider.invoke(), + blockchainNetwork = blockchainNetwork, + ) .walletManager(walletManager) .build(), ) @@ -185,7 +187,11 @@ internal class DefaultWalletStoresManager( val userWalletId = userWallet.walletId walletStoresRepository.storeOrUpdate( userWalletId = userWalletId, - walletStore = WalletStoreBuilder(userWallet, walletManager) + walletStore = WalletStoreBuilder( + userWallet = userWallet, + cardTypeResolver = cardTypeResolverProvider.invoke(), + walletManager = walletManager, + ) .build(), ) } diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt index d89d4ea6aa..1f89cd4eda 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt @@ -2,6 +2,8 @@ package com.tangem.tap.domain.walletStores.repository.di import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.datasource.api.tangemTech.TangemTechService +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider import com.tangem.tap.domain.walletStores.repository.WalletAmountsRepository import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository @@ -16,8 +18,9 @@ fun WalletStoresRepository.Companion.provideDefaultImplementation(): WalletStore fun WalletManagersRepository.Companion.provideDefaultImplementation( walletManagerFactory: WalletManagerFactory, + cardTypeResolverProvider: Provider, ): WalletManagersRepository { - return DefaultWalletManagersRepository(walletManagerFactory) + return DefaultWalletManagersRepository(walletManagerFactory, cardTypeResolverProvider) } fun WalletAmountsRepository.Companion.provideDefaultImplementation( diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt index b2d8167a7e..bf26df0009 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt @@ -1,22 +1,17 @@ package com.tangem.tap.domain.walletStores.repository.implementation -import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.DerivationParams -import com.tangem.blockchain.common.DerivationStyle -import com.tangem.blockchain.common.WalletManager -import com.tangem.blockchain.common.WalletManagerFactory +import com.tangem.blockchain.common.* import com.tangem.common.CompletionResult import com.tangem.common.catching import com.tangem.common.doOnSuccess import com.tangem.common.mapFailure import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.UserWalletId import com.tangem.domain.models.scan.CardDTO -import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.domain.extensions.makeWalletManagerForApp import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.tokens.models.BlockchainNetwork @@ -30,6 +25,7 @@ import timber.log.Timber internal class DefaultWalletManagersRepository( private val walletManagerFactory: WalletManagerFactory, + private val cardTypeResolverProvider: Provider, ) : WalletManagersRepository { private val walletManagersStorage = WalletManagerStorage @@ -56,10 +52,7 @@ internal class DefaultWalletManagersRepository( derivationPath = blockchainNetwork?.derivationPath, ) - foundWalletManager?.updateTokens( - scanResponse = userWallet.scanResponse, - blockchainNetwork = blockchainNetwork, - ) + foundWalletManager?.updateTokens(blockchainNetwork = blockchainNetwork) ?: makeAndStore(userWallet, blockchainNetwork) } @@ -69,7 +62,7 @@ internal class DefaultWalletManagersRepository( ): CompletionResult { val scanResponse = userWallet.scanResponse val blockchain = blockchainNetwork?.blockchain - ?: scanResponse.cardTypesResolver.getBlockchain().let { blockchain -> + ?: cardTypeResolverProvider.invoke().getBlockchain().let { blockchain -> if (scanResponse.card.isTestCard) blockchain.getTestnetVersion() else blockchain } val derivationParams = getDerivationParams( @@ -80,6 +73,7 @@ internal class DefaultWalletManagersRepository( val walletManager = blockchain?.let { walletManagerFactory.makeWalletManagerForApp( scanResponse = userWallet.scanResponse, + cardTypeResolver = cardTypeResolverProvider.invoke(), blockchain = blockchain, derivationParams = derivationParams, ) @@ -98,10 +92,7 @@ internal class DefaultWalletManagersRepository( CompletionResult.Failure(error) } walletManager != null -> { - walletManager.updateTokens( - scanResponse = scanResponse, - blockchainNetwork = blockchainNetwork, - ) + walletManager.updateTokens(blockchainNetwork = blockchainNetwork) .doOnSuccess { store(userWallet.walletId, it) } } else -> { @@ -161,13 +152,10 @@ internal class DefaultWalletManagersRepository( } } - private fun WalletManager.updateTokens( - scanResponse: ScanResponse, - blockchainNetwork: BlockchainNetwork?, - ): CompletionResult { + private fun WalletManager.updateTokens(blockchainNetwork: BlockchainNetwork?): CompletionResult { val walletManager = this return catching { - val tokens = blockchainNetwork?.tokens ?: listOfNotNull(scanResponse.cardTypesResolver.getPrimaryToken()) + val tokens = blockchainNetwork?.tokens ?: listOfNotNull(cardTypeResolverProvider.invoke().getPrimaryToken()) if (tokens != walletManager.cardTokens) { // TODO: remove ability to manipulate with walletManager.cardTokens diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt index 4624db8d34..89cdd44f5f 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt @@ -1,13 +1,14 @@ package com.tangem.tap.features.demo import com.tangem.common.extensions.guard -import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.common.demo.DemoConfig import com.tangem.domain.common.extensions.withMainContext +import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.domain.extensions.makePrimaryWalletManager import com.tangem.tap.features.onboarding.products.note.redux.OnboardingNoteAction import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import kotlinx.coroutines.launch @@ -28,9 +29,14 @@ internal class DemoOnboardingNoteMiddleware : DemoMiddleware { noteState.walletManager } else { val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = wmFactory.makePrimaryWalletManager(scanResponse).guard { - return false - } + val walletManager = wmFactory + .makePrimaryWalletManager( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) + .guard { + return false + } store.dispatch(OnboardingNoteAction.SetWalletManager(walletManager)) walletManager } diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt index 5782c7b0e2..ad390d5207 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt @@ -2,7 +2,6 @@ package com.tangem.tap.features.details.redux import com.tangem.blockchain.common.Wallet import com.tangem.domain.models.scan.CardDTO -import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.entities.FiatCurrency import org.rekotlin.Action @@ -26,7 +25,7 @@ sealed class DetailsAction : Action { object ScanCard : DetailsAction() - data class PrepareCardSettingsData(val card: CardDTO, val cardTypesResolver: CardTypesResolver) : DetailsAction() + data class PrepareCardSettingsData(val card: CardDTO) : DetailsAction() object ResetCardSettingsData : DetailsAction() sealed class AccessCodeRecovery : DetailsAction() { 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 acc0130ea9..8541cb7fb0 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 @@ -8,7 +8,6 @@ import com.tangem.common.extensions.guard import com.tangem.common.flatMap import com.tangem.core.analytics.Analytics import com.tangem.domain.common.TapWorkarounds.isTangemTwins -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam @@ -33,13 +32,8 @@ import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.foregroundActivityObserver -import com.tangem.tap.preferencesStorage -import com.tangem.tap.scope -import com.tangem.tap.store +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.tangemSdkManager -import com.tangem.tap.userWalletsListManager -import com.tangem.tap.walletStoresManager import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -92,10 +86,7 @@ class DetailsMiddleware { if (isSameWallet) { store.dispatchOnMain( - DetailsAction.PrepareCardSettingsData( - scanResponse.card, - scanResponse.cardTypesResolver, - ), + DetailsAction.PrepareCardSettingsData(card = scanResponse.card), ) } else { store.dispatchDialogShow( @@ -328,7 +319,12 @@ class DetailsMiddleware { enableAccessCodesSaving: Boolean, ): CompletionResult { val userWallet = userWalletsListManager.selectedUserWalletSync - ?: scanResponse?.let { UserWalletBuilder(it).build() } + ?: scanResponse?.let { + UserWalletBuilder( + scanResponse = it, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ).build() + } ?: return CompletionResult.Failure( error = TangemSdkError.ExceptionError(IllegalStateException("scanResponse is null")), ) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index e28b9cd398..21bdcfdddc 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -1,15 +1,15 @@ package com.tangem.tap.features.details.redux -import com.tangem.domain.common.CardTypesResolver -import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.extensions.signedHashesCount import com.tangem.tap.preferencesStorage +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import com.tangem.tap.tangemSdkManager import org.rekotlin.Action -import java.util.* +import java.util.EnumSet object DetailsReducer { fun reduce(action: Action, state: AppState): DetailsState = internalReduce(action, state) @@ -23,11 +23,7 @@ private fun internalReduce(action: Action, state: AppState): DetailsState { handlePrepareScreen(action) } is DetailsAction.PrepareCardSettingsData -> { - handlePrepareCardSettingsScreen( - card = action.card, - cardTypesResolver = action.cardTypesResolver, - state = detailsState, - ) + handlePrepareCardSettingsScreen(card = action.card, state = detailsState) } is DetailsAction.ResetCardSettingsData -> detailsState.copy(cardSettingsState = null) is DetailsAction.ResetToFactory -> { @@ -60,17 +56,14 @@ private fun handlePrepareScreen(action: DetailsAction.PrepareScreen): DetailsSta ) } -private fun handlePrepareCardSettingsScreen( - card: CardDTO, - cardTypesResolver: CardTypesResolver, - state: DetailsState, -): DetailsState { +private fun handlePrepareCardSettingsScreen(card: CardDTO, state: DetailsState): DetailsState { + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) val cardSettingsState = CardSettingsState( - cardInfo = card.toCardInfo(cardTypesResolver), - manageSecurityState = prepareSecurityOptions(card, cardTypesResolver), + cardInfo = card.toCardInfo(cardTypeResolver), + manageSecurityState = prepareSecurityOptions(card, cardTypeResolver), card = card, - resetCardAllowed = isResetToFactoryAllowedByCard(card, cardTypesResolver), - accessCodeRecovery = if (cardTypesResolver.isWallet2()) { + resetCardAllowed = isResetToFactoryAllowedByCard(card, cardTypeResolver), + accessCodeRecovery = if (cardTypeResolver.isWallet2()) { val enabled = card.userSettings?.isUserCodeRecoveryAllowed ?: false AccessCodeRecoveryState( enabledOnCard = enabled, @@ -83,7 +76,7 @@ private fun handlePrepareCardSettingsScreen( return state.copy(cardSettingsState = cardSettingsState) } -private fun prepareSecurityOptions(card: CardDTO, cardTypesResolver: CardTypesResolver): ManageSecurityState { +private fun prepareSecurityOptions(card: CardDTO, cardTypeResolver: CardTypeResolver): ManageSecurityState { val securityOption = when { card.isAccessCodeSet -> { SecurityOption.AccessCode @@ -98,14 +91,15 @@ private fun prepareSecurityOptions(card: CardDTO, cardTypesResolver: CardTypesRe } } val allowedSecurityOptions = when { - cardTypesResolver.isStart2Coin() || cardTypesResolver.isTangemNote() -> { + cardTypeResolver.isStart2Coin() || cardTypeResolver.isTangemNote() -> { EnumSet.of(SecurityOption.LongTap) } card.settings.isBackupAllowed -> { EnumSet.of(securityOption) } - else -> - prepareAllowedSecurityOptions(cardTypesResolver = cardTypesResolver, currentSecurityOption = securityOption) + else -> { + prepareAllowedSecurityOptions(cardTypeResolver = cardTypeResolver, currentSecurityOption = securityOption) + } } return ManageSecurityState( currentOption = securityOption, @@ -114,9 +108,9 @@ private fun prepareSecurityOptions(card: CardDTO, cardTypesResolver: CardTypesRe ) } -private fun isResetToFactoryAllowedByCard(card: CardDTO, cardTypesResolver: CardTypesResolver): Boolean { +private fun isResetToFactoryAllowedByCard(card: CardDTO, cardTypeResolver: CardTypeResolver): Boolean { val hasPermanentWallet = card.wallets.any { it.settings.isPermanent } - val isNotAllowed = hasPermanentWallet || cardTypesResolver.isStart2Coin() + val isNotAllowed = hasPermanentWallet || cardTypeResolver.isStart2Coin() return !isNotAllowed } @@ -140,12 +134,10 @@ private fun handleSecurityAction(action: DetailsAction.ManageSecurity, state: De // Setting options to show only LongTap from now on for non-twins val manageSecurityState = state.cardSettingsState?.manageSecurityState?.copy( currentOption = state.cardSettingsState.manageSecurityState.selectedOption, - allowedOptions = state.scanResponse?.cardTypesResolver?.let { - prepareAllowedSecurityOptions( - cardTypesResolver = it, - currentSecurityOption = state.cardSettingsState.manageSecurityState.selectedOption, - ) - } ?: EnumSet.of(SecurityOption.LongTap), + allowedOptions = prepareAllowedSecurityOptions( + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + currentSecurityOption = state.cardSettingsState.manageSecurityState.selectedOption, + ), ) state.copy( cardSettingsState = state.cardSettingsState?.copy( @@ -229,12 +221,12 @@ private fun handleAccessCodeRecoveryAction( } private fun prepareAllowedSecurityOptions( - cardTypesResolver: CardTypesResolver, + cardTypeResolver: CardTypeResolver, currentSecurityOption: SecurityOption?, ): EnumSet { val allowedSecurityOptions = EnumSet.of(SecurityOption.LongTap) - if (cardTypesResolver.isTangemTwins()) { + if (cardTypeResolver.isTangemTwins()) { allowedSecurityOptions.add(SecurityOption.PassCode) } if (currentSecurityOption == SecurityOption.AccessCode) { @@ -246,9 +238,8 @@ private fun prepareAllowedSecurityOptions( return allowedSecurityOptions } -@Suppress("MagicNumber") -private fun CardDTO.toCardInfo(cardTypesResolver: CardTypesResolver): CardInfo { - val cardId = this.cardId.chunked(4).joinToString(separator = " ") +private fun CardDTO.toCardInfo(cardTypeResolver: CardTypeResolver): CardInfo { + val cardId = this.cardId.chunked(size = 4).joinToString(separator = " ") val issuer = this.issuer.name val signedHashes = this.signedHashesCount() @@ -256,7 +247,7 @@ private fun CardDTO.toCardInfo(cardTypesResolver: CardTypesResolver): CardInfo { cardId = cardId, issuer = issuer, signedHashes = signedHashes, - isTwin = cardTypesResolver.isTangemTwins(), + isTwin = cardTypeResolver.isTangemTwins(), hasBackup = backupStatus?.isActive == true, ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index b69de63a66..47422b12e6 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -8,7 +8,6 @@ import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toNetworkId 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.tap.common.extensions.dispatchOnMain @@ -404,7 +403,8 @@ class WalletConnectMiddleware { private fun handleScanResponse(scanResponse: ScanResponse, session: WalletConnectSession, blockchain: Blockchain) { val card = scanResponse.card - if (!scanResponse.cardTypesResolver.isMultiwalletAllowed()) { + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + if (!cardTypeResolver.isMultiwalletAllowed()) { store.dispatchOnMain(WalletConnectAction.UnsupportedCard) return } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index e9766c6147..9256eda744 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -3,7 +3,6 @@ package com.tangem.tap.features.details.ui.details import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import com.tangem.core.analytics.Analytics -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.feedback.FeedbackEmail import com.tangem.tap.common.feedback.SupportInfo @@ -16,6 +15,7 @@ import com.tangem.tap.features.disclaimer.redux.DisclaimerAction import com.tangem.tap.features.home.LocaleRegionProvider import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.wallet.BuildConfig import org.rekotlin.Store @@ -26,11 +26,11 @@ class DetailsViewModel(private val store: Store) { @Suppress("ComplexMethod") fun updateState(state: DetailsState): DetailsScreenState { - val cardTypesResolver = state.scanResponse?.cardTypesResolver + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) val settings = SettingsElement.values().mapNotNull { when (it) { SettingsElement.WalletConnect -> { - if (cardTypesResolver?.isMultiwalletAllowed() == true) it else null + if (cardTypeResolver.isMultiwalletAllowed()) it else null } SettingsElement.SendFeedback -> it SettingsElement.LinkMoreCards -> if (state.createBackupAllowed) it else null @@ -38,8 +38,8 @@ class DetailsViewModel(private val store: Store) { if (state.privacyPolicyUrl != null) it else null } SettingsElement.AppSettings -> if (state.appSettingsState.isBiometricsAvailable) it else null - SettingsElement.AppCurrency -> if (cardTypesResolver?.isMultiwalletAllowed() != true) it else null - SettingsElement.ReferralProgram -> if (cardTypesResolver?.isTangemWallet() == true) it else null + SettingsElement.AppCurrency -> if (!cardTypeResolver.isMultiwalletAllowed()) it else null + SettingsElement.ReferralProgram -> if (cardTypeResolver.isTangemWallet()) it else null SettingsElement.TesterMenu -> if (BuildConfig.TESTER_MENU_ENABLED) it else null else -> it } 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 9d7d775e1d..5a3d6060f6 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 @@ -27,6 +27,7 @@ import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.home.redux.HomeMiddleware.BUY_WALLET_URL import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.signin.redux.SignInAction +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -101,10 +102,15 @@ private fun readCard(analyticsEvent: AnalyticsEvent?) = scope.launch { } private fun proceedWithScanResponse(scanResponse: ScanResponse) = scope.launch { - val userWallet = UserWalletBuilder(scanResponse).build().guard { - Timber.e("User wallet not created") - return@launch - } + val userWallet = UserWalletBuilder( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) + .build() + .guard { + Timber.e("User wallet not created") + return@launch + } userWalletsListManager.save(userWallet) .doOnFailure { error -> 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 6079110e39..2003719d77 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 @@ -4,10 +4,11 @@ import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics -import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse +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 @@ -16,11 +17,7 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.features.saveWallet.redux.SaveWalletAction -import com.tangem.tap.preferencesStorage -import com.tangem.tap.scope -import com.tangem.tap.store -import com.tangem.tap.tangemSdkManager -import com.tangem.tap.userWalletsListManager +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber @@ -29,11 +26,11 @@ import timber.log.Timber [REDACTED_AUTHOR] */ object OnboardingHelper { - fun isOnboardingCase(response: ScanResponse): Boolean { + fun isOnboardingCase(response: ScanResponse, cardTypeResolver: CardTypeResolver): Boolean { val cardInfoStorage = preferencesStorage.usedCardsPrefStorage val cardId = response.card.cardId return when { - response.cardTypesResolver.isTangemTwins() -> { + cardTypeResolver.isTangemTwins() -> { if (!response.twinsIsTwinned()) { true } else { @@ -41,7 +38,7 @@ object OnboardingHelper { } } - response.cardTypesResolver.isWallet2() -> { + cardTypeResolver.isWallet2() -> { val emptyWallets = response.card.wallets.isEmpty() val activationInProgress = cardInfoStorage.isActivationInProgress(cardId) val backupNotActive = response.card.backupStatus?.isActive != true @@ -73,7 +70,10 @@ object OnboardingHelper { accessCode: String? = null, backupCardsIds: List? = null, ) { - Analytics.setContext(scanResponse) + Analytics.setContext( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) when { // When should save user wallets, then save card without navigate to save wallet screen preferencesStorage.shouldSaveUserWallets -> scope.launch { @@ -119,7 +119,10 @@ object OnboardingHelper { } private suspend fun proceedWithScanResponse(scanResponse: ScanResponse, backupCardsIds: List?) { - val userWallet = UserWalletBuilder(scanResponse) + val userWallet = UserWalletBuilder( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) .backupCardsIds(backupCardsIds?.toSet()) .build() .guard { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index fddc46b3a8..29877cbf50 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -7,13 +7,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding -import com.tangem.tap.common.extensions.dispatchDebugErrorNotification -import com.tangem.tap.common.extensions.dispatchDialogShow -import com.tangem.tap.common.extensions.dispatchErrorNotification -import com.tangem.tap.common.extensions.dispatchOnMain -import com.tangem.tap.common.extensions.dispatchOpenUrl -import com.tangem.tap.common.extensions.getAddressData -import com.tangem.tap.common.extensions.getTopUpUrl +import com.tangem.tap.common.extensions.* import com.tangem.tap.common.postUi import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState @@ -29,6 +23,7 @@ import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.models.WalletDialog +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager @@ -123,7 +118,10 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch noteState.walletManager } else { val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = wmFactory.makePrimaryWalletManager(scanResponse).guard { + val walletManager = wmFactory.makePrimaryWalletManager( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ).guard { val message = "Loading cancelled. Cause: wallet manager didn't created" val customError = TapError.CustomError(message) store.dispatchErrorNotification(customError) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt index ba7983eaa5..044c9fd13f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt @@ -3,9 +3,8 @@ package com.tangem.tap.features.onboarding.products.otherCards.redux import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.core.analytics.Analytics -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.extensions.withMainContext -import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE +import com.tangem.tap.* import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.postUi import com.tangem.tap.common.redux.AppState @@ -13,10 +12,7 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.wallet.models.toCurrencies -import com.tangem.tap.scope -import com.tangem.tap.store -import com.tangem.tap.tangemSdkManager -import com.tangem.tap.userTokensRepository +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -90,9 +86,10 @@ private fun handleOtherCardsAction(action: Action) { onboardingManager.activationStarted(updatedCard.cardId) store.state.globalState.topUpController?.registerEmptyWallet(updatedResponse) - val primaryBlockchain = updatedResponse.cardTypesResolver.getBlockchain() + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + val primaryBlockchain = cardTypeResolver.getBlockchain() val blockchainNetworks = if (primaryBlockchain != Blockchain.Unknown) { - val primaryToken = updatedResponse.cardTypesResolver.getPrimaryToken() + val primaryToken = cardTypeResolver.getPrimaryToken() val blockchainNetwork = BlockchainNetwork( blockchain = primaryBlockchain, 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 036482c623..1fa0ce5b48 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 @@ -29,6 +29,7 @@ import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.models.WalletDialog +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -221,7 +222,10 @@ private fun handle(action: Action, dispatch: DispatchFunction) { twinCardsState.walletManager } else { val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = wmFactory.makePrimaryWalletManager(getScanResponse()).guard { + val walletManager = wmFactory.makePrimaryWalletManager( + scanResponse = getScanResponse(), + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ).guard { val message = "Loading cancelled. Cause: wallet manager didn't created" val customError = TapError.CustomError(message) store.dispatchErrorNotification(customError) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt index 9ba9492c54..d393583ef3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt @@ -1,8 +1,9 @@ package com.tangem.tap.features.onboarding.products.twins.redux -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.getTwinCardNumber import com.tangem.tap.common.redux.AppState +import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.store import org.rekotlin.Action object TwinCardsReducer { @@ -17,7 +18,8 @@ private fun internalReduce(action: Action, state: AppState): TwinCardsState { when (action) { is TwinCardsAction.IfTwinsPrepareState -> { - state = if (action.scanResponse.cardTypesResolver.isTangemTwins()) { + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + state = if (cardTypeResolver.isTangemTwins()) { val cardNumber = action.scanResponse.card.getTwinCardNumber() ?: return state TwinCardsState( 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 2f4be5416d..dc2a82105e 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 @@ -7,7 +7,6 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.ifNotNull import com.tangem.core.analytics.Analytics 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.feature.onboarding.data.model.CreateWalletResponse @@ -30,9 +29,9 @@ 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 -import org.rekotlin.DispatchFunction import org.rekotlin.Middleware object OnboardingWalletMiddleware { @@ -43,8 +42,8 @@ private val onboardingWalletMiddleware: Middleware = { dispatch, state { next -> { action -> when (action) { - is OnboardingWallet2Action -> handleWallet2Action(action, state) - else -> handleWalletAction(action, state, dispatch) + is OnboardingWallet2Action -> handleWallet2Action(action) + else -> handleWalletAction(action) } next(action) } @@ -52,7 +51,7 @@ private val onboardingWalletMiddleware: Middleware = { dispatch, state } @Suppress("LongMethod", "ComplexMethod") -private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: DispatchFunction) { +private fun handleWalletAction(action: Action) { if (action !is OnboardingWalletAction) return val globalState = store.state.globalState @@ -178,7 +177,7 @@ private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: } @Suppress("LongMethod", "ComplexMethod") -private fun handleWallet2Action(action: OnboardingWallet2Action, state: () -> AppState?) { +private fun handleWallet2Action(action: OnboardingWallet2Action) { val globalState = store.state.globalState val onboardingManager = globalState.onboardingState.onboardingManager @@ -186,7 +185,8 @@ private fun handleWallet2Action(action: OnboardingWallet2Action, state: () -> Ap when (action) { is OnboardingWallet2Action.Init -> { - if (scanResponse?.cardTypesResolver?.isWallet2() == true) { + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + if (cardTypeResolver.isWallet2()) { store.dispatch(OnboardingWallet2Action.SetDependencies(action.maxProgress)) } } 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 ec2223b2bd..8866609bb7 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 @@ -7,6 +7,7 @@ import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.common.flatMap import com.tangem.core.analytics.Analytics +import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Onboarding @@ -21,12 +22,7 @@ import com.tangem.tap.domain.userWalletList.UserWalletsListManager import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.domain.userWalletList.isLockable import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.foregroundActivityObserver -import com.tangem.tap.preferencesStorage -import com.tangem.tap.scope -import com.tangem.tap.store -import com.tangem.tap.tangemSdkManager -import com.tangem.tap.userWalletsListManager +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.launch import org.rekotlin.Middleware import timber.log.Timber @@ -96,7 +92,10 @@ internal class SaveWalletMiddleware { scope.launch { val userWallet = userWalletsListManager.selectedUserWalletSync - ?: UserWalletBuilder(scanResponse) + ?: UserWalletBuilder( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) .backupCardsIds(state.backupInfo?.backupCardsIds) .build() ?: return@launch 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 9c1feed6b4..c6ee8940d4 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 @@ -4,7 +4,6 @@ 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.util.cardTypesResolver import com.tangem.tap.common.entities.Button import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.toggleWidget.WidgetState @@ -50,9 +49,6 @@ data class WalletState( store.state.twinCardsState } - val isTangemTwins: Boolean - get() = store.state.globalState.scanResponse?.cardTypesResolver?.isTangemTwins() == true - val isExchangeServiceFeatureOn: Boolean get() = store.state.globalState.exchangeManager.featureIsSwitchedOn() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index d86a41c389..de428f2421 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -19,6 +19,7 @@ import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.models.WalletDialog +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.userWalletsListManager @@ -82,7 +83,10 @@ class MultiWalletMiddleware { return } val scanResponse = selectedUserWallet.scanResponse - Analytics.addContext(scanResponse) + Analytics.addContext( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false)) store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt index 44a7dd5341..7b64bf710f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt @@ -5,7 +5,6 @@ import com.tangem.blockchain.common.SignatureCountValidator import com.tangem.blockchain.extensions.SimpleResult import com.tangem.common.card.FirmwareVersion import com.tangem.domain.common.TapWorkarounds.isTestCard -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.extensions.dispatchOnMain @@ -107,9 +106,10 @@ class WarningsMiddleware { } private fun checkIfWarningNeeded(scanResponse: ScanResponse): WarningMessage? { - if (scanResponse.cardTypesResolver.isTangemTwins() || scanResponse.isDemoCard()) return null + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + if (cardTypeResolver.isTangemTwins() || scanResponse.isDemoCard()) return null - if (scanResponse.cardTypesResolver.isMultiwalletAllowed()) { + if (cardTypeResolver.isMultiwalletAllowed()) { val isBackupForbidden = with(scanResponse.card.settings) { !(isBackupAllowed || isHDWalletAllowed) } return if (scanResponse.card.hasSignedHashes() && isBackupForbidden) { WarningMessagesManager.signedHashesMultiWalletWarning @@ -139,9 +139,8 @@ class WarningsMiddleware { val card = scanResponse?.card if (card == null || preferencesStorage.usedCardsPrefStorage.wasScanned(card.cardId)) return - if (scanResponse.cardTypesResolver.isTangemTwins() || scanResponse.cardTypesResolver.isMultiwalletAllowed()) { - return - } + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + if (cardTypeResolver.isTangemTwins() || cardTypeResolver.isMultiwalletAllowed()) return val validator = store.state.walletState.walletManagers.firstOrNull() as? SignatureCountValidator diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt index 95f80ebca8..d07d830d42 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.common.analytics.events.MainScreen @@ -14,6 +13,7 @@ import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.userWalletList.UserWalletsListManager import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.ui.analytics.WalletAnalyticsEventsMapper +import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import com.tangem.tap.walletStoresManager import dagger.hilt.android.lifecycle.HiltViewModel @@ -54,8 +54,9 @@ internal class WalletViewModel @Inject constructor( override fun onCreate(owner: LifecycleOwner) { launch() val scanResponse = store.state.globalState.scanResponse + val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) if (scanResponse != null) { - val currency = ParamCardCurrencyConverter().convert(scanResponse.cardTypesResolver) + val currency = ParamCardCurrencyConverter().convert(cardTypeResolver) val signInType = store.state.signInState.type if (currency != null && signInType != null) { analyticsEventHandler.send( 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 3528a61c7a..a53ee4fe57 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 @@ -22,6 +22,7 @@ import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.unlockIfLockable +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull @@ -162,7 +163,11 @@ internal class WalletSelectorMiddleware { } private suspend fun saveUserWalletAndPopBackToWalletScreen(scanResponse: ScanResponse): CompletionResult { - val userWallet = UserWalletBuilder(scanResponse).build() + val userWallet = UserWalletBuilder( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) + .build() ?: return CompletionResult.Failure(TangemSdkError.WalletIsNotCreated()) return userWalletsListManager.save(userWallet) diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt index 2a8ace7ad3..e24f28d268 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt @@ -1,10 +1,11 @@ package com.tangem.tap.features.walletSelector.redux -import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.model.UserWallet +import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.store import org.rekotlin.Action internal object WalletSelectorReducer { @@ -99,7 +100,10 @@ internal object WalletSelectorReducer { ) } else { UserWalletModel.Type.SingleCurrency( - blockchainName = scanResponse.cardTypesResolver.getBlockchain().fullName, + blockchainName = store.state.daggerGraphState + .get(DaggerGraphState::cardTypeResolver) + .getBlockchain() + .fullName, ) } } 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 005bcca0a4..983f4bc963 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 @@ -20,6 +20,7 @@ import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.unlockIfLockable import com.tangem.tap.features.intentHandler.handlers.WalletConnectLinkIntentHandler import com.tangem.tap.features.signin.redux.SignInAction +import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.launch import org.rekotlin.Middleware import timber.log.Timber @@ -79,7 +80,12 @@ internal class WelcomeMiddleware { private fun proceedWithCard(state: WelcomeState) = scope.launch { scanCardInternal { scanResponse -> - val userWallet = UserWalletBuilder(scanResponse).build() ?: return@scanCardInternal + val userWallet = UserWalletBuilder( + scanResponse = scanResponse, + cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), + ) + .build() + ?: return@scanCardInternal userWalletsListManager.save(userWallet, canOverride = true) .doOnFailure { error -> diff --git a/app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt b/app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt new file mode 100644 index 0000000000..d44eda26cd --- /dev/null +++ b/app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt @@ -0,0 +1,100 @@ +package com.tangem.tap.legacy.card + +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token +import com.tangem.common.card.EllipticCurve +import com.tangem.common.card.FirmwareVersion +import com.tangem.common.card.WalletData +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider +import com.tangem.domain.common.TapWorkarounds.isStart2Coin +import com.tangem.domain.common.TapWorkarounds.isTestCard +import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.models.scan.ProductType + +internal class LegacyCardTypeResolver( + private val cardProvider: Provider, + private val productTypeProvider: Provider, + private val walletDataProvider: Provider, +) : CardTypeResolver { + + private val card: CardDTO get() = cardProvider.invoke() + private val productType: ProductType get() = productTypeProvider.invoke() + private val walletData: WalletData? get() = walletDataProvider.invoke() + + override fun isTangemNote(): Boolean = productType == ProductType.Note + + override fun isTangemWallet(): Boolean { + return with(card.settings) { + isBackupAllowed && isHDWalletAllowed && card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable + } + } + + override fun isWallet2(): Boolean { + return with(card) { + firmwareVersion >= FirmwareVersion.KeysImportAvailable && settings.isKeysImportAllowed + } + } + + override fun isTangemTwins(): Boolean = productType == ProductType.Twins + + override fun isStart2Coin(): Boolean = card.isStart2Coin + + override fun isMultiwalletAllowed(): Boolean { + return (multiWalletAvailable() || card.wallets.firstOrNull()?.curve == EllipticCurve.Secp256k1) && + !isTangemTwins() && !card.isStart2Coin && !isTangemNote() + } + + private fun multiWalletAvailable() = card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable + + override fun getBlockchain(): Blockchain { + if (productType == ProductType.Start2Coin) { + return if (card.isTestCard) Blockchain.BitcoinTestnet else Blockchain.Bitcoin + } + + val blockchainName = walletData?.blockchain + ?: return if (productType == ProductType.Note) { + TANGEM_NOTE_BATCHES[card.batchId] ?: Blockchain.Unknown + } else { + Blockchain.Unknown + } + + return Blockchain.fromBlockchainName(blockchainName) + } + + override fun getPrimaryToken(): Token? { + val cardToken = walletData?.token ?: return null + return Token( + name = cardToken.name, + symbol = cardToken.symbol, + contractAddress = cardToken.contractAddress, + decimals = cardToken.decimals, + ) + } + + private fun Blockchain.Companion.fromBlockchainName(name: String): Blockchain { + // workaround for BSC (BNB) notes cards + return when (name) { + "BINANCE" -> Blockchain.BSC + "BINANCE/test" -> Blockchain.BSCTestnet + else -> Blockchain.fromId(name) + } + } + + private companion object { + val TANGEM_NOTE_BATCHES = mapOf( + "AB01" to Blockchain.Bitcoin, + "AB02" to Blockchain.Ethereum, + "AB03" to Blockchain.CardanoShelley, + "AB04" to Blockchain.Dogecoin, + "AB05" to Blockchain.BSC, + "AB06" to Blockchain.XRP, + "AB07" to Blockchain.Bitcoin, + "AB08" to Blockchain.Ethereum, + "AB09" to Blockchain.Bitcoin, // new batches for 3.34 + "AB10" to Blockchain.Ethereum, + "AB11" to Blockchain.Bitcoin, + "AB12" to Blockchain.Ethereum, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt b/app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt new file mode 100644 index 0000000000..032d545891 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt @@ -0,0 +1,34 @@ +package com.tangem.tap.legacy.card.di + +import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.Provider +import com.tangem.tap.legacy.card.LegacyCardTypeResolver +import com.tangem.tap.proxy.AppStateHolder +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object LegacyCardModule { + + @Provides + @Singleton + fun providesCardTypeResolver(reduxStateHolder: AppStateHolder): CardTypeResolver { + return LegacyCardTypeResolver( + cardProvider = Provider { + requireNotNull(reduxStateHolder.userWalletsListManager?.selectedUserWalletSync?.scanResponse?.card) + }, + productTypeProvider = Provider { + requireNotNull( + value = reduxStateHolder.userWalletsListManager?.selectedUserWalletSync?.scanResponse?.productType, + ) + }, + walletDataProvider = Provider { + requireNotNull(reduxStateHolder.userWalletsListManager?.selectedUserWalletSync?.scanResponse).walletData + }, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index c673ac8577..ba301a2fc1 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -29,9 +29,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.coroutines.suspendCoroutine -class DerivationManagerImpl( - private val appStateHolder: AppStateHolder, -) : DerivationManager { +class DerivationManagerImpl(private val appStateHolder: AppStateHolder) : DerivationManager { override suspend fun deriveMissingBlockchains(currency: Currency) = suspendCoroutine { continuation -> val blockchain = Blockchain.fromNetworkId(currency.networkId) diff --git a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt index 371f1e21bf..0f33e210b7 100644 --- a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt +++ b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt @@ -46,9 +46,7 @@ class ProxyModule { @Provides @Singleton fun provideDerivationManager(appStateHolder: AppStateHolder): DerivationManager { - return DerivationManagerImpl( - appStateHolder = appStateHolder, - ) + return DerivationManagerImpl(appStateHolder = appStateHolder) } // regions FeatureConsumers diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index a741e4dfd4..a4ca39f942 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -2,6 +2,7 @@ package com.tangem.tap.proxy.redux import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager +import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.card.ScanCardUseCase import com.tangem.features.tester.api.TesterRouter import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles @@ -23,6 +24,7 @@ data class DaggerGraphState( val walletConnectRepository: WalletConnectRepository? = null, val walletConnectSessionsRepository: WalletConnectSessionsRepository? = null, val walletConnectInteractor: WalletConnectInteractor? = null, + val cardTypeResolver: CardTypeResolver? = null, ) : StateType { inline fun get(getDependency: DaggerGraphState.() -> T?): T { diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt b/domain/legacy/src/main/java/com/tangem/domain/card/CardTypeResolver.kt similarity index 84% rename from domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt rename to domain/legacy/src/main/java/com/tangem/domain/card/CardTypeResolver.kt index 72e1bfb243..97012f4efd 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/card/CardTypeResolver.kt @@ -1,17 +1,23 @@ -package com.tangem.domain.common +package com.tangem.domain.card import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token -interface CardTypesResolver { +interface CardTypeResolver { + fun isTangemNote(): Boolean + fun isTangemWallet(): Boolean + fun isWallet2(): Boolean + fun isTangemTwins(): Boolean + fun isStart2Coin(): Boolean fun isMultiwalletAllowed(): Boolean fun getBlockchain(): Blockchain + fun getPrimaryToken(): Token? } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt b/domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt new file mode 100644 index 0000000000..c77b356dfc --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt @@ -0,0 +1,10 @@ +package com.tangem.domain.common + +/** + * Provider for lazy initialization + * + * @param action initialization action + * +[REDACTED_AUTHOR] + */ +class Provider(action: () -> T) : () -> T by action \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt deleted file mode 100644 index 79f908088a..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.tangem.domain.common - -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.Token -import com.tangem.common.card.EllipticCurve -import com.tangem.common.card.FirmwareVersion -import com.tangem.common.card.WalletData -import com.tangem.domain.common.TapWorkarounds.getTangemNoteBlockchain -import com.tangem.domain.common.TapWorkarounds.isStart2Coin -import com.tangem.domain.common.TapWorkarounds.isTestCard -import com.tangem.domain.models.scan.CardDTO -import com.tangem.domain.models.scan.ProductType - -class TangemCardTypesResolver( - private val card: CardDTO, - private val productType: ProductType, - private val walletData: WalletData?, -) : CardTypesResolver { - - override fun isTangemNote(): Boolean = productType == ProductType.Note - override fun isTangemWallet(): Boolean = card.settings.isBackupAllowed && - card.settings.isHDWalletAllowed && - card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable - - override fun isWallet2(): Boolean = - card.firmwareVersion >= FirmwareVersion.KeysImportAvailable && card.settings.isKeysImportAllowed - - override fun isTangemTwins(): Boolean = productType == ProductType.Twins - override fun isStart2Coin(): Boolean = card.isStart2Coin - - override fun isMultiwalletAllowed(): Boolean = !isTangemTwins() && - !card.isStart2Coin && - !isTangemNote() && - (multiWalletAvailable() || card.wallets.firstOrNull()?.curve == EllipticCurve.Secp256k1) - - private fun multiWalletAvailable() = card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable - - override fun getBlockchain(): Blockchain { - return when (productType) { - ProductType.Start2Coin -> if (card.isTestCard) Blockchain.BitcoinTestnet else Blockchain.Bitcoin - else -> { - val blockchainName: String = walletData?.blockchain - ?: if (productType == ProductType.Note) { - return card.getTangemNoteBlockchain() ?: Blockchain.Unknown - } else { - return Blockchain.Unknown - } - Blockchain.fromBlockchainName(blockchainName) - } - } - } - - override fun getPrimaryToken(): Token? { - val cardToken = walletData?.token ?: return null - return Token( - cardToken.name, - cardToken.symbol, - cardToken.contractAddress, - cardToken.decimals, - ) - } -} - -private fun Blockchain.Companion.fromBlockchainName(blockchainName: String): Blockchain { - // workaround for BSC (BNB) notes cards - return when (blockchainName) { - "BINANCE" -> { - Blockchain.BSC - } - "BINANCE/test" -> { - Blockchain.BSCTestnet - } - else -> { - Blockchain.fromId(blockchainName) - } - } -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt index 5d25521277..144e55921c 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt @@ -1,14 +1,13 @@ package com.tangem.domain.common -import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.DerivationStyle -import com.tangem.common.card.Card import com.tangem.domain.models.scan.CardDTO -import java.util.* +import java.util.Locale /** [REDACTED_AUTHOR] */ +@Deprecated(message = "Use CardTypeResolver. [REDACTED_JIRA]") object TapWorkarounds { private const val START_2_COIN_ISSUER = "start2coin" private const val TEST_CARD_BATCH = "99FF" @@ -44,34 +43,11 @@ object TapWorkarounds { val CardDTO.isNotSupportedInThatRelease: Boolean get() = false - private val tangemNoteBatches = mapOf( - "AB01" to Blockchain.Bitcoin, - "AB02" to Blockchain.Ethereum, - "AB03" to Blockchain.CardanoShelley, - "AB04" to Blockchain.Dogecoin, - "AB05" to Blockchain.BSC, - "AB06" to Blockchain.XRP, - "AB07" to Blockchain.Bitcoin, - "AB08" to Blockchain.Ethereum, - "AB09" to Blockchain.Bitcoin, // new batches for 3.34 - "AB10" to Blockchain.Ethereum, - "AB11" to Blockchain.Bitcoin, - "AB12" to Blockchain.Ethereum, - ) - private val excludedBatches = listOf("0027", "0030", "0031", "0035") private val excludedIssuers = listOf("TTM BANK") - @Deprecated( - "Now blockchain is read form files (CardTypesResolver.getBlockchain), " + - "but for previously saved cards this method is still used", - ) - fun CardDTO.getTangemNoteBlockchain(): Blockchain? = tangemNoteBatches[batchId] - fun isStart2CoinIssuer(cardIssuer: String?): Boolean { return cardIssuer?.lowercase(Locale.US) == START_2_COIN_ISSUER } - - fun Card.getTangemNoteBlockchain(): Blockchain? = tangemNoteBatches[batchId] ?: null } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt b/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt index 8438a87f14..8e7b1a2099 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt @@ -4,22 +4,13 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.toMapKey import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.common.CardTypesResolver -import com.tangem.domain.common.TangemCardTypesResolver import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.models.scan.ScanResponse -val ScanResponse.cardTypesResolver: CardTypesResolver - get() = TangemCardTypesResolver( - card = card, - productType = productType, - walletData = walletData, - ) - fun ScanResponse.twinsIsTwinned(): Boolean = card.isTangemTwins && walletData != null && secondTwinPublicKey != null + fun ScanResponse.supportsHdWallet(): Boolean = card.settings.isHDWalletAllowed -fun ScanResponse.supportsBackup(): Boolean = card.settings.isBackupAllowed fun ScanResponse.hasDerivation(blockchain: Blockchain, rawDerivationPath: String): Boolean { return hasDerivation(blockchain, DerivationPath(rawDerivationPath))