3 Commits

Author SHA1 Message Date
pezkuwichain bcd44828a3 fix(deeplink): stop malformed deep links from bricking every launch
Two related defects surfaced from a banner action pezkuwiwallet://.../open/governance:

1. ReferendumDeepLinkHandler.matches() used path.startsWith("/open/gov"), so
   "/open/governance" wrongly matched the referendum prefix and then failed with
   ReferendumIsNotSpecified (no id). Use an exact path match instead.

2. RootDeepLinkHandler only cleared the persisted pending deep link on success or
   HandlerNotFound. A link that matched a handler but failed with a terminal
   DeepLinkHandlingException stayed in SharedPreferences and replayed on every
   launch ("Referendum not found" on each open). Clear pending on terminal
   handling failures in both the fresh-intent and pending-retry paths. This also
   auto-recovers already-stuck installs on update.
2026-07-22 21:49:03 -07:00
pezkuwichain df745e9147 fix: point CHAINS_URL/EVM_ASSETS_URL/etc back at wallet-utils master
wallet-utils master now has the coordinated Bitcoin/Tron/Solana chain
config content (its own compat-revert was reverted back and merged with
pending/post-fix-release now that this app version can parse it) - drop
the temporary pending/post-fix-release override used during development.
2026-07-18 23:51:38 -07:00
SatoshiQaziMuhammed 0603e079e2 Merge PR #14: Support first-signer case for /open/multisigOperation deep link
Support first-signer case for /open/multisigOperation deep link
2026-07-18 22:59:55 -07:00
3 changed files with 20 additions and 17 deletions
@@ -2,6 +2,7 @@ package io.novafoundation.nova.feature_deep_linking.presentation.handling
import android.net.Uri import android.net.Uri
import io.novafoundation.nova.common.utils.onFailureInstance import io.novafoundation.nova.common.utils.onFailureInstance
import io.novafoundation.nova.feature_deep_linking.presentation.handling.common.DeepLinkHandlingException
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
@@ -23,12 +24,18 @@ class RootDeepLinkHandler(
return handleDeepLinkInternal(pendingDeepLink) return handleDeepLinkInternal(pendingDeepLink)
.onSuccess { pendingDeepLinkProvider.clear() } .onSuccess { pendingDeepLinkProvider.clear() }
// A pending link that reaches a handler but fails with a terminal error (malformed/unresolvable),
// or matches no handler, will never succeed on retry - clear it so it does not replay on every launch.
.onFailureInstance<DeepLinkHandlingException, Unit> { pendingDeepLinkProvider.clear() }
.onFailureInstance<HandlerNotFoundException, Unit> { pendingDeepLinkProvider.clear() }
} }
override suspend fun handleDeepLink(data: Uri): Result<Unit> { override suspend fun handleDeepLink(data: Uri): Result<Unit> {
pendingDeepLinkProvider.save(data) pendingDeepLinkProvider.save(data)
return handleDeepLinkInternal(data) return handleDeepLinkInternal(data)
.onSuccess { pendingDeepLinkProvider.clear() } .onSuccess { pendingDeepLinkProvider.clear() }
// Same as above: a terminal handling failure must not be persisted, otherwise it bricks every launch.
.onFailureInstance<DeepLinkHandlingException, Unit> { pendingDeepLinkProvider.clear() }
.onFailureInstance<HandlerNotFoundException, Unit> { pendingDeepLinkProvider.clear() } // If we haven't find any handler - no need to save deep link .onFailureInstance<HandlerNotFoundException, Unit> { pendingDeepLinkProvider.clear() } // If we haven't find any handler - no need to save deep link
} }
@@ -31,7 +31,9 @@ class ReferendumDeepLinkHandler(
override suspend fun matches(data: Uri): Boolean { override suspend fun matches(data: Uri): Boolean {
val path = data.path ?: return false val path = data.path ?: return false
return path.startsWith(ReferendumDetailsDeepLinkConfigurator.PREFIX) // Exact match, not startsWith: otherwise "/open/governance" (and any "/open/gov*") would wrongly
// match the referendum prefix "/open/gov" and fail with ReferendumIsNotSpecified.
return path == ReferendumDetailsDeepLinkConfigurator.PREFIX
} }
override suspend fun handleDeepLink(data: Uri) = runCatching { override suspend fun handleDeepLink(data: Uri) = runCatching {
+10 -16
View File
@@ -5,19 +5,13 @@ android {
defaultConfig { defaultConfig {
// TEMPORARY - points at pending/post-fix-release, NOT master. wallet-util's master was reset to the buildConfigField "String", "CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/android/chains.json\""
// last content the still-live Play Store release can parse (see wallet-util repo history around buildConfigField "String", "EVM_ASSETS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/assets/evm/v3/assets.json\""
// 2026-07-11), so master has neither Tron nor Bitcoin config/icons this branch needs to test against. buildConfigField "String", "PRE_CONFIGURED_CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/preConfigured/chains.json\""
// pending/post-fix-release is where both are staged until wallet-android ships the coordinated release. buildConfigField "String", "PRE_CONFIGURED_CHAIN_DETAILS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/preConfigured/details\""
// MUST be pointed back at "master" before this branch merges - do not ship this override.
buildConfigField "String", "CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/chains/v22/android/chains.json\"" buildConfigField "String", "TEST_CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/tests/chains_for_testBalance.json\""
buildConfigField "String", "EVM_ASSETS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/assets/evm/v3/assets.json\"" buildConfigField "String", "TEST_ASSETS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/tests/pezkuwi_assets_for_testBalance.json\""
buildConfigField "String", "PRE_CONFIGURED_CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/chains/v22/preConfigured/chains.json\""
buildConfigField "String", "PRE_CONFIGURED_CHAIN_DETAILS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/chains/v22/preConfigured/details\""
buildConfigField "String", "TEST_CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/tests/chains_for_testBalance.json\""
buildConfigField "String", "TEST_ASSETS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/tests/pezkuwi_assets_for_testBalance.json\""
buildConfigField "String", "INFURA_API_KEY", readStringSecret("INFURA_API_KEY") buildConfigField "String", "INFURA_API_KEY", readStringSecret("INFURA_API_KEY")
buildConfigField "String", "DWELLIR_API_KEY", readStringSecret("DWELLIR_API_KEY") buildConfigField "String", "DWELLIR_API_KEY", readStringSecret("DWELLIR_API_KEY")
@@ -33,10 +27,10 @@ android {
minifyEnabled false minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String", "CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/chains/v22/android/chains.json\"" buildConfigField "String", "CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/android/chains.json\""
buildConfigField "String", "EVM_ASSETS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/assets/evm/v3/assets.json\"" buildConfigField "String", "EVM_ASSETS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/assets/evm/v3/assets.json\""
buildConfigField "String", "PRE_CONFIGURED_CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/chains/v22/preConfigured/chains.json\"" buildConfigField "String", "PRE_CONFIGURED_CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/preConfigured/chains.json\""
buildConfigField "String", "PRE_CONFIGURED_CHAIN_DETAILS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/pending/post-fix-release/chains/v22/preConfigured/details\"" buildConfigField "String", "PRE_CONFIGURED_CHAIN_DETAILS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/preConfigured/details\""
} }
} }
namespace 'io.novafoundation.nova.runtime' namespace 'io.novafoundation.nova.runtime'