Skip to content

fix: match subscriptions screens to handoff design - #1269

Open
jvsena42 wants to merge 30 commits into
masterfrom
fix/subscriptions-design-parity
Open

jvsena42 wants to merge 30 commits into
masterfrom
fix/subscriptions-design-parity

Conversation

@jvsena42

@jvsena42 jvsena42 commented Sep 15, 2026

Copy link
Copy Markdown
Member

Description

This PR brings the Subscriptions screens back in line with the Handoff v62 designs after driving the whole flow on an emulator and comparing every screen against its frame.

  1. Layers the top bar, tabs and footer button over the list, so rows scroll underneath them instead of stopping short. The two screens involved were plain columns, so nothing could overlap; the Payments tab inside Subscriptions gets the same treatment. The header blurs as a bar, while the footer button blurs only through its own pill the way the handoff does, leaving the rest of the row sharp.

  2. Centres the Payments tab label and places the badge just after it, so the label no longer shifts to make room and the badge is not stranded at the tab edge on a wide tab. Every tab also reserves the badge height, so one tab carrying a badge no longer drops its indicator below the others.

  3. Switches every swipe-to-confirm knob to brand orange. Subscribe used purple and cancel/delete used red; the handoff uses #FF4400 for all of them.

  4. Adds the trash illustration and icon to the delete sheet and button, which were reusing the cancel cross.

  5. Fills the expired detail's empty right-hand cell with its EXPIRED date, drops the year from detail dates, and swaps the payments metric to the coins glyph.

  6. Titles subscription detail payment rows by subscription name over the date and drops the bitcoin symbol there. The Payments tab keeps contact names and the symbol, which is what its frame shows.

  7. Shows pending in place of the fiat amount on outgoing payment requests, sizes the request details contact card to its content, rules dividers after its contact and tags sections, gives its note the torn paper edge, and drops the bitcoin symbol from its signed amount — the handoff's Balance component there is just a sign, a 6pt space and the digits.

  8. Corrects copy: the delete sheet's question mark, a comma in the created summary, and title case on the cadence labels.

  9. Uses the frame fills from the handoff: flat Base/Black behind the subscription detail and payment request details, and the bottom modal's own Gray6-to-black gradient behind the sheets, in place of the shared white-wash gradient on all three.

Blur reuses the existing haze setup, with the style hoisted out of PinnedTabsScaffold so both screens share it. The torn note reuses the zigzag the activity detail already drew, extracted to ui/components; it was the only copy in the app.

All five review findings are addressed and resolved: money cell options now resolve against the selected currency rather than line position, the request list falls back to the navigation bar inset when no footer renders, the tab badge no longer strands or overlaps, and both journeys were corrected against the actual accept and delete gating.

Three gaps are intentionally left out because they are unbuilt design rather than regressions, and each needs a product decision: the Edit button on the created detail, the Renew button on the expired detail, and the Automatically pay this subscription toggle on Review & Subscribe. All three are missing on iOS too. Discover is excluded as before.

iOS shares several of these gaps — no-blur chrome, the cross-for-trash delete sheet, the red knob, and dates carrying the year. iOS additionally renders dates day-first where the design and Android are month-first, and its subscription detail avatar is circular where the design uses a rounded square. Those are reported here rather than fixed.

Design

Preview

Figma on the left, this branch on the right. Test wallet data differs from the mockup data, so compare layout and treatment rather than values.

Screen Figma vs branch
Overview — list passing behind the blurred Create pill, badge beside the centred label Overview — Figma vs branch
Payments — pending in the fiat slot, symbol retained Payments tab — Figma vs branch
Payment Request Details — hugging contact card, dividers, torn note Payment Request Details — Figma vs branch
Subscription Detail Expired — EXPIRED cell filled, no year Subscription Detail Expired — Figma vs branch
Subscription Detail Created — coins metric, trash button Subscription Detail Created — Figma vs branch
Delete Subscription — trash illustration, orange knob, question mark Delete Subscription sheet — Figma vs branch

QA Notes

