Skip to content

feat(bills): render bills at the app root; drop camera frosting - #1220

Merged
bmc08gt merged 3 commits into
code/cashfrom
refactor/bills-at-root
Aug 12, 2026
Merged

feat(bills): render bills at the app root; drop camera frosting#1220
bmc08gt merged 3 commits into
code/cashfrom
refactor/bills-at-root

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

Phase B — bills render at the app root, not inside the camera. A presented bill (payable / tip card / gold bar) now appears over any screen and is fully decoupled from the scanner.

Stacked on #1218 (Phase A). Review/merge that first.

  • New BillOverlay (:shared:bills), mounted at the app root in App.kt beside ScrimOverlay. Reads the app-scoped billState via LocalSessionController; owns swipe-to-dismiss, enter/exit animation, tip-modal positioning, and the below-bill decorators. Touch-transparent when no bill is present (taps pass through to the tab bar).
  • ScannableContainer slimmed to camera + HUD (−236 lines): no longer draws the bill; hides its DecorView HUD while a bill is up.
  • Tab bar hides while a bill/tip card is up — AppNavigationBar gated on LocalSessionController.billState; slides out with the bill, returns on dismiss.
  • Scrim behind the bill over app content — driven through the shared root ScrimController (theme scrim color + tap-to-dismiss). Skipped over the scanner, where the live camera stays visible behind the bill. (ScrimController.hide() made public so the overlay can clear it on self-dismiss.)
  • Frosting removed: deleted TipCardCameraBackdrop, dropped the previewView plumbing from Scanner, and TipCard renders as a solid opaque card (LocalTipCard{Color,BaseAlpha} default to the opaque fallback; the backdrop local is gone). The FrostedTipCard flag is now unused.

Test Plan

  • Present a bill over the wallet: tab bar slides out, scrim dims/blocks behind the bill, tap-scrim or swipe dismisses, tab bar returns
  • Present a bill over the camera: no scrim, camera visible behind the bill
  • Below-bill modals (management options / received-funds / tip modal) work
  • Tip card renders as a solid opaque card (no frosted backdrop)
  • No touch blocking when no bill is present

@github-actions github-actions Bot added area: payments Payments, transfers, intents, billing area: scanner QR/Kikcode scanning, camera type: feature New functionality area: ui Compose UI, theme, components, resources labels Aug 12, 2026
@bmc08gt bmc08gt changed the title feat(bills): render bills at the app root; drop camera frosting (Phase B) feat(bills): render bills at the app root; drop camera frosting Aug 12, 2026
Phase B of moving bills out of the scanner. A presented bill now renders at the
app root instead of inside the camera screen, so it appears over ANY screen and
is fully decoupled from the camera.

- New BillOverlay (:shared:bills), mounted at the app root in App.kt next to
  ScrimOverlay. It reads the app-scoped billState via LocalSessionController and
  owns the swipe-to-dismiss gesture, enter/exit animation, tip-modal positioning,
  and the below-bill decorators. Touch-transparent when no bill is present.
- ScannableContainer slims down to camera + HUD: it no longer draws the bill,
  and hides its DecorView HUD while a bill is up (billState.bill != null).
- Remove the frosted tip-card camera backdrop entirely: delete
  TipCardCameraBackdrop, drop the previewView plumbing from Scanner, and render
  TipCard as a solid opaque card (LocalTipCard{Color,BaseAlpha} now default to
  the opaque fallback; the backdrop composition local is gone).

The FrostedTipCard feature flag is now unused (left in place; harmless).
Bills render at the app root above everything, so the v2 tab bar would show
beneath a presented bill. Gate AppNavigationBar visibility on the app-scoped
billState (bill == null) so the bar slides out while a bill is up and returns
on dismiss.
…rimController

When a bill/tip card is presented over app content (not the camera), dim and
block the content beneath it so it reads as a focused modal. Drive the shared
root ScrimController (its ScrimOverlay already sits just below BillOverlay), so
it uses the theme scrim colour and gets tap-to-dismiss for free. Skipped on the
scanner tab, where the live camera stays visible behind the bill.

- ScrimController.hide() made public so BillOverlay can conceal the scrim when
  the bill clears itself (e.g. swipe dismiss) without re-invoking onDismiss.
@bmc08gt
bmc08gt force-pushed the refactor/bills-at-root branch from b866727 to 7a2fc9a Compare August 12, 2026 15:25
@bmc08gt
bmc08gt changed the base branch from refactor/bill-decorators-to-shared to code/cash August 12, 2026 15:25
@bmc08gt
bmc08gt merged commit 5c62554 into code/cash Aug 12, 2026
3 checks passed
@bmc08gt
bmc08gt deleted the refactor/bills-at-root branch August 12, 2026 15:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: payments Payments, transfers, intents, billing area: scanner QR/Kikcode scanning, camera area: ui Compose UI, theme, components, resources type: feature New functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant