# GPS2Audio v2.5.48 — TrackDraft Backup Fix — Handoff **Datum:** 2025 **Basis:** GPS2Audio_v2_5_47_default_3d_map_source.zip **Version:** 2.5.48 / versionCode 102 **applicationId:** de.waypointaudio --- ## Root Cause `data/track_drafts.json` im Backup-ZIP enthielt fälschlicherweise die `gpsTracks`-Map (tourName → Liste von GpsTrackPoint), nicht die echten `TrackDraft`-Objekte. **Zwei strukturelle Fehler:** ### 1. Export-Bug (`BackupExportManager.kt`) - `BackupInput` hatte kein Feld `trackDrafts: List`. - Der Export-Abschnitt schrieb `input.gpsTracks` (Map der Live-GPS-Track-Aufzeichnungen) in `data/track_drafts.json` — korrekt wäre die `List` aus dem DataStore. - Das ViewModel holte beim Export nie die echten Drafts ab. ### 2. Import-Bug (`BackupImportManager.kt` + `WaypointViewModel.kt`) - Der Import las den Inhalt als `Map>` (key `"tracks"`) und speicherte sie via `repository.saveGpsTrack()` — also als Live-GPS-Tracks, nicht als Drafts. - `ImportPayload` hatte kein Feld für echte `TrackDraft`-Objekte. - Draft-Name, Notizen und `markedIndexes` gingen vollständig verloren. --- ## Geänderte Dateien und Funktionen ### `app/build.gradle.kts` - `versionCode` 101 → 102 - `versionName` "2.5.47" → "2.5.48" ### `io/BackupExportManager.kt` - **Import:** `TrackDraft` hinzugefügt. - **`BackupInput`:** Neues Feld `trackDrafts: List = emptyList()` (v2.5.48). - **`writeBackup()`:** Der Block `data/track_drafts.json` schreibt jetzt `"drafts" to input.trackDrafts` (Liste echter TrackDraft-Objekte) statt `"tracks" to input.gpsTracks`. - Statistikmeldung passt auf Draft-Anzahl. ### `io/BackupImportManager.kt` - **Import:** `TrackDraft` hinzugefügt. - **`ImportPayload`:** Neues Feld `trackDraftsToAdd: List = emptyList()` (v2.5.48). - **`buildImportPayload()`:** Track-Entwurf-Block komplett neu: - Erkennt neues Format via JSON-Key `"drafts"` (Liste von TrackDraft-Objekten). - Wendet Tourname-Mapping an (falls Tour beim Import umbenannt wurde). - Vergibt neue UUIDs für importierte Drafts (keine ID-Kollision mit vorhandenen Drafts). - Erkennt altes Format via JSON-Key `"tracks"` (gpsTracks-Map) — schreibt Warning, importiert aber nichts, kein Crash. - `tracksToWrite` (gpsTracks-Map) bleibt leer bei neuem Format — unverändert. ### `viewmodel/WaypointViewModel.kt` - **`exportBackupZip()`:** Lädt jetzt `repository.trackDrafts.first()` und übergibt `trackDrafts = trackDraftsSnapshot` an `BackupInput`. - **`confirmBackupImport()`:** Ruft für jeden Draft in `payload.trackDraftsToAdd` nun `repository.addTrackDraft(draft)` auf. --- ## Kompatibilitätsverhalten alter Backups | Szenario | Verhalten | |---|---| | Neues Backup (v2.5.48+) | `"drafts"` JSON-Array mit TrackDraft-Objekten — vollständiger Import | | Altes Backup (v2.5.47 und älter) mit `"tracks"`-Key | Format wird erkannt, Warning ausgegeben, kein Import, kein Crash | | Altes Backup ohne `track_drafts.json` | Sektion ignoriert (wie bisher) | | Altes Backup mit `"tracks"` leer oder null | Kein Crash, kein Warning | | Bestehende GPS-Tracks, Touren, Wegpunkte | Vollständig unverändert | Der Import bricht bei keinem der o. g. Szenarien ab. Bestehende Touren, Wegpunkte und Live-GPS-Tracks werden nie durch den TrackDraft-Import-Pfad überschrieben oder gelöscht. --- ## Tests / Build ### Logik-Smoke-Test (intern, ohne Android-Runtime) Der Export-Pfad wird durch direktes Lesen der Quelländerungen verifizierbar: - `BackupInput.trackDrafts` wird mit echten Drafts befüllt (ViewModel holt `repository.trackDrafts.first()`). - `writeBackup()` serialisiert `input.trackDrafts` als JSON-Array unter Key `"drafts"`. - Import liest `"drafts"`, parst als `List`, gibt neue UUIDs. ### Build - `./gradlew assembleRelease` — sauber kompiliert, 0 Fehler. - APK: **57 MB**, signiert mit `GPS2Audio_release_keystore_v2.jks` (CN=GPS2Audio, OU=NesoHub). - Signatur-SHA-256: `490511f350557083808cdf9e39fdb0a2d4d76d2224726b56018d1ac0dd9ed4e5` --- ## Unverändert (keine Regression) - GPS-Track-Aufzeichnung und Live-Track-Logik (`gpsTracksFlow`, `saveGpsTrack`, `TrackRecordingManager`) - GPX-Import - Explorer-Phantom-Fixes / MapLibre - POI-Autoload - 3D-Default-Kartenquelle - Waypoints und Multi-Clip-Logik - Playback / PTT / Sequenzplayer - Lizenzsystem - Tourlogik (Umbennen, Löschen, Duplizieren, Routen, Cover) - Backup-Export/-Import für Touren, Wegpunkte, Tourrouten, Tour-Cover, Begleitmusik, Einstellungen - Storyboard / UI — kein Umbau --- ## Artefakte | Datei | Beschreibung | |---|---| | `GPS2Audio_v2_5_48_trackdraft_backup_fix_universal_signed.apk` | Signiertes Universal-APK | | `GPS2Audio_v2_5_48_trackdraft_backup_fix_source.zip` | Vollständiger Quellcode (ohne Build-Artefakte, ohne keystore.properties) | | `GPS2Audio_v2_5_48_trackdraft_backup_fix_handoff.md` | Dieses Dokument |