From aee18abe0eb931840687edc52c76c024d5cf9514 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 5 May 2026 11:30:05 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../common/analytics/events/AnalyticsParam.kt | 6 -- .../tap/common/analytics/events/Onboarding.kt | 15 ---- .../component/impl/DefaultRoutingComponent.kt | 4 +- .../com/tangem/common/routing/AppRoute.kt | 3 +- core/analytics/models/build.gradle.kts | 5 ++ .../core/analytics/models/AnalyticsParam.kt | 74 ++++++++++--------- .../models/event/OnboardingAnalyticsEvent.kt | 71 +++++++++++------- .../CreateWalletSelectionModel.kt | 2 +- .../CreateWalletStartModel.kt | 2 +- .../CreateWalletStartModelTest.kt | 2 +- features/hot-wallet/api/build.gradle.kts | 1 + .../hotwallet/CreateMobileWalletComponent.kt | 3 +- .../model/AddExistingWalletImportModel.kt | 6 +- .../CreateMobileWalletModel.kt | 10 ++- .../v2/common/analytics/OnboardingEvent.kt | 38 ---------- .../DefaultOnboardingMultiWalletComponent.kt | 4 +- .../model/MultiWalletCreateWalletModel.kt | 10 +-- .../model/MultiWalletSeedPhraseModel.kt | 7 +- .../impl/model/OnboardingMultiWalletModel.kt | 4 +- .../model/OnboardingNoteCreateWalletModel.kt | 13 ++-- .../v2/note/impl/model/OnboardingNoteModel.kt | 4 +- .../v2/twin/impl/model/OnboardingTwinModel.kt | 3 +- .../model/OnboardingMultiWalletModelTest.kt | 4 +- 23 files changed, 131 insertions(+), 160 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt index 125b159021..642fb88cdc 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/AnalyticsParam.kt @@ -66,12 +66,6 @@ sealed class AnalyticsParam { data object BlockchainSdk : Error("Blockchain Sdk Error") } - sealed class WalletCreationType(val value: String) { - data object PrivateKey : WalletCreationType(value = "Private Key") - data object NewSeed : WalletCreationType(value = "New Seed") - data object SeedImport : WalletCreationType(value = "Seed Import") - } - sealed class AppTheme(val value: String) { data object System : AppTheme("System") data object Dark : AppTheme("Dark") diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt deleted file mode 100644 index a8deb0d88d..0000000000 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.tangem.tap.common.analytics.events - -import com.tangem.core.analytics.models.AnalyticsEvent - -/** -[REDACTED_AUTHOR] - */ -sealed class Onboarding( - category: String, - event: String, - params: Map = emptyMap(), -) : AnalyticsEvent(category, event, params) { - - class Finished : Onboarding("Onboarding", "Onboarding Finished") -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt b/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt index 2cdabfbc36..91913162ff 100644 --- a/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt +++ b/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt @@ -17,6 +17,7 @@ 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.analytics.utils.TrackingContextProxy import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.child @@ -48,7 +49,6 @@ import com.tangem.hot.sdk.TangemHotSdk import com.tangem.hot.sdk.android.create import com.tangem.sdk.api.BackupServiceHolder import com.tangem.tap.common.SnackbarHandler -import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.features.hot.TangemHotSDKProxy import com.tangem.tap.features.root.RootDetectedWarningComponent import com.tangem.tap.features.scanfails.ScanFailsComponent @@ -353,7 +353,7 @@ internal class DefaultRoutingComponent @AssistedInject constructor( val unfinishedBackup = onboardingRepository.getUnfinishedFinalizeOnboarding() ?: return@launch cardRepository.finishCardActivation(unfinishedBackup.card.cardId) onboardingRepository.clearUnfinishedFinalizeOnboarding() - analyticsEventHandler.send(Onboarding.Finished()) + analyticsEventHandler.send(OnboardingAnalyticsEvent.Onboarding.Finished()) } } diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index 3a6eac7c41..cc3ea90fdc 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -7,6 +7,7 @@ import android.os.Bundle import com.tangem.common.routing.bundle.RouteBundleParams import com.tangem.common.routing.bundle.bundle import com.tangem.common.routing.entity.InitScreenLaunchMode +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.decompose.navigation.Route import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.feedback.models.WalletMetaInfo @@ -376,7 +377,7 @@ sealed class AppRoute(val path: String) : Route { @Serializable data class CreateMobileWallet( - val source: String, + val source: AnalyticsParam.ScreensSources, ) : AppRoute(path = "/create_mobile_wallet") @Serializable diff --git a/core/analytics/models/build.gradle.kts b/core/analytics/models/build.gradle.kts index 7ff7fb7522..ed80a19c56 100644 --- a/core/analytics/models/build.gradle.kts +++ b/core/analytics/models/build.gradle.kts @@ -1,4 +1,9 @@ plugins { alias(deps.plugins.kotlin.jvm) + alias(deps.plugins.kotlin.serialization) id("configuration") +} + +dependencies { + api(deps.kotlin.serialization) } \ No newline at end of file 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 75b448a196..e408f3855d 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 @@ -2,6 +2,7 @@ package com.tangem.core.analytics.models import com.tangem.core.analytics.models.AnalyticsParam.Key.REFERRAL import com.tangem.core.analytics.models.AnalyticsParam.Key.REFERRAL_ID +import kotlinx.serialization.Serializable const val IS_NOT_HTTP_ERROR = "Is not http error" @@ -67,39 +68,40 @@ sealed class AnalyticsParam { data object BlockchainSdk : Error("Blockchain Sdk Error") } - sealed class ScreensSources(val value: String) { - data object Settings : ScreensSources("Settings") - data object Main : ScreensSources("Main") - data object SignIn : ScreensSources("Sign In") - data object Send : ScreensSources("Send") - data object Intro : ScreensSources("Introduction") - data object MyWallets : ScreensSources("My Wallets") - data object Token : ScreensSources("Token") - data object Stories : ScreensSources("Stories") - data object Buy : ScreensSources("Buy") - data object Swap : ScreensSources("Swap") - data object Sell : ScreensSources("Sell") - data object Backup : ScreensSources("Backup") - data object Onboarding : ScreensSources("Onboarding") - data object LongTap : ScreensSources("Long Tap") - data object Market : ScreensSources("Market") - data object Markets : ScreensSources("Markets") - data object MarketPulse : ScreensSources("Market Pulse") - data object TangemPay : ScreensSources("Tangem Pay") - data object WalletSettings : ScreensSources("Wallet Settings") - data object Upgrade : ScreensSources("Upgrade") - data object HardwareWallet : ScreensSources("Hardware Wallet") - data object ImportWallet : ScreensSources("Import Wallet") - data object CreateWalletIntro : ScreensSources("Create Wallet Intro") - data object AddNewWallet : ScreensSources("Add New Wallet") - data object AddNew : ScreensSources("Add New") - data object CreateWallet : ScreensSources("Create Wallet") - data object NewsList : ScreensSources("News List") - data object NewsLink : ScreensSources("News Link") - data object NewsPage : ScreensSources("News Page") - data object Portfolio : ScreensSources("Portfolio") - data object Staking : ScreensSources("Staking") - data object Earn : ScreensSources("Earn") + @Serializable + enum class ScreensSources(val value: String) { + Settings("Settings"), + Main("Main"), + SignIn("Sign In"), + Send("Send"), + Intro("Introduction"), + MyWallets("My Wallets"), + Token("Token"), + Stories("Stories"), + Buy("Buy"), + Swap("Swap"), + Sell("Sell"), + Backup("Backup"), + Onboarding("Onboarding"), + LongTap("Long Tap"), + Market("Market"), + Markets("Markets"), + MarketPulse("Market Pulse"), + TangemPay("Tangem Pay"), + WalletSettings("Wallet Settings"), + Upgrade("Upgrade"), + HardwareWallet("Hardware Wallet"), + ImportWallet("Import Wallet"), + CreateWalletIntro("Create Wallet Intro"), + AddNewWallet("Add New Wallet"), + AddNew("Add New"), + CreateWallet("Create Wallet"), + NewsList("News List"), + NewsLink("News Link"), + NewsPage("News Page"), + Portfolio("Portfolio"), + Staking("Staking"), + Earn("Earn"), } sealed class TxSentFrom(val value: String) { @@ -191,9 +193,9 @@ sealed class AnalyticsParam { } sealed class WalletCreationType(val value: String) { - data object PrivateKey : WalletCreationType("Private key") - data object NewSeed : WalletCreationType("New seed") - data object SeedImport : WalletCreationType("Seed import") + data object PrivateKey : WalletCreationType(value = "Private Key") + data object NewSeed : WalletCreationType(value = "New Seed") + data object SeedImport : WalletCreationType(value = "Seed Import") } sealed class WalletType(val value: String) { diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/OnboardingAnalyticsEvent.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/OnboardingAnalyticsEvent.kt index 6743eccfea..f85138e90a 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/OnboardingAnalyticsEvent.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/OnboardingAnalyticsEvent.kt @@ -1,9 +1,6 @@ package com.tangem.core.analytics.models.event -import com.tangem.core.analytics.models.AnalyticsEvent -import com.tangem.core.analytics.models.AnalyticsParam -import com.tangem.core.analytics.models.AppsFlyerIncludedEvent -import com.tangem.core.analytics.models.getReferralParams +import com.tangem.core.analytics.models.* sealed class OnboardingAnalyticsEvent( category: String, @@ -16,23 +13,29 @@ sealed class OnboardingAnalyticsEvent( params: Map = mapOf(), ) : OnboardingAnalyticsEvent(category = "Onboarding", event = event, params = params) { + /** + * Tracks the start of the onboarding process. + */ class Started( - source: String, + source: AnalyticsParam.ScreensSources? = null, ) : Onboarding( event = "Onboarding Started", - params = mapOf( - AnalyticsParam.SOURCE to source, - ), - ) + params = buildMap { + source?.value?.let { put(AnalyticsParam.SOURCE, it) } + }, + ), CriticalEvent + /** + * Tracks the completion of the onboarding process. + */ class Finished( - source: String, + source: AnalyticsParam.ScreensSources? = null, ) : Onboarding( event = "Onboarding Finished", - params = mapOf( - AnalyticsParam.SOURCE to source, - ), - ) + params = buildMap { + source?.value?.let { put(AnalyticsParam.SOURCE, it) } + }, + ), CriticalEvent class ButtonMobileWallet( source: String, @@ -49,31 +52,42 @@ sealed class OnboardingAnalyticsEvent( params: Map = mapOf(), ) : OnboardingAnalyticsEvent(category = "Onboarding / Create Wallet", event = event, params = params) { - class ButtonCreateWallet : CreateWallet("Button - Create Wallet") + /** + * Tracks opening of the create wallet screen. + */ + class ScreenOpened : CreateWallet("Create Wallet Screen Opened"), CriticalEvent + /** + * Tracks the user clicking the "Create Wallet" button. + */ + class ButtonCreateWallet : CreateWallet("Button - Create Wallet"), CriticalEvent + + /** + * Tracks the user clicking the "Other Options" button on the create wallet screen. + */ + class ButtonOtherOptions : CreateWallet("Button - Other Options"), CriticalEvent + + /** + * Tracks successful wallet creation, either on a Tangem card or as a mobile wallet. + */ class WalletCreatedSuccessfully( - source: String, - creationType: WalletCreationType = WalletCreationType.NewSeed, + creationType: AnalyticsParam.WalletCreationType = AnalyticsParam.WalletCreationType.PrivateKey, seedPhraseLength: Int? = null, passPhraseState: AnalyticsParam.EmptyFull, referralId: String?, + source: AnalyticsParam.ScreensSources? = null, ) : CreateWallet( event = "Wallet Created Successfully", params = buildMap { - put(AnalyticsParam.SOURCE, source) put("Creation Type", creationType.value) put("Passphrase", passPhraseState.value) if (seedPhraseLength != null) { put("Seed Phrase Length", seedPhraseLength.toString()) } + source?.value?.let { put(AnalyticsParam.SOURCE, it) } putAll(getReferralParams(referralId)) }, - ), AppsFlyerIncludedEvent - - sealed class WalletCreationType(val value: String) { - data object NewSeed : WalletCreationType(value = "New Seed") - data object SeedImport : WalletCreationType(value = "Seed Import") - } + ), AppsFlyerIncludedEvent, CriticalEvent } sealed class SeedPhrase( @@ -82,16 +96,19 @@ sealed class OnboardingAnalyticsEvent( ) : OnboardingAnalyticsEvent(category = "Onboarding / Seed Phrase", event = event, params = params) { class CreateMobileScreenOpened( - source: String, + source: AnalyticsParam.ScreensSources, ) : SeedPhrase( event = "Create Mobile Screen Opened", params = mapOf( - AnalyticsParam.SOURCE to source, + AnalyticsParam.SOURCE to source.value, ), ), AppsFlyerIncludedEvent class ButtonImportWallet : SeedPhrase("Button - Import Wallet") - class ImportSeedPhraseScreenOpened : SeedPhrase("Import Seed Phrase Screen Opened") + /** + * Tracks opening of the seed phrase import screen. + */ + class ImportSeedPhraseScreenOpened : SeedPhrase("Import Seed Phrase Screen Opened"), CriticalEvent class ButtonImport : SeedPhrase("Button - Import") } diff --git a/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionModel.kt b/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionModel.kt index 14265dcd96..5cd91beff4 100644 --- a/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionModel.kt +++ b/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionModel.kt @@ -96,7 +96,7 @@ internal class CreateWalletSelectionModel @Inject constructor( return } - router.push(AppRoute.CreateMobileWallet(AnalyticsParam.ScreensSources.AddNewWallet.value)) + router.push(AppRoute.CreateMobileWallet(AnalyticsParam.ScreensSources.AddNewWallet)) } private fun onHardwareWalletClick() { diff --git a/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt b/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt index 9a2539c546..afddd1aad4 100644 --- a/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt +++ b/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt @@ -164,7 +164,7 @@ internal class CreateWalletStartModel @Inject constructor( return } - router.push(AppRoute.CreateMobileWallet(AnalyticsParam.ScreensSources.CreateWalletIntro.value)) + router.push(AppRoute.CreateMobileWallet(AnalyticsParam.ScreensSources.CreateWalletIntro)) } private fun onBuyClick() { diff --git a/features/create-wallet-start/impl/src/test/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModelTest.kt b/features/create-wallet-start/impl/src/test/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModelTest.kt index 28520a0603..6da464c113 100644 --- a/features/create-wallet-start/impl/src/test/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModelTest.kt +++ b/features/create-wallet-start/impl/src/test/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModelTest.kt @@ -194,7 +194,7 @@ internal class CreateWalletStartModelTest { verify { router.push( route = AppRoute.CreateMobileWallet( - source = AnalyticsParam.ScreensSources.CreateWalletIntro.value, + source = AnalyticsParam.ScreensSources.CreateWalletIntro, ), onComplete = any(), ) diff --git a/features/hot-wallet/api/build.gradle.kts b/features/hot-wallet/api/build.gradle.kts index 7e7bd837fd..4ab40a7a26 100644 --- a/features/hot-wallet/api/build.gradle.kts +++ b/features/hot-wallet/api/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation(projects.domain.wallets.models) /* Project - Core */ + api(projects.core.analytics.models) implementation(projects.core.decompose) implementation(projects.core.ui) diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt index 72db10452d..232082c2ca 100644 --- a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt @@ -1,11 +1,12 @@ package com.tangem.features.hotwallet +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.decompose.factory.ComponentFactory import com.tangem.core.ui.decompose.ComposableContentComponent interface CreateMobileWalletComponent : ComposableContentComponent { data class Params( - val source: String, + val source: AnalyticsParam.ScreensSources, ) interface Factory : ComponentFactory diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt index 6c6efa8ece..1d47e02224 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt @@ -129,13 +129,13 @@ internal class AddExistingWalletImportModel @Inject constructor( analyticsEventHandler.send( event = OnboardingAnalyticsEvent.Onboarding.Finished( - source = AnalyticsParam.ScreensSources.ImportWallet.value, + source = AnalyticsParam.ScreensSources.ImportWallet, ), ) analyticsEventHandler.send( event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( - source = AnalyticsParam.ScreensSources.ImportWallet.value, - creationType = OnboardingAnalyticsEvent.CreateWallet.WalletCreationType.SeedImport, + source = AnalyticsParam.ScreensSources.ImportWallet, + creationType = AnalyticsParam.WalletCreationType.SeedImport, seedPhraseLength = mnemonic.mnemonicComponents.size, passPhraseState = if (passphrase.isNullOrBlank()) { AnalyticsParam.EmptyFull.Empty diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt index a5c4e17316..fb2d8cc290 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt @@ -62,7 +62,9 @@ internal class CreateMobileWalletModel @Inject constructor( init { trackingContextProxy.addHotWalletContext() - analyticsEventHandler.send(event = OnboardingAnalyticsEvent.Onboarding.Started(source = params.source)) + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.Onboarding.Started(source = params.source), + ) analyticsEventHandler.send( event = OnboardingAnalyticsEvent.SeedPhrase.CreateMobileScreenOpened(source = params.source), ) @@ -95,11 +97,13 @@ internal class CreateMobileWalletModel @Inject constructor( saveUserWalletUseCase(userWallet) - analyticsEventHandler.send(OnboardingAnalyticsEvent.Onboarding.Finished(source = params.source)) + analyticsEventHandler.send( + OnboardingAnalyticsEvent.Onboarding.Finished(source = params.source), + ) analyticsEventHandler.send( event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( source = params.source, - creationType = OnboardingAnalyticsEvent.CreateWallet.WalletCreationType.NewSeed, + creationType = AnalyticsParam.WalletCreationType.NewSeed, seedPhraseLength = SEED_PHRASE_LENGTH, passPhraseState = AnalyticsParam.EmptyFull.Empty, referralId = appsFlyerStore.get()?.refcode, diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/common/analytics/OnboardingEvent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/common/analytics/OnboardingEvent.kt index 07da257630..b9248bb256 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/common/analytics/OnboardingEvent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/common/analytics/OnboardingEvent.kt @@ -2,9 +2,6 @@ package com.tangem.features.onboarding.v2.common.analytics import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam -import com.tangem.core.analytics.models.AppsFlyerIncludedEvent -import com.tangem.core.analytics.models.getReferralParams -import kotlin.collections.putAll sealed class OnboardingEvent( category: String, @@ -12,41 +9,6 @@ sealed class OnboardingEvent( params: Map = mapOf(), ) : AnalyticsEvent(category, event, params) { - class Started : OnboardingEvent("Onboarding", "Onboarding Started") - class Finished : OnboardingEvent("Onboarding", "Onboarding Finished") - - sealed class CreateWallet( - event: String, - params: Map = mapOf(), - ) : OnboardingEvent("Onboarding / Create Wallet", event, params) { - - class ScreenOpened : CreateWallet("Create Wallet Screen Opened") - class ButtonCreateWallet : CreateWallet("Button - Create Wallet") - class ButtonOtherOptions : CreateWallet("Button - Other Options") - class WalletCreatedSuccessfully( - creationType: WalletCreationType = WalletCreationType.PrivateKey, - seedPhraseLength: Int? = null, - passPhraseState: AnalyticsParam.EmptyFull, - referralId: String?, - ) : CreateWallet( - event = "Wallet Created Successfully", - params = buildMap { - put("Creation Type", creationType.value) - put("Passphrase", passPhraseState.value) - if (seedPhraseLength != null) { - put("Seed Phrase Length", seedPhraseLength.toString()) - } - putAll(getReferralParams(referralId)) - }, - ), AppsFlyerIncludedEvent - - sealed class WalletCreationType(val value: String) { - data object PrivateKey : WalletCreationType(value = "Private Key") - data object NewSeed : WalletCreationType(value = "New Seed") - data object SeedImport : WalletCreationType(value = "Seed Import") - } - } - sealed class Backup( event: String, params: Map = mapOf(), diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt index c1c8142bb6..7bb3e6821b 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt @@ -19,6 +19,7 @@ import com.arkivanov.decompose.router.stack.* import com.arkivanov.decompose.value.Value import com.arkivanov.essenty.instancekeeper.getOrCreateSimple import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.childByContext import com.tangem.core.decompose.model.getOrCreateModel @@ -28,7 +29,6 @@ import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.features.biometry.AskBiometryComponent import com.tangem.features.onboarding.v2.addresssync.AddressSyncComponent import com.tangem.features.onboarding.v2.addresssync.DefaultAddressSyncComponent -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.multiwallet.api.OnboardingMultiWalletComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams import com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.MultiWalletAccessCodeComponent @@ -229,7 +229,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor } Done -> { // final step - navigate to parent - analyticsHandler.send(OnboardingEvent.Finished()) + analyticsHandler.send(OnboardingAnalyticsEvent.Onboarding.Finished()) val userWallet = childParams.multiWalletState.value.resultUserWallet ?: return params.onDone(userWallet) } 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 205405cad4..365e636946 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 @@ -6,6 +6,7 @@ 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.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -19,7 +20,6 @@ import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.usecase.SaveWalletUseCase -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.impl.R import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams import com.tangem.features.onboarding.v2.multiwallet.impl.child.createwallet.ui.state.MultiWalletCreateWalletUM @@ -67,12 +67,12 @@ internal class MultiWalletCreateWalletModel @Inject constructor( resourceReference(R.string.onboarding_create_wallet_body) }, onCreateWalletClick = { - analyticsHandler.send(OnboardingEvent.CreateWallet.ButtonCreateWallet()) + analyticsHandler.send(OnboardingAnalyticsEvent.CreateWallet.ButtonCreateWallet()) createWallet(false) }, showOtherOptionsButton = params.parentParams.withSeedPhraseFlow, onOtherOptionsClick = { - analyticsHandler.send(OnboardingEvent.CreateWallet.ButtonOtherOptions()) + analyticsHandler.send(OnboardingAnalyticsEvent.CreateWallet.ButtonOtherOptions()) modelScope.launch { onDone.emit(Step.SeedPhrase) } @@ -85,7 +85,7 @@ internal class MultiWalletCreateWalletModel @Inject constructor( val onDone = MutableSharedFlow() init { - analyticsHandler.send(OnboardingEvent.CreateWallet.ScreenOpened()) + analyticsHandler.send(OnboardingAnalyticsEvent.CreateWallet.ScreenOpened()) } private fun createWallet(shouldReset: Boolean) { @@ -110,7 +110,7 @@ internal class MultiWalletCreateWalletModel @Inject constructor( cardRepository.startCardActivation(cardId = result.data.card.cardId) analyticsHandler.send( - event = OnboardingEvent.CreateWallet.WalletCreatedSuccessfully( + event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( passPhraseState = AnalyticsParam.EmptyFull.Empty, referralId = appsFlyerStore.get()?.refcode, ), 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 c960e1022a..646ff7ad23 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 @@ -29,7 +29,6 @@ import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.usecase.IsWalletAlreadySavedUseCase import com.tangem.features.hotwallet.MnemonicRepository -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.common.ui.OnboardingDialogUM import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams import com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.model.builder.GenerateSeedPhraseUiStateBuilder @@ -239,11 +238,11 @@ internal class MultiWalletSeedPhraseModel @Inject constructor( if (!isWalletAlreadySaved) { analyticsHandler.send( - OnboardingEvent.CreateWallet.WalletCreatedSuccessfully( + OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( creationType = if (generatedSeedPhrase) { - OnboardingEvent.CreateWallet.WalletCreationType.NewSeed + AnalyticsParam.WalletCreationType.NewSeed } else { - OnboardingEvent.CreateWallet.WalletCreationType.SeedImport + AnalyticsParam.WalletCreationType.SeedImport }, seedPhraseLength = mnemonic.mnemonicComponents.size, passPhraseState = if (passphrase.isNullOrBlank()) { diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt index fe78a9bb43..b77bf11401 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt @@ -3,6 +3,7 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.model import com.tangem.common.routing.AppRoute import com.tangem.common.ui.userwallet.converter.ArtworkUMConverter import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -12,7 +13,6 @@ import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType import com.tangem.domain.onboarding.repository.OnboardingRepository import com.tangem.domain.wallets.usecase.GetCardImageUseCase -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.common.ui.interruptBackupDialog import com.tangem.features.onboarding.v2.multiwallet.api.OnboardingMultiWalletComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams @@ -60,7 +60,7 @@ internal class OnboardingMultiWalletModel @Inject constructor( val uiState = _uiState.asStateFlow() init { - analyticsHandler.send(OnboardingEvent.Started()) + analyticsHandler.send(OnboardingAnalyticsEvent.Onboarding.Started()) initScreenTitle() loadCardArtwork() subscribeToBackups() diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt index f083fdec7e..79fa723c64 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt @@ -3,6 +3,7 @@ package com.tangem.features.onboarding.v2.note.impl.child.create.model import com.tangem.common.CompletionResult import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -10,10 +11,9 @@ import com.tangem.core.ui.components.artwork.ArtworkUM import com.tangem.datasource.local.appsflyer.AppsFlyerStore import com.tangem.domain.card.repository.CardRepository import com.tangem.domain.models.scan.ScanResponse -import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.usecase.SaveWalletUseCase -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.note.impl.child.create.OnboardingNoteCreateWalletComponent import com.tangem.features.onboarding.v2.note.impl.child.create.ui.state.OnboardingNoteCreateWalletUM import com.tangem.sdk.api.TangemSdkManager @@ -46,11 +46,11 @@ internal class OnboardingNoteCreateWalletModel @Inject constructor( ) init { - analyticsEventHandler.send(OnboardingEvent.CreateWallet.ScreenOpened()) + analyticsEventHandler.send(OnboardingAnalyticsEvent.CreateWallet.ScreenOpened()) modelScope.launch { val scanResponse = params.childParams.commonState.value.scanResponse ?: return@launch if (!cardRepository.isActivationStarted(scanResponse.card.cardId)) { - analyticsEventHandler.send(OnboardingEvent.Started()) + analyticsEventHandler.send(OnboardingAnalyticsEvent.Onboarding.Started()) } } observeArtwork() @@ -64,11 +64,10 @@ internal class OnboardingNoteCreateWalletModel @Inject constructor( it.copy(createWalletInProgress = true) } val scanResponse = params.childParams.commonState.value.scanResponse ?: return@launch - val result = tangemSdkManager.createProductWallet(scanResponse) - when (result) { + when (val result = tangemSdkManager.createProductWallet(scanResponse)) { is CompletionResult.Success -> { analyticsEventHandler.send( - event = OnboardingEvent.CreateWallet.WalletCreatedSuccessfully( + event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( passPhraseState = AnalyticsParam.EmptyFull.Empty, referralId = appsFlyerStore.get()?.refcode, ), diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteModel.kt index 04edacf8ef..234e608373 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteModel.kt @@ -3,6 +3,7 @@ package com.tangem.features.onboarding.v2.note.impl.model import com.arkivanov.decompose.router.stack.StackNavigation import com.tangem.common.ui.userwallet.converter.ArtworkUMConverter import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -10,7 +11,6 @@ import com.tangem.core.decompose.navigation.Router import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.usecase.GetCardImageUseCase -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.common.ui.exitOnboardingDialog import com.tangem.features.onboarding.v2.note.api.OnboardingNoteComponent import com.tangem.features.onboarding.v2.note.impl.OnboardingNoteInnerNavigationState @@ -76,7 +76,7 @@ internal class OnboardingNoteModel @Inject constructor( } fun onWalletCreated(userWallet: UserWallet) { - analyticsEventHandler.send(OnboardingEvent.Finished()) + analyticsEventHandler.send(OnboardingAnalyticsEvent.Onboarding.Finished()) commonUiState.update { it.copy(userWallet = userWallet) } 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 924382dc55..ad6c629a9f 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 @@ -10,6 +10,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.event.OnboardingAnalyticsEvent import com.tangem.core.analytics.models.Basic import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model @@ -175,7 +176,7 @@ internal class OnboardingTwinModel @Inject constructor( } analyticsEventHandler.send( - event = OnboardingEvent.CreateWallet.WalletCreatedSuccessfully( + event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( passPhraseState = AnalyticsParam.EmptyFull.Empty, referralId = appsFlyerStore.get()?.refcode, ), diff --git a/features/onboarding-v2/impl/src/test/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModelTest.kt b/features/onboarding-v2/impl/src/test/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModelTest.kt index 3b10fcbbbe..3748355dea 100644 --- a/features/onboarding-v2/impl/src/test/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModelTest.kt +++ b/features/onboarding-v2/impl/src/test/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModelTest.kt @@ -19,7 +19,7 @@ import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.onboarding.repository.OnboardingRepository import com.tangem.domain.wallets.usecase.GetCardImageUseCase import com.tangem.features.onboarding.v2.TitleProvider -import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent +import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.features.onboarding.v2.impl.R import com.tangem.features.onboarding.v2.multiwallet.api.OnboardingMultiWalletComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams @@ -114,7 +114,7 @@ internal class OnboardingMultiWalletModelTest { createModel(this) advanceUntilIdle() - verify { analyticsHandler.send(match { true }) } + verify { analyticsHandler.send(match { true }) } } @Test