feat: deep link spending hw sign - #1176
Open
guzino wants to merge 4 commits into
Open
Conversation
Greptile SummaryThe PR adds debug-only deep-link navigation into the hardware-wallet spending-sign flow, restoring the requested Blocktank order before navigation.
Confidence Score: 5/5The PR appears safe to merge, with no concrete blocking or independently actionable non-blocking issue identified. The deep link remains restricted by the existing debug and Dev Mode gates, prepares the exact requested order before navigation, rejects unavailable prerequisites, and keeps internal navigation synchronized through the new order ID.
|
| Filename | Overview |
|---|---|
| app/src/main/java/to/bitkit/ui/ContentView.kt | Coordinates order preparation before deep-link navigation and registers the sign destination with both route arguments. |
| app/src/main/java/to/bitkit/viewmodels/TransferViewModel.kt | Adds validated order restoration, centralizes spending-order adoption, and includes the order ID in creation effects. |
| app/src/main/java/to/bitkit/ui/utils/ScreenDeepLinks.kt | Parses the hardware sign route's wallet and order path segments while retaining existing screen-link gating. |
| app/src/main/java/to/bitkit/ui/screens/transfer/hardware/SpendingHwSignScreen.kt | Ensures the in-memory order matches the route order before rendering the signing flow. |
| app/src/test/java/to/bitkit/viewmodels/TransferViewModelTest.kt | Covers successful restoration, unknown wallets, missing orders, and reuse of a matching in-memory order. |
| app/src/test/java/to/bitkit/ui/utils/ScreenDeepLinksTest.kt | Covers the generated URI contract and extraction of both required route identifiers. |
Sequence Diagram
sequenceDiagram
participant Intent as Screen deep link
participant AppVM as AppViewModel
participant Content as ContentView
participant TransferVM as TransferViewModel
participant Blocktank as BlocktankRepo
participant Nav as NavController
Intent->>AppVM: queue URI when debug runtime and Dev Mode permit
AppVM-->>Content: pendingScreenDeepLink
Content->>TransferVM: prepareSpendingHwSign(walletId, orderId)
alt matching order already in memory
TransferVM-->>Content: true
else order must be restored
TransferVM->>Blocktank: "getOrder(orderId, refresh = true)"
Blocktank-->>TransferVM: order or missing
TransferVM-->>Content: preparation result
end
alt prepared
Content->>Nav: handleDeepLink(uri)
else rejected
Content->>Content: log unhandled link
end
Content->>AppVM: consumeScreenDeepLink()
Reviews (1): Last reviewed commit: "fix: consume deeplink after prepare" | Re-trigger Greptile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #1126
Refs #1119
This PR opens the hardware-wallet transfer Sign screen from
bitkit://screen/spending-hw-sign/{walletId}/{orderId}.Description
#1119 left six transfer destinations
InternalOnlybecause they read activity-scopedTransferViewModelstate.SpendingHwSignwas the closest: it already took a wallet id (the issue still saysdeviceId) and bounced home whenspendingUiState.orderwas null. A generated link therefore could not reconstruct the Blocktank order.ContentViewnow parses that URI and callsprepareSpendingHwSignbeforenavController.handleDeepLink. Unknown wallet or missing order is refused with the existingUnhandled screen deeplinkwarning and does not navigate. A matching in-memory order is reused; otherwiseblocktankRepo.getOrder(orderId, refresh = true)loads it andadoptSpendingOrderwrites the same stateonOrderCreatedalready wrote, without emittingTransferEffect.OnOrderCreated. The pending URI is consumed after that suspend, so theLaunchedEffectis not cancelled mid-fetch.OnOrderCreatednow carriesorderId. Amount → Sign navigatesRoutes.SpendingHwSign(walletId, orderId)from the effect. The dest reads both route args and matchesstate.ordertoorderId.Routes.SpendingHwSigntoDeepLinkablewith pathbitkit://screen/spending-hw-sign/{walletId}/{orderId}.ScreenDeepLinks.spendingHwSignLinkviakebabId(Routes.SpendingHwSign::class).SavingsProgress,SettingUp,SpendingAdvanced,SpendingConfirm, andSpendingHwSignedasInternalOnly. The rest of feat: deep link the late transfer screens #1126 stays a follow-up.Preview
N/A
QA Notes
Dev mode is on by default on debug builds (Settings ▸ Advanced ▸ Dev Settings). The app must be past onboarding. The Sign path needs a paired hardware wallet and a live Blocktank order id.
Manual Tests
adb shell am start -a android.intent.action.VIEW -d "bitkit://screen/spending-hw-sign/<walletId>/<orderId>" to.bitkit.dev→ Sign opens with the same order.Unhandled screen deeplink.regression:bitkit://screen/spending-amount-hw/<walletId>→ Amount still opens.Automated Checks
ScreenDeepLinksTest.kt: path pattern, wallet and order segments, missing order id.TransferViewModelTest.kt: known wallet loads the named order, unknown wallet and missing order are refused, in-memory order is reused without a second fetch.just compile,just test,just lintall pass, no new detekt findings.