Manual Tests

  • 1a. Subscriptions → Overview → scroll the list: rows pass under the tab bar, blurred, rather than clipping at the underline.
    • 1b. scroll to the end: rows pass under the Create button, blurred.
  • 2. Overview with a pending incoming request: the Payments badge sits at the tab's right edge and Payments stays centred in its half.
  • 3. Payments tab → scroll: rows pass under the tab bar and the Request Payment button.
  • 4. Payments tab → outgoing request row: shows pending where the fiat amount sits, with the note or date as subtitle.
  • 5. Payments tab → tap an incoming request → Payment Request Details: contact card hugs its name, dividers follow contact and tags, note has a torn top edge.
  • 6a. Overview → tap an active subscription: RENEWS shows a date with no year; payment rows are titled by subscription name with the date beneath and no bitcoin symbol.
    • 6b. tap Cancel: sheet shows the cross illustration and an orange swipe knob.
  • 7a. Overview → tap a subscription you created: PAYMENTS uses the coins glyph and Delete carries the trash icon.
    • 7b. tap Delete: title reads Delete Subscription?, illustration is the trash, knob is orange, summary reads 1 subscriber, N payments.
  • 8. Overview → tap an expired subscription: the right-hand cell reads EXPIRED with a date instead of sitting empty.
  • 9. regression: Overview with no subscriptions: the welcome empty state still fills the screen between the tabs and the Create button.
  • 10. regression: Activity → open a Lightning payment with a message: the invoice note still renders with its torn top edge.
  • 11. regression: Settings, Shop Discover and All Activity: pinned tab headers still blur correctly after the shared haze style moved.

Automated Checks

  • Unit tests added: SubscriptionsScreenTest.kt covers the expired detail falling back to the last paid period end, and a fixed end date winning over paid periods.
  • Journeys added: journeys/subscriptions/ documents create-and-propose, review-and-subscribe, cancel-and-delete and the Payments tab. No journey covered subscriptions before.
  • just compile, just test and just lint pass locally; detekt reports no new findings for the touched files.
  • Cross-device: a subscription created on the Android emulator arrived on an iOS simulator as Review & Subscribe, confirming the layout rework did not disturb the Paykit round trip.

jvsena42 and others added 17 commits September 15, 2026 09:22
The badge shared a Row with the label, so label and badge centred as a
group and pushed the label off the tab centre. Design centres the label
in the cell and right-aligns the badge.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Top bar, tabs and the footer button were Column siblings, so nothing
could scroll underneath them. Layer them over the list with haze, as the
handoff does, and reuse the blur style via rememberChromeHazeStyle.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Subscribe used purple and cancel/delete used red. The handoff frames use
Brand/Bitkit #FF4400 for every swipe knob; purple there is the auto-pay
toggle, not the knob.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delete sheet title gains its question mark, the created summary uses a
comma instead of a middot, and the cadence labels use title case.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A subscription cancelled without a fixed end date failed both arms of
shouldShowTiming, so the right-hand cell rendered empty instead of the
EXPIRED date the handoff shows. Fall back to the last paid period end.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delete reused the cancel X, and the payments metric used the received
arrow. The handoff uses a trash can for delete and a coins glyph for the
payments count.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The detail RENEWS/EXPIRED cell used MMMM d, yyyy while the handoff and
the list rows both show MMMM d. Reuse formatShortDate and drop the now
unused formatFullDate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The handoff titles these rows with the subscription name over the date
and omits the bitcoin symbol; the contact name and symbol stay on the
Payments tab, which does show both.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The handoff keeps the note as the subtitle and replaces the fiat line
with "pending". Drop the now unused waiting_for_recipient string.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The handoff sizes the contact card to its content and rules a divider
after the contact and tags sections.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The description rendered at 15sp semibold; the handoff sets the
paragraph in 17sp regular and keeps the benefit bullets semibold.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delete reused the cancel cross. Add the handoff's trash illustration as
webp across mdpi through xxxhdpi and keep the cross for cancel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The handoff uses the same torn note card the activity detail already
draws. Extract ZigzagDivider into ui/components and reuse it instead of
the plain rounded rect.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
iOS already exposes SubscriptionRow-<id>; Android rows carried no tag.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Cover create and propose, review and subscribe, cancel and delete, and
the Payments tab. No journey covered subscriptions before.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Import ordering after the haze and zigzag changes, plus the Canvas and
Path imports left unused by extracting ZigzagDivider.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@greptile-apps

