From 12146c8981264d4b4031d2cf00a3fca1034282dd Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Nov 2024 14:04:49 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/common/url/CustomTabsUrlOpener.kt | 3 +++ .../deeplink/global/BuyCurrencyDeepLink.kt | 6 ++++-- features/tokendetails/impl/build.gradle.kts | 1 + .../router/DefaultTokenDetailsRouter.kt | 4 ++++ .../router/InnerTokenDetailsRouter.kt | 2 ++ .../viewmodels/TokenDetailsViewModel.kt | 12 ++++++++--- features/wallet/impl/build.gradle.kts | 1 + .../deeplink/WalletDeepLinksHandler.kt | 21 ++++++++++++------- .../router/DefaultWalletRouter.kt | 4 ++++ .../presentation/router/InnerWalletRouter.kt | 3 +++ .../intents/WalletContentClickIntents.kt | 6 ++++++ 11 files changed, 51 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt b/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt index 7fe3ef0081..e189ec9e68 100644 --- a/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt +++ b/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt @@ -1,6 +1,7 @@ package com.tangem.tap.common.url import android.content.Context +import android.content.Intent import android.net.Uri import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent @@ -34,6 +35,8 @@ internal class CustomTabsUrlOpener : UrlOpener { ) .build() + customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + customTabsIntent.launchUrl(context, Uri.parse(url)) } } \ No newline at end of file diff --git a/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt b/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt index 3c31ec55a7..9282116415 100644 --- a/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt +++ b/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt @@ -2,11 +2,13 @@ package com.tangem.core.deeplink.global import com.tangem.core.deeplink.DeepLink -class BuyCurrencyDeepLink(val onReceive: () -> Unit) : DeepLink { +class BuyCurrencyDeepLink(val onReceive: (txId: String) -> Unit) : DeepLink { override val uri: String = "tangem://redirect?action=dismissBrowser" override fun onReceive(params: Map) { - onReceive() + onReceive( + params["txId"] ?: return, + ) } } \ No newline at end of file diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts index cf4e80b1fa..15e9420092 100644 --- a/features/tokendetails/impl/build.gradle.kts +++ b/features/tokendetails/impl/build.gradle.kts @@ -93,5 +93,6 @@ dependencies { implementation(projects.features.send.api) implementation(projects.features.staking.api) implementation(projects.features.markets.api) + implementation(projects.features.onramp.api) } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt index 30a598c8df..ef43fe1b48 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt @@ -48,4 +48,8 @@ internal class DefaultTokenDetailsRouter( ), ) } + + override fun openOnrampSuccess(txId: String) { + router.push(AppRoute.OnrampSuccess(txId)) + } } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/InnerTokenDetailsRouter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/InnerTokenDetailsRouter.kt index b7c55e065b..93c8591b7b 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/InnerTokenDetailsRouter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/InnerTokenDetailsRouter.kt @@ -19,4 +19,6 @@ internal interface InnerTokenDetailsRouter : TokenDetailsRouter { fun openTokenDetails(userWalletId: UserWalletId, currency: CryptoCurrency) fun openStaking(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, yield: Yield) + + fun openOnrampSuccess(txId: String) } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 782f95ba25..bef30a208e 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -66,6 +66,7 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.state.express.E import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsStateFactory import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.express.ExpressStatusFactory import com.tangem.feature.tokendetails.presentation.tokendetails.ui.components.express.ExpressStatusBottomSheetConfig +import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.features.tokendetails.impl.R import com.tangem.utils.Provider import com.tangem.utils.coroutines.* @@ -111,6 +112,7 @@ internal class TokenDetailsViewModel @Inject constructor( private val vibratorHapticManager: VibratorHapticManager, private val clipboardManager: ClipboardManager, expressStatusFactory: ExpressStatusFactory.Factory, + private val onrampFeatureToggles: OnrampFeatureToggles, getUserWalletUseCase: GetUserWalletUseCase, getStakingIntegrationIdUseCase: GetStakingIntegrationIdUseCase, deepLinksRegistry: DeepLinksRegistry, @@ -193,9 +195,13 @@ internal class TokenDetailsViewModel @Inject constructor( userWallet = getUserWalletUseCase(userWalletId).getOrNull() ?: error("UserWallet not found") } - private fun onBuyCurrencyDeepLink() { - val currency = cryptoCurrencyStatus?.currency ?: return - analyticsEventsHandler.send(TokenScreenAnalyticsEvent.Bought(currency.symbol)) + private fun onBuyCurrencyDeepLink(txId: String) { + if (onrampFeatureToggles.isFeatureEnabled) { + router.openOnrampSuccess(txId) + } else { + val currency = cryptoCurrencyStatus?.currency ?: return + analyticsEventsHandler.send(TokenScreenAnalyticsEvent.Bought(currency.symbol)) + } } override fun onCreate(owner: LifecycleOwner) { diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 624fa004c5..be6834bd6b 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -94,6 +94,7 @@ dependencies { implementation(projects.features.details.api) implementation(projects.features.pushNotifications.api) implementation(projects.features.markets.api) + implementation(projects.features.onramp.api) /** Common modules */ implementation(projects.common.ui) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt index d34c68bd50..8a8186fde0 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt @@ -16,6 +16,8 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntents +import com.tangem.features.onramp.OnrampFeatureToggles import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch @@ -31,6 +33,8 @@ internal class WalletDeepLinksHandler @Inject constructor( private val getFeePaidCryptoCurrencyStatusSyncUseCase: GetFeePaidCryptoCurrencyStatusSyncUseCase, private val getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase, private val reduxStateHolder: ReduxStateHolder, + private val clickIntents: WalletClickIntents, + private val onrampFeatureToggles: OnrampFeatureToggles, ) { private var deepLinksMap = mutableMapOf>() @@ -58,11 +62,11 @@ internal class WalletDeepLinksHandler @Inject constructor( return buildList { add(sellCurrencyDeepLink) - if (!userWallet.isMultiCurrency) { + if (onrampFeatureToggles.isFeatureEnabled || !userWallet.isMultiCurrency) { add( BuyCurrencyDeepLink( - onReceive = { - scope.launch { onBuyCurrencyDeepLink(userWallet) } + onReceive = { txId -> + scope.launch { onBuyCurrencyDeepLink(txId, userWallet) } }, ), ) @@ -102,10 +106,13 @@ internal class WalletDeepLinksHandler @Inject constructor( } } - private suspend fun onBuyCurrencyDeepLink(userWallet: UserWallet) { - val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrNull() ?: return - - analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol)) + private suspend fun onBuyCurrencyDeepLink(txId: String, userWallet: UserWallet) { + if (onrampFeatureToggles.isFeatureEnabled) { + clickIntents.onOnrampSuccessClick(txId) + } else { + val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrNull() ?: return + analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol)) + } } private suspend fun findCryptoCurrencyStatus( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index a2e325f621..7c1a971dd1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -112,6 +112,10 @@ internal class DefaultWalletRouter( ) } + override fun openOnrampSuccessScreen(txId: String) { + router.push(AppRoute.OnrampSuccess(txId)) + } + override fun openUrl(url: String) { urlOpener.openUrl(url) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt index 344887162c..4532ced599 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt @@ -38,6 +38,9 @@ internal interface InnerWalletRouter : WalletRouter { /** Open onboarding screen */ fun openOnboardingScreen() + /** Open onramp success screen for [txId] */ + fun openOnrampSuccessScreen(txId: String) + /** Open transaction history website by [url] */ fun openUrl(url: String) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt index 22c9441399..fb40dbfcf1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt @@ -34,6 +34,8 @@ internal interface WalletContentClickIntents { fun onOrganizeTokensClick() + fun onOnrampSuccessClick(txId: String) + fun onDismissMarketsOnboarding() fun onTokenItemClick(currencyStatus: CryptoCurrencyStatus) @@ -97,6 +99,10 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( router.openOrganizeTokensScreen(userWalletId = stateHolder.getSelectedWalletId()) } + override fun onOnrampSuccessClick(txId: String) { + router.openOnrampSuccessScreen(txId = txId) + } + override fun onDismissMarketsOnboarding() { stateHolder.update { it.copy(showMarketsOnboarding = false) } viewModelScope.launch {