pilot-toolkit-android/README-android.md
2026-05-03 13:11:29 -04:00

94 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Pilot's Toolkit — Android
A collection of aviation utilities for flight crews, built with Kotlin and Jetpack Compose. Designed for practical cockpit use on Android devices.
**Not for operational use — verify all calculations independently.**
---
## Modules
- **Fuel Order Calculator** — Fuel quantity in US/imperial gallons and liters with ASTM D1250 Table 6B density correction and ambient temperature adjustment.
- **Pavement Strength / ESWL** — ACN/ACR calculation with PCN/PCR comparison, rigid/flexible pavement types, four subgrade categories. Reverse-solves maximum allowable weight when pavement is exceeded.
- **Crosswind Calculator** — Headwind, tailwind, and crosswind components from wind direction/speed and runway heading. Auto-formats five-digit wind input on focus loss.
- **Fuel Buckets** — Stage length vs. fuel burn schedule with slider interpolation. Supports operator-specific CSV and JSON profile import.
- **HF Frequencies** — Active ARINC HF assignments for Atlantic and Pacific with staleness indicator.
- **Passdown** — Crew changeover form with local storage, autocomplete, history, batch .ptz export, email compose via share intent, and tappable phone dialing.
- **Flight Level ↔ Meters** — ICAO meters-to-feet conversion table and China RVSM FLAS with directional filtering.
- **Crew Rest** — Augmented operations rest calculator for 34 pilots. Equal-division sequential rest rotation with lock toggle to prevent accidental edits mid-flight.
## Project Structure
```
app/src/main/
assets/
reference.json ← Flight levels, subgrade labels
aircraft/
G450.json ← Per-airframe data (auto-discovered)
G500.json
G650.json
G700.json
java/com/harshmallow/pilottoolkit/
MainActivity.kt ← Entry point, DataLoader.init()
data/
AircraftData.kt ← Data classes, enums, calculations
DataLoader.kt ← JSON parser from assets/
FlightLevelData.kt ← FlightLevelEntry class + DataLoader delegates
FuelProfiles.kt ← Fuel profile storage (SharedPreferences)
ui/
PilotToolkitApp.kt ← Navigation, tab bar, hamburger menu
components/
SharedComponents.kt ← ToolkitTextField, ResultCard, ClearButton, etc.
modules/
FuelOrderModule.kt
PavementModule.kt
CrosswindModule.kt
FuelBucketsModule.kt
HFModule.kt
PassdownModule.kt
FlightLevelModule.kt
CrewRestModule.kt
theme/
Color.kt ← ToolkitColors (light/dark palettes)
Theme.kt ← ToolkitTheme composable
```
## Data Architecture
All aircraft and reference data lives in JSON files under `assets/`. The `DataLoader` singleton parses these at app startup.
- **`reference.json`** — Airframe-agnostic: meters-to-feet table (107 entries), China FLAS (50 entries), RVSM direction sets, pavement subgrade labels.
- **`aircraft/*.json`** — One file per airframe: weight limits, ESWL config (formula or thresholds), PCN/PCR linear regression coefficients, fuel bucket schedules. Auto-discovered from the directory — adding a new airframe is just dropping a JSON file in `assets/aircraft/`.
Each aircraft file loads independently. A malformed file is logged and skipped — it does not crash the app or affect other airframes.
## Storage
All persistent data uses `SharedPreferences`:
- Default aircraft selection
- Dark mode toggle
- Volume unit preference
- Passdown retention period
- Passdown records (JSON serialization)
- Autocomplete lookups (per field)
- Fuel profiles (per aircraft)
## Exchange Formats
- **`.ptz`** — Gzipped JSON array of passdown objects. Exported via `GZIPOutputStream`, imported via `GZIPInputStream`. Open format.
- **Fuel profile JSON** — Validated on import by `format: "pilot-toolkit-fuel-profile"` field.
- **Fuel profile CSV** — Two columns (stage length, fuel burn), optional header row.
## Dependencies
- Kotlin
- Jetpack Compose + Material3
- `org.json.JSONObject` (built-in Android)
- `java.util.zip.GZIPOutputStream` / `GZIPInputStream` (built-in Java)
- No third-party libraries beyond standard Android/Compose dependencies
## Build
Standard Android Studio project. Open the root directory in Android Studio, sync Gradle, and run.