greptile-apps Bot commented Sep 15, 2026

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

The PR appears safe to merge, with non-blocking follow-ups for RTL badge placement and the Payments journey’s stale positioning assertion.

Findings

  1. P2 Badge no longer mirrors
  2. P2 Journey expects old badge position

Summary

Aligns subscription and payment-request screens with the handoff design.

  • Layers scrolling content beneath pinned headers and footer controls, with pill-scoped blur for Create.
  • Updates currency-specific amount formatting, badges, detail dates, illustrations, note styling, and copy.
  • Adds expiry-date tests and subscription lifecycle walkthroughs.
  • Two non-blocking follow-ups remain: direction-aware badge placement and a stale badge-position assertion in the Payments journey.

Reviews (2) · Last reviewed commit: "Merge branch 'master' into fix/subscript..."

Comment thread app/src/main/java/to/bitkit/ui/components/Money.kt Outdated
Comment thread journeys/subscriptions/review-and-subscribe.xml Outdated
Comment thread journeys/subscriptions/cancel-and-delete.xml Outdated
@github-actions

github-actions Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Regtest APK

Built from 74d7946 (run).

Download bitkit-dev-debug universal APK (expires in 30 days).

@jvsena42
jvsena42 marked this pull request as draft September 15, 2026 13:04
jvsena42 and others added 8 commits September 15, 2026 10:16
Right-aligning the badge stranded it at the tab edge whenever the tab was
wide, which is every two-tab row. Place it relative to the label instead,
and cap the label width so it truncates before reaching the badge.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
showSymbol and the status replacement acted on the primary and secondary
lines, so with fiat as the primary display they suppressed the fiat
symbol and replaced the bitcoin amount. Address bitcoin and fiat
directly instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The handoff fills both full-screen frames with Base/Black and gives the
bottom modal its own gradient from Gray6 down to black. The app applied
the same white-wash gradient to all three.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Without an eligible recipient the footer never renders, so nothing
supplied navigationBarsPadding and content sat under the navigation
area. Fall back to the inset, and ignore a stale footer measurement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Accepting a proposal opens the send flow or the Subscribed confirmation
rather than returning to the list, and payment history only exists once a
payment completes. Creator deletion needs its own pending proposal, since
a cancelled subscription no longer offers Delete and one with paid
periods stays in CREATED. Set a description so More Info is reachable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The badge made its tab taller than the others, so that tab's indicator
sat lower than the rest. Reserve the badge height on every tab.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The handoff blurs the list only through the button itself, leaving the
rest of the row sharp. Drop the full-width blurred band and pass the
haze state to the Create button so the blur follows its pill.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jvsena42
jvsena42 marked this pull request as ready for review September 15, 2026 14:37
@jvsena42 jvsena42 self-assigned this Sep 15, 2026
Comment thread journeys/subscriptions/payments-tab.xml Outdated
jvsena42 and others added 3 commits September 15, 2026 11:59
The Layout placed both children with absolute coordinates, so the badge
stayed physically right of the label in RTL where the previous CenterEnd
alignment had followed the direction. Update the journey step, which
still described the old right-edge placement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Master's merge added a suites table, an identifier table and a porting
rule that this suite predates. List it, record the Android and iOS row
identifiers alongside the parallel Payment Request entry, and mark the
suite as not yet ported.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every other confirm swipe follows the rail — send, savings, spending,
external — and the success confetti already did too. Subscriptions were
the exception, hardcoding one colour. Derive it from the accepted
endpoints, preferring lightning the way payablePreferenceOrder does.

Cancel and delete stay brand: they spend nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Accepted endpoints alone are not enough: a wallet with no usable
spending balance would get the purple knob and then be sent down the
savings path anyway. Require the amount to fit maxSendLightningSats too.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jvsena42
jvsena42 force-pushed the fix/subscriptions-design-parity branch from 9a9fe76 to bfdda4d Compare September 15, 2026 17:36
The handoff's Balance component has no symbol node on this screen, just
the sign, a 6pt space and the digits. Falling back to rememberMoneyText's
default keeps the fiat symbol and drops the bitcoin one, and the sign now
has its separating space.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant