Skip to content

Remove Android Auto from the shipping app (clears the driving-mode rejection) - #809

Merged
patrickrb merged 2 commits into
devfrom
fix/auto-driving-mode-phone-prompt
Sep 9, 2026
Merged

patrickrb merged 2 commits into
devfrom
fix/auto-driving-mode-phone-prompt

Conversation

@patrickrb

@patrickrb patrickrb commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Why

Play rejected the update:

Auto App Quality Guidelines: Visual info on phone
Your app does not disable features requiring phone interaction while in driving mode.

Both supporting-evidence screenshots are the same car screen — the Auto idle
state rendering "Open FT8AF on your phone to start the FT8 engine". That
message is what QsoStatusScreen/RecentDecodesScreen fall back to whenever
MainViewModel.peekInstance() is null, i.e. any time Auto connects before the
phone app has been opened. So the car screen instructed phone interaction, with
nothing gating it on the car being stopped.

This is the second Auto rejection in two months — versionCode 1327 was
rejected in July under the NAVIGATION category ("does not load map and user
location"), which is what PR #600 removed Auto for, before the IOT/templates
shape was restored. No approved Auto category fits a ham-radio QSO monitor well
enough to be worth another review cycle, so this PR takes Play's other path:
stop shipping as an Auto app.

What changed

1. Made the car UI compliant (c95b4a05) — kept so a revival doesn't walk
straight back into this finding:

  • Idle message is status only: car_open_phonecar_engine_idle = "FT8AF is
    not on the air yet. QSO status appears here once it is running." (en + pt-BR).
  • The one phone-reaching action ("Start FT8AF", launches the phone app) is
    wrapped in ParkedOnlyOnClickListener, so the host runs it only when parked
    and otherwise shows its own "not available while driving" notice — the Car App
    Library's sanctioned mechanism for exactly what the guideline asks.

2. Unwired Auto from the shipping app (5177c3de):

  • Manifest: dropped the com.google.android.gms.car.application descriptor, the
    androidx.car.app.minCarApiLevel meta-data and the FT8AFCarAppService
    service. Nothing marks the app as Auto-enabled, so Play stops routing it
    through Auto app-quality review.
  • Deleted res/xml/automotive_app_desc.xml.
  • CarAppManifestWiringTest flips from "wired in the approved IOT shape" to a
    guard asserting Auto is unwired, recording both rejections so a third
    revival has to be deliberate.

The car/ package, its tests and the androidx.car.app:app dependency stay
in-tree — dead but compiling — exactly as after the July removal. Debug-only
AAOS scaffolding (src/debug CarAppActivity + DebugInjectReceiver) is
untouched; it never merges into release.

Tests

  • Full testDebugUnitTest: 3724 tests, 0 failures.
  • processReleaseMainManifest: the merged release manifest keeps only the
    car-app library's own entries (connection provider, permission activity,
    notification receiver) — no Auto descriptor, no CarAppService. That is the
    same state that shipped between PR Remove Android Auto support to clear Play production rejection #600 and the restore, which passed review.
  • New CarIdleTemplateTest (4) pins the parked-only action and scans the
    shipped string for "phone"/"tap"/"touch", so a revival can't quietly
    reintroduce the rejected wording.

One thing to check outside the repo

The app is registered for the Android Auto form factor in Play Console
(Advanced settings → Form factors). The manifest strip is the code half; if the
console entry still declares Auto, remove it there too before resubmitting.

🤖 Generated with Claude Code

https://claude.ai/code/session_01B4bi57TiMribneqcSBddRB

Play rejected versionCode 2100 under "Auto App Quality Guidelines: Visual
info on phone — your app does not disable features requiring phone
interaction while in driving mode". The review evidence is the car-screen
idle state, which read "Open FT8AF on your phone to start the FT8 engine":
the car both instructed phone interaction and left it available while
driving.

