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

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
bmc08gt added a commit that referenced this pull request Sep 28, 2026
FrostedTipCard has had no reader since #1220 removed the frosted backdrop and
left the flag in place.

ContactPickerMode is retired as off, which is what every user already gets. The
picker path lost its only entry point when direct-send went (#1419), so turning
it on would skip the contacts permission step and leave the reader with an empty
picker store. ScopeAwareContactReader now always reads through full access and
still falls back to picked contacts when that fails; the picker reader and
launcher stay for a future entry point.

That reader was the contacts module's only FeatureFlag reference, so
`:apps:flipcash:shared:featureflags` leaves its build file. Both DataStore keys
stay behind unread, the same as the other retired flags.
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