Android parity 2/3: getting data in fast - #35
Merged
Merged
Conversation
- People tab: search by name, Sort by Recent (each person's latest live flight), crew pill, + menu with CSV import, overflow with CSV export (SAF). - CSV import matches rows by name + date of birth across the file and the app, so one person with several documents stays one person (iOS 1173620); the plan is pure in :core-logic, written in one transaction. - Full-screen crew and passenger picker: search, usual crew first, Frequent with / Usual Crew groups, crew/passenger toggle, reorderable crew (PIC first), add a person the search did not find. A person created from the picker joins the flight (iOS 83e47fd). - Per-flight document choice for people with several active documents, stored as flight.chosenDocNumbers (Room migration 1 -> 2), carried by leg actions and Move my data, and winning over the region pick. - Aircraft editor: airplane/helicopter, company operator, owner picked from People with owner/address kept in step. Refs #30 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016NgSweh5v5Fx5omrHvvjAk
…or PDF - Port MRZResultProcessor to :core-logic with its Swift tests: duplicate document across everyone, name mismatch, matching people. Replaces the silent upsert applyScan did. - The scan result is a bottom sheet over the camera with the choices that fit where the scan started (add to this person, update the name, create a new person; or pick a matching person). Rescanning a document the person already holds offers to refresh it. - Scan Document from the People + menu and the crew picker opens whoever the scan ends with, and puts them on the flight from the picker. - Scan from a photo (Photo Picker) or a PDF (SAF + PdfRenderer), no permission and nothing kept. Refs #30 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016NgSweh5v5Fx5omrHvvjAk
…ices - Route picker over the bundled airports.db (FROM/TO, ranked search, recent routes; an unknown four-letter code can still be used), and a single airport picker for an aircraft's usual base. - Airport time zones as an icao,zone table generated from airports.db by scripts/airport_timezones.py: Android's Geocoder has no time zone. - Schedule fields offer UTC and the route's local times, moving to the airport's zone once known unless the pilot picked one. - Airport notices from maps.flyfun.aero under the route, through their own client so the forms token never goes there. Refs #30 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016NgSweh5v5Fx5omrHvvjAk
…ight - + opens New Flight in two steps (route, schedule, aircraft; then people) on the same draft; Create Flight stores it and the editor takes over. - The people step suggests who was on board last time (same aircraft first, then the latest flight, then usual crew), and "Choose another flight..." copies any earlier crew, one row per distinct set of people. - Previous Flight copies an earlier flight's route, aircraft, people and settings, rescheduled to the next time its local time of day comes round. - PeopleSuggestion and NextOccurrence ported to :core-logic with the iOS tests. Refs #30 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016NgSweh5v5Fx5omrHvvjAk
- Import from Contact on the People + menu and the crew picker: the system contact picker (no READ_CONTACTS), then create a new person or update a close match, filling missing fields only or overriding all, with a choice when the contact has several phones, e-mails or addresses. - Matching (same surname with a shared first-name prefix, or both names within two edits) and merging ported to :core-logic with tests. Closes #30 once driven on the emulator. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016NgSweh5v5Fx5omrHvvjAk
Owner
Author
Code ReviewVerdict: merge, with the fixes below on main. No blocking bugs. The core-logic ports match their Swift originals; where they differ, the difference is deliberate or makes the Kotlin more correct. Verified locally (covers the "owed before merge" list, except the manual emulator drive)
Fix on main
Follow-ups (not fixed here)
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR 2 of 3 of the Android parity work (#30): people, aircraft and flights go in as fast as on iOS. One commit per section; the checklist and decisions are in
designs/future/android-parity.md§5 and §8, ticked in the same commits.Sections
5fc16bb)1173620).83e47fd).flight.chosenDocNumbers, the first real Room migration (1 → 2), carried by leg actions and Move my data.74dde14):MRZResultProcessorported to:core-logicwith its Swift tests (duplicates across everyone, name mismatch, matching people). The result shows in a bottom sheet before anything is stored. Standalone scan from People and from the picker. Scan from a photo (Photo Picker) or a PDF (PdfRenderer).323656e)airports.db.scripts/airport_timezones.py.maps.flyfun.aero, through their own client so the forms token is never sent there.f9af07a): two steps (route, then people), a "same crew as last time" suggestion, "Choose another flight…" to copy an earlier crew, and Previous Flight import rescheduled to its next local time of day.d837b9e):PickContact()with noREAD_CONTACTS, then create or merge (Fill Missing Only / Override All). Matching and merging are in:core-logicwith tests.Testing
Built in a cloud session with no route to Google Maven, as PR 1's 1a was, so
./gradlew :app:…could not run.:core-logic: 173 tests pass (43 new, most ported from the Swift suites), after every commit.app/src/main+androidTest: type-checked against Compose Multiplatform desktop plus stubs for the Android APIs, clean after every commit. The 27app/src/testtests pass.app/schemas/…/2.jsonis written by the next real build and needs committing.Owed before merge:
./gradlew :app:testDebugUnitTest :core-logic:test,assembleDebug, the instrumented tests, and a drive on the emulator:Decisions worth a look
icao,zonetable rather than a column added toairports.dbat build time. Re-run the script whenairports.dbchanges; a missing airport only loses the local-time option.GmsDocumentScanningwas not adopted for now.7af8d61), listed in §7 as a PR 3 candidate.Closes #30
🤖 Generated with Claude Code
https://claude.ai/code/session_016NgSweh5v5Fx5omrHvvjAk
Generated by Claude Code