# Cable for Android

A native Kotlin / Jetpack Compose port of the **Cable by VoltPlan** iOS app — a tool for
sizing low-voltage electrical conductors (boats, RVs, off-grid). This module reproduces every
feature of the iOS app with an Android-adapted navigation structure and the same Aptabase
analytics backend.

## Feature parity with iOS

- **Systems** — list, create (with name-derived icons), delete, onboarding empty state.
- **System detail** — Android bottom-navigation tabs (Overview · Components · Batteries · Chargers),
  replacing the iOS `TabView`.
- **Calculator / Loads** — voltage/current/power/length sliders with snap-to-common-values and
  tap-to-edit dialogs, watt⇄ampere mode, duty cycle & daily on-time (advanced), live wire-gauge /
  voltage-drop / power-loss / fuse results, and a per-load Bill of Materials sheet.
- **Batteries** — chemistry picker, nominal voltage, capacity, usable-capacity override, charge &
  cut-off voltage, temperature range; bank voltage/capacity mismatch warnings.
- **Chargers** — power source picker (shore/solar/wind/generator/alternator), input/output voltage,
  and a charge-output field that toggles between current and power entry.
- **Overview** — estimated runtime & charge time with editable goals, BOM completion progress, and
  loads/batteries/chargers summary cards.
- **Bill of Materials** — categorized checklist (components, batteries, cables, fuses, accessories),
  completion tracking persisted per component, and locale-aware Amazon affiliate / search links.
- **Component Library** — VoltPlan PocketBase backend (`https://base.voltplan.app`) with pagination,
  multi-language translations, locale-aware affiliate resolution, and Coil-cached remote icons.
- **PDF export** — system overview and BOM PDFs via Android `PdfDocument`, shared through a
  `FileProvider`.
- **Localization** — English, German, Spanish, French, Dutch (`values`, `values-de/es/fr/nl`).
- **Analytics** — Aptabase (app key `A-SH-4260269603`, host `https://apta.yuzuhub.com`), implemented
  against the Aptabase ingestion protocol so every iOS event (`App Launched`, `System Created`,
  `Tab Changed`, `Load/Battery/Charger Created/Deleted`, `BOM Item Tapped`, …) is mirrored. The iOS
  app uses Aptabase, so Aptabase is the source of truth here.

## Architecture

- **UI:** Jetpack Compose + Material 3, Navigation-Compose.
- **State:** `ViewModel` + `StateFlow`; auto-save editors mirror the iOS "save on change" behaviour.
- **Persistence:** Room (`SwiftData` → `@Entity`), all values stored in metric; imperial is a
  display-time conversion only (`UnitSystemSettings` via DataStore).
- **Calculation engine:** `calc/ElectricalCalculations.kt` is a direct port (0.017 Ω·mm²/m copper
  resistivity, 5 % voltage-drop limit, AWG/metric tables).
- **Networking:** Retrofit + kotlinx.serialization (PocketBase), OkHttp (Aptabase).

Package root: `app.voltplan.cable`.

## Building

This module needs the Android toolchain (JDK 17 + Android SDK 35). The Gradle **wrapper JAR** is a
binary and is not checked in here, so generate it once (or just open the folder in Android Studio,
which does it automatically):

```bash
cd android
# Option A: open in Android Studio (Giraffe+) and let it sync.
# Option B: with a system Gradle 8.11+ installed:
gradle wrapper --gradle-version 8.11.1
./gradlew :app:assembleDebug
```

Create a `local.properties` pointing at your SDK if Studio doesn't:

```
sdk.dir=/path/to/Android/sdk
```

## Notes

- SF Symbol names from the iOS data model are preserved verbatim and translated to Material icons at
  render time (`ui/Symbols.kt`), so the two platforms share identical stored data.
- The in-calculator "saved loads" picker from iOS is intentionally omitted; the VoltPlan component
  library is the primary picker on Android.
