From 6558188794ea4fca31a9ce0c8658415515aabc64 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 21 Nov 2023 11:17:20 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 19 -- .../common/analytics/topup/TopUpController.kt | 207 ------------------ .../tap/common/redux/global/GlobalAction.kt | 2 - .../common/redux/global/GlobalMiddleware.kt | 3 - .../tap/common/redux/global/GlobalReducer.kt | 1 - .../tap/common/redux/global/GlobalState.kt | 2 - .../note/redux/OnboardingNoteMiddleware.kt | 3 - .../redux/OnboardingOtherCardsMiddleware.kt | 1 - .../twins/redux/TwinCardsMiddleware.kt | 3 - .../redux/OnboardingWalletMiddleware.kt | 1 - 10 files changed, 242 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 0aecd2719a..be77267ab0 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -46,7 +46,6 @@ import com.tangem.tap.common.analytics.handlers.BlockchainExceptionHandler import com.tangem.tap.common.analytics.handlers.amplitude.AmplitudeAnalyticsHandler import com.tangem.tap.common.analytics.handlers.appsFlyer.AppsFlyerAnalyticsHandler import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler -import com.tangem.tap.common.analytics.topup.TopUpController import com.tangem.tap.common.chat.ChatManager import com.tangem.tap.common.feedback.AdditionalFeedbackInfo import com.tangem.tap.common.feedback.FeedbackManager @@ -61,8 +60,6 @@ import com.tangem.tap.domain.configurable.warningMessage.WarningMessagesManager import com.tangem.tap.domain.tasks.product.DerivationsFinder import com.tangem.tap.domain.tokens.UserTokensRepository import com.tangem.tap.domain.tokens.UserTokensStorageService -import com.tangem.tap.domain.totalBalance.TotalFiatBalanceCalculator -import com.tangem.tap.domain.totalBalance.di.provideDefaultImplementation import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.domain.userWalletList.di.provideRuntimeImplementation import com.tangem.tap.domain.walletCurrencies.WalletCurrenciesManager @@ -132,9 +129,6 @@ val walletCurrenciesManager by lazy { appCurrencyProvider = { store.state.globalState.appCurrency }, ) } -val totalFiatBalanceCalculator by lazy { - TotalFiatBalanceCalculator.provideDefaultImplementation() -} @HiltAndroidApp internal class TapApplication : Application(), ImageLoaderFactory { @@ -282,7 +276,6 @@ internal class TapApplication : Application(), ImageLoaderFactory { appStateHolder.userTokensRepository = userTokensRepository appStateHolder.walletStoresManager = walletStoresManager - initTopUpController() walletConnect2Repository.init(projectId = configManager.config.walletConnectProjectId) } @@ -315,18 +308,6 @@ internal class TapApplication : Application(), ImageLoaderFactory { ) } - private fun initTopUpController() { - val topUpController = TopUpController( - scanResponseProvider = { - store.state.globalState.scanResponse - ?: store.state.globalState.onboardingState.onboardingManager?.scanResponse - }, - walletStoresManagerProvider = { walletStoresManager }, - topupWalletStorage = preferencesStorage.toppedUpWalletStorage, - ) - store.dispatch(GlobalAction.SetTopUpController(topUpController)) - } - override fun newImageLoader(): ImageLoader { return createCoilImageLoader( context = this, 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 deleted file mode 100644 index 376143ec6b..0000000000 --- a/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt +++ /dev/null @@ -1,207 +0,0 @@ -package com.tangem.tap.common.analytics.topup - -import com.tangem.common.extensions.guard -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.BlockchainNetwork -import com.tangem.domain.common.CardTypesResolver -import com.tangem.domain.common.util.cardTypesResolver -import com.tangem.domain.models.scan.ScanResponse -import com.tangem.domain.userwallets.UserWalletIdBuilder -import com.tangem.domain.wallets.models.UserWallet -import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.tap.common.analytics.converters.TopUpEventConverter -import com.tangem.tap.common.analytics.events.AnalyticsParam -import com.tangem.tap.domain.model.TotalFiatBalance -import com.tangem.tap.domain.model.WalletDataModel -import com.tangem.tap.domain.model.WalletStoreModel -import com.tangem.tap.domain.walletCurrencies.WalletCurrenciesManager -import com.tangem.tap.domain.walletStores.WalletStoresManager -import com.tangem.tap.features.wallet.models.Currency -import com.tangem.tap.scope -import com.tangem.utils.extensions.copy -import kotlinx.coroutines.launch -import java.math.BigDecimal - -/** -[REDACTED_AUTHOR] - */ -class TopUpController( - var scanResponseProvider: (() -> ScanResponse?)? = null, - var walletStoresManagerProvider: (() -> WalletStoresManager)? = null, - private val topupWalletStorage: ToppedUpWalletStorage, -) : WalletCurrenciesManager.Listener { - - private var hadMissedDerivations: Boolean = false - private val addedCurrencies = mutableListOf() - - override fun didUpdate(userWallet: UserWallet, currency: Currency) { - tryToSend() - } - - override fun willCurrenciesAdd(userWallet: UserWallet, currenciesToAdd: List) { - addedCurrencies.addAll(currenciesToAdd.distinct()) - } - - fun walletStoresChanged(walletStores: List) { - val missedDerivations = walletStores - .flatMap { it.walletsData } - .map { it.status } - .filterIsInstance() - - hadMissedDerivations = missedDerivations.isNotEmpty() - } - - fun scanToGetDerivations() { - hadMissedDerivations = true - } - - fun addMissingDerivations(blockchains: List) { - hadMissedDerivations = blockchains.isNotEmpty() - } - - fun totalBalanceStateChanged(totalFiatBalance: TotalFiatBalance) { - if (totalFiatBalance is TotalFiatBalance.Loaded) tryToSend() - } - - fun loadDataSuccess() { - tryToSend() - } - - private fun tryToSend() { - if (hadMissedDerivations) return - val scanResponse = scanResponseProvider?.invoke() ?: return - val userWalletId = UserWalletIdBuilder.scanResponse(scanResponse).build() ?: return - val walletStoresManager = walletStoresManagerProvider?.invoke() ?: return - - scope.launch { - val walletDataModels = walletStoresManager.getSync(userWalletId).flatMap { it.walletsData } - if (walletDataModels.isEmpty()) return@launch - - val isCorrectStatus = walletDataModels.any { - it.status is WalletDataModel.Loading || - it.status is WalletDataModel.NoAccount || - it.status is WalletDataModel.Unreachable || - it.status is WalletDataModel.MissedDerivation || - it.status.isErrorStatus - } - if (isCorrectStatus) return@launch - - val isToppedUpInPast = findToppedUpCurrenciesInPast(walletDataModels).isNotEmpty() - if (isToppedUpInPast) { - val newWalletInfo = DataSourceTopupInfo( - walletId = userWalletId.stringValue, - cardBalanceState = DataSourceTopupInfo.CardBalanceState.Full, - ) - topupWalletStorage.save(newWalletInfo) - return@launch - } - - val cardBalanceState = BalanceCalculator(walletDataModels).calculate().toCardBalanceState() - send(userWalletId, cardBalanceState, scanResponse.cardTypesResolver) - } - } - - /** - * A UserWalletId registration should be after creating wallets - */ - fun registerEmptyWallet(scanResponse: ScanResponse) { - UserWalletIdBuilder.scanResponse(scanResponse).build()?.let { - topupWalletStorage.save( - DataSourceTopupInfo( - walletId = it.stringValue, - cardBalanceState = DataSourceTopupInfo.CardBalanceState.Empty, - ), - ) - } - } - - fun send(scanResponse: ScanResponse, cardBalanceState: AnalyticsParam.CardBalanceState) { - UserWalletIdBuilder.scanResponse(scanResponse).build()?.let { - send(it, cardBalanceState, scanResponse.cardTypesResolver) - } - } - - fun send( - userWalletId: UserWalletId, - cardBalanceState: AnalyticsParam.CardBalanceState, - cardTypesResolver: CardTypesResolver, - ) { - val topupInfo = topupWalletStorage.restore(userWalletId.stringValue).guard { - val topupInfo = DataSourceTopupInfo( - walletId = userWalletId.stringValue, - cardBalanceState = when (cardBalanceState) { - AnalyticsParam.CardBalanceState.BlockchainError -> - DataSourceTopupInfo.CardBalanceState.BlockchainError - AnalyticsParam.CardBalanceState.CustomToken -> - DataSourceTopupInfo.CardBalanceState.CustomToken - AnalyticsParam.CardBalanceState.Empty -> - DataSourceTopupInfo.CardBalanceState.Empty - AnalyticsParam.CardBalanceState.Full -> - DataSourceTopupInfo.CardBalanceState.Full - AnalyticsParam.CardBalanceState.NoRate -> - DataSourceTopupInfo.CardBalanceState.NoRate - }, - ) - topupWalletStorage.save(topupInfo) - return - } - - val isToppedUp = topupInfo.cardBalanceState == DataSourceTopupInfo.CardBalanceState.Full - if (isToppedUp) return - - if (cardBalanceState.isToppedUp()) { - topupWalletStorage.save(topupInfo.copy(cardBalanceState = DataSourceTopupInfo.CardBalanceState.Full)) - TopUpEventConverter().convert(value = userWalletId to cardTypesResolver)?.let { - Analytics.send(it) - } - } - } - - private fun findToppedUpCurrenciesInPast(walletDataModels: List): List { - val currenciesToppedUpInPast = addedCurrencies.copy() - .mapNotNull { currency -> - val foundCurrencyModel = walletDataModels - .find { it.currency == currency } - ?: return@mapNotNull null - - if (foundCurrencyModel.status.amount.isZero()) null else foundCurrencyModel - } - addedCurrencies.clear() - - return currenciesToppedUpInPast - } - - private fun BigDecimal.toCardBalanceState(): AnalyticsParam.CardBalanceState = when { - isZero() -> AnalyticsParam.CardBalanceState.Empty - else -> AnalyticsParam.CardBalanceState.Full - } - - private fun AnalyticsParam.CardBalanceState.isToppedUp(): Boolean = this == AnalyticsParam.CardBalanceState.Full -} - -private interface IBalanceCalculator { - fun calculate(): BigDecimal -} - -private class BalanceCalculator( - private val walletDataModels: List, -) : IBalanceCalculator { - - override fun calculate(): BigDecimal { - val singleToken = walletDataModels - .filter { it.currency.isToken() } - .firstOrNull { it.isCardSingleToken } - - val totalAmount = singleToken?.status?.amount - ?: walletDataModels.calculateTotalCryptoAmount() - - return totalAmount - } - - private fun List.calculateTotalCryptoAmount(): BigDecimal = this - .map { it.status.amount } - .reduce(BigDecimal::plus) -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 13a9ee6ac8..acc2ecb36b 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -8,7 +8,6 @@ import com.tangem.datasource.config.models.ChatConfig import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.wallets.legacy.UserWalletsListManager -import com.tangem.tap.common.analytics.topup.TopUpController import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.common.feedback.FeedbackData import com.tangem.tap.common.feedback.FeedbackManager @@ -78,7 +77,6 @@ sealed class GlobalAction : Action { data class SetConfigManager(val configManager: ConfigManager) : GlobalAction() data class SetWarningManager(val warningManager: WarningMessagesManager) : GlobalAction() data class SetFeedbackManager(val feedbackManager: FeedbackManager) : GlobalAction() - data class SetTopUpController(val topUpController: TopUpController) : GlobalAction() data class SendEmail(val feedbackData: FeedbackData) : GlobalAction() data class OpenChat(val feedbackData: FeedbackData, val chatConfig: ChatConfig? = null) : GlobalAction() diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt index 49d7841274..add3c5f204 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt @@ -164,9 +164,6 @@ private fun handleAction(action: Action, appState: () -> AppState?) { } } } - is GlobalAction.SetTopUpController -> { - walletCurrenciesManager.addListener(action.topUpController) - } is GlobalAction.UpdateUserWalletsListManager -> { val walletManagersFacade = store.state.daggerGraphState.get(DaggerGraphState::walletManagersFacade) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index 2b282844d5..f6fe0f4b00 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -52,7 +52,6 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde globalState.copy(configManager = action.configManager) } is GlobalAction.SetWarningManager -> globalState.copy(warningManager = action.warningManager) - is GlobalAction.SetTopUpController -> globalState.copy(topUpController = action.topUpController) is GlobalAction.UpdateWalletSignedHashes -> { val card = globalState.scanResponse?.card ?: return globalState val wallet = card.wallets diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index c20fbea0f9..dd6530b9d7 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -5,7 +5,6 @@ import com.tangem.datasource.config.ConfigManager import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.wallets.legacy.UserWalletsListManager -import com.tangem.tap.common.analytics.topup.TopUpController import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.common.feedback.FeedbackManager import com.tangem.tap.domain.TapWalletManager @@ -29,7 +28,6 @@ data class GlobalState( val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(), val userCountryCode: String? = null, val userWalletsListManager: UserWalletsListManager? = null, - val topUpController: TopUpController? = null, val appThemeMode: AppThemeMode = AppThemeMode.DEFAULT, ) : StateType 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 c2110839a7..c96005ad98 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 @@ -102,7 +102,6 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch val updatedResponse = scanResponse.copy(card = result.data.card) onboardingManager.scanResponse = updatedResponse onboardingManager.activationStarted(updatedResponse.card.cardId) - store.state.globalState.topUpController?.registerEmptyWallet(updatedResponse) store.dispatch(OnboardingNoteAction.SetStepOfScreen(OnboardingNoteStep.TopUpWallet)) } is CompletionResult.Failure -> Unit @@ -151,8 +150,6 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch is OnboardingNoteAction.Balance.Set -> { if (action.balance.balanceIsToppedUp()) { OnboardingHelper.sendToppedUpEvent(scanResponse) - - store.state.globalState.topUpController?.send(scanResponse, AnalyticsParam.CardBalanceState.Full) store.dispatch(OnboardingNoteAction.SetStepOfScreen(OnboardingNoteStep.Done)) } } 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 faf34114d6..07c6ad43d9 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 @@ -89,7 +89,6 @@ private fun handleOtherCardsAction(action: Action) { val updatedCard = updatedResponse.card onboardingManager.scanResponse = updatedResponse onboardingManager.activationStarted(updatedCard.cardId) - store.state.globalState.topUpController?.registerEmptyWallet(updatedResponse) val primaryBlockchain = updatedResponse.cardTypesResolver.getBlockchain() val blockchainNetworks = if (primaryBlockchain != Blockchain.Unknown) { 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 ee7fd0f75f..3c13aa42a5 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 @@ -200,7 +200,6 @@ private fun handle(action: Action, dispatch: DispatchFunction) { is Result.Success -> { Analytics.send(Onboarding.Twins.SetupFinished()) updateScanResponse(result.data) - store.state.globalState.topUpController?.registerEmptyWallet(result.data) delay(DELAY_SDK_DIALOG_CLOSE) withMainContext { @@ -259,8 +258,6 @@ private fun handle(action: Action, dispatch: DispatchFunction) { is TwinCardsAction.Balance.Set -> { if (action.balance.balanceIsToppedUp()) { OnboardingHelper.sendToppedUpEvent(getScanResponse()) - - store.state.globalState.topUpController?.send(getScanResponse(), AnalyticsParam.CardBalanceState.Full) store.dispatchOnMain(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Done)) } } 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 4a6035d3ae..64db9eb86c 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 @@ -142,7 +142,6 @@ private fun handleWalletAction(action: Action) { primaryCard = result.data.primaryCard, ) onboardingManager.scanResponse = updatedResponse - store.state.globalState.topUpController?.registerEmptyWallet(updatedResponse) val blockchainNetworks = if (DemoHelper.isDemoCardId(result.data.card.cardId)) { DemoHelper.config.demoBlockchains