From 65a2f369c8539701b740986ac24266e1cc44f1f1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 9 Feb 2026 20:36:41 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../AppsFlyerReferralParamsHandler.kt | 2 +- .../di/UserWalletsListManagerModule.kt | 3 +++ .../DefaultUserWalletsListRepository.kt | 21 +++++++++++++++++++ .../AppsFlyerReferralParamsHandlerTest.kt | 2 +- .../DefaultMobileWalletPromoRepository.kt | 4 ++-- .../domain/MobileWalletPromoRepository.kt | 2 +- .../SetShouldShowMobileWalletPromoUseCase.kt | 4 ++-- 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt index 68a63f0c00..cd9e78634b 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt @@ -71,7 +71,7 @@ class AppsFlyerReferralParamsHandler @Inject constructor( private fun storeConversionData(refcode: String, campaign: String?) { coroutineScope.launch { mutex.withLock { - setShouldShowMobileWalletPromoUseCase() + setShouldShowMobileWalletPromoUseCase(true) .onLeft { Timber.e(it) } appsFlyerStore.storeIfAbsent( value = AppsFlyerConversionData(refcode = refcode, campaign = campaign), diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerModule.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerModule.kt index 1c3cfc1d98..92f1c4702e 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerModule.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerModule.kt @@ -17,6 +17,7 @@ import com.tangem.domain.visa.model.VisaCardActivationStatus import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository import com.tangem.domain.wallets.hot.HotWalletPasswordRequester import com.tangem.domain.wallets.legacy.UserWalletsListManager +import com.tangem.feature.referral.domain.MobileWalletPromoRepository import com.tangem.hot.sdk.TangemHotSdk import com.tangem.sdk.storage.AndroidSecureStorage import com.tangem.sdk.storage.AndroidSecureStorageV2 @@ -130,6 +131,7 @@ internal object UserWalletsListManagerModule { trackingContextProxy: TrackingContextProxy, analyticsEventHandler: AnalyticsEventHandler, hotWalletRepository: HotWalletRepository, + mobileWalletPromoRepository: MobileWalletPromoRepository, ): UserWalletsListRepository { val moshi = buildMoshi() val secureStorage = buildSecureStorage(applicationContext = applicationContext) @@ -180,6 +182,7 @@ internal object UserWalletsListManagerModule { trackingContextProxy = trackingContextProxy, analyticsEventHandler = analyticsEventHandler, hotWalletRepository = hotWalletRepository, + mobileWalletPromoRepository = mobileWalletPromoRepository, ) } diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt index 414ea8a0b3..8471ade6de 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt @@ -25,6 +25,7 @@ import com.tangem.domain.wallets.analytics.WalletSettingsAnalyticEvents import com.tangem.domain.wallets.builder.UserWalletIdBuilder import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository import com.tangem.domain.wallets.hot.HotWalletPasswordRequester +import com.tangem.feature.referral.domain.MobileWalletPromoRepository import com.tangem.hot.sdk.TangemHotSdk import com.tangem.hot.sdk.model.HotWalletId import com.tangem.sdk.api.TangemSdkManager @@ -58,6 +59,7 @@ internal class DefaultUserWalletsListRepository( private val trackingContextProxy: TrackingContextProxy, private val analyticsEventHandler: AnalyticsEventHandler, private val hotWalletRepository: HotWalletRepository, + private val mobileWalletPromoRepository: MobileWalletPromoRepository, ) : UserWalletsListRepository { override val userWallets = MutableStateFlow?>(null) @@ -126,6 +128,8 @@ internal class DefaultUserWalletsListRepository( raise(SaveWalletError.WalletAlreadySaved(messageId = R.string.user_wallet_list_error_wallet_already_saved)) } + val isFirstWallet = userWallets.value?.isEmpty() == true + if (savePersistentInformation()) { publicInformationRepository.save(userWallet, canOverride) if (userWallet.isLocked.not()) { @@ -148,6 +152,10 @@ internal class DefaultUserWalletsListRepository( wallets.addOrReplace(userWallet) { it.walletId == userWallet.walletId } } + if (isFirstWallet) { + onFirstWalletCreated() + } + // update the selectedUserWallet state if it is the only wallet if (userWallets.value?.size == 1) { selectedUserWalletRepository.set(userWallet.walletId) @@ -221,6 +229,9 @@ internal class DefaultUserWalletsListRepository( val newSelected = updatedWallets?.findAvailableUserWallet( currentWallets.indexOfFirstOrNull { it.walletId == currentSelected.walletId } ?: 0, ) + if (newSelected == null) { + onAllWalletsDeleted() + } selectedUserWalletRepository.set(newSelected?.walletId) newSelected } @@ -542,4 +553,14 @@ internal class DefaultUserWalletsListRepository( private fun trackWalletUpgradeEvent() { analyticsEventHandler.send(event = WalletSettingsAnalyticEvents.WalletUpgraded()) } + + private suspend fun onFirstWalletCreated() { + // reset flag (that is set from AF deeplink) after creating a new wallet + mobileWalletPromoRepository.setShouldShowMobileWalletPromo(false) + } + + private suspend fun onAllWalletsDeleted() { + // reset flag (that is set from AF deeplink) after removing the last wallet + mobileWalletPromoRepository.setShouldShowMobileWalletPromo(false) + } } \ No newline at end of file diff --git a/app/src/test/kotlin/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandlerTest.kt b/app/src/test/kotlin/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandlerTest.kt index c804791992..e83e93807b 100644 --- a/app/src/test/kotlin/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandlerTest.kt +++ b/app/src/test/kotlin/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandlerTest.kt @@ -26,7 +26,7 @@ class AppsFlyerReferralParamsHandlerTest { private val appsFlyerStore: AppsFlyerStore = mockk(relaxUnitFun = true) private val setShouldShowMobileWalletPromoUseCase: SetShouldShowMobileWalletPromoUseCase = mockk { - coEvery { this@mockk.invoke() } returns Unit.right() + coEvery { this@mockk.invoke(true) } returns Unit.right() } private val handler = AppsFlyerReferralParamsHandler( appsFlyerStore = appsFlyerStore, diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/data/DefaultMobileWalletPromoRepository.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/data/DefaultMobileWalletPromoRepository.kt index 56a482e96d..1fd76e4838 100644 --- a/features/referral/data/src/main/java/com/tangem/feature/referral/data/DefaultMobileWalletPromoRepository.kt +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/data/DefaultMobileWalletPromoRepository.kt @@ -14,9 +14,9 @@ internal class DefaultMobileWalletPromoRepository @Inject constructor( return appPreferencesStore.getSyncOrDefault(key = SHOULD_SHOW_MOBILE_WALLET_PROMO_KEY, default = false) } - override suspend fun setShouldShowMobileWalletPromo(value: Boolean) { + override suspend fun setShouldShowMobileWalletPromo(shouldShowPromo: Boolean) { appPreferencesStore.editData { preferences -> - preferences[SHOULD_SHOW_MOBILE_WALLET_PROMO_KEY] = value + preferences[SHOULD_SHOW_MOBILE_WALLET_PROMO_KEY] = shouldShowPromo } } diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/MobileWalletPromoRepository.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/MobileWalletPromoRepository.kt index 642ab878c7..95cba17c9d 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/MobileWalletPromoRepository.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/MobileWalletPromoRepository.kt @@ -4,5 +4,5 @@ interface MobileWalletPromoRepository { suspend fun shouldShowMobileWalletPromo(): Boolean - suspend fun setShouldShowMobileWalletPromo(value: Boolean) + suspend fun setShouldShowMobileWalletPromo(shouldShowPromo: Boolean) } \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/SetShouldShowMobileWalletPromoUseCase.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/SetShouldShowMobileWalletPromoUseCase.kt index 9049cc72bb..335669eabf 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/SetShouldShowMobileWalletPromoUseCase.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/SetShouldShowMobileWalletPromoUseCase.kt @@ -9,10 +9,10 @@ class SetShouldShowMobileWalletPromoUseCase @Inject constructor( private val userWalletsListRepository: UserWalletsListRepository, ) { - suspend operator fun invoke(): Either = Either.catch { + suspend operator fun invoke(shouldShowPromo: Boolean): Either = Either.catch { val wallets = userWalletsListRepository.userWallets.value if (wallets.isNullOrEmpty()) { - mobileWalletPromoRepository.setShouldShowMobileWalletPromo(true) + mobileWalletPromoRepository.setShouldShowMobileWalletPromo(shouldShowPromo) } } } \ No newline at end of file