mirror of
https://github.com/pezkuwichain/pezkuwi-wallet-android.git
synced 2026-07-30 21:05:43 +00:00
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.
This commit is contained in:
+7
@@ -2,6 +2,7 @@ package io.novafoundation.nova.feature_deep_linking.presentation.handling
|
||||
|
||||
import android.net.Uri
|
||||
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.merge
|
||||
|
||||
@@ -23,12 +24,18 @@ class RootDeepLinkHandler(
|
||||
|
||||
return handleDeepLinkInternal(pendingDeepLink)
|
||||
.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> {
|
||||
pendingDeepLinkProvider.save(data)
|
||||
return handleDeepLinkInternal(data)
|
||||
.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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user