From 922b19717242a00a85aeec0b32ba8ac689ef72ec Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Mar 2026 20:17:20 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/di/TangemSdkManagerModule.kt | 3 +++ .../tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt | 7 +++++++ .../com/tangem/core/analytics/models/AnalyticsParam.kt | 1 + .../tokens/model/analytics/TokenExchangeAnalyticsEvent.kt | 7 +++++-- .../com/tangem/features/details/model/DetailsModel.kt | 2 ++ .../feed/model/market/details/MarketsTokenDetailsModel.kt | 3 +++ .../features/hotwallet/upgradewallet/UpgradeWalletModel.kt | 3 +++ .../impl/child/backup/model/MultiWalletBackupModel.kt | 4 ++++ .../createwallet/model/MultiWalletCreateWalletModel.kt | 2 ++ .../impl/child/finalize/model/MultiWalletFinalizeModel.kt | 4 ++++ .../child/seedphrase/model/MultiWalletSeedPhraseModel.kt | 2 ++ .../upgradewallet/model/MultiWalletUpgradeWalletModel.kt | 4 ++++ .../v2/stepper/impl/DefaultOnboardingStepperComponent.kt | 3 +++ .../onboarding/v2/twin/impl/model/OnboardingTwinModel.kt | 4 ++++ .../send/v2/send/confirm/model/SendConfirmModel.kt | 3 +++ .../com/tangem/features/send/v2/send/model/SendModel.kt | 3 +++ .../send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt | 3 +++ .../tangem/features/send/v2/sendnft/model/NFTSendModel.kt | 5 +++++ .../staking/impl/presentation/model/StakingModel.kt | 3 +++ .../features/swap/v2/impl/common/SwapAlertFactory.kt | 5 +++++ .../main/java/com/tangem/feature/swap/model/SwapModel.kt | 2 ++ .../features/tangempay/model/TangemPayDetailsModel.kt | 2 ++ .../tangempay/model/TangemPayTxHistoryDetailsModel.kt | 3 +++ .../state/factory/express/ExpressStatusFactory.kt | 3 ++- .../factory/express/TokenDetailsExpressStatusFactory.kt | 3 ++- .../child/wallet/model/intents/TangemPayClickIntents.kt | 6 ++++++ .../wallet/model/intents/WalletWarningsClickIntents.kt | 4 ++++ 27 files changed, 90 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/di/TangemSdkManagerModule.kt b/app/src/main/java/com/tangem/tap/di/TangemSdkManagerModule.kt index 21dfcaa7f1..53f53dffef 100644 --- a/app/src/main/java/com/tangem/tap/di/TangemSdkManagerModule.kt +++ b/app/src/main/java/com/tangem/tap/di/TangemSdkManagerModule.kt @@ -1,6 +1,7 @@ package com.tangem.tap.di import android.content.Context +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.api.AnalyticsExceptionHandler import com.tangem.core.decompose.di.GlobalUiMessageSender import com.tangem.core.decompose.ui.UiMessageSender @@ -42,6 +43,7 @@ internal class TangemSdkManagerModule { sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, analyticsExceptionHandler: AnalyticsExceptionHandler, blockchainToDeriveFinder: BlockchainToDeriveFinder, + analyticsEventHandler: AnalyticsEventHandler, dispatchers: CoroutineDispatcherProvider, ): TangemSdkManager { return if (BuildConfig.MOCK_DATA_SOURCE) { @@ -59,6 +61,7 @@ internal class TangemSdkManagerModule { sendFeedbackEmailUseCase = sendFeedbackEmailUseCase, analyticsExceptionHandler = analyticsExceptionHandler, blockchainToDeriveFinder = blockchainToDeriveFinder, + analyticsEventHandler = analyticsEventHandler, dispatchers = dispatchers, ) } diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt index 4d923813ad..caf25e2b96 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt @@ -18,7 +18,10 @@ import com.tangem.common.extensions.hexToBytes import com.tangem.common.services.secure.SecureStorage import com.tangem.common.usersCode.UserCodeRepository import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.api.AnalyticsExceptionHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.analytics.models.ExceptionAnalyticsEvent import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.navigation.finisher.AppFinisher @@ -82,6 +85,7 @@ internal class DefaultTangemSdkManager( private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val analyticsExceptionHandler: AnalyticsExceptionHandler, private val blockchainToDeriveFinder: BlockchainToDeriveFinder, + private val analyticsEventHandler: AnalyticsEventHandler, dispatchers: CoroutineDispatcherProvider, ) : TangemSdkManager { @@ -470,6 +474,9 @@ internal class DefaultTangemSdkManager( title = resourceReference(R.string.alert_button_request_support), onClick = { coroutineScope.launch { + analyticsEventHandler.send( + Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.SignIn), + ) sendFeedbackEmailUseCase(FeedbackEmailType.BiometricsAuthenticationFailed) } }, diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt index ae0d6a4253..946ad653c4 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt @@ -98,6 +98,7 @@ sealed class AnalyticsParam { data object NewsLink : ScreensSources("News Link") data object NewsPage : ScreensSources("News Page") data object Portfolio : ScreensSources("Portfolio") + data object Staking : ScreensSources("Staking") } sealed class TxSentFrom(val value: String) { diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenExchangeAnalyticsEvent.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenExchangeAnalyticsEvent.kt index 4d139661e9..6206a29df4 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenExchangeAnalyticsEvent.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenExchangeAnalyticsEvent.kt @@ -11,9 +11,12 @@ class TokenExchangeAnalyticsEvent( params: Map = mapOf(), ) : AnalyticsEvent("Token", event, params) { - class CexTxStatusOpened(token: String) : TokenScreenAnalyticsEvent( + class CexTxStatusOpened(token: String, provider: String) : TokenScreenAnalyticsEvent( event = "Swap Status Opened", - params = mapOf(TOKEN_PARAM to token), + params = mapOf( + TOKEN_PARAM to token, + PROVIDER to provider, + ), ) class CexTxStatusChanged(token: String, status: String, provider: String) : TokenScreenAnalyticsEvent( diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt index 05292329ad..8ebb80ce0b 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt @@ -150,6 +150,7 @@ internal class DetailsModel @Inject constructor( } } + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Settings)) sendFeedbackEmailUseCase(feedbackType) } } @@ -230,6 +231,7 @@ internal class DetailsModel @Inject constructor( } } + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Settings)) sendFeedbackEmailUseCase(feedbackType) } } diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt index e4af70344b..819d362a4a 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt @@ -9,6 +9,8 @@ import com.tangem.common.ui.charts.state.MarketChartData import com.tangem.common.ui.charts.state.MarketChartDataProducer import com.tangem.common.ui.charts.state.sorted import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -163,6 +165,7 @@ internal class MarketsTokenDetailsModel @Inject constructor( }, onGeneratedAINotificationClick = { modelScope.launch { + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Market)) sendFeedbackEmailUseCase( type = FeedbackEmailType.CurrencyDescriptionError( currencyId = params.token.id.value, diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt index 3d8d7bc0bd..5b9efafb88 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt @@ -179,6 +179,9 @@ internal class UpgradeWalletModel @Inject constructor( title = resourceReference(id = R.string.alert_button_request_support), onClick = { modelScope.launch { + analyticsEventHandler.send( + Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Upgrade), + ) sendFeedbackEmailUseCase(type = FeedbackEmailType.CardAttestationFailed) } }, diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt index d070a4ffed..3fc4aa71fb 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt @@ -6,6 +6,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.api.AnalyticsExceptionHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.analytics.models.ExceptionAnalyticsEvent import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped @@ -262,6 +263,9 @@ class MultiWalletBackupModel @Inject constructor( errorDescription = resourceReference(id = resId, resArgs.toWrappedList()), onRequestSupport = { modelScope.launch { + analyticsEventHandler.send( + Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding), + ) sendFeedbackEmailUseCase(type = FeedbackEmailType.CardAttestationFailed) } }, diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/model/MultiWalletCreateWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/model/MultiWalletCreateWalletModel.kt index d777faa37b..205405cad4 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/model/MultiWalletCreateWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/model/MultiWalletCreateWalletModel.kt @@ -5,6 +5,7 @@ import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -182,6 +183,7 @@ internal class MultiWalletCreateWalletModel @Inject constructor( modelScope.launch { val cardInfo = getWalletMetaInfoUseCase(multiWalletState.value.currentScanResponse).getOrNull() ?: return@launch + analyticsHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding)) sendFeedbackEmailUseCase(FeedbackEmailType.DirectUserRequest(cardInfo)) } } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt index 0fb3c2f011..61d26b089e 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt @@ -5,7 +5,9 @@ import arrow.core.getOrElse import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.ByteArrayKey +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -71,6 +73,7 @@ internal class MultiWalletFinalizeModel @Inject constructor( private val walletsRepository: WalletsRepository, private val uiMessageSender: UiMessageSender, private val backupValidator: BackupValidator, + private val analyticsEventHandler: AnalyticsEventHandler, ) : Model() { private val params = paramsContainer.require() @@ -392,6 +395,7 @@ internal class MultiWalletFinalizeModel @Inject constructor( modelScope.launch { val cardInfo = getWalletMetaInfoUseCase(multiWalletState.value.currentScanResponse).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding)) sendFeedbackEmailUseCase(FeedbackEmailType.BackupProblem(cardInfo)) } } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/model/MultiWalletSeedPhraseModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/model/MultiWalletSeedPhraseModel.kt index fc3e5ad044..c960e1022a 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/model/MultiWalletSeedPhraseModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/model/MultiWalletSeedPhraseModel.kt @@ -7,6 +7,7 @@ import com.tangem.common.TangemBlogUrlBuilder import com.tangem.common.core.TangemSdkError import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.GlobalUiMessageSender import com.tangem.core.decompose.di.ModelScoped @@ -310,6 +311,7 @@ internal class MultiWalletSeedPhraseModel @Inject constructor( modelScope.launch { val cardInfo = getWalletMetaInfoUseCase(multiWalletState.value.currentScanResponse).getOrNull() ?: return@launch + analyticsHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding)) sendFeedbackEmailUseCase(FeedbackEmailType.DirectUserRequest(cardInfo)) } } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/upgradewallet/model/MultiWalletUpgradeWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/upgradewallet/model/MultiWalletUpgradeWalletModel.kt index d7e2c6e3e9..c5a2989d7c 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/upgradewallet/model/MultiWalletUpgradeWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/upgradewallet/model/MultiWalletUpgradeWalletModel.kt @@ -4,7 +4,9 @@ import androidx.compose.runtime.Stable import arrow.core.getOrElse import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -48,6 +50,7 @@ internal class MultiWalletUpgradeWalletModel @Inject constructor( private val saveWalletUseCase: SaveWalletUseCase, private val getUserWalletUseCase: GetUserWalletUseCase, private val exportSeedPhraseUseCase: ExportSeedPhraseUseCase, + private val analyticsEventHandler: AnalyticsEventHandler, ) : Model() { private val params = paramsContainer.require() @@ -179,6 +182,7 @@ internal class MultiWalletUpgradeWalletModel @Inject constructor( modelScope.launch { val cardInfo = getWalletMetaInfoUseCase(multiWalletState.value.currentScanResponse).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding)) sendFeedbackEmailUseCase(FeedbackEmailType.DirectUserRequest(cardInfo)) } } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt index 636c9f4f32..aa083e3575 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt @@ -8,6 +8,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.arkivanov.essenty.instancekeeper.getOrCreateSimple import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.context.AppComponentContext import com.tangem.domain.card.common.TapWorkarounds.isVisa import com.tangem.domain.feedback.GetWalletMetaInfoUseCase @@ -45,6 +47,7 @@ internal class DefaultOnboardingStepperComponent @AssistedInject constructor( val cardInfo = getWalletMetaInfoUseCase(params.scanResponse).getOrNull() ?: return@launch val userWalletId = cardInfo.userWalletId val visaCustomerId = userWalletId?.let { id -> getTangemPayCustomerIdUseCase(id).getOrNull() } + analyticsHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding)) sendFeedbackEmailUseCase( if (params.scanResponse.card.isVisa && !visaCustomerId.isNullOrEmpty()) { FeedbackEmailType.Visa.Activation(walletMetaInfo = cardInfo, customerId = visaCustomerId) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt index 2dbc11a45c..b1893158d7 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt @@ -9,6 +9,7 @@ import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toHexString import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -358,6 +359,9 @@ internal class OnboardingTwinModel @Inject constructor( errorDescription = resourceReference(id = resId, resArgs.toWrappedList()), onRequestSupport = { modelScope.launch { + analyticsEventHandler.send( + Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Onboarding), + ) sendFeedbackEmailUseCase(type = FeedbackEmailType.CardAttestationFailed) } }, diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt index c4b53d2a7f..710868cdef 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt @@ -13,6 +13,8 @@ import com.tangem.common.ui.navigationButtons.NavigationButton import com.tangem.common.ui.navigationButtons.NavigationUM import com.tangem.common.ui.userwallet.ext.walletInterationIcon import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -295,6 +297,7 @@ internal class SendConfirmModel @Inject constructor( modelScope.launch { val metaInfo = getWalletMetaInfoUseCase.invoke(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Send)) sendFeedbackEmailUseCase(type = FeedbackEmailType.TransactionSendingProblem(walletMetaInfo = metaInfo)) } } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt index e9d194d455..180c7115a1 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt @@ -9,6 +9,8 @@ import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.common.ui.amountScreen.models.AmountState import com.tangem.common.ui.navigationButtons.NavigationUM import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -426,6 +428,7 @@ internal class SendModel @Inject constructor( modelScope.launch { val metaInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Send)) sendFeedbackEmailUseCase(type = FeedbackEmailType.TransactionSendingProblem(walletMetaInfo = metaInfo)) } } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt index 62ee3117f2..084f793b58 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt @@ -8,6 +8,8 @@ import com.tangem.common.ui.navigationButtons.NavigationButton import com.tangem.common.ui.navigationButtons.NavigationUM import com.tangem.common.ui.userwallet.ext.walletInterationIcon import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -202,6 +204,7 @@ internal class NFTSendConfirmModel @Inject constructor( modelScope.launch { val metaInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Send)) sendFeedbackEmailUseCase(type = FeedbackEmailType.TransactionSendingProblem(walletMetaInfo = metaInfo)) } } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt index c7d65fec93..4d84c0b4a2 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt @@ -6,6 +6,9 @@ import arrow.core.getOrElse import arrow.core.left import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.common.ui.navigationButtons.NavigationUM +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -73,6 +76,7 @@ internal class NFTSendModel @Inject constructor( private val nftSendSuccessTrigger: NFTSendSuccessTrigger, private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase, private val getAccountCurrencyStatusUseCase: GetAccountCurrencyStatusUseCase, + private val analyticsEventHandler: AnalyticsEventHandler, ) : Model(), SendNFTComponentCallback, NFTSendSuccessComponent.ModelCallback { val params: NFTSendComponent.Params = paramsContainer.require() @@ -230,6 +234,7 @@ internal class NFTSendModel @Inject constructor( modelScope.launch { val metaInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Send)) sendFeedbackEmailUseCase(type = FeedbackEmailType.TransactionSendingProblem(walletMetaInfo = metaInfo)) } } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt index d94650898d..805dafd774 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt @@ -20,6 +20,8 @@ import com.tangem.features.approval.api.GiveApprovalFeatureToggles import com.tangem.common.ui.notifications.NotificationUM import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.api.ParamsInterceptorHolder +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -1080,6 +1082,7 @@ internal class StakingModel @Inject constructor( unsignedTransactions = transactionsInProgress.map { it.unsignedTransaction }, ) + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Staking)) sendFeedbackEmailUseCase(email) } } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/common/SwapAlertFactory.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/common/SwapAlertFactory.kt index 79c2503262..0fb397effb 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/common/SwapAlertFactory.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/common/SwapAlertFactory.kt @@ -1,6 +1,9 @@ package com.tangem.features.swap.v2.impl.common import com.tangem.common.ui.alerts.TransactionErrorDialogFactory +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.ui.extensions.resourceReference @@ -25,6 +28,7 @@ internal class SwapAlertFactory @Inject constructor( private val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase, private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val transactionErrorDialogFactory: TransactionErrorDialogFactory, + private val analyticsEventHandler: AnalyticsEventHandler, ) { fun getGenericErrorState(expressError: ExpressError, onFailedTxEmailClick: () -> Unit, popBack: () -> Unit = {}) { uiMessageSender.send( @@ -83,6 +87,7 @@ internal class SwapAlertFactory @Inject constructor( val metaInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.Swap)) sendFeedbackEmailUseCase( type = FeedbackEmailType.SwapProblem( walletMetaInfo = metaInfo, diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt index a0e992a13c..4c90fa3f34 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt @@ -1648,6 +1648,7 @@ internal class SwapModel @Inject constructor( providerName = dataState.selectedProvider?.name.orEmpty(), txId = txId, ) + analyticsEventHandler.send(Basic.ButtonSupport(source = ScreensSources.Swap)) sendFeedbackEmailUseCase(email) } } @@ -2179,6 +2180,7 @@ internal class SwapModel @Inject constructor( txId = transaction?.txId.orEmpty(), ) + analyticsEventHandler.send(Basic.ButtonSupport(source = ScreensSources.Swap)) sendFeedbackEmailUseCase(email) } } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index beb2bed482..c9e17d71f5 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -7,6 +7,7 @@ import com.arkivanov.decompose.router.slot.dismiss import com.tangem.common.routing.AppRoute import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -380,6 +381,7 @@ internal class TangemPayDetailsModel @Inject constructor( override fun onContactSupportClicked() { analytics.send(TangemPayAnalyticsEvents.GoToSupportOnBetaBannerClicked()) + analytics.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.TangemPay)) modelScope.launch { sendFeedbackEmailUseCase.invoke( type = FeedbackEmailType.Visa.FeatureIsBeta( diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt index 4e815c1f1a..9569233780 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt @@ -2,6 +2,8 @@ package com.tangem.features.tangempay.model import androidx.compose.runtime.Stable import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -66,6 +68,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor( private fun dispute(customerId: String) { analytics.send(TangemPayAnalyticsEvents.SupportOnTransactionPopupClicked()) + analytics.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.TangemPay)) modelScope.launch { val walletMetaInfo = getWalletMetaInfoUseCase.invoke(params.userWalletId).getOrNull() ?: return@launch diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExpressStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExpressStatusFactory.kt index 7d3b0b6008..c5ff9805b6 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExpressStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExpressStatusFactory.kt @@ -122,7 +122,8 @@ internal class ExpressStatusFactory @AssistedInject constructor( val analyticEvents = when (expressState) { is ExchangeUM -> listOfNotNull( TokenExchangeAnalyticsEvent.CexTxStatusOpened( - cryptoCurrency.symbol, + token = cryptoCurrency.symbol, + provider = expressState.provider.name, ), maybeGetLongTimeExchangeNotificationShowEvent( expressState = expressState, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExpressStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExpressStatusFactory.kt index 19387b7150..c40bc24c57 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExpressStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExpressStatusFactory.kt @@ -118,7 +118,8 @@ internal class TokenDetailsExpressStatusFactory @AssistedInject constructor( val analyticEvents = when (expressState) { is ExchangeUM -> listOfNotNull( TokenExchangeAnalyticsEvent.CexTxStatusOpened( - cryptoCurrency.symbol, + token = cryptoCurrency.symbol, + provider = expressState.provider.name, ), maybeGetLongTimeExchangeNotificationShowEvent( expressState = expressState, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt index 5a779f8e1d..6fa2ff980b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt @@ -2,6 +2,9 @@ package com.tangem.feature.wallet.child.wallet.model.intents import com.arkivanov.decompose.router.slot.activate import com.tangem.common.routing.AppRoute +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.res.R @@ -71,6 +74,7 @@ internal class TangemPayClickIntentsImplementor @Inject constructor( private val tangemPayOnboardingRepository: OnboardingRepository, private val tangemPayEligibilityManager: TangemPayEligibilityManager, private val uiMessageSender: UiMessageSender, + private val analyticsEventHandler: AnalyticsEventHandler, ) : BaseWalletClickIntents(), TangemPayIntents { override suspend fun onPullToRefresh() { @@ -169,6 +173,7 @@ internal class TangemPayClickIntentsImplementor @Inject constructor( private fun goToSupportForRejectKyc(customerId: String) { modelScope.launch { + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.TangemPay)) sendFeedbackEmailUseCase( type = FeedbackEmailType.Visa.KycRejected( walletMetaInfo = WalletMetaInfo( @@ -227,6 +232,7 @@ internal class TangemPayClickIntentsImplementor @Inject constructor( userWalletId = stateHolder.getSelectedWalletId(), ).getOrNull() ?: return@launch + analyticsEventHandler.send(Basic.ButtonSupport(source = AnalyticsParam.ScreensSources.TangemPay)) sendFeedbackEmailUseCase( FeedbackEmailType.Visa.FailedIssueCard( walletMetaInfo = cardInfo, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt index 0cdab04aa3..c3b9d8d1f2 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt @@ -8,6 +8,7 @@ import com.tangem.common.ui.notifications.NotificationId import com.tangem.common.ui.userwallet.handle import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic.ButtonSupport import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.navigation.url.UrlOpener @@ -234,6 +235,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( val userWallet = getSelectedUserWallet() ?: return@launch val cardInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(ButtonSupport(source = AnalyticsParam.ScreensSources.Main)) sendFeedbackEmailUseCase(type = FeedbackEmailType.RateCanBeBetter(walletMetaInfo = cardInfo)) } } @@ -336,6 +338,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( modelScope.launch { val metaInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(ButtonSupport(source = AnalyticsParam.ScreensSources.Main)) sendFeedbackEmailUseCase(type = FeedbackEmailType.DirectUserRequest(walletMetaInfo = metaInfo)) } } @@ -345,6 +348,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( modelScope.launch { val metaInfo = getWalletMetaInfoUseCase(userWallet.walletId).getOrNull() ?: return@launch + analyticsEventHandler.send(ButtonSupport(source = AnalyticsParam.ScreensSources.Main)) sendFeedbackEmailUseCase(type = FeedbackEmailType.BackupProblem(walletMetaInfo = metaInfo)) } }