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 a90e193a92..125b159021 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 @@ -12,12 +12,6 @@ sealed class AnalyticsParam { class Amount(amount: com.tangem.blockchain.common.Amount) : CurrencyType(amount.currencySymbol) } - sealed class CardBalanceState(val value: String) { - data object Empty : CardBalanceState("Empty") - data object Full : CardBalanceState("Full") - companion object - } - sealed class RateApp(val value: String) { data object Liked : RateApp("Liked") data object Closed : RateApp("Close") 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 index a4fcb32fe0..a8deb0d88d 100644 --- 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 @@ -11,85 +11,5 @@ sealed class Onboarding( params: Map = emptyMap(), ) : AnalyticsEvent(category, event, params) { - class Started : Onboarding("Onboarding", "Onboarding Started") class Finished : Onboarding("Onboarding", "Onboarding Finished") - - sealed class CreateWallet( - event: String, - params: Map = emptyMap(), - ) : Onboarding("Onboarding / Create Wallet", event, params) { - - class ScreenOpened : CreateWallet("Create Wallet Screen Opened") - class ButtonCreateWallet : CreateWallet("Button - Create Wallet") - class WalletCreatedSuccessfully( - creationType: AnalyticsParam.WalletCreationType = AnalyticsParam.WalletCreationType.PrivateKey, - seedPhraseLength: Int? = null, - ) : CreateWallet( - event = "Wallet Created Successfully", - params = buildMap { - put(AnalyticsParam.CREATION_TYPE, creationType.value) - - if (seedPhraseLength != null) put(AnalyticsParam.SEED_PHRASE_LENGTH, seedPhraseLength.toString()) - }, - ) - } - - sealed class Backup( - event: String, - params: Map = emptyMap(), - ) : Onboarding("Onboarding / Backup", event, params) { - - class ScreenOpened : Backup("Backup Screen Opened") - class Started : Backup("Backup Started") - class Skipped : Backup("Backup Skipped") - class SettingAccessCodeStarted : Backup("Setting Access Code Started") - class AccessCodeEntered : Backup("Access Code Entered") - class AccessCodeReEntered : Backup("Access Code Re-entered") - - class Finished(cardsCount: Int) : Backup( - event = "Backup Finished", - params = mapOf("Cards count" to "$cardsCount"), - ) - - object ResetCancelEvent : Backup( - event = "Reset Card Notification", - params = mapOf("Option" to "Cancel"), - ) - - object ResetPerformEvent : Backup( - event = "Reset Card Notification", - params = mapOf("Option" to "Reset"), - ) - } - - sealed class Topup( - event: String, - params: Map = emptyMap(), - ) : Onboarding("Onboarding / Top Up", event, params) { - - class ScreenOpened : Topup("Activation Screen Opened") - - class ButtonBuyCrypto(currency: AnalyticsParam.CurrencyType) : Topup( - event = "Button - Buy Crypto", - params = mapOf(AnalyticsParam.CURRENCY to currency.value), - ) - - class ButtonShowWalletAddress : Topup("Button - Show the Wallet Address") - } - - sealed class Twins( - event: String, - params: Map = emptyMap(), - ) : Onboarding("Onboarding / Twins", event, params) { - - class ScreenOpened : Twins("Twinning Screen Opened") - class SetupStarted : Twins("Twin Setup Started") - class SetupFinished : Twins("Twin Setup Finished") - } - - class EnableBiometrics(state: AnalyticsParam.OnOffState) : Onboarding( - category = "Onboarding / Biometric", - event = "Enable Biometric", - params = mapOf("State" to state.value), - ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index ac18c8b943..95d2b8fe04 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -164,7 +164,7 @@ internal class LegacyScanProcessor @Inject constructor( ) { if (error is TangemSdkError.CardVerificationFailed) { analyticsEventHandler.send( - event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed( + event = OnboardingAnalyticsEvent.Error.OfflineAttestationFailed( analyticsSource, ), ) diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index ecb61b1097..df8495fe6c 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -529,7 +529,9 @@ internal class ChildFactory @Inject constructor( is AppRoute.CreateMobileWallet -> { createComponentChild( context = context, - params = Unit, + params = CreateMobileWalletComponent.Params( + source = route.source, + ), componentFactory = createMobileWalletComponentFactory, ) } 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 44386ece68..cbe8919317 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 @@ -346,7 +346,9 @@ sealed class AppRoute(val path: String) : Route { object CreateHardwareWallet : AppRoute(path = "/create_hardware_wallet") @Serializable - object CreateMobileWallet : AppRoute(path = "/create_mobile_wallet") + data class CreateMobileWallet( + val source: String, + ) : AppRoute(path = "/create_mobile_wallet") @Serializable data class UpgradeWallet( 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 b0114af14c..7f051ebf87 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 @@ -11,11 +11,6 @@ sealed class AnalyticsParam { companion object } - sealed class TokenBalanceState(val value: String) { - data object Empty : TokenBalanceState("Empty") - data object Full : TokenBalanceState("Full") - } - sealed class RateApp(val value: String) { data object Liked : RateApp("Liked") data object Disliked : RateApp("Disliked") @@ -205,8 +200,9 @@ sealed class AnalyticsParam { Pending(value = "Pending"), } - enum class EnsStatus(val value: String) { - EMPTY("Empty"), FULL("Full") + enum class EmptyFull(val value: String) { + Empty("Empty"), + Full("Full"), } enum class ProductType(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 f60f3b53fe..d10949860f 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 @@ -12,11 +12,85 @@ sealed class OnboardingAnalyticsEvent( sealed class Onboarding( event: String, params: Map = mapOf(), + ) : OnboardingAnalyticsEvent(category = "Onboarding", event = event, params = params) { + + class Started( + source: String, + ) : Onboarding( + event = "Onboarding Started", + params = mapOf( + AnalyticsParam.SOURCE to source, + ), + ) + + class Finished( + source: String, + ) : Onboarding( + event = "Onboarding Finished", + params = mapOf( + AnalyticsParam.SOURCE to source, + ), + ) + + class ButtonMobileWallet( + source: String, + ) : Onboarding( + event = "Button - Mobile Wallet", + params = mapOf( + AnalyticsParam.SOURCE to source, + ), + ) + } + + sealed class CreateWallet( + event: String, + params: Map = mapOf(), + ) : OnboardingAnalyticsEvent(category = "Onboarding / Create Wallet", event = event, params = params) { + + data object ButtonCreateWallet : CreateWallet("Button - Create Wallet") + + class WalletCreatedSuccessfully( + source: String, + creationType: WalletCreationType = WalletCreationType.NewSeed, + seedPhraseLength: Int? = null, + passPhraseState: AnalyticsParam.EmptyFull, + ) : 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()) + } + }, + ) + + sealed class WalletCreationType(val value: String) { + data object NewSeed : WalletCreationType(value = "New Seed") + data object SeedImport : WalletCreationType(value = "Seed Import") + } + } + + sealed class SeedPhrase( + event: String, + params: Map = mapOf(), + ) : OnboardingAnalyticsEvent(category = "Onboarding / Seed Phrase", event = event, params = params) { + + data object CreateMobileScreenOpened : SeedPhrase("Create Mobile Screen Opened") + data object ButtonImportWallet : SeedPhrase("Button - Import Wallet") + data object ImportSeedPhraseScreenOpened : SeedPhrase("Import Seed Phrase Screen Opened") + data object ButtonImport : SeedPhrase("Button - Import") + } + + sealed class Error( + event: String, + params: Map = mapOf(), ) : OnboardingAnalyticsEvent(category = "Error", event = event, params = params) { data class OfflineAttestationFailed( val source: AnalyticsParam.ScreensSources, - ) : Onboarding( + ) : Error( event = "Offline Attestation Failed", params = mapOf(AnalyticsParam.SOURCE to source.value), ) diff --git a/domain/nft/src/main/kotlin/com/tangem/domain/nft/analytics/NFTAnalyticsEvent.kt b/domain/nft/src/main/kotlin/com/tangem/domain/nft/analytics/NFTAnalyticsEvent.kt index 7ccdadbd7d..0c0e7d83cd 100644 --- a/domain/nft/src/main/kotlin/com/tangem/domain/nft/analytics/NFTAnalyticsEvent.kt +++ b/domain/nft/src/main/kotlin/com/tangem/domain/nft/analytics/NFTAnalyticsEvent.kt @@ -1,6 +1,7 @@ package com.tangem.domain.nft.analytics import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.AnalyticsParam.Key.BLOCKCHAIN import com.tangem.core.analytics.models.AnalyticsParam.Key.COLLECTIONS import com.tangem.core.analytics.models.AnalyticsParam.Key.NFT @@ -18,7 +19,7 @@ sealed class NFTAnalyticsEvent( ) { data class NFTListScreenOpened( - val state: State, + val state: AnalyticsParam.EmptyFull, val collectionsCount: Int, val allAssetsCount: Int, val noCollectionAssetsCount: Int, @@ -30,12 +31,7 @@ sealed class NFTAnalyticsEvent( put(NFT, allAssetsCount.toString()) put(NO_COLLECTION, noCollectionAssetsCount.toString()) }, - ) { - enum class State(val value: String) { - Empty("Empty"), - Full("Full"), - } - } + ) object Receive { data object ScreenOpened : NFTAnalyticsEvent(event = "Receive NFT Screen Opened") diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt index cf752c7e38..5916c680aa 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt @@ -15,7 +15,7 @@ sealed class TokenReceiveNewAnalyticsEvent( class ReceiveScreenOpened( token: String, blockchainName: String, - ensStatus: AnalyticsParam.EnsStatus, + ensStatus: AnalyticsParam.EmptyFull, ) : TokenReceiveNewAnalyticsEvent( event = "Receive Screen Opened", params = mapOf( 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 ba67d8e99a..48a41b6f98 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 @@ -4,6 +4,7 @@ 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.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.navigation.Router @@ -98,6 +99,11 @@ internal class CreateWalletSelectionModel @Inject constructor( } private fun onMobileWalletClick() { + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.Onboarding.ButtonMobileWallet( + source = AnalyticsParam.ScreensSources.AddNewWallet.value, + ), + ) if (!isHotWalletCreationSupported()) { uiMessageSender.send( hotWalletCreationNotSupportedDialog(isHotWalletCreationSupported.getLeastVersionName()), @@ -105,7 +111,7 @@ internal class CreateWalletSelectionModel @Inject constructor( return } - router.push(AppRoute.CreateMobileWallet) + router.push(AppRoute.CreateMobileWallet(AnalyticsParam.ScreensSources.AddNewWallet.value)) } 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 9a74037170..c72cfae7a2 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 @@ -7,6 +7,7 @@ import com.tangem.common.routing.AppRouter 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 import com.tangem.core.decompose.model.Model @@ -134,6 +135,11 @@ internal class CreateWalletStartModel @Inject constructor( } private fun onStartWithMobileWalletClick() { + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.Onboarding.ButtonMobileWallet( + source = AnalyticsParam.ScreensSources.CreateNewWallet.value, + ), + ) if (!isHotWalletCreationSupported()) { uiMessageSender.send( hotWalletCreationNotSupportedDialog(isHotWalletCreationSupported.getLeastVersionName()), @@ -141,7 +147,7 @@ internal class CreateWalletStartModel @Inject constructor( return } - router.push(AppRoute.CreateMobileWallet) + router.push(AppRoute.CreateMobileWallet(AnalyticsParam.ScreensSources.CreateNewWallet.value)) } private fun onBuyClick() { 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 e9bdbf64e5..72db10452d 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 @@ -4,5 +4,9 @@ import com.tangem.core.decompose.factory.ComponentFactory import com.tangem.core.ui.decompose.ComposableContentComponent interface CreateMobileWalletComponent : ComposableContentComponent { - interface Factory : ComponentFactory + data class Params( + val source: String, + ) + + interface Factory : ComponentFactory } \ No newline at end of file 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 7d8156ecd3..d891de2892 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 @@ -1,5 +1,8 @@ package com.tangem.features.hotwallet.addexistingwallet.im.port.model +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.GlobalUiMessageSender import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model @@ -37,6 +40,7 @@ internal class AddExistingWalletImportModel @Inject constructor( private val hotUserWalletBuilderFactory: HotUserWalletBuilder.Factory, private val saveUserWalletUseCase: SaveWalletUseCase, @GlobalUiMessageSender private val uiMessageSender: UiMessageSender, + private val analyticsEventHandler: AnalyticsEventHandler, ) : Model() { private val params: AddExistingWalletImportComponent.Params = paramsContainer.require() @@ -60,6 +64,7 @@ internal class AddExistingWalletImportModel @Inject constructor( } init { + analyticsEventHandler.send(OnboardingAnalyticsEvent.SeedPhrase.ImportSeedPhraseScreenOpened) importSeedPhraseUiStateBuilder = ImportSeedPhraseUiStateBuilder( modelScope = modelScope, mnemonicRepository = mnemonicRepository, @@ -72,6 +77,7 @@ internal class AddExistingWalletImportModel @Inject constructor( ) }, onPassphraseInfoClick = ::onPassphraseInfoClick, + onImportClick = { analyticsEventHandler.send(OnboardingAnalyticsEvent.SeedPhrase.ButtonImport) }, ) } @@ -101,6 +107,23 @@ internal class AddExistingWalletImportModel @Inject constructor( } .onRight { setImportProgress(false) + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.Onboarding.Finished( + source = AnalyticsParam.ScreensSources.ImportWallet.value, + ), + ) + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( + source = AnalyticsParam.ScreensSources.ImportWallet.value, + creationType = OnboardingAnalyticsEvent.CreateWallet.WalletCreationType.SeedImport, + seedPhraseLength = mnemonic.mnemonicComponents.size, + passPhraseState = if (passphrase.isNullOrBlank()) { + AnalyticsParam.EmptyFull.Empty + } else { + AnalyticsParam.EmptyFull.Full + }, + ), + ) params.callbacks.onWalletImported(userWallet.walletId) } }.onFailure { diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/ImportSeedPhraseUiStateBuilder.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/ImportSeedPhraseUiStateBuilder.kt index 95e7f9c2db..cfdb385983 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/ImportSeedPhraseUiStateBuilder.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/ImportSeedPhraseUiStateBuilder.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch +@Suppress("LongParameterList") internal class ImportSeedPhraseUiStateBuilder( private val modelScope: CoroutineScope, private val mnemonicRepository: MnemonicRepository, @@ -24,6 +25,7 @@ internal class ImportSeedPhraseUiStateBuilder( private val updateUiState: ((AddExistingWalletImportUM) -> AddExistingWalletImportUM) -> Unit, private val importWallet: (mnemonic: Mnemonic, passphrase: String?) -> Unit, private val onPassphraseInfoClick: () -> Unit, + private val onImportClick: () -> Unit, ) { private val wordsCheckJobHolder = JobHolder() private var importedMnemonic: Mnemonic? = null @@ -57,6 +59,7 @@ internal class ImportSeedPhraseUiStateBuilder( } private fun onCreateWallet() { + onImportClick() val mnemonic = importedMnemonic ?: return val passphrase = passphrase?.takeIf { it.isNotEmpty() } importWallet(mnemonic, passphrase) 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 49a136ea47..243343ce0b 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 @@ -1,9 +1,13 @@ package com.tangem.features.hotwallet.createmobilewallet 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.event.OnboardingAnalyticsEvent import com.tangem.core.analytics.utils.TrackingContextProxy import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model +import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.navigation.Router import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.ui.message.dialog.Dialogs.hotWalletCreationNotSupportedDialog @@ -11,6 +15,7 @@ import com.tangem.domain.hotwallet.IsHotWalletCreationSupported import com.tangem.domain.wallets.builder.HotUserWalletBuilder import com.tangem.domain.wallets.usecase.SaveWalletUseCase import com.tangem.domain.wallets.usecase.SyncWalletWithRemoteUseCase +import com.tangem.features.hotwallet.CreateMobileWalletComponent import com.tangem.features.hotwallet.createmobilewallet.entity.CreateMobileWalletUM import com.tangem.hot.sdk.TangemHotSdk import com.tangem.hot.sdk.model.HotAuth @@ -28,6 +33,7 @@ import javax.inject.Inject @Suppress("LongParameterList") @ModelScoped internal class CreateMobileWalletModel @Inject constructor( + paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, private val hotUserWalletBuilderFactory: HotUserWalletBuilder.Factory, private val saveUserWalletUseCase: SaveWalletUseCase, @@ -37,8 +43,11 @@ internal class CreateMobileWalletModel @Inject constructor( private val trackingContextProxy: TrackingContextProxy, private val isHotWalletCreationSupported: IsHotWalletCreationSupported, private val uiMessageSender: UiMessageSender, + private val analyticsEventHandler: AnalyticsEventHandler, ) : Model() { + private val params: CreateMobileWalletComponent.Params = paramsContainer.require() + internal val uiState: StateFlow field = MutableStateFlow( CreateMobileWalletUM( @@ -51,6 +60,8 @@ internal class CreateMobileWalletModel @Inject constructor( init { trackingContextProxy.addHotWalletContext() + analyticsEventHandler.send(OnboardingAnalyticsEvent.Onboarding.Started(source = params.source)) + analyticsEventHandler.send(OnboardingAnalyticsEvent.SeedPhrase.CreateMobileScreenOpened) } override fun onDestroy() { @@ -59,11 +70,13 @@ internal class CreateMobileWalletModel @Inject constructor( } private fun onImportClick() { + analyticsEventHandler.send(OnboardingAnalyticsEvent.SeedPhrase.ButtonImportWallet) checkHotWalletCreationSupported(notSupported = { return }) router.push(AppRoute.AddExistingWallet) } private fun onCreateClick() { + analyticsEventHandler.send(OnboardingAnalyticsEvent.CreateWallet.ButtonCreateWallet) checkHotWalletCreationSupported(notSupported = { return }) modelScope.launch { @@ -78,6 +91,16 @@ internal class CreateMobileWalletModel @Inject constructor( saveUserWalletUseCase(userWallet) + analyticsEventHandler.send(OnboardingAnalyticsEvent.Onboarding.Finished(source = params.source)) + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.CreateWallet.WalletCreatedSuccessfully( + source = params.source, + creationType = OnboardingAnalyticsEvent.CreateWallet.WalletCreationType.NewSeed, + seedPhraseLength = SEED_PHRASE_LENGTH, + passPhraseState = AnalyticsParam.EmptyFull.Empty, + ), + ) + launch(dispatchers.main + NonCancellable) { syncWalletWithRemoteUseCase(userWalletId = userWallet.walletId) } @@ -99,4 +122,8 @@ internal class CreateMobileWalletModel @Inject constructor( notSupported() } } + + companion object { + private const val SEED_PHRASE_LENGTH = 12 + } } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt index bf5fd61424..2dbd2f1aa4 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt @@ -15,7 +15,7 @@ import dagger.assisted.AssistedInject @Suppress("UnusedPrivateMember") internal class DefaultCreateMobileWalletComponent @AssistedInject constructor( @Assisted private val context: AppComponentContext, - @Assisted private val params: Unit, + @Assisted private val params: CreateMobileWalletComponent.Params, ) : CreateMobileWalletComponent, AppComponentContext by context { private val model: CreateMobileWalletModel = getOrCreateModel(params) @@ -31,6 +31,9 @@ internal class DefaultCreateMobileWalletComponent @AssistedInject constructor( @AssistedFactory interface Factory : CreateMobileWalletComponent.Factory { - override fun create(context: AppComponentContext, params: Unit): DefaultCreateMobileWalletComponent + override fun create( + context: AppComponentContext, + params: CreateMobileWalletComponent.Params, + ): DefaultCreateMobileWalletComponent } } \ No newline at end of file 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 4628feb506..609e1e7b6d 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 @@ -250,7 +250,7 @@ class MultiWalletBackupModel @Inject constructor( private fun showCardVerificationFailedDialog(error: TangemSdkError.CardVerificationFailed) { analyticsEventHandler.send( - event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed(AnalyticsParam.ScreensSources.Backup), + event = OnboardingAnalyticsEvent.Error.OfflineAttestationFailed(AnalyticsParam.ScreensSources.Backup), ) val resource = error.localizedDescriptionRes() diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt index 4c2f12ab7a..5774e3b776 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt @@ -24,7 +24,7 @@ internal sealed class SendAnalyticEvents( val feeType: AnalyticsParam.FeeType, val blockchain: String, val nonceNotEmpty: Boolean, - private val ensStatus: AnalyticsParam.EnsStatus, + private val ensStatus: AnalyticsParam.EmptyFull, ) : SendAnalyticEvents( event = "Transaction Sent Screen Opened", params = mapOf( @@ -33,8 +33,8 @@ internal sealed class SendAnalyticEvents( BLOCKCHAIN to blockchain, NONCE to nonceNotEmpty.toString().capitalize(), ENS_ADDRESS to when (ensStatus) { - AnalyticsParam.EnsStatus.EMPTY -> false.toString().capitalize() - AnalyticsParam.EnsStatus.FULL -> true.toString().capitalize() + AnalyticsParam.EmptyFull.Empty -> false.toString().capitalize() + AnalyticsParam.EmptyFull.Full -> true.toString().capitalize() }, ), ) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt index 0d5fe7f1e4..48f87023ed 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt @@ -53,13 +53,13 @@ internal class SendAnalyticHelper @Inject constructor( } } - private fun getEnsStatus(sendUM: SendUM): AnalyticsParam.EnsStatus { + private fun getEnsStatus(sendUM: SendUM): AnalyticsParam.EmptyFull { val blockchainAddressForEns = (sendUM.destinationUM as? DestinationUM.Content)?.addressTextField?.isAddressEns return if (blockchainAddressForEns == true) { - AnalyticsParam.EnsStatus.FULL + AnalyticsParam.EmptyFull.Full } else { - AnalyticsParam.EnsStatus.EMPTY + AnalyticsParam.EmptyFull.Empty } } } \ No newline at end of file diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt index decfd54c50..50bc8ae792 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt @@ -56,12 +56,12 @@ internal class TokenReceiveAssetsModel @Inject constructor( ), ) - private fun configureEnsStatus(): AnalyticsParam.EnsStatus { + private fun configureEnsStatus(): AnalyticsParam.EmptyFull { val hasEnsAddress = params.addresses.any { it.type == ReceiveAddress.Type.Ens } return if (hasEnsAddress) { - AnalyticsParam.EnsStatus.FULL + AnalyticsParam.EmptyFull.Full } else { - AnalyticsParam.EnsStatus.EMPTY + AnalyticsParam.EmptyFull.Empty } } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt index b42d3aebb9..ca2353b273 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt @@ -4,6 +4,7 @@ import arrow.core.getOrElse import com.tangem.common.ui.expressStatus.ExpressStatusBottomSheetConfig import com.tangem.common.ui.tokens.TokenItemStateConverter.ApySource import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.event.MainScreenAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.domain.models.account.Account @@ -354,7 +355,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( is WalletNFTItemUM.Content -> { analyticsEventHandler.send( NFTAnalyticsEvent.NFTListScreenOpened( - state = NFTAnalyticsEvent.NFTListScreenOpened.State.Full, + state = AnalyticsParam.EmptyFull.Full, allAssetsCount = state.allAssetsCount, collectionsCount = state.collectionsCount, noCollectionAssetsCount = state.noCollectionAssetsCount, @@ -364,7 +365,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( is WalletNFTItemUM.Empty -> { analyticsEventHandler.send( NFTAnalyticsEvent.NFTListScreenOpened( - state = NFTAnalyticsEvent.NFTListScreenOpened.State.Empty, + state = AnalyticsParam.EmptyFull.Empty, allAssetsCount = 0, collectionsCount = 0, noCollectionAssetsCount = 0, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt index 9f5263273e..00a748830b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt @@ -37,7 +37,7 @@ sealed class WalletScreenAnalyticsEvent { }, ) - class TokenBalance(balance: AnalyticsParam.TokenBalanceState, token: String) : Basic( + class TokenBalance(balance: AnalyticsParam.EmptyFull, token: String) : Basic( event = "Token Balance", params = mapOf( AnalyticsParam.STATE to balance.value, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt index fe583f7183..b8d4f81c17 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/TokenListAnalyticsSender.kt @@ -156,9 +156,9 @@ internal class TokenListAnalyticsSender @Inject constructor( -> { if (balanceWasSentMap[blockchain.currency] != true) { val tokenBalance = if (balanceStatus.amount.isZero()) { - AnalyticsParam.TokenBalanceState.Empty + AnalyticsParam.EmptyFull.Empty } else { - AnalyticsParam.TokenBalanceState.Full + AnalyticsParam.EmptyFull.Full } analyticsEventHandler.send( Basic.TokenBalance(