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",