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) {