The idle template is now status only ("FT8AF is not on the air yet. QSO
status appears here once it is running."), and the one action that does
reach the phone — starting the app so it can create the engine — is
wrapped in ParkedOnlyOnClickListener, so the Auto host runs it only when
the car is parked and otherwise shows its own "not available while
driving" notice.

Template content is split out from resource lookup so the guarantee is
unit-testable: CarIdleTemplateTest pins the action as parked-only, and
checks the shipped string itself for phone-interaction wording so a later
copy edit can't quietly reintroduce the rejection.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4bi57TiMribneqcSBddRB
@codecov

codecov Bot commented Sep 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 43.75000% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 42.41%. Comparing base (fe346e4) to head (5177c3d).

Files with missing lines Patch % Lines
...n/kotlin/radio/ks3ckc/ft8af/car/QsoStatusScreen.kt 46.66% 8 Missing ⚠️
...tlin/radio/ks3ckc/ft8af/car/RecentDecodesScreen.kt 0.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff              @@
##                dev     #809      +/-   ##
============================================
- Coverage     42.64%   42.41%   -0.23%     
- Complexity      226      228       +2     
============================================
  Files           267      270       +3     
  Lines         32068    32450     +382     
  Branches       3664     3735      +71     
============================================
+ Hits          13675    13764      +89     
- Misses        18132    18410     +278     
- Partials        261      276      +15     
Flag Coverage Δ
android 17.21% <43.75%> (+0.13%) ⬆️
native 9.93% <ø> (ø)

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

Files with missing lines Coverage Δ
...tlin/radio/ks3ckc/ft8af/car/RecentDecodesScreen.kt 0.00% <0.00%> (ø)
...n/kotlin/radio/ks3ckc/ft8af/car/QsoStatusScreen.kt 5.92% <46.66%> (+5.92%) ⬆️

... and 12 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Second Auto rejection in two months, so take Play's other path and stop
shipping as an Auto app rather than keep answering review findings.

versionCode 2100 was rejected under "Visual info on phone — your app does
not disable features requiring phone interaction while in driving mode";
versionCode 1327 was rejected in July under the NAVIGATION category ("does
not load map and user location"). The IOT/templates shape restored after
that first removal is what drew this one. No approved Auto category fits a
ham-radio QSO monitor well enough to be worth the review cycle right now.

- AndroidManifest.xml: drop the com.google.android.gms.car.application
  descriptor, the androidx.car.app.minCarApiLevel meta-data and the
  FT8AFCarAppService service. Nothing marks the app as Auto-enabled, so
  Play no longer routes it through Auto app-quality review.
- Delete res/xml/automotive_app_desc.xml (dead once the descriptor is gone).
- CarAppManifestWiringTest: flip back from "AA is wired in the approved IOT
  shape" to a guard asserting AA is unwired, with both rejections recorded
  so a third revival is a deliberate act.

The car/ Kotlin package, its tests and the androidx.car.app:app dependency
stay in-tree (dead but compiling), as they did after the July removal, so
the feature can be revived. It carries the previous commit's driving-mode
fix, so a revival starts compliant with the finding that triggered this.

The debug-only AAOS scaffolding (src/debug CarAppActivity +
DebugInjectReceiver) is untouched; it never merges into release.

Verified: full testDebugUnitTest suite (3724 tests, 0 failures) plus
processReleaseMainManifest — the merged release manifest keeps only the
car-app library's own entries (connection provider, permission activity,
notification receiver), which carry no Auto descriptor or CarAppService.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4bi57TiMribneqcSBddRB
@patrickrb patrickrb changed the title Fix Android Auto rejection: never ask the driver to use their phone Remove Android Auto from the shipping app (clears the driving-mode rejection) Sep 9, 2026
@patrickrb
patrickrb merged commit caadc95 into dev Sep 9, 2026
19 checks passed
@patrickrb
patrickrb deleted the fix/auto-driving-mode-phone-prompt branch September 9, 2026 18:30
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