feat(bills): render bills at the app root; drop camera frosting - #1220
Merged
Conversation
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
force-pushed
the
refactor/bills-at-root
branch
from
August 12, 2026 15:25
b866727 to
7a2fc9a
Compare
bmc08gt
changed the base branch from
refactor/bill-decorators-to-shared
to
code/cash
August 12, 2026 15:25
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.
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.
BillOverlay(:shared:bills), mounted at the app root inApp.ktbesideScrimOverlay. Reads the app-scopedbillStateviaLocalSessionController; 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).ScannableContainerslimmed to camera + HUD (−236 lines): no longer draws the bill; hides itsDecorViewHUD while a bill is up.AppNavigationBargated onLocalSessionController.billState; slides out with the bill, returns on dismiss.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.)TipCardCameraBackdrop, dropped thepreviewViewplumbing fromScanner, andTipCardrenders as a solid opaque card (LocalTipCard{Color,BaseAlpha}default to the opaque fallback; the backdrop local is gone). TheFrostedTipCardflag is now unused.Test Plan