# GPS2Audio v2.5.19 — Menü-/UX-Politur + Backup-Cover-Klarstellung Stand: 2026-05-28 Diese interne Version baut auf v2.5.18 auf (additiver GPX-Import, Backup ZIP, Lizenz/Pro/About, Multi-Clip, Sequenzplayer, Countdown, maximierbarer Player, Tour duplizieren, Waypoint kopieren im Edit-Modus, Explorer/MapLibre/Routing, PTT/Atmo, Hintergrundwiedergabe, Tour-Cover). v2.5.19 ist eine reine Menü-/UX-Politur, die keine bestehende Funktion entfernt. ## Zusammenfassung der Änderungen 1. **Menüeintrag „Track Editor" auf der Hauptseite entfernt.** Die Funktion (Track-Entwürfe) ist über den Explorer weiterhin vollständig erreichbar (Drafts → Vollbild-Editor). Daher war der separate Einstieg auf der Hauptseite redundant. 2. **„Klassische Ansicht" → „Bearbeitungsmodus".** Begriffsänderung in der UX. Der vom Nutzer vorgeschlagene Begriff „Editor Mode" wurde bewusst auf das deutsche „Bearbeitungsmodus" gemappt, da die App-UI in dieser Sprachfamilie konsistent ist (z. B. interner `editMode`-State in `WaypointListScreen`, FAB-Verhalten ist davon abhängig). „Bearbeitungsmodus" ist die klarere, kürzere deutsche Entsprechung und passt visuell besser in das DropdownMenuItem. 3. **„Touren ordnen" verschoben.** Der Menüpunkt wurde aus der einzelnen Touransicht (`WaypointListScreen`-Overflow) entfernt und in das Overflow-Menü der Audio-Bibliothek (`HomeScreen`) verschoben. Logisch passt die Aktion dorthin: sie sortiert die gesamte Tourliste, nicht etwas innerhalb einer einzelnen Tour. Die zugrundeliegende Logik (`WaypointViewModel.moveTour`, `TourReorderDialog`) ist unverändert; nur die Sichtbarkeit von `TourReorderDialog` wurde auf `internal` gehoben, damit `HomeScreen` ihn ohne Code-Duplikation aufrufen kann. 4. **Backup mit Tour-Cover (Prüfung & Klarstellung).** Tour-Cover (Icon + Palette + ggf. Bild) sind **bereits seit v2.5.7** Teil des ZIP-Backups und werden beim Import wiederhergestellt. Es war keine Code-Änderung nötig. Geprüft wurde: - `BackupExportManager.kt` (Lines 106–167): kopiert `cover.imageUri` in `media/covers/.jpg`, schreibt den `imageUri` im exportierten JSON als ZIP-relativen Pfad. Cover ohne Bild (nur Icon+Palette) werden 1:1 mit exportiert. Quell-Datei fehlt → Cover ohne Bild exportiert (Icon+Palette bleiben erhalten). - `BackupImportManager.kt` (Lines 257–277, 461–493): extrahiert `media/covers/*` **auch dann**, wenn der Nutzer „Medien/Atmo" beim Import abgewählt hat, sofern „Touren und Wegpunkte" gewählt wurde. So bleibt das Cover an die Tour gebunden und geht nicht verloren. Die extrahierte Datei wird via `TourCoverImageStore.saveFromFile` in den app-internen Cover-Ordner kopiert (relativer/absoluter Pfad neu, kein Verweis auf fremdes Gerät), sodass Pfade nach Geräte-/Installationswechsel stabil bleiben. Bestehende Cover werden nicht überschrieben (Merge-only). - Wiring im ViewModel (`WaypointViewModel.kt`, Z. 1200–1209 für Export, Z. 1307–1351 für Import): `tourCovers` werden in den `BackupInput` hineingereicht; nach dem Import wird `repository.mergeTourCovers` mit den `tourCoversToWrite` aufgerufen. Backup-Format-Kompatibilität: - `formatVersion = 1` bleibt unverändert. - `tourCovers` in `data/tours.json` ist seit v2.5.7 ein optionaler Block; ältere Backups ohne diesen Block werden weiterhin korrekt importiert. - Backups, die mit absolutem `imageUri`-Pfad eines fremden Geräts ankommen (z. B. ältere v2.5.5-/v2.5.6-Übergangsdateien), führen lediglich dazu, dass das Bild beim Import übersprungen wird; Icon+Palette werden gerettet, kein Datenverlust. 5. **Versionsbump.** `versionCode = 73`, `versionName = "2.5.19"` (vorher 72 / 2.5.18). Versions-Hinweis-Dialog zeigt eine neue Notiz mit dem Inhalt von v2.5.19 (Resource `version_notice_body_v2519`). ## Geänderte Dateien - `app/build.gradle.kts` — versionCode/-Name + Changelog-Kommentar. - `app/src/main/kotlin/de/waypointaudio/ui/HomeScreen.kt` - „Klassische Ansicht" → „Bearbeitungsmodus". - Eintrag „Track-Entwürfe" entfernt. - Neuer Eintrag „Touren ordnen" im Overflow-Menü (nutzt `TourReorderDialog`). - Parameter `onOpenDrafts` aus `HomeScreen()`-Signatur entfernt. - `stringResource`-Import hinzugefügt. - `app/src/main/kotlin/de/waypointaudio/MainActivity.kt` - Aufruf von `HomeScreen` an die geänderte Signatur angepasst (`onOpenDrafts` entfällt). Die `drafts`-Route bleibt für den Explorer-Fluss bestehen. - `app/src/main/kotlin/de/waypointaudio/ui/WaypointListScreen.kt` - „Touren ordnen"-Eintrag aus dem Overflow-Menü der Touransicht entfernt. - Kommentar im Hilfetext zur „Klassischen Ansicht" auf „Bearbeitungsmodus" aktualisiert. - `TourReorderDialog` von `private` auf `internal` gehoben. - `app/src/main/kotlin/de/waypointaudio/ui/VersionNoticeDialog.kt` - Body verweist auf `version_notice_body_v2519`. - `app/src/main/res/values/strings.xml` - Neuer String `version_notice_body_v2519`. Bestehende Strings (`menu_track_editor`, `menu_tour_reorder`, `draft_list_title`) bleiben unverändert, weil ihre Targets (Explorer-Drafts, TourReorderDialog, interne Komponenten) weiter benötigt werden. ## Neue Menü-/UX-Struktur **Audio-Bibliothek (HomeScreen) — Overflow-Menü (von oben nach unten):** 1. Startseite anpassen 2. Bearbeitungsmodus (Sprung in `WaypointListScreen`) 3. Touren ordnen *(neu hier; ehem. nur in Touransicht)* 4. Explorer / Karte 5. (Trenner) 6. Über GPS2Audio **Touransicht (WaypointListScreen) — Overflow-Menü:** - Bisher: …, Datensicherung, Begleitmusik, Ansicht anpassen…, **Touren ordnen** *(entfernt)*, Display aktiv halten, Über GPS2Audio. - Neu: identisch, aber ohne „Touren ordnen". **Begründung der Begriffswahl „Bearbeitungsmodus":** - Konsistent zum existierenden internen Konzept (`editMode`-State in `WaypointListScreen`, der genau diesen Bildschirm meint). - Klarer Bezug zur Funktion: Wegpunkte bearbeiten, Reihenfolge verschieben, GPS-Wegpunkt erfassen, Cover wechseln — alles Aktivitäten, die zum Bearbeiten der Tour gehören. - Vermeidet das englische Mischwort „Editor Mode", das in einer deutschen UI ungewöhnlich wirkt. - „Klassische Ansicht" war zwar verständlich, suggerierte aber „alte UI", während es de facto der Detailbildschirm mit voller Bearbeitung ist. ## Backup-Cover — geprüfte Stellen (Belegliste) | Datei | Zeilen | Was sicherstellt | |---|---|---| | `BackupExportManager.kt` | 106–167 | Cover-Bilder werden in `media/covers/.jpg` gepackt, `imageUri` im JSON wird auf den ZIP-relativen Pfad gesetzt. | | `BackupExportManager.kt` | 144–146 | Cover ohne Bild (nur Icon+Palette) werden 1:1 mit exportiert. | | `BackupImportManager.kt` | 257–277 | `media/covers/*` wird beim Import **auch dann** entpackt, wenn der Nutzer „Medien/Atmo" abgewählt hat, sofern „Touren und Wegpunkte" gewählt ist. | | `BackupImportManager.kt` | 461–493 | Pro importierter Tour wird das Bild via `TourCoverImageStore.saveFromFile` neu in die app-interne Ablage geschrieben; bei Misserfolg bleibt Icon+Palette erhalten. | | `WaypointViewModel.kt` | ≈1200–1209 | `tourCovers` wird in den Backup-Export gereicht. | | `WaypointViewModel.kt` | ≈1307–1351 | `tourCoversToWrite` wird nach dem Import via `repository.mergeTourCovers` persistiert. | | `TourCoverImageStore.kt` | 87–103 | `saveFromFile` führt einen sauberen Re-Encode (JPEG 1024 px, center-crop) durch und legt eine neue Datei mit nanoTime-Suffix an → keine Duplikat-/Verlust-Probleme bei mehrfachem Import. | ## Build-Ergebnis - Befehl: `gradle assembleRelease` (Gradle 8.7, Android SDK 35, JDK 21). - Ergebnis: BUILD SUCCESSFUL, 1m 54s. - APK: 58 862 594 Byte. - Signatur (`apksigner verify --verbose`): - Verified using v1 scheme: false - **Verified using v2 scheme: true** - Verified using v3/v3.1/v4: false - Number of signers: 1 - Signiert mit `GPS2Audio_release_keystore_v2.jks` (Alias `gps2audio_release_v2`, RSA 4096). ## Artefakte - `/home/user/workspace/GPS2Audio_v2_5_19_menu_backup_cover_signed.apk` - `/home/user/workspace/GPS2Audio_v2_5_19_menu_backup_cover_source.zip` - `/home/user/workspace/GPS2Audio_v2_5_19_menu_backup_cover_handoff.md` Der Source-ZIP enthält **kein** `keystore.properties` und keinen Build-Output (kein `.gradle/`, `build/`, `app/build/`). ## Bekannte Einschränkungen - Es wurde bewusst **keine** Veröffentlichung auf Gitea ausgeführt und **kein** Release-Tag angelegt; dies ist eine interne v2.5.19. - Die Update-Linie folgt weiterhin dem Release-Keystore v2. In-Place-Updates auf alte v2.5.x-Builds, die mit dem verlorenen alten Keystore signiert wurden, sind weiterhin nicht möglich (unverändert ggü. v2.5.17/18). - Kompilierungs-Warnungen aus Compose/Material (deprecated `Icons.Filled.*`, Divider→HorizontalDivider, MapLibre-Annotation-API) sind unverändert ggü. v2.5.18 und nicht funktionsrelevant. Sie werden in einer späteren Aufräum-Version aufgelöst. - `version_notice_body_v2512` bleibt als unbenutzter String im Ressourcen-Pool, da andere historische Notizen ebenfalls erhalten bleiben (kein Lokalisierungsrisiko, kein Lint-Fehler). - `showTourReorderDialog`-State in `WaypointListScreen` bleibt erhalten (nur noch als toter Pfad, weil der einzige Setter entfernt wurde); das ist bewusst, um die Rückkehr zur alten Position bei Bedarf risikolos zu ermöglichen. Wird in einer Aufräum-Version entfernt, wenn die neue UX bestätigt ist. ## Erhalten gebliebene Funktionen (Regressions-Schutz) - v2.5.18 additiver GPX-Import mit Dialog, keine Datenlöschung. - v2.5.17 Lizenzseite, GPS2Audio Pro, Public-Key-Resource. - Multi-Clip pro Waypoint, manueller Sequenzplayer, Countdown, maximierbarer Player. - Tour duplizieren, Waypoints im Edit-Modus kopieren. - Explorer/MapLibre/Routing, Backup Export/Import, PTT/Atmo, Hintergrundwiedergabe, Tour-Cover. - JSON-Import/-Export bleibt aus UI entfernt; interne Backup-Kompatibilität bleibt erhalten.