Updated on 2026-08-14

This commit is contained in:
Tangem 2026-07-15 15:56:26 +04:00
parent 78cb0fc750
commit 39d4997aa7
4 changed files with 96 additions and 11 deletions

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.KeyEvent
@ -32,6 +33,7 @@ import com.appsflyer.AppsFlyerLib
import com.tangem.common.routing.AppRouter
import com.tangem.common.routing.deeplink.DeeplinkConst.WEBLINK_KEY
import com.tangem.common.routing.deeplink.PayloadToDeeplinkConverter
import com.tangem.common.routing.deeplink.PushDeeplinkPolicy
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.core.decompose.di.RootAppComponentContext
@ -415,25 +417,33 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder {
}
private fun handleDeepLink(intent: Intent, isFromOnNewIntent: Boolean) {
val deepLinkExtras = PayloadToDeeplinkConverter.convertBundle(intent.extras)?.toUri()
val externalDeepLink = intent.data
val extrasDeepLink = PayloadToDeeplinkConverter.convertBundle(intent.extras)?.toUri()
val webLink = intent.getStringExtra(WEBLINK_KEY)
val receivedDeepLink = intent.data ?: deepLinkExtras
when {
receivedDeepLink != null -> {
deeplinkFactory.handleDeeplink(
deeplinkUri = receivedDeepLink,
coroutineScope = lifecycleScope,
isFromOnNewIntent = isFromOnNewIntent,
)
}
// External deep links (browser / universal links) arrive via intent.data — never gated.
externalDeepLink != null -> launchDeepLink(externalDeepLink, isFromOnNewIntent)
// A deep link reconstructed from a notification payload must pass the push policy. If it is
// present but blocked, stop — do not fall back to another payload-supplied field (e.g. webLink).
extrasDeepLink != null ->
if (PushDeeplinkPolicy.isOpenableFromPush(scheme = extrasDeepLink.scheme, host = extrasDeepLink.host)) {
launchDeepLink(extrasDeepLink, isFromOnNewIntent)
}
webLink?.uriValidate() == true -> {
urlOpener.openUrl(webLink)
}
}
}
private fun launchDeepLink(deeplinkUri: Uri, isFromOnNewIntent: Boolean) {
deeplinkFactory.handleDeeplink(
deeplinkUri = deeplinkUri,
coroutineScope = lifecycleScope,
isFromOnNewIntent = isFromOnNewIntent,
)
}
private fun sendStakingUnsubmittedHashes() {
lifecycleScope.launch {
sendUnsubmittedHashesUseCase.invoke()

View file

@ -4,6 +4,7 @@ import android.net.Uri
import androidx.core.net.toUri
import com.tangem.common.routing.DeepLinkRoute
import com.tangem.common.routing.deeplink.PayloadToDeeplinkConverter
import com.tangem.common.routing.deeplink.PushDeeplinkPolicy
import com.tangem.utils.extensions.uriValidate
import javax.inject.Inject
@ -21,7 +22,9 @@ internal class PushMessageHandler @Inject constructor(
) {
fun onMessageReceived(data: Map<String, String>) {
val deeplink = PayloadToDeeplinkConverter.convert(data)?.toUri() ?: return
val deeplink = PayloadToDeeplinkConverter.convert(data)?.toUri()
?.takeIf { PushDeeplinkPolicy.isOpenableFromPush(scheme = it.scheme, host = it.host) }
?: return
val queryParams = deeplink.getQueryParams()
when (deeplink.host) {
DeepLinkRoute.TokenDetails.host -> tokenDetailsPushHandler.handle(queryParams)