Skip to content

Car status dashboard: POTA-to-validate, ROTA miles, and session-fallback rows (pane) - #731

Open
patrickrb wants to merge 1 commit into
devfrom
feat/car-dashboard-pane
Open

Car status dashboard: POTA-to-validate, ROTA miles, and session-fallback rows (pane)#731
patrickrb wants to merge 1 commit into
devfrom
feat/car-dashboard-pane

Conversation

@patrickrb

Copy link
Copy Markdown
Owner

What

Implements the CarPlay/Android Auto status-dashboard design (Claude Design project) on top of the merged dev. This is the pane-path rework of #730: #729 removed the Play-rejected map/surface variant that #730 was originally built on, so this ports only the host-agnostic dashboard rows onto the read-only PaneTemplate.

Beside the existing headline / sequence / band rows, the activation block now shows:

  • POTA rowPOTA K-1234 · N QSOs with a N more to validate the activationActivation validated secondary (POTA's 10-QSO program rule; POTA_ACTIVATION_TARGET = 10).
  • ROTA rowROTA <trip> · N QSOs with a X.X mi driven this activation secondary. car_rota_line is split from Restore Android Auto (Play-approved IOT shape) + POTA/ROTA status rows #729's 3-arg inline form to a 2-arg title + new car_rota_miles secondary.
  • Session-fallback rowSession · N QSOs / Last logged JA1XYZ · 20m · 41 min, shown only when neither POTA nor ROTA is active (the design's "activation rows drop out, session stats take the slot").
  • Band decodes secondaryN decodes last cycle.

How

Decision/format logic lives in pure, Android-free helpers in CarQsoStatus.kt (buildCarActivationRows, potaValidateSpec, buildCarSessionRow, formatMiles, minutesAgo, carDecodesSecondary), unit-tested directly. QsoStatusScreen maps the app singletons (PotaSessionManager, RotaTripManager, GeneralVariables.QSL_Callsign_list_today, FT8TransmitSignal.mutableQsoCompletedAt) into those helpers.

Notes / judgment calls

  • POTA and ROTA are practically mutually exclusive (parked vs. roving), but both are emitted (POTA then ROTA) if both are active; on a 3-row host the tie-break keeps POTA and drops the band line.
  • "Session QSOs" uses the today/yesterday worked-callsign set (QSL_Callsign_list_today) — the only cheap in-memory count; "last logged" is best-effort from the last partner + completion timestamp. Both documented at the call site.

Testing

  • CarDashboardTest.kt — 17 new tests; full testDebugUnitTest green (incl. the Robolectric manifest-wiring test).
  • assembleDebug passes (validates the new string resources + manifest merge).
  • ⚠️ Not driven on a real head unit — no device tethered; Android Auto needs a DHU/AAOS host.

Supersedes

Replaces #730 (which was built on the surface overlay #729 deleted). #730 can be closed once this lands.

🤖 Generated with Claude Code

…s on the pane

Ports the CarPlay/Android Auto status-dashboard design onto dev's pane path
(the surface/map variant was removed in #729). The activation block now shows,
via pure helpers in CarQsoStatus.kt:

- POTA row with a "N more to validate the activation" / "Activation validated"
  secondary (POTA_ACTIVATION_TARGET = 10).
- ROTA row with a "X.X mi driven this activation" secondary; car_rota_line is
  split to a 2-arg title + car_rota_miles secondary.
- Session-fallback row ("Session · N QSOs" / "Last logged JA1XYZ · 20m · 41 min")
  when neither POTA nor ROTA is active — the design's "activation rows drop out,
  session stats take the slot."
- Band row gains a "N decodes last cycle" secondary, read from currentMessages
  (per-cycle overlay, so it drops to 0 on a silent slot) rather than the
  cross-cycle mutableFt8MessageList.

Activation rows keep #729's row-priority selection, so on a tight host they
replace the band line instead of being dropped. buildCarActivationRows,
potaValidateSpec, buildCarSessionRow, formatMiles, minutesAgo, and
carDecodesSecondary are unit-tested in CarDashboardTest (17 cases).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 53.44828% with 27 lines in your changes missing coverage. Please review.
✅ Project coverage is 36.23%. Comparing base (a7f2dfb) to head (7abeb58).

Files with missing lines Patch % Lines
...n/kotlin/radio/ks3ckc/ft8af/car/QsoStatusScreen.kt 0.00% 26 Missing ⚠️
...main/kotlin/radio/ks3ckc/ft8af/car/CarQsoStatus.kt 96.87% 0 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff              @@
##                dev     #731      +/-   ##
============================================
+ Coverage     36.19%   36.23%   +0.03%     
  Complexity      290      290              
============================================
  Files           244      244              
  Lines         30156    30202      +46     
  Branches       3954     3968      +14     
============================================
+ Hits          10916    10943      +27     
- Misses        18889    18907      +18     
- Partials        351      352       +1     
Flag Coverage Δ
android 17.89% <53.44%> (+0.10%) ⬆️
native 9.93% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...main/kotlin/radio/ks3ckc/ft8af/car/CarQsoStatus.kt 96.15% <96.87%> (+0.10%) ⬆️
...n/kotlin/radio/ks3ckc/ft8af/car/QsoStatusScreen.kt 0.00% <0.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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