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 e1dfdea4c1..f35a636601 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 @@ -13,7 +13,6 @@ sealed class Onboarding( class Started : Onboarding("Onboarding", "Onboarding Started") class Finished : Onboarding("Onboarding", "Onboarding Finished") - data object OfflineAttestationFailed : Onboarding(category = "Onboarding", event = "Offline Attestation Failed") sealed class CreateWallet( event: String, diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt index a7592add78..216af3ca6d 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt @@ -19,11 +19,13 @@ internal class DefaultScanCardProcessor( override suspend fun scan( cardId: String?, allowsRequestAccessCodeFromRepository: Boolean, + analyticsSource: AnalyticsParam.ScreensSources, ): CompletionResult { return if (isNewCardScanningEnabled) { UseCaseScanProcessor.scan(cardId, allowsRequestAccessCodeFromRepository) } else { legacyScanProcessor.scan( + analyticsSource = analyticsSource, cardId = cardId, allowsRequestAccessCodeFromRepository = allowsRequestAccessCodeFromRepository, ) 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 0d0d13797e..27fa8ead9e 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 @@ -59,13 +59,14 @@ internal class LegacyScanProcessor @Inject constructor( suspend fun scan( cardId: String? = null, allowsRequestAccessCodeFromRepository: Boolean = false, + analyticsSource: AnalyticsParam.ScreensSources, ): CompletionResult { return tangemSdkManager.scanProduct( cardId = cardId, allowsRequestAccessCodeFromRepository = allowsRequestAccessCodeFromRepository, ) .doOnFailure { error -> - onScanFailure(error = error, onFailure = {}, onCancel = {}) + onScanFailure(analyticsSource = analyticsSource, error = error, onFailure = {}, onCancel = {}) } } @@ -92,6 +93,7 @@ internal class LegacyScanProcessor @Inject constructor( result .doOnFailure { error -> onScanFailure( + analyticsSource = analyticsSource, error = error, onFailure = onFailure, onCancel = { @@ -162,12 +164,17 @@ internal class LegacyScanProcessor @Inject constructor( } private suspend inline fun onScanFailure( + analyticsSource: AnalyticsParam.ScreensSources, error: TangemError, crossinline onFailure: suspend (TangemError) -> Unit, crossinline onCancel: () -> Unit, ) { if (error is TangemSdkError.CardVerificationFailed) { - analyticsEventHandler.send(event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed) + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed( + analyticsSource, + ), + ) val resource = error.localizedDescriptionRes() val resId = resource.resId ?: R.string.common_unknown_error diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt index 8ede05a98a..bbf156324b 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt @@ -66,7 +66,10 @@ internal class CardSettingsViewModel @Inject constructor( ) private fun scanCard() = viewModelScope.launch { - scanCardProcessor.scan(allowsRequestAccessCodeFromRepository = true) + scanCardProcessor.scan( + analyticsSource = com.tangem.core.analytics.models.AnalyticsParam.ScreensSources.Settings, + allowsRequestAccessCodeFromRepository = true, + ) .doOnSuccess { scanResponse -> val scannedUserWalletId = UserWalletIdBuilder.scanResponse(scanResponse).build() if (userWalletId == scannedUserWalletId || scannedUserWalletId == null) { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index 78a0248326..4b8ab7545a 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -7,6 +7,7 @@ import com.tangem.common.extensions.guard import com.tangem.common.routing.AppRoute import com.tangem.common.routing.utils.popTo import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent import com.tangem.core.ui.R import com.tangem.core.ui.extensions.resourceReference @@ -356,7 +357,9 @@ private fun handle(action: Action, dispatch: DispatchFunction) { private fun showCardVerificationFailedDialog(error: TangemError) { if (error is TangemSdkError.CardVerificationFailed) { - Analytics.send(event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed) + Analytics.send( + event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed(AnalyticsParam.ScreensSources.Backup), + ) val resource = error.localizedDescriptionRes() val resId = resource.resId ?: R.string.common_unknown_error 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 b87183595a..d09e6d3c37 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 @@ -476,7 +476,11 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) when (val error = result.error) { is TangemSdkError.CardVerificationFailed -> { - Analytics.send(event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed) + Analytics.send( + event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed( + com.tangem.core.analytics.models.AnalyticsParam.ScreensSources.Backup, + ), + ) val resource = error.localizedDescriptionRes() val resId = resource.resId ?: com.tangem.core.ui.R.string.common_unknown_error 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 723451acf5..6e4b6e4a13 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 @@ -79,6 +79,8 @@ sealed class AnalyticsParam { 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") } sealed class TxSentFrom(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 454bdc1ab7..f60f3b53fe 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,6 +1,7 @@ package com.tangem.core.analytics.models.event import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam sealed class OnboardingAnalyticsEvent( category: String, @@ -11,8 +12,13 @@ sealed class OnboardingAnalyticsEvent( sealed class Onboarding( event: String, params: Map = mapOf(), - ) : OnboardingAnalyticsEvent(category = "Onboarding", event = event, params = params) { + ) : OnboardingAnalyticsEvent(category = "Error", event = event, params = params) { - data object OfflineAttestationFailed : Onboarding(event = "Offline Attestation Failed") + data class OfflineAttestationFailed( + val source: AnalyticsParam.ScreensSources, + ) : Onboarding( + event = "Offline Attestation Failed", + params = mapOf(AnalyticsParam.SOURCE to source.value), + ) } } \ No newline at end of file diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt index 9c52d3c84a..f7a54bccda 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt @@ -10,6 +10,7 @@ interface ScanCardProcessor { suspend fun scan( cardId: String? = null, allowsRequestAccessCodeFromRepository: Boolean = false, + analyticsSource: AnalyticsParam.ScreensSources, ): CompletionResult suspend fun scan( 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 24b85a782c..48d3ead42a 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 @@ -5,6 +5,7 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics 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.event.OnboardingAnalyticsEvent import com.tangem.core.decompose.di.ComponentScoped import com.tangem.core.decompose.model.Model @@ -246,7 +247,9 @@ class MultiWalletBackupModel @Inject constructor( } private fun showCardVerificationFailedDialog(error: TangemSdkError.CardVerificationFailed) { - analyticsEventHandler.send(event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed) + analyticsEventHandler.send( + event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed(AnalyticsParam.ScreensSources.Backup), + ) val resource = error.localizedDescriptionRes() val resId = resource.resId ?: com.tangem.core.ui.R.string.common_unknown_error diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/ScanCardToUnlockWalletClickHandler.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/ScanCardToUnlockWalletClickHandler.kt index e528262365..9026867a47 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/ScanCardToUnlockWalletClickHandler.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/ScanCardToUnlockWalletClickHandler.kt @@ -5,6 +5,7 @@ import arrow.core.raise.either import arrow.core.raise.ensure import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.wallets.builder.UserWalletBuilder import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase @@ -22,7 +23,7 @@ internal class ScanCardToUnlockWalletClickHandler @Inject constructor( suspend operator fun invoke(walletId: UserWalletId): Either { return either { - when (val result = scanCardProcessor.scan()) { + when (val result = scanCardProcessor.scan(analyticsSource = AnalyticsParam.ScreensSources.Main)) { is CompletionResult.Failure -> { if (result.error is TangemSdkError.UserCancelled) { scanFailsCounter++