Skip to content

Phase 7: onboarding, Play disclosure, English - #9

Merged
hupcus merged 4 commits into
mainfrom
phase-7-onboarding-policy
Sep 24, 2026
Merged

hupcus merged 4 commits into
mainfrom
phase-7-onboarding-policy

Conversation

@hupcus

@hupcus hupcus commented Sep 24, 2026

Copy link
Copy Markdown
Owner

Phase 7 — Onboarding a policy (PLAN.md)

Scope: onboarding in five steps + the optional time-in-app step (SPEC §31, D19): Kolik toho denně nascrolluješ → Jak měření funguje → prominent disclosure (SPEC §30 word for word) → Zapni měření (Android's settings, detected on return; Android 13+ restricted-settings hint with a one-tap App info button) → calibration (card / automatic) → Čas v aplikacích (Povolit / Teď ne). The app shows the dashboard only after the onboarding; every other path into the accessibility settings goes through the disclosure (AccessibilityGate). values-en/ with every string, per-app language (Android 13+), library translations filtered to cs + en. Final privacy screen, docs/accessibility-policy.md, new docs/play-listing.md. ADR-032.

DoD

  • SPEC §29 — privacy screen with the spec's text (pinned by TranslationsTest) + what is stored / never / no backup
  • SPEC §30 — disclosure on its own screen, explicit "Rozumím a chci pokračovat" before "Otevřít nastavení zpřístupnění"; isAccessibilityTool=false; text pinned against the spec
  • SPEC §31 — onboarding steps, detection on return, calibration card / automatic
  • SPEC §32 — service state in the onboarding and on the dashboard (unchanged)
  • The onboarding cannot be skipped before the service is on; it finishes without Usage access (OnboardingFlow, tests)
  • Texts in Czech and English (TranslationsTest: keys, format arguments, plurals)
  • docs/accessibility-policy.md final, docs/play-listing.md (listing cs/en, Accessibility declaration answers incl. "UsageStats gives only time, not scroll deltas", Data safety, privacy-policy text, video scenario)

Verification

  • Gates: testDebugUnitTest lintDebug assembleDebug assembleRelease green — 259 JVM tests; lint only the 6 old SetTextI18n in the Phase 1 debug surface; tools tests; manifest policy (only android:localeConfig added). No new permission, nothing new exported.
  • Emulator API 34: fresh install in English (device language) and Czech (per-app language) through the whole onboarding; back between steps; auto-advance after the system settings; service already on; delete everything → onboarding again (with the result toast); debug developer screen skips it; banner without consent → disclosure → system settings; App info button; R8 release through the whole onboarding. 24 screenshots (cs/en, light/dark) reviewed by subagents.
  • Reviews: Stage 0 /impact HIGH (app entry gate + Play policy boundary). /topshit: restricted-settings one-tap, visible launcher icon, double-tap guard, headings, English phrasing (1b27cf0). Stage 2 functional + security (Fable): no HIGH / MEDIUM, no hard-rule violation; 6× LOW fixed in e979f23 (consent after the text, stable gate on read errors, erase reporting across the screen swap, stronger gate and format guards, docs).
  • Not verifiable on the emulator → handoff.md „Dluh ověření“ V7 (sideloaded install with Android's restricted settings on the OnePlus, per-app language on ColorOS).

CI

GitHub Actions are still blocked by the account's billing / spending limit (open point in handoff.md). The merge relies on the CI-equivalent gate run in a clean checkout of this branch (same commands as .github/workflows/ci.yml + assembleRelease, JDK 21).

🤖 Generated with Claude Code

hupcus and others added 4 commits September 24, 2026 16:40
- Onboarding (spec §31): intro → how it works → prominent disclosure (spec §30 word for word)
  → switching the service on, detected on return → calibration (card / automatic) → optional
  time in app (D19). OnboardingFlow (pure Kotlin) decides what can be skipped: nothing before
  the service is on, everything after.
- MainActivity shows the app only after the onboarding; a debug developer screen from the
  launch intent skips it.
- AccessibilityGate: the dashboard banner and Nastavení reach Android's accessibility settings
  only through the disclosure while it has not been accepted (DisclosureRoute).
- values-en with every string; number_locale per language; generated locale config (cs, en)
  for Android 13+ per-app language; library translations filtered to cs + en.
- Privacy screen: nothing goes to a cloud backup or a new phone.
- Tests: onboarding rules, gate, translations in step (keys, format arguments, plurals),
  disclosure and privacy text pinned to the spec.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ADR-032: onboarding, the disclosure gate, step-4 hints, languages, claim.
- accessibility-policy.md: where the disclosure is enforced, release provider allowlist.
- play-listing.md: listing texts cs/en, Accessibility declaration answers, Data safety,
  permissions, privacy policy text, video scenario, rating and audience.
- architecture.md, README: onboarding, languages, status.
- Step 4 hides the setup instructions once the service is on.
- PolicyGuardTest: only MainActivity builds the accessibility settings intent.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…le icon, double tap

- Step 4 on Android 13+: an "Otevřít informace o aplikaci" button next to the
  restricted-settings hint (App info is where Android offers "Allow restricted settings");
  the hint is hidden below 13, where the block does not exist.
- The welcome illustration is the launcher icon as the home screen shows it (white mark on
  its blue) — the bare white foreground was nearly invisible on the light theme.
- The disclosure screen's accept button disables itself, so a double tap cannot open the
  accessibility settings twice.
- Step titles are headings for TalkBack.
- English: "compared with the automatic estimate: +2.1 %".

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…at reports

- Onboarding step 3: the consent button follows the four paragraphs inside the scroll.
- A settings read error after the acceptance no longer bounces step 4 back to the disclosure.
- "Smazat data i nastavení" runs in an application scope and reports, although the onboarding
  replaces the settings screen mid-way.
- NavHost gets the loaded acceptance from MainActivity (no default in the first frames).
- PolicyGuardTest: settings actions as strings and the details page count too; the NavHost may
  not hand the ungated callback on (with a self-test). TranslationsTest sees every format
  specifier.
- Docs: ADR-032 amendments, the gate screen opens the settings after consent, the class name
  in the privacy text; handoff Phase 7 exit report.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@hupcus
hupcus merged commit 39aeb30 into main Sep 24, 2026
1 check failed
@hupcus
hupcus deleted the phase-7-onboarding-policy branch September 24, 2026 16:28
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