From 9d8611cee3c70432e28903bd84ee9444ce271a2a Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 27 Mar 2023 17:47:53 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 17 ++- .../analytics/converters/TopUpConverter.kt | 58 +------ .../common/analytics/filters/TopUpFilter.kt | 72 --------- .../common/analytics/topup/TopUpController.kt | 141 +++++++++++------- .../tap/common/redux/global/GlobalAction.kt | 2 + .../common/redux/global/GlobalMiddleware.kt | 4 + .../tap/common/redux/global/GlobalReducer.kt | 1 + .../tap/common/redux/global/GlobalState.kt | 2 +- .../com/tangem/tap/domain/TapWalletManager.kt | 2 +- .../WalletCurrenciesManager.kt | 10 +- .../note/redux/OnboardingNoteMiddleware.kt | 18 +-- .../redux/OnboardingOtherCardsMiddleware.kt | 1 + .../twins/redux/TwinCardsMiddleware.kt | 17 +-- .../redux/OnboardingWalletMiddleware.kt | 21 +-- .../middlewares/MultiWalletMiddleware.kt | 4 +- .../redux/middlewares/WalletMiddleware.kt | 2 +- .../tap/features/wallet/ui/WalletFragment.kt | 2 +- .../tap/persistence/ToppedUpWalletStorage.kt | 14 +- .../tangem/core/analytics/AnalyticsEvent.kt | 1 - 19 files changed, 146 insertions(+), 243 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/common/analytics/filters/TopUpFilter.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 4247167482..42d008074f 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -22,10 +22,10 @@ import com.tangem.domain.common.LogConfig import com.tangem.tap.common.IntentHandler import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder -import com.tangem.tap.common.analytics.filters.TopUpFilter 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 @@ -162,10 +162,15 @@ class TapApplication : Application(), ImageLoaderFactory { } private fun initTopUpController() { - val topUpController = store.state.globalState.topUpController - topUpController.walletStoresManagerProvider = { walletStoresManager } - topUpController.scanResponseProvider = { store.state.globalState.scanResponse } - walletCurrenciesManager.addListener(topUpController) + 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 { @@ -194,8 +199,6 @@ class TapApplication : Application(), ImageLoaderFactory { factory.addHandlerBuilder(AppsFlyerAnalyticsHandler.Builder()) factory.addHandlerBuilder(FirebaseAnalyticsHandler.Builder()) - factory.addFilter(TopUpFilter(preferencesStorage.toppedUpWalletStorage)) - val buildData = AnalyticsHandlerBuilder.Data( application = application, config = config, diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpConverter.kt index 98dc89b12e..429b2e5ebc 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpConverter.kt @@ -1,67 +1,17 @@ package com.tangem.tap.common.analytics.converters import com.tangem.common.Converter -import com.tangem.common.extensions.isZero import com.tangem.domain.common.CardTypesResolver -import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Basic -import com.tangem.tap.common.analytics.filters.TopUpFilter -import com.tangem.tap.domain.model.WalletDataModel -import java.math.BigDecimal /** [REDACTED_AUTHOR] */ -class TopUpEventConverter : Converter { +class TopUpEventConverter : Converter { - override fun convert(value: Data): Basic.ToppedUp? { - val (cardTypesResolver, walletDataModels, userWalletIdValue, isToppedUpInPast) = value - val paramCardCurrency = ParamCardCurrencyConverter().convert(cardTypesResolver) ?: return null + override fun convert(value: CardTypesResolver): Basic.ToppedUp? { + val paramCardCurrency = ParamCardCurrencyConverter().convert(value) ?: return null - val cardBalanceState = BalanceCalculator(walletDataModels).calculate().toCardBalanceState() - val filterData = TopUpFilter.Data( - walletId = userWalletIdValue, - cardBalanceState = cardBalanceState, - isToppedUpInPast = isToppedUpInPast, - ) - return Basic.ToppedUp(paramCardCurrency).apply { - this.filterData = filterData - } + return Basic.ToppedUp(paramCardCurrency) } - - private fun BigDecimal.toCardBalanceState(): AnalyticsParam.CardBalanceState = when { - isZero() -> AnalyticsParam.CardBalanceState.Empty - else -> AnalyticsParam.CardBalanceState.Full - } - - data class Data( - val cardTypesResolver: CardTypesResolver, - val walletDataModels: List, - val userWalletIdValue: String, - val isToppedUpInPast: Boolean, - ) -} - -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/analytics/filters/TopUpFilter.kt b/app/src/main/java/com/tangem/tap/common/analytics/filters/TopUpFilter.kt deleted file mode 100644 index 658ab218aa..0000000000 --- a/app/src/main/java/com/tangem/tap/common/analytics/filters/TopUpFilter.kt +++ /dev/null @@ -1,72 +0,0 @@ -package com.tangem.tap.common.analytics.filters - -import com.tangem.common.extensions.guard -import com.tangem.core.analytics.AnalyticsEvent -import com.tangem.core.analytics.api.AnalyticsEventFilter -import com.tangem.core.analytics.api.AnalyticsHandler -import com.tangem.tap.common.analytics.events.AnalyticsParam -import com.tangem.tap.common.analytics.events.Basic -import com.tangem.tap.common.analytics.topup.log -import com.tangem.tap.common.extensions.dispatchDebugErrorNotification -import com.tangem.tap.persistence.ToppedUpWalletStorage -import com.tangem.tap.store - -/** -[REDACTED_AUTHOR] - */ -class TopUpFilter( - private val topupWalletStorage: ToppedUpWalletStorage, -) : AnalyticsEventFilter { - - override fun canBeAppliedTo(event: AnalyticsEvent): Boolean = event is Basic.ToppedUp - - override fun canBeSent(event: AnalyticsEvent): Boolean { - val data = event.filterData as? Data ?: return false - - if (data.isToppedUpInPast) { - log("BasicTopUpFilter: [false]: sending is blocked") - val newWalletInfo = ToppedUpWalletStorage.Companion.TopupInfo( - walletId = data.walletId, - cardBalanceState = AnalyticsParam.CardBalanceState.Full, - ) - topupWalletStorage.save(newWalletInfo) - return false - } - - val topupInfo = topupWalletStorage.restore(data.walletId).guard { - log("BasicTopUpFilter: [false]: sending is blocked") - val topupInfo = ToppedUpWalletStorage.Companion.TopupInfo( - walletId = data.walletId, - cardBalanceState = data.cardBalanceState, - ) - topupWalletStorage.save(topupInfo) - return false - } - - if (topupInfo.isToppedUp) { - log("BasicTopUpFilter: [false]: sending is blocked") - return false - } - - return if (!topupInfo.isToppedUp && data.isToppedUp) { - log("BasicTopUpFilter: [TRUE]: !topupInfo.isToppedUp && data.isToppedUp") - log("BasicTopUpFilter: [TRUE]: SEND") - store.dispatchDebugErrorNotification("Topped UP sent") - topupWalletStorage.save(topupInfo.copy(cardBalanceState = AnalyticsParam.CardBalanceState.Full)) - true - } else { - log("BasicTopUpFilter: [false]: sending is blocked") - false - } - } - - override fun canBeConsumedByHandler(handler: AnalyticsHandler, event: AnalyticsEvent): Boolean = true - - data class Data( - val walletId: String, - val cardBalanceState: AnalyticsParam.CardBalanceState, - val isToppedUpInPast: Boolean, - ) { - val isToppedUp: Boolean = cardBalanceState == AnalyticsParam.CardBalanceState.Full - } -} \ No newline at end of file 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 3817d79ba5..e17985be26 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 @@ -7,6 +7,7 @@ import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.util.UserWalletId import com.tangem.tap.common.analytics.converters.TopUpEventConverter +import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.extensions.copy import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.model.WalletDataModel @@ -17,9 +18,10 @@ 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.features.wallet.redux.ProgressState +import com.tangem.tap.persistence.ToppedUpWalletStorage import com.tangem.tap.scope import kotlinx.coroutines.launch -import timber.log.Timber +import java.math.BigDecimal /** [REDACTED_AUTHOR] @@ -27,27 +29,18 @@ import timber.log.Timber 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 willUpdate(userWallet: UserWallet, currency: Currency) { - } - override fun didUpdate(userWallet: UserWallet, currency: Currency) { - tryToNotify() + tryToSend() } override fun willCurrenciesAdd(userWallet: UserWallet, currenciesToAdd: List) { addedCurrencies.addAll(currenciesToAdd.distinct()) - log("addCurrencies = [${addedCurrencies.joinToString()}]") - } - - override fun willCurrenciesRemove(userWallet: UserWallet, currenciesToRemove: List) { - } - - override fun willCurrencyRemove(userWallet: UserWallet, currencyToRemove: Currency) { } fun walletStoresChanged(walletStores: List) { @@ -57,46 +50,34 @@ class TopUpController( .filterIsInstance() hadMissedDerivations = missedDerivations.isNotEmpty() - log("walletStoresChanged: hadMissedDerivations = [${hadMissedDerivations}]") } fun scanToGetDerivations() { hadMissedDerivations = true - log("scanAndUpdateCard: hadMissedDerivations = [${hadMissedDerivations}]") } fun addMissingDerivations(blockchains: List) { hadMissedDerivations = blockchains.isNotEmpty() - log("addMissingDerivations: hadMissedDerivations = [${hadMissedDerivations}]") } fun totalBalanceStateChanged(state: ProgressState) { - log("totalBalanceStateChanged = [${state.name}]") - if (state == ProgressState.Done) { - tryToNotify() - } + if (state == ProgressState.Done) tryToSend() } fun loadDataSuccess() { - log("loadDataSuccess") - tryToNotify() + tryToSend() } - private fun tryToNotify() { - if (hadMissedDerivations) { - log("tryToNotify: FAILED: derivationsCheckIsScheduled") - return - } + 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()) { - log("tryToNotify: FAILED: walletDataModels.size = [0]") - return@launch - } + if (walletDataModels.isEmpty()) return@launch + val isCorrectStatus = walletDataModels.any { it.status is WalletDataModel.Loading || it.status is WalletDataModel.NoAccount || @@ -104,39 +85,70 @@ class TopUpController( it.status is WalletDataModel.MissedDerivation || it.status.isErrorStatus } - if (isCorrectStatus) { - log("tryToNotify: FAILED: by status") + if (isCorrectStatus) return@launch + + val isToppedUpInPast = findToppedUpCurrenciesInPast(walletDataModels).isNotEmpty() + if (isToppedUpInPast) { + val newWalletInfo = ToppedUpWalletStorage.TopupInfo( + walletId = userWalletId.stringValue, + cardBalanceState = AnalyticsParam.CardBalanceState.Full, + ) + topupWalletStorage.save(newWalletInfo) return@launch } - notify(userWalletId, walletDataModels, scanResponse.cardTypesResolver) + + val cardBalanceState = BalanceCalculator(walletDataModels).calculate().toCardBalanceState() + send(userWalletId, cardBalanceState, scanResponse.cardTypesResolver) } } - private fun notify( + /** + * A UserWalletId registration should be after creating wallets + */ + fun registerEmptyWallet(scanResponse: ScanResponse) { + UserWalletIdBuilder.scanResponse(scanResponse).build()?.let { + topupWalletStorage.save( + ToppedUpWalletStorage.TopupInfo( + walletId = it.stringValue, + cardBalanceState = AnalyticsParam.CardBalanceState.Empty, + ), + ) + } + } + + fun send( + scanResponse: ScanResponse, + cardBalanceState: AnalyticsParam.CardBalanceState, + ) { + UserWalletIdBuilder.scanResponse(scanResponse).build()?.let { + send(it, cardBalanceState, scanResponse.cardTypesResolver) + } + } + + fun send( userWalletId: UserWalletId, - walletDataModels: List, + cardBalanceState: AnalyticsParam.CardBalanceState, cardTypesResolver: CardTypesResolver, ) { - val isToppedUpInPast = findToppedUpCurrenciesInPast(walletDataModels).isNotEmpty() - log("notify: currencies from manage tokens had toppedUp in the past = [${isToppedUpInPast}]") - - val data = TopUpEventConverter.Data( - cardTypesResolver = cardTypesResolver, - walletDataModels = walletDataModels, - userWalletIdValue = userWalletId.stringValue, - isToppedUpInPast = isToppedUpInPast, - ) - val event = TopUpEventConverter().convert(data).guard { - log("notify: TopUpEventConverter can't convert a data to an event") + val topupInfo = topupWalletStorage.restore(userWalletId.stringValue).guard { + val topupInfo = ToppedUpWalletStorage.TopupInfo( + walletId = userWalletId.stringValue, + cardBalanceState = cardBalanceState, + ) + topupWalletStorage.save(topupInfo) return } + if (topupInfo.isToppedUp) return - log("notify: Analytics.send(event)") - Analytics.send(event) + if (!topupInfo.isToppedUp && cardBalanceState.isToppedUp()) { + topupWalletStorage.save(topupInfo.copy(cardBalanceState = AnalyticsParam.CardBalanceState.Full)) + TopUpEventConverter().convert(cardTypesResolver)?.let { + Analytics.send(it) + } + } } private fun findToppedUpCurrenciesInPast(walletDataModels: List): List { - log("findToppedUpCurrenciesInPast: added new currencies = [${addedCurrencies.size}]") val currenciesToppedUpInPast = addedCurrencies.copy() .mapNotNull { currency -> val foundCurrencyModel = walletDataModels @@ -149,8 +161,35 @@ class TopUpController( 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 } -fun log(log: String) { - Timber.d("TopUp: %s", log) +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 f0f6e8244c..a140fb2d0c 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 @@ -7,6 +7,7 @@ import com.tangem.common.core.TangemError import com.tangem.datasource.config.ConfigManager import com.tangem.datasource.config.models.ChatConfig import com.tangem.domain.common.ScanResponse +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 @@ -88,6 +89,7 @@ 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 b7fd1db3fe..5d99c5357e 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 @@ -32,6 +32,7 @@ import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager import com.tangem.tap.userTokensRepository +import com.tangem.tap.walletCurrenciesManager import com.tangem.wallet.BuildConfig import kotlinx.coroutines.launch import org.rekotlin.Action @@ -194,6 +195,9 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di } } } + is GlobalAction.SetTopUpController -> { + walletCurrenciesManager.addListener(action.topUpController) + } } } 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 3ed3751c74..15b8d10c94 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 @@ -49,6 +49,7 @@ 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 14eeac6618..1d6dddf647 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 @@ -29,7 +29,7 @@ data class GlobalState( val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(), val userCountryCode: String? = null, val userWalletsListManager: UserWalletsListManager? = null, - val topUpController: TopUpController = TopUpController(), + val topUpController: TopUpController? = null, ) : StateType typealias CryptoCurrencyName = String 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 c994e477f6..509cd78033 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -66,7 +66,7 @@ class TapWalletManager { .doOnSuccess { Timber.d("Wallet stores fetched for ${userWallet.walletId}") store.dispatchOnMain(WalletAction.LoadData.Success) - store.state.globalState.topUpController.loadDataSuccess() + store.state.globalState.topUpController?.loadDataSuccess() } .doOnFailure { error -> val errorAction = when (error) { diff --git a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/WalletCurrenciesManager.kt b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/WalletCurrenciesManager.kt index 47d92b26e0..fa2bbc0424 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/WalletCurrenciesManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/WalletCurrenciesManager.kt @@ -87,11 +87,11 @@ interface WalletCurrenciesManager { * Interface definition for a callbacks */ interface Listener { - fun willUpdate(userWallet: UserWallet, currency: Currency) - fun didUpdate(userWallet: UserWallet, currency: Currency) - fun willCurrenciesAdd(userWallet: UserWallet, currenciesToAdd: List) - fun willCurrenciesRemove(userWallet: UserWallet, currenciesToRemove: List) - fun willCurrencyRemove(userWallet: UserWallet, currencyToRemove: Currency) + fun willUpdate(userWallet: UserWallet, currency: Currency) {} + fun didUpdate(userWallet: UserWallet, currency: Currency) {} + fun willCurrenciesAdd(userWallet: UserWallet, currenciesToAdd: List) {} + fun willCurrenciesRemove(userWallet: UserWallet, currenciesToRemove: List) {} + fun willCurrencyRemove(userWallet: UserWallet, currencyToRemove: Currency) {} } // For provider 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 8ec11cf17c..fddc46b3a8 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 @@ -6,7 +6,6 @@ import com.tangem.core.analytics.Analytics 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.Basic import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchDialogShow @@ -98,7 +97,7 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch onboardingManager.activationFinished(card.cardId) postUi(DELAY_SDK_DIALOG_CLOSE) { store.dispatch(OnboardingNoteAction.Confetti.Show) } } - else -> {} + else -> Unit } } is OnboardingNoteAction.CreateWallet -> { @@ -111,11 +110,10 @@ 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 -> { -// do nothing - } + is CompletionResult.Failure -> Unit } } } @@ -160,15 +158,7 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch } is OnboardingNoteAction.Balance.Set -> { if (action.balance.balanceIsToppedUp()) { - Analytics.send( - event = Basic.ToppedUp( - currency = AnalyticsParam.CardCurrency.SingleCurrency( - type = AnalyticsParam.CurrencyType.Blockchain( - blockchain = scanResponse.cardTypesResolver.getBlockchain(), - ), - ), - ), - ) + 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 faa3dd2441..73312bd8a9 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 @@ -87,6 +87,7 @@ 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 f6d021d0f8..e7d4d1edf5 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 @@ -8,7 +8,6 @@ import com.tangem.domain.common.ScanResponse 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.Basic import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchDialogShow @@ -206,6 +205,8 @@ 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 { when (twinCardsState.mode) { @@ -262,18 +263,8 @@ private fun handle(action: Action, dispatch: DispatchFunction) { } is TwinCardsAction.Balance.Set -> { if (action.balance.balanceIsToppedUp()) { - Analytics.send( - event = Basic.ToppedUp( - currency = AnalyticsParam.CardCurrency.SingleCurrency( - type = AnalyticsParam.CurrencyType.Blockchain( - blockchain = getScanResponse().cardTypesResolver.getBlockchain(), - ), - ), - ), - ) - scope.launch { - withMainContext { store.dispatch(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Done)) } - } + store.state.globalState.topUpController?.send(getScanResponse(), AnalyticsParam.CardBalanceState.Full) + store.dispatchOnMain(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Done)) } } is TwinCardsAction.ShowAddressInfoDialog -> { 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 50a9f32619..94fe803ccc 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 @@ -127,6 +127,7 @@ private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: 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 @@ -145,9 +146,7 @@ private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: startCardActivation(updatedResponse) store.dispatch(OnboardingWalletAction.ResumeBackup) } - is CompletionResult.Failure -> { -// do nothing - } + is CompletionResult.Failure -> Unit } } } @@ -190,7 +189,7 @@ private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: newAction?.let { store.dispatch(it) } } OnboardingWalletAction.OnBackPressed -> handleOnBackPressed(onboardingWalletState) - else -> {} + else -> Unit } } @@ -249,8 +248,7 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) is CompletionResult.Success -> { store.dispatchOnMain(BackupAction.StartAddingBackupCards) } - is CompletionResult.Failure -> { - } + is CompletionResult.Failure -> Unit } } } @@ -267,8 +265,7 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) is CompletionResult.Success -> { store.dispatchOnMain(BackupAction.AddBackupCard.Success) } - is CompletionResult.Failure -> { - } + is CompletionResult.Failure -> Unit } } } @@ -308,8 +305,7 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) is CompletionResult.Success -> { store.dispatchOnMain(BackupAction.PrepareToWriteBackupCard(1)) } - is CompletionResult.Failure -> { - } + is CompletionResult.Failure -> Unit } } } @@ -324,8 +320,7 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) store.dispatchOnMain(BackupAction.PrepareToWriteBackupCard(action.cardNumber + 1)) } } - is CompletionResult.Failure -> { - } + is CompletionResult.Failure -> Unit } } } @@ -375,7 +370,7 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) Analytics.send(Onboarding.Finished()) finishCardActivation(notActivatedCardIds) } - else -> {} + else -> Unit } } 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 52ebe9454f..f2cc59a816 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 @@ -91,14 +91,14 @@ class MultiWalletMiddleware { store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) } is WalletAction.MultiWallet.AddMissingDerivations -> { - store.state.globalState.topUpController.addMissingDerivations(action.blockchains) + store.state.globalState.topUpController?.addMissingDerivations(action.blockchains) } is WalletAction.MultiWallet.ScanToGetDerivations -> { val selectedUserWallet = userWalletsListManager.selectedUserWalletSync.guard { Timber.e("Unable to scan to get derivations, no user wallet selected") return } - store.state.globalState.topUpController.scanToGetDerivations() + store.state.globalState.topUpController?.scanToGetDerivations() scanAndUpdateCard(selectedUserWallet, walletState) } else -> {} diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index b401c9c0fe..5d12f94a9a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -184,7 +184,7 @@ class WalletMiddleware { } is WalletAction.UserWalletChanged -> Unit is WalletAction.WalletStoresChanged -> { - store.state.globalState.topUpController.walletStoresChanged(action.walletStores) + store.state.globalState.topUpController?.walletStoresChanged(action.walletStores) updateWalletStores(action.walletStores, walletState) fetchTotalFiatBalance(action.walletStores) findMissedDerivations(action.walletStores) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index e72b7e284e..f3a6eba304 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -67,7 +67,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber totalBalance?.state?.let { - store.state.globalState.topUpController.totalBalanceStateChanged(it) + store.state.globalState.topUpController?.totalBalanceStateChanged(it) } } } diff --git a/app/src/main/java/com/tangem/tap/persistence/ToppedUpWalletStorage.kt b/app/src/main/java/com/tangem/tap/persistence/ToppedUpWalletStorage.kt index c7234832fe..892b1a2370 100644 --- a/app/src/main/java/com/tangem/tap/persistence/ToppedUpWalletStorage.kt +++ b/app/src/main/java/com/tangem/tap/persistence/ToppedUpWalletStorage.kt @@ -53,14 +53,14 @@ class ToppedUpWalletStorage( } } + data class TopupInfo( + val walletId: String, + val cardBalanceState: AnalyticsParam.CardBalanceState, + ) { + val isToppedUp: Boolean = cardBalanceState == AnalyticsParam.CardBalanceState.Full + } + companion object { private const val KEY = "userWalletsInfo" - - data class TopupInfo( - val walletId: String, - val cardBalanceState: AnalyticsParam.CardBalanceState, - ) { - val isToppedUp: Boolean = cardBalanceState == AnalyticsParam.CardBalanceState.Full - } } } \ No newline at end of file diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt index e23a503460..1fbc89d977 100644 --- a/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/tangem/core/analytics/AnalyticsEvent.kt @@ -8,5 +8,4 @@ open class AnalyticsEvent( val event: String, var params: Map = mapOf(), val error: Throwable? = null, - var filterData: Any? = null, ) \ No newline at end of file