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 d1dd0f06bb..e7e51bdd4c 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 @@ -133,9 +133,9 @@ sealed class AnalyticsParam { } sealed class WalletCreationType(val value: String) { - object PrivateKey : WalletCreationType("Private key") - object NewSeed : WalletCreationType("New seed") - object SeedImport : WalletCreationType("Seed import") + object PrivateKey : WalletCreationType(value = "Private Key") + object NewSeed : WalletCreationType(value = "New Seed") + object SeedImport : WalletCreationType(value = "Seed Import") } companion object Key { @@ -152,7 +152,8 @@ sealed class AnalyticsParam { const val ERROR_DESCRIPTION = "Error Description" const val ERROR_CODE = "Error Code" const val ERROR_KEY = "Error Key" - const val CREATION_TYPE = "Creation type" + const val CREATION_TYPE = "Creation Type" + const val SEED_PHRASE_LENGTH = "Seed Phrase Length" const val DAPP_NAME = "DApp Name" const val DAPP_URL = "DApp Url" const val METHOD_NAME = "Method Name" 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 a9432ad404..9088608413 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 @@ -23,9 +23,14 @@ sealed class Onboarding( class ButtonCreateWallet : CreateWallet("Button - Create Wallet") class WalletCreatedSuccessfully( creationType: AnalyticsParam.WalletCreationType = AnalyticsParam.WalletCreationType.PrivateKey, + seedPhraseLength: Int? = null, ) : CreateWallet( event = "Wallet Created Successfully", - params = mapOf(AnalyticsParam.CREATION_TYPE to creationType.value), + params = buildMap { + put(AnalyticsParam.CREATION_TYPE, creationType.value) + + if (seedPhraseLength != null) put(AnalyticsParam.SEED_PHRASE_LENGTH, seedPhraseLength.toString()) + }, ) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt index 0db51098a3..6db15ac882 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt @@ -45,6 +45,7 @@ class CardContextInterceptor( ProductType.Note -> "Note" ProductType.Twins -> "Twin" ProductType.Wallet -> "Wallet" + ProductType.Wallet2 -> "Wallet 2.0" ProductType.Start2Coin -> "Start2Coin" else -> if (DemoHelper.isDemoCard(scanResponse)) { if (DemoHelper.isTestDemoCard(scanResponse)) { diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index 30b5814a11..e6be2ff4c2 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -209,7 +209,9 @@ private class ScanWalletProcessor( session: CardSession, callback: (result: CompletionResult) -> Unit, ) { - val productType = ProductType.Wallet + val isWallet2 = card.settings.isKeysImportAllowed || card.firmwareVersion >= FirmwareVersion.KeysImportAvailable + + val productType = if (isWallet2) ProductType.Wallet2 else ProductType.Wallet val config = CardConfig.createConfig(card) scope.launch { val scanResponse = ScanResponse( diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 29c6d0fe98..6369010887 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -53,7 +53,7 @@ object OnboardingHelper { fun whereToNavigate(scanResponse: ScanResponse): AppScreen { return when (scanResponse.productType) { ProductType.Note -> AppScreen.OnboardingNote - ProductType.Wallet -> if (scanResponse.card.settings.isBackupAllowed) { + ProductType.Wallet, ProductType.Wallet2 -> if (scanResponse.card.settings.isBackupAllowed) { AppScreen.OnboardingWallet } else { AppScreen.OnboardingOther diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index b46578b48b..b825a98b28 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -237,7 +237,12 @@ private fun handleWallet2Action(action: OnboardingWallet2Action) { SeedPhraseSource.IMPORTED -> AnalyticsParam.WalletCreationType.SeedImport SeedPhraseSource.GENERATED -> AnalyticsParam.WalletCreationType.NewSeed } - Analytics.send(Onboarding.CreateWallet.WalletCreatedSuccessfully(creationType)) + Analytics.send( + event = Onboarding.CreateWallet.WalletCreatedSuccessfully( + creationType = creationType, + seedPhraseLength = action.mnemonicComponents.size, + ), + ) val response = CreateWalletResponse( card = result.data.card, derivedKeys = result.data.derivedKeys, diff --git a/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt b/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt index 321a48b0bf..11dc95e2b1 100644 --- a/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt +++ b/data/card/src/main/java/com/tangem/data/card/DefaultCardSdkConfigRepository.kt @@ -50,6 +50,7 @@ internal class DefaultCardSdkConfigRepository( ProductType.Note, ProductType.Wallet, ProductType.Start2Coin, + ProductType.Wallet2, -> CardIdDisplayFormat.Full } } diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 925137aab5..8c4877ad37 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -179,7 +179,6 @@ fun Blockchain.toCoinId(): String { Blockchain.Dash -> "dash" Blockchain.Kaspa -> "kaspa" Blockchain.TON, Blockchain.TONTestnet -> "the-open-network" - Blockchain.Unknown -> "unknown" Blockchain.Kava, Blockchain.KavaTestnet -> "kava" Blockchain.Ravencoin, Blockchain.RavencoinTestnet -> "ravencoin" Blockchain.Cosmos, Blockchain.CosmosTestnet -> "cosmos" @@ -189,10 +188,10 @@ fun Blockchain.toCoinId(): String { Blockchain.Telos, Blockchain.TelosTestnet -> "telos" Blockchain.AlephZero, Blockchain.AlephZeroTestnet -> "aleph-zero" Blockchain.OctaSpace, Blockchain.OctaSpaceTestnet -> "octaspace" - Blockchain.Chia -> "chia" - Blockchain.ChiaTestnet -> "chia/test" + Blockchain.Chia, Blockchain.ChiaTestnet -> "chia" Blockchain.Near -> "near" Blockchain.NearTestnet -> "near/test" + Blockchain.Unknown -> "unknown" } } diff --git a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt index 4916db578c..29890a9abd 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletBuilder.kt @@ -25,6 +25,7 @@ class UserWalletBuilder( cardTypesResolver.isStart2Coin() -> "Start2Coin" else -> "Wallet" } + ProductType.Wallet2 -> "Wallet" } /** diff --git a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt index cad0957152..40ac39de3c 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/userwallets/UserWalletIdBuilder.kt @@ -60,6 +60,7 @@ class UserWalletIdBuilder private constructor( ProductType.Twins -> scanResponse.secondTwinPublicKey?.hexToBytes() ProductType.Note, ProductType.Wallet, + ProductType.Wallet2, ProductType.Start2Coin, -> null }, diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt index c6f1d9f75c..74a552e520 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/scan/ScanResponse.kt @@ -21,5 +21,5 @@ data class ScanResponse( typealias KeyWalletPublicKey = ByteArrayKey enum class ProductType { - Note, Twins, Wallet, Start2Coin + Note, Twins, Wallet, Start2Coin, Wallet2 } \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt index 7cdaf16171..719abb7761 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt @@ -156,6 +156,7 @@ class SeedPhraseViewModel @Inject constructor( ), suggestedPhraseClick = ::buttonSuggestedPhraseClick, buttonCreateWalletClick = { + analyticsEventHandler.send(SeedPhraseEvents.ButtonImport) buttonImportWalletClick(importedMnemonicComponents, SeedPhraseSource.IMPORTED) }, ), @@ -165,7 +166,7 @@ class SeedPhraseViewModel @Inject constructor( // region CheckSeedPhrase private fun onTextFieldChanged(field: SeedPhraseField, textFieldValue: TextFieldValue) { - viewModelScope.launchSingle { + launchSingle { updateUi { uiBuilder.checkSeedPhrase.updateTextField(uiState, field, textFieldValue) } val fieldState = field.getState(uiState) @@ -278,7 +279,6 @@ class SeedPhraseViewModel @Inject constructor( } private fun buttonImportWalletClick(mnemonicComponents: List?, seedPhraseSource: SeedPhraseSource) { - analyticsEventHandler.send(SeedPhraseEvents.ButtonImport) mnemonicComponents ?: return viewModelScope.launch(dispatchers.io) { @@ -325,7 +325,7 @@ class SeedPhraseViewModel @Inject constructor( private fun buttonGenerateSeedPhraseClick() { analyticsEventHandler.send(SeedPhraseEvents.ButtonGenerateSeedPhrase) - viewModelScope.launchSingle { + launchSingle { updateUi { uiBuilder.generateMnemonicComponents(uiState) } delay(DELAY_GENERATE_SEED_PHRASE) interactor.generateMnemonic() @@ -380,7 +380,7 @@ class SeedPhraseViewModel @Inject constructor( } private fun buttonSuggestedPhraseClick(suggestionIndex: Int) { - viewModelScope.launchSingle { + launchSingle { val textFieldValue = uiState.importSeedPhraseState.tvSeedPhrase.textFieldValue val word = uiState.importSeedPhraseState.suggestionsList[suggestionIndex] val cursorPosition = textFieldValue.selection.end @@ -420,7 +420,7 @@ class SeedPhraseViewModel @Inject constructor( SeedPhraseField.Eleventh -> uiState.checkSeedPhraseState.tvEleventhPhrase } - private fun CoroutineScope.launchSingle(block: suspend CoroutineScope.() -> Unit): Job { + private fun launchSingle(block: suspend CoroutineScope.() -> Unit): Job { return viewModelScope.launch(dispatchers.single, block = block) }