Repository navigation
fix: apply design nits - #1741
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 75b3b6c5e5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
[Low impact] The PR appears safe to merge based on the code reviewed. SummaryUpdates the shared USDT illustration and adds “quickly” to the English intro.
Reviews (1) · Last reviewed commit: "fix: update tether icon and usdt copy" · Reviewed by Greptile |
talosmachina
left a comment
There was a problem hiding this comment.
No findings. Swaps the 3D Tether render, redraws UsdtCoinIllustration as a 256 dp fit image drawn 32 dp down, and adds "quickly" to the English intro copy. Reviewed 5dc7a99, full tier, static: per the review policy for this repo the branch was not built here, so this rests on the code and CI.
What I checked, and 3 candidates I ruled out
Read in full: UsdtWalletScreen.kt, UsdtIntroSheet.kt, UsdtNetworkPicker.kt, UsdtDepositReceiveScreen.kt (NetworkSelector), strings.xml hunk
Call sites traced: all four UsdtCoinIllustration callers; the removed requiredSize and ContentScale imports have no other use in the file
Asset: new tether_coin.png is 1024x1024 with its opaque bounds at 771x721+125+174, so at 256 dp the art ends about 32 dp above the box bottom; the offset(y = 32.dp) puts it flush with the layout bottom
CI: lint, build and build-local were still pending at review time
Ruled out
- Drawn image overlapping the next element (
NetworkSelectorputsstate.errortext right after the illustration):offsetdoes not change layout size, but the 32 dp it pushes past the bounds is the PNG's transparent bottom margin, so nothing opaque overlaps. - Wallet header shift: the extra 32 dp also applies at the
TopEndcall site; the PR's wallet screenshot against Figma covers that placement, and it is the same on the iOS twin. - Translations not updated: the other locales keep the old wording, which is still accurate copy, and the PR scopes it out explicitly.
Merge confidence: 4/5, no findings, but CI had not finished and the branch was not built here.
Reviewer model: claude-opus-5-5
Reasoning effort: Not exposed (the review session's metadata does not report it)
Regtest APKDownload bitkit-dev-debug universal APK (expires in 30 days). |
coreyphillips
left a comment
There was a problem hiding this comment.
Two independent reviews.
worth doing, does not block
- Translations of usdt__intro_description keep the old wording (app/src/main/res/values/strings.xml:1240)
the reviewers disagree, your call
- Wallet header coin moves about 30 dp lower, but the description says unchanged (app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtWalletScreen.kt:330-334). Objection: The artwork does move roughly 30 dp downward, but that alone does not establish incorrect placement. The PR description was unavailable, so I could not independently confirm the claimed wording mismatch. Answer: The PR body's Out of Scope section says "
UsdtWalletScreen.kt: the header illustration's screen position is unchanged." From the alpha bounds, the old crop put the pentagon's top at about 45 dp inside the 256 dp box (old rows 228..804 of 1000, scaled 0.3048, cropped and centred). The new render's top is at 43.5 dp plus the 32 dp offset, about 75.5 dp, so at the call site (statusBars + 4 dp, lines 330-334) the visible coin moves about 30 dp down and its bottom about 35 dp. The code may well match Figma; the fix is to correct that line of the description so reviewers of the Wallet screen expect the move.
|
Pushed 0a60ec4, which adds Aldert's other design nits as separate commits (title now
The description, Preview and QA Notes match the new head. The Shop Market and Services cards stay out of scope; the description says why. |
@coreyphillips The move is intended: the Wallet USDT frame draws the header coin with the same |
QA on 0a60ec4Dev debug build, Android 16 emulator. The preparing state was staged with a local debug-only hook that opens the real
The USDT review is unchanged here: it already had the teal swipe and android-preparing2x.mp4 |
coreyphillips
left a comment
There was a problem hiding this comment.
Rechecked after 4 new commits (045ec2e, 88504a1, 82788cb, 0a60ec4). Nothing blocking remains.
addressed
- Translations of usdt__intro_description keep the old wording (app/src/main/res/values/strings.xml:1240). Fixed: 045ec2e updates
usdt__intro_descriptionin all 15values-*/strings.xmlfiles ("schnell", "rapidement", "rápidamente", "быстро" and so on). I grepped each locale file at HEAD to confirm.values-nightandvalues-v31have no string resources, so none are missing. - Wallet header coin moves about 30 dp lower, but the description says unchanged (app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtWalletScreen.kt:330-334). Fixed: The point was the description's wording, not the code. The description no longer says "unchanged". It now says the wallet header coin moves about 30 dp down, to where the Wallet USDT frame draws it.
UsdtWalletScreen.ktandUsdtCoinIllustrationare untouched since 5dc7a99 (checked withgit diff 5dc7a99..HEAD), so the corrected text matches the code.
new since the last review
worth doing, does not block
- Preparing request tint comes from the previous send's payMethod (app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt:370-375)
- Request Payment opens Add Contact while recipients are still loading (app/src/main/java/to/bitkit/ui/screens/paymentrequests/PaymentRequestsScreen.kt:224)
- Lightning requests prepare with onchain colours (app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt:370-374)
QA on b9a24dbPushed 90596b5, 79774b1 and b9a24db, answering @ben-kaufman's and @coreyphillips's new threads:
Dev debug build, Android 16 emulator. The preparing state was staged with a local debug-only hook (not part of this PR) using the default
|
coreyphillips
left a comment
There was a problem hiding this comment.
Rechecked after 3 new commits (90596b5, 79774b1, b9a24db). Nothing blocking remains.
addressed
- Preparing request tint comes from the previous send's payMethod (app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt:370-375). Fixed: SendConfirmScreen.kt:371-375 now takes the colour from
preparingRequest.preparingAccentColor()(lines 990-1001) whenever a request is preparing, souiState.payMethodno longer decides it. I read the helper: Bolt11/Lnurl-only gives purple, onchain-only orange, USDT-only teal, and mixed or unknown rails give White64. That colour feeds the summary icons (466) and the swipe (522). - Lightning requests prepare with onchain colours (app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt:370-374). Fixed: Same change as point 1. A request accepting only
btc-lightning-bolt11maps toMethodId.Bolt11, sopreparingAccentColor()(SendConfirmScreen.kt:990-1001) returnsColors.PurplewhateverpayMethodthe freshSendUiState()from SendSheet holds. I confirmed it by reading thewhenbranches against theMethodIdraw values in PublicPaykitRepo.kt:675-682.
still open
- Request Payment opens Add Contact while recipients are still loading (app/src/main/java/to/bitkit/ui/screens/paymentrequests/PaymentRequestsScreen.kt:224).
PaymentRequestsScreensends the button toonAddContactwhenevereligiblePaymentRequestTargetsis empty (PaymentRequestsScreen.kt:224). That list starts asemptyList()(PaykitPaymentRequestRepo.kt:389). It is filled only afterrefreshEligibleTargetsreads each saved contact's Paykit endpoints on the bulk lane. If the first refresh fails, the failure path filters an already empty list, so it stays empty. So a signed-in user with Paykit-capable contacts who opens Subscriptions › Payments soon after launch, or while offline, is sent to Contacts with the Add Contact sheet open. They should get the recipient picker. Before this change the button was hidden in that window. Now it is shown and goes to the wrong place. The screen cannot tell "not loaded yet" from "no eligible contacts". One fix: route to Add Contact only whenpubkyContactsis empty. If there are contacts, openReceiveRoute.PaymentRequestRecipient, or wait for the first discovery to finish. Found by reading the code; not reproduced on a device. The loading window is covered when the refresh succeeds.canRequestPayment(AppViewModel.kt:1369-1374) still cannot tell a failed lookup from "no eligible contacts". Offline, eachcanReceivePaymentRequestsfails andeligibleTargetsfalls back topreviousTargets[publicKey], which is empty. A thrownidentityStatus, orOperationInProgressfromcheckRefreshAdmissionon Background priority, goes throughonFailureand leaves the list empty. In each case the tap opens Add Contact for a user with capable contacts, which is the offline case the point named.refreshEligibleTargetsreturnsResult<Unit>and the discovery'sfailedPublicKeysare dropped, so the screen has no failure signal to act on.
new since the last review
worth doing, does not block
- Request Payment tap does nothing visible while a forced discovery runs (app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt:1369-1374)
nits
- preparingAccentColor reimplements MethodId.fromRawValue (app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt:990-993)
QA on 3e518bfPushed 3e518bf, answering @coreyphillips's two new threads:
Dev debug build, Android 16 emulator:
android-j1b2x.mp4Manual test 1 (preparing colours) is unchanged in behaviour since 79774b1; its run is in #1741 (comment). |
coreyphillips
left a comment
There was a problem hiding this comment.
Rechecked after 1 new commit (3e518bf). Nothing blocking remains.
addressed
- Request Payment opens Add Contact while recipients are still loading (app/src/main/java/to/bitkit/ui/screens/paymentrequests/PaymentRequestsScreen.kt:224). Fixed: PaymentRequestsScreen.kt:222 now routes on
contacts.isEmpty(), wherecontactsispubkyRepo.contacts. That list comes from the local SDK state (observedContactRecords, PubkyService.kt:222-224), not from endpoint discovery. With saved contacts the tap opensReceiveRoute.PaymentRequestRecipient(ContentView.kt:942), which is the fix suggested last time. The only window left is before the local contacts read finishes after session restore, which is short. - Request Payment tap does nothing visible while a forced discovery runs (app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt:1369-1374). Fixed:
canRequestPaymentis gone from AppViewModel, and a grep of app/src finds no references to it. The click handler at PaymentRequestsScreen.kt:222 now just picks a callback and awaits nothing. Taps no longer wait silently and no longer queue a forced discovery behindtargetDiscoveryMutex. - preparingAccentColor reimplements MethodId.fromRawValue (app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt:990-993). Fixed: SendConfirmScreen.kt:991 now reads
acceptedPaymentEndpointIdentifiers.mapNotNull(MethodId::fromRawValue).fromRawValue(PublicPaykitRepo.kt:700-703) compares againstrawValueForNetwork(Env.network), the same value therawValuegetter returns, so behaviour is unchanged. Checked by reading the code; I did not compile it here.
new since the last review
worth doing, does not block
- Recipient picker says no contact can receive while targets are still loading (app/src/main/java/to/bitkit/ui/ContentView.kt:940-943)
- J1 does not cover the saved-contacts branch it is listed as proving (journeys/subscriptions/request-payment-without-contacts.xml:1-14)
QA on 569137bPushed 70eaf45 and 569137b, answering @coreyphillips's two new threads:
Dev debug build, Android 16 emulator;
android-j1c2x.mp4 |
coreyphillips
left a comment
There was a problem hiding this comment.
Rechecked after 2 new commits (70eaf45, 569137b). Nothing blocking remains.
addressed
- J1 does not cover the saved-contacts branch it is listed as proving (journeys/subscriptions/request-payment-without-contacts.xml:1-14). Fixed: request-payment-without-contacts.xml:13-14 adds the saved-contact steps, and the description now names the second identity they need. The PR body keeps J1 unchecked, and Evidence and Gaps say the Add Contact sheet step and the saved-contact steps were not run, which matches the reported run.
still open
- Recipient picker says no contact can receive while targets are still loading (app/src/main/java/to/bitkit/ui/ContentView.kt:940-943). With saved contacts, Request Payment on Subscriptions › Payments now opens the recipient picker even while
eligiblePaymentRequestTargetsis still empty. That happens during the first discovery after launch, and after a discovery that failed while offline. The picker has no loading state. Whenrecipientsis empty it showswallet__payment_request_recipient_unavailable(CreatePaymentRequestScreen.kt:664-669): "Payment requests can only be sent to a saved contact with a private connection." A user whose linked contacts can receive is told they cannot, and the list appears later. Opening the picker from ContentView.kt:942 does not start a refresh.showPaymentRequests()andshowSubscriptionCreator()(AppViewModel.kt:8141-8149) launchrefreshPaymentRequestTargets(force = true)without awaiting it. This path relies on the polling loop's maintenance refresh, every 30 to 60 s and only while online. Before this branch the picker could not be reached from here with empty targets, because the button was hidden. Two fixes that would not reintroduce the old wait: launch the same non-awaited forced refresh when the sheet opens, and show a loading row instead of the unavailable copy until the first discovery completes. Found by reading the code; not reproduced on a device. The non-awaited forced refresh now runs when the picker opens (AppViewModel.kt:8149-8152, wired at ContentView.kt:941). But the picker still opens straight onto the unavailable copy (CreatePaymentRequestScreen.kt:669) until that network discovery finishes, so the window is shorter, not gone. Create Subscription does reach the same content with empty targets, but the claim that Receive did too does not hold: both Receive entries are hidden when targets are empty (ReceiveSheet.kt:175, :288). Deferring the loading row to #1742 is reasonable for a non-blocking point and need not hold the merge, but the code does not settle it yet.
QA on 569137b: J1 in fullDev debug build, Android 16 emulator, regtest dev build against the staging Pubky homeserver. Setup: a new Pubky profile created in the app on each device (Android "QaAndroid", iOS "QaIos"), then each added the other through the normal Add Contact flow, giving a private Paykit connection.
The no-profile branch passed earlier on this head; the send-review colour cases are unchanged since their last run. |
|
@coreyphillips Merging this PR on your approval of head 569137b, with a device run of its cases on that head, checks green and no open threads. |
Twin: synonymdev/bitkit-ios#1179
Description
tether_coin.png) with the updated render from Figma, which fixes the brand mark's accuracy. It shows on the USDT intro sheet, the USDT wallet header and the USDT network pickers.Visualcomponent does: 256 dp square, 32 dp down inside its 256 dp box. The old 304.76 × 228.57 crop was tuned to the old render's padding and would draw the new render about 20% too large.Visualcomponent, flipped.$icon.Out of Scope
Design
Bitkit - Handoff v63:
Preview
Figma (left) and this PR on an emulator (right):
Recordings (2x):
android-flow2x.mp4
android-request2x.mp4
QA Notes
Setup
For J1's contact steps: create a Pubky profile in the app on two devices (staging homeserver), then add each other through Add Contact.
Dev debug build on regtest with the default USDT endpoints, fresh wallet with Paykit on and no contacts.
Journeys
request-payment-without-contacts.xml— Request Payment shows with no contacts and opens Add Contact; with contacts it opens the recipient pickerManual Tests
Automated Checks
PaymentRequestsScreenTest.kt— drops the case that expected no button without eligible contactsSubscriptionsScreenTest.kt— follows the removedcanRequestPaymentparameterEvidence
just lintandjust testpass; app and instrumented tests compile.Gaps
UsdtDepositReceiveScreen.ktalso shows the Tether image and was not opened; it uses the same composable.Models used
claude-opus-5-5(reasoning:Not exposed)claude-opus-5-5(reasoning:Not exposed)The session metadata does not expose the reasoning setting.