For a zone labeled free_2h/3h/4h, "Check in (free · Xh)" starts a local, API-free
countdown to the free limit — no ParkSmarter call. The bbp-notify module gains a
showCheckin() that posts the ticking chronometer with "End" / "Pay" buttons, a
BbpActionReceiver (declared in the module's new AndroidManifest.xml) that records
the tap in SharedPreferences and, for Pay, relaunches the app; consumePendingAction()
is drained on foreground by useCheckinSync() — End clears the check-in, Pay hands
off to StartSession for the stored zone. A pre-expiry alert reuses the existing
reminder lead-minutes. Starting a paid session supersedes an active check-in.
Also: MeterDetail shows the free/pay-immediate label and (admins) labeling chips.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Countdown notification "nothing appears" on session start:
- The small icon was the adaptive launcher mipmap (applicationInfo.icon),
which Android 13+/GrapheneOS rejects as an invalid notification small icon
and drops the post silently. Ship a proper white-on-transparent vector
small icon (bbp_stat_parking) inside the module and use it.
- showCountdown now returns a diagnostic string (posted / notifications
disabled / exception) instead of swallowing failures; JS logs the branch,
permission result, and native outcome to the in-app diagnostics log.
- Log the raw active-session payload in refreshSessionStatus (element shape
was previously unconfirmed).
Time remaining showed "7694 min":
- API's TimeRemaining is SECONDS, not minutes. Format it as hours+minutes
in SessionDetail; annotate the type.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replaces the static status notification with a native Android chronometer that
counts DOWN to the session end — the system ticks it every second with zero app
CPU/battery, visible without opening the app.
- modules/bbp-notify: a ~50-line local Expo module using only NotificationCompat
(setWhen + setUsesChronometer + setChronometerCountDown + ongoing). Zero
third-party dependencies, no Firebase — fits the de-Googled ethos. Verified:
autolinks + Kotlin compiles.
- sessionStatus.ts uses it when present, else falls back to the expo-notifications
static expiry-time notification.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>