diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b9db373358..8981d0a0b1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,6 +30,13 @@
+
+
+
+
+
+
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..965d6caacd 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,8 +1,11 @@
package com.tangem.tap.common.url
import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
import android.net.Uri
import androidx.browser.customtabs.CustomTabColorSchemeParams
+import androidx.browser.customtabs.CustomTabsClient
import androidx.browser.customtabs.CustomTabsIntent
import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_DARK
import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_LIGHT
@@ -12,6 +15,7 @@ import com.tangem.tap.common.extensions.getColorCompat
import com.tangem.tap.foregroundActivityObserver
import com.tangem.tap.withForegroundActivity
import com.tangem.wallet.R
+import timber.log.Timber
internal class CustomTabsUrlOpener : UrlOpener {
@@ -34,6 +38,37 @@ internal class CustomTabsUrlOpener : UrlOpener {
)
.build()
- customTabsIntent.launchUrl(context, Uri.parse(url))
+ customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
+
+ val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ runCatching {
+ if (checkCustomTabsAvailability(context, browserIntent)) {
+ context.startActivity(browserIntent)
+ } else {
+ customTabsIntent.launchUrl(context, Uri.parse(url))
+ }
+ }.onFailure {
+ Timber.e(it.message)
+ }
+ }
+
+ /**
+ * Custom Tabs compatibility check. Returns flag whether custom tabs are supported
+ * @see "https://developer.chrome.com/docs/android/custom-tabs/howto-custom-tab-check"
+ */
+ private fun checkCustomTabsAvailability(context: Context, browserIntent: Intent): Boolean {
+ // Get all apps that can handle VIEW intents and Custom Tab service connections.
+ val resolveInfos = context.packageManager.queryIntentActivities(browserIntent, PackageManager.MATCH_ALL)
+
+ // Extract package names from ResolveInfo objects
+ val packageNames = mutableListOf()
+ for (info in resolveInfos) {
+ packageNames.add(info.activityInfo.packageName)
+ }
+
+ // Get a package that supports Custom Tabs
+ val packageName = CustomTabsClient.getPackageName(context, packageNames, true)
+
+ return packageName == null // Custom Tabs are not supported by any browser on the device
}
}
\ No newline at end of file
diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/CustomTabsManager.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/CustomTabsManager.kt
index 565d27a3b8..af04294b72 100644
--- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/CustomTabsManager.kt
+++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/CustomTabsManager.kt
@@ -8,6 +8,7 @@ import androidx.browser.customtabs.CustomTabColorSchemeParams
import androidx.browser.customtabs.CustomTabsIntent
import java.lang.ref.WeakReference
+@Deprecated("Replace with CustomTabsUrlOpener")
class CustomTabsManager(private val context: WeakReference) {
fun openUrl(url: String) {
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 52eae5de76..d8a3eb4733 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
@@ -50,6 +50,13 @@ internal class DefaultTokenDetailsRouter(
}
override fun openOnrampSuccess(externalTxId: String) {
- router.push(AppRoute.OnrampSuccess(externalTxId))
+ // finish current onramp flow and show onramp success screen
+ val replaceOnrampScreens = router.stack
+ .filterNot { it is AppRoute.Onramp }
+ .toMutableList()
+
+ replaceOnrampScreens.add(AppRoute.OnrampSuccess(externalTxId))
+
+ router.replaceAll(*replaceOnrampScreens.toTypedArray())
}
}
\ No newline at end of file
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 4d2df2bd9f..6780b00e47 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
@@ -130,7 +130,14 @@ internal class DefaultWalletRouter(
}
override fun openOnrampSuccessScreen(externalTxId: String) {
- router.push(AppRoute.OnrampSuccess(externalTxId))
+ // finish current onramp flow and show onramp success screen
+ val replaceOnrampScreens = router.stack
+ .filterNot { it is AppRoute.Onramp }
+ .toMutableList()
+
+ replaceOnrampScreens.add(AppRoute.OnrampSuccess(externalTxId))
+
+ router.replaceAll(*replaceOnrampScreens.toTypedArray())
}
override fun openUrl(url: String) {