From af822f9d7a16eb05baa83233a7ec64bbcf4dbc17 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 31 Jul 2024 12:57:35 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../analytics/DefaultAnalyticsContextProxy.kt | 31 +++++++++++ .../tap/di/analytics/AnalyticsModule.kt | 6 +++ .../details/ui/details/DetailsScreenState.kt | 2 +- app/src/main/res/drawable/ic_more_cards.xml | 5 -- core/analytics/build.gradle.kts | 1 + .../analytics/utils/AnalyticsContextProxy.kt | 17 +++++++ .../main/res/drawable/ic_more_cards_24.xml | 11 ++++ .../wallet-settings/impl/build.gradle.kts | 3 ++ .../walletsettings/analytics/Settings.kt | 13 +++++ .../preview/PreviewWalletSettingsComponent.kt | 2 + .../model/WalletSettingsModel.kt | 29 +++++++++++ .../walletsettings/utils/ItemsBuilder.kt | 51 ++++++++++++------- 12 files changed, 147 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/analytics/DefaultAnalyticsContextProxy.kt delete mode 100644 app/src/main/res/drawable/ic_more_cards.xml create mode 100644 core/analytics/src/main/java/com/tangem/core/analytics/utils/AnalyticsContextProxy.kt create mode 100644 core/ui/src/main/res/drawable/ic_more_cards_24.xml create mode 100644 features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/analytics/Settings.kt diff --git a/app/src/main/java/com/tangem/tap/common/analytics/DefaultAnalyticsContextProxy.kt b/app/src/main/java/com/tangem/tap/common/analytics/DefaultAnalyticsContextProxy.kt new file mode 100644 index 0000000000..d1aecc29d0 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/DefaultAnalyticsContextProxy.kt @@ -0,0 +1,31 @@ +package com.tangem.tap.common.analytics + +import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.utils.AnalyticsContextProxy +import com.tangem.domain.models.scan.ScanResponse +import com.tangem.tap.common.extensions.addContext +import com.tangem.tap.common.extensions.eraseContext +import com.tangem.tap.common.extensions.removeContext +import com.tangem.tap.common.extensions.setContext + +/** +[REDACTED_AUTHOR] + */ +internal class DefaultAnalyticsContextProxy : AnalyticsContextProxy { + + override fun setContext(scanResponse: ScanResponse) { + Analytics.setContext(scanResponse) + } + + override fun eraseContext() { + Analytics.eraseContext() + } + + override fun addContext(scanResponse: ScanResponse) { + Analytics.addContext(scanResponse) + } + + override fun removeContext() { + Analytics.removeContext() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt b/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt index 34dbbd2e11..c687d63c10 100644 --- a/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt +++ b/app/src/main/java/com/tangem/tap/di/analytics/AnalyticsModule.kt @@ -1,6 +1,8 @@ package com.tangem.tap.di.analytics +import com.tangem.core.analytics.utils.AnalyticsContextProxy import com.tangem.domain.analytics.ChangeCardAnalyticsContextUseCase +import com.tangem.tap.common.analytics.DefaultAnalyticsContextProxy import com.tangem.tap.common.analytics.DefaultChangeCardAnalyticsContextUseCase import dagger.Module import dagger.Provides @@ -17,4 +19,8 @@ internal object AnalyticsModule { fun provideChangeCardAnalyticsContextUseCase(): ChangeCardAnalyticsContextUseCase { return DefaultChangeCardAnalyticsContextUseCase() } + + @Provides + @Singleton + fun provideAnalyticsContextProxy(): AnalyticsContextProxy = DefaultAnalyticsContextProxy() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt index b35c17a5fd..acafefe8e7 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt @@ -60,7 +60,7 @@ internal sealed class SettingsItem( data class LinkMoreCards( override val onClick: () -> Unit, ) : SettingsItem( - iconResId = R.drawable.ic_more_cards, + iconResId = R.drawable.ic_more_cards_24, title = resourceReference(R.string.details_row_title_create_backup), ) diff --git a/app/src/main/res/drawable/ic_more_cards.xml b/app/src/main/res/drawable/ic_more_cards.xml deleted file mode 100644 index 0cc559021b..0000000000 --- a/app/src/main/res/drawable/ic_more_cards.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts index 9d05970191..c61c8e7af2 100644 --- a/core/analytics/build.gradle.kts +++ b/core/analytics/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { /** Domain */ implementation(projects.domain.analytics) + implementation(projects.domain.models) /** Other */ implementation(deps.kotlin.coroutines) diff --git a/core/analytics/src/main/java/com/tangem/core/analytics/utils/AnalyticsContextProxy.kt b/core/analytics/src/main/java/com/tangem/core/analytics/utils/AnalyticsContextProxy.kt new file mode 100644 index 0000000000..cab4da6a7b --- /dev/null +++ b/core/analytics/src/main/java/com/tangem/core/analytics/utils/AnalyticsContextProxy.kt @@ -0,0 +1,17 @@ +package com.tangem.core.analytics.utils + +import com.tangem.domain.models.scan.ScanResponse + +/** +[REDACTED_AUTHOR] + */ +interface AnalyticsContextProxy { + + fun setContext(scanResponse: ScanResponse) + + fun eraseContext() + + fun addContext(scanResponse: ScanResponse) + + fun removeContext() +} \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/ic_more_cards_24.xml b/core/ui/src/main/res/drawable/ic_more_cards_24.xml new file mode 100644 index 0000000000..1fd80fa554 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_more_cards_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/features/wallet-settings/impl/build.gradle.kts b/features/wallet-settings/impl/build.gradle.kts index 8c61fc867a..14885a740b 100644 --- a/features/wallet-settings/impl/build.gradle.kts +++ b/features/wallet-settings/impl/build.gradle.kts @@ -21,11 +21,13 @@ dependencies { implementation(projects.core.ui) implementation(projects.core.featuretoggles) implementation(projects.core.navigation) + implementation(projects.core.analytics) implementation(projects.core.analytics.models) implementation(projects.common.routing) /* Project - Domain */ implementation(projects.domain.legacy) + implementation(projects.domain.models) implementation(projects.domain.wallets) implementation(projects.domain.wallets.models) @@ -50,4 +52,5 @@ dependencies { /* Other */ implementation(deps.kotlin.immutable.collections) implementation(deps.timber) + implementation(deps.reKotlin) } \ No newline at end of file diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/analytics/Settings.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/analytics/Settings.kt new file mode 100644 index 0000000000..9a655d973a --- /dev/null +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/analytics/Settings.kt @@ -0,0 +1,13 @@ +package com.tangem.feature.walletsettings.analytics + +import com.tangem.core.analytics.models.AnalyticsEvent + +internal sealed class Settings( + category: String = "Settings", + event: String, + params: Map = mapOf(), + error: Throwable? = null, +) : AnalyticsEvent(category, event, params, error) { + + class ButtonCreateBackup : Settings(event = "Button - Create Backup") +} \ No newline at end of file diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/preview/PreviewWalletSettingsComponent.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/preview/PreviewWalletSettingsComponent.kt index 7649ef9bd7..4dba365556 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/preview/PreviewWalletSettingsComponent.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/preview/PreviewWalletSettingsComponent.kt @@ -19,8 +19,10 @@ internal class PreviewWalletSettingsComponent : WalletSettingsComponent { userWalletId = UserWalletId("011"), userWalletName = "My Wallet", isReferralAvailable = true, + isLinkMoreCardsAvailable = true, renameWallet = {}, forgetWallet = {}, + onLinkMoreCardsClick = {}, ), ) diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt index e066301748..a9e5b42932 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt @@ -5,6 +5,8 @@ import arrow.core.getOrElse import com.arkivanov.decompose.router.slot.SlotNavigation import com.arkivanov.decompose.router.slot.activate import com.tangem.common.routing.AppRoute +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.utils.AnalyticsContextProxy import com.tangem.core.decompose.di.ComponentScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -16,9 +18,14 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.message.ContentMessage import com.tangem.core.ui.message.SnackbarMessage import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.redux.LegacyAction +import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.usecase.DeleteWalletUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase +import com.tangem.feature.walletsettings.analytics.Settings import com.tangem.feature.walletsettings.component.WalletSettingsComponent import com.tangem.feature.walletsettings.entity.DialogConfig import com.tangem.feature.walletsettings.entity.WalletSettingsItemUM @@ -43,6 +50,9 @@ internal class WalletSettingsModel @Inject constructor( private val deleteWalletUseCase: DeleteWalletUseCase, private val itemsBuilder: ItemsBuilder, override val dispatchers: CoroutineDispatcherProvider, + private val analyticsEventHandler: AnalyticsEventHandler, + private val analyticsContextProxy: AnalyticsContextProxy, + private val reduxStateHolder: ReduxStateHolder, ) : Model() { val params: WalletSettingsComponent.Params = paramsContainer.require() @@ -75,6 +85,7 @@ internal class WalletSettingsModel @Inject constructor( userWalletId = userWallet.walletId, userWalletName = userWallet.name, isReferralAvailable = userWallet.cardTypesResolver.isTangemWallet(), + isLinkMoreCardsAvailable = userWallet.scanResponse.card.backupStatus == CardDTO.BackupStatus.NoBackup, renameWallet = { openRenameWalletDialog(userWallet, dialogNavigation) }, forgetWallet = { messageSender.send( @@ -98,6 +109,9 @@ internal class WalletSettingsModel @Inject constructor( }, ) }, + onLinkMoreCardsClick = { + onLinkMoreCardsClick(scanResponse = userWallet.scanResponse) + }, ) private fun openRenameWalletDialog(userWallet: UserWallet, dialogNavigation: SlotNavigation) { @@ -126,4 +140,19 @@ internal class WalletSettingsModel @Inject constructor( router.replaceAll(AppRoute.Home) } } + + private fun onLinkMoreCardsClick(scanResponse: ScanResponse) { + analyticsEventHandler.send(Settings.ButtonCreateBackup()) + + analyticsContextProxy.addContext(scanResponse) + + reduxStateHolder.dispatch( + LegacyAction.StartOnboardingProcess( + scanResponse = scanResponse, + canSkipBackup = false, + ), + ) + + router.push(AppRoute.OnboardingWallet()) + } } \ No newline at end of file diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/ItemsBuilder.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/ItemsBuilder.kt index 0e065183b2..941f1c53f2 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/ItemsBuilder.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/ItemsBuilder.kt @@ -19,15 +19,18 @@ internal class ItemsBuilder @Inject constructor( private val router: Router, ) { + @Suppress("LongParameterList") fun buildItems( userWalletId: UserWalletId, userWalletName: String, + isLinkMoreCardsAvailable: Boolean, isReferralAvailable: Boolean, forgetWallet: () -> Unit, renameWallet: () -> Unit, + onLinkMoreCardsClick: () -> Unit, ): PersistentList = persistentListOf( buildNameItem(userWalletName, renameWallet), - buildCardItem(userWalletId, isReferralAvailable), + buildCardItem(userWalletId, isLinkMoreCardsAvailable, isReferralAvailable, onLinkMoreCardsClick), buildForgetItem(forgetWallet), ) @@ -38,26 +41,38 @@ internal class ItemsBuilder @Inject constructor( onClick = renameWallet, ) - private fun buildCardItem(userWalletId: UserWalletId, isReferralAvailable: Boolean) = - WalletSettingsItemUM.WithItems( - id = "card", - description = resourceReference(R.string.settings_card_settings_footer), - blocks = buildList { + private fun buildCardItem( + userWalletId: UserWalletId, + isLinkMoreCardsAvailable: Boolean, + isReferralAvailable: Boolean, + onLinkMoreCardsClick: () -> Unit, + ) = WalletSettingsItemUM.WithItems( + id = "card", + description = resourceReference(R.string.settings_card_settings_footer), + blocks = buildList { + if (isLinkMoreCardsAvailable) { BlockUM( - text = resourceReference(R.string.card_settings_title), - iconRes = R.drawable.ic_card_settings_24, - onClick = { router.push(AppRoute.CardSettings(userWalletId)) }, + text = resourceReference(R.string.details_row_title_create_backup), + iconRes = R.drawable.ic_more_cards_24, + onClick = onLinkMoreCardsClick, ).let(::add) + } - if (isReferralAvailable) { - BlockUM( - text = resourceReference(R.string.details_referral_title), - iconRes = R.drawable.ic_add_friends_24, - onClick = { router.push(AppRoute.ReferralProgram(userWalletId)) }, - ).let(::add) - } - }.toImmutableList(), - ) + BlockUM( + text = resourceReference(R.string.card_settings_title), + iconRes = R.drawable.ic_card_settings_24, + onClick = { router.push(AppRoute.CardSettings(userWalletId)) }, + ).let(::add) + + if (isReferralAvailable) { + BlockUM( + text = resourceReference(R.string.details_referral_title), + iconRes = R.drawable.ic_add_friends_24, + onClick = { router.push(AppRoute.ReferralProgram(userWalletId)) }, + ).let(::add) + } + }.toImmutableList(), + ) private fun buildForgetItem(forgetWallet: () -> Unit) = WalletSettingsItemUM.WithItems( id = "forget",