Android parity 3/3: platform and integrations - #37
Conversation
… helpers Work in progress on #31 section 3a; not yet type-checked. - Adaptive launcher icon generated from the iOS artwork by scripts/android_launcher_icon.py, with a monochrome layer for themed icons - FlyFunTheme: dynamic colour, light or dark with the system; edge to edge - material3-adaptive and navigation-suite dependencies, ListDetail helper, selected-row highlight on the flight, people and aircraft lists Still to do in 3a: NavigationSuiteScaffold and wiring ListDetail into the routes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
NavigationSuiteScaffold replaces the bottom bar: a bar on phones, a rail on tablets. ListDetailPaneScaffold lays out the existing back stack, so a tablet shows the list beside the open flight, person or aircraft, and a phone is unchanged. Picking another flight from the side list with unsaved edits asks Save / Discard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
…ions, shortcuts - Sign in with Apple through the server's web flow, beside Google - TokenStore encrypts the JWT with its own Keystore AES-GCM key; drops the deprecated security-crypto dependency - Take X-Renewed-Token so sessions roll instead of expiring - Launcher shortcuts: New flight, Scan passport Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
Lists the pilot's weather.flyfun.aero flights with the same account's token and applies the chosen one's FlightExchange to the new flight: route, schedule and aircraft (matched by registration, or staged and stored with the flight). The exchange format and mapping live in :core-logic with tests. Autorouter import is skipped: its routes are raw ICAO plans, waiting on G4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
…cale config Flights strings and the generated translations follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
…anguage Every user-visible literal in the app moves to res/values/strings*.xml, one file per area. scripts/android_strings.py writes values-fr/de/es from the iOS Localizable.xcstrings by matching English text (133 of 350 today; the rest fall back to English). locales_config.xml offers en/fr/de/es in the system's per-app language setting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
The privacy link, passenger note and Delete all data landed on main while 3d was moving strings into resources, so they were still literals, and the Delete account text 3d extracted predated main's rewording. Both are now resources, and the translations are regenerated from the iOS catalogue. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
cf5ff78 to
edea0b8
Compare
|
Reviewed 3a-3d (layout/theme, auth/token storage, FlyFun Weather import, localisation). Bug: orphaned staged-aircraft FK on a second Weather import (high confidence)
When a Weather import has a registration not on file, a new At Fix: only reset No other high-confidence issues found; the Keystore |
…r crashes Save Importing a Weather flight whose aircraft was not on file staged a new aircraft and pointed the draft at it. A second import into the same draft with no registration kept that aircraftId but dropped the staged aircraft, so Save wrote a flight referencing a row that was never inserted and failed the foreign key. The staged aircraft now changes only when the import names one, as the draft's aircraft already did. Found by the PR 37 review. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Closes #31. This is PR 3 of the Android parity work: the app now looks and behaves like an Android app, and can import flights from FlyFun Weather. The checklist and the decisions made along the way are in
designs/future/android-parity.md§6 and §8. There is one commit per section.Not compiled. Google Maven is blocked from this cloud session, so
./gradlewcould not run. Please build it and run it on the emulator before merging. The:core-logictests are new too and have not been run yet.3a: look and layout
scripts/android_launcher_icon.pygenerates it; re-run it when the iOS icon changes.FlyFunTheme: dynamic colour (Material You), light or dark following the system, drawn edge to edge. There is no fallback palette: dynamic colour needs API 31 and the app's minimum is 33.NavigationSuiteScaffoldreplaces the bottom bar: a bar on phones and a rail on tablets.ListDetailPaneScaffoldshows the list beside the open flight, person or aircraft on wide screens. The navigation back stack decides which panes show, so phones behave exactly as before and ViewModel scoping, Back and the pickers are unchanged.androidx.compose.material3.adaptive:adaptiveandadaptive-layoutpinned at 1.2.0, andmaterial3-adaptive-navigation-suitetaken from the Compose BOM. I could not check these versions against Google Maven, so bump them if the build complains.3b: auth and platform
/auth/login/apple, form_post callback, then the auth code). It sits beside Google on the sign-in screen and in Settings.TokenStorenow encrypts the token with its own Keystore AES-GCM key, and the deprecatedsecurity-cryptodependency is gone.X-Renewed-Tokenheader, so every session expired at the token's lifetime however often the app was used. The interceptor now keeps the renewed token.3c: server-backed imports
weather.flyfun.aerousing the forms token, and applies the chosen flight's route, schedule and aircraft to the draft.FlightExchange) and the mapping onto the draft are in:core-logic, covered by the newFlightExchangeTest.3d: localisation
res/values/strings*.xml, one file per area.scripts/android_strings.pywritesvalues-fr/de/esfrom the iOSLocalizable.xcstrings, matching on the English text. 133 of the 350 strings get a translation today; the rest fall back to English.locales_config.xmllists en/fr/de/es for the system's per-app language setting.:core-logic, which has no access to Android resources: the CSV import summary, the merge summary, the "Anne, Bob and 2 more" line, and parser error messages. The details are in §8.To check when you build
calculateThreePaneScaffoldValue,ThreePaneScaffoldDestinationItem,NavigationSuiteType.None) are the likeliest compile errors, because their names have changed between adaptive versions.NavController.currentBackStackis used to find which tab's list a screen was opened from.🤖 Generated with Claude Code
https://claude.ai/code/session_017wLwwiewwvrkxjTmXNfwNg
Generated by Claude Code