# GPS2Audio v2.5.16 — Waypoint-Kopieren sichtbar im Bearbeiten-Modus Interner Build. Nicht auf Gitea veröffentlicht. ## Ausgangsbasis - Source-Zip: `GPS2Audio_v2_5_15_player_maximize_tour_variants_source.zip` - Repo-Skeleton bewusst NICHT verwendet — Arbeitsstand ausschließlich aus dem v2.5.15-Quellzip in einen sauberen Arbeitsordner entpackt und darauf aufgebaut. - Versionssprung: `versionName 2.5.15` (`versionCode 69`) → `versionName 2.5.16` (`versionCode 70`). ## Signatur - Keystore: `GPS2Audio_release_keystore_v2.jks` (v2-Linie, RSA 4096). - Alias: `gps2audio_release_v2`. - Credentials aus `GPS2Audio_release_keystore_v2_credentials.txt`. - Kein neuer Keystore. APK ist mit derselben v2-Signatur wie v2.5.15 signiert → In-Place-Update aus v2.5.15 funktioniert. (DN `CN=GPS2Audio, OU=NesoHub, O=GPS2Audio, L=Germany, C=DE`, SHA-256 `49:05:11:f3:50:55:70:83:80:8c:df:9e:39:fd:b0:a2:d4:d7:6d:22:24:72:6b:56:01:8d:1a:c0:dd:9e:d4:e5`.) - `keystore.properties` und `local.properties` sind im Source-Zip ausgeschlossen, ebenso `build/` und `.gradle/`. ## Was wurde geändert ### Problem v2.5.15 hat `WaypointViewModel.copyWaypointToTour(...)` eingeführt, der Edit-Dialog enthielt auch eine Kopiersektion. Sie war aber: 1. Nur im Edit-Dialog der Wegpunkt-Liste verkabelt (`WaypointListScreen.kt`). In den anderen Edit-Flows (`MapScreen.kt`, `ExplorerScreen.kt`, `ExplorerScreenMapLibre.kt`) war `onCopyToOtherTour = null`, dadurch wurde die Sektion stillschweigend ausgeblendet. 2. Im Edit-Dialog ganz unten platziert, hinter Audio-Clips, Abspielregeln und Scheduler. Sehr lange Dialog-Scrollstrecke → praktisch nicht entdeckbar. 3. Nur sichtbar, wenn mindestens eine andere Tour existiert. Bei Single-Tour-Setups gar keine Aktion. ### Fix `app/src/main/kotlin/de/waypointaudio/ui/WaypointEditDialog.kt` - Neue private Composable `WaypointCopySection(...)`. Wird direkt unter der Tour-Zuordnung gerendert, mit klarer Section-Überschrift „Wegpunkt kopieren“, kurzem Erklärtext, Ziel-Tour-Dropdown und `FilledTonalButton "Kopieren"`. - Aktion ist NUR sichtbar, wenn: - ein bestehender Wegpunkt bearbeitet wird (`waypoint != null`) und - der Aufrufer einen `onCopyToOtherTour`-Callback liefert. Der Player-/Playback-Modus öffnet den `WaypointEditDialog` nicht und sieht die Aktion daher nie. - Zusätzliche zweite Aktion `OutlinedButton "In dieser Tour duplizieren („“)"`. Immer verfügbar, unabhängig davon, ob eine andere Tour existiert. Damit ist auch im Single-Tour-Fall eine Kopie möglich; die alte „Lege erst eine Tour an …“-Sackgasse entfällt. - Die aktuelle Tour wird im Ziel-Dropdown ausgeblendet (Duplizieren in dieser Tour läuft über den separaten Button), damit das Dropdown semantisch eindeutig bleibt. - Nach einer Kopier-Aktion schließt sich der Dialog (`onDismiss()`). Das ViewModel löst `_infoMessage` aus, was die bestehende Snackbar-/Info-Anzeige übernimmt. `app/src/main/kotlin/de/waypointaudio/ui/MapScreen.kt`, `ExplorerScreen.kt`, `ExplorerScreenMapLibre.kt` - `onCopyToOtherTour = editDialogWaypoint?.let { wp -> { target -> viewModel.copyWaypointToTour(wp.id, target) } }` ergänzt, damit die Kopiersektion auch beim Bearbeiten aus Karte/Explorer angezeigt wird. ### Duplizieren in derselben Tour Umgesetzt. Sauber realisiert über denselben `WaypointViewModel.copyWaypointToTour(sourceId, currentTour)`-Pfad: neue Waypoint-ID, neue Clip-IDs, Medien-URIs referenziert, `playCount = 0`, Position natürlich ans Ende der Tour. Eigener `OutlinedButton`, klar beschriftet, getrennt vom Dropdown. ### Versionierung / Build `app/build.gradle.kts` - `versionCode = 70` - `versionName = "2.5.16"` - Kommentar im Block ersetzt durch v2.5.16-Release-Notes. ## Was bewusst NICHT geändert wurde - `WaypointViewModel.copyWaypointToTour` selbst — Logik aus v2.5.15 wiederverwendet, keine ID-/Clip-/URI-Logik angefasst. - `duplicateTour` aus v2.5.15 — unverändert. - Player-Vollbild (v2.5.15), Multi-Clip-Navigation und Countdown (v2.5.14), Xiaomi/HyperOS-Hintergrundhilfe (v2.5.13), Backup/Import, PTT, Atmo, Explorer/MapLibre, Routing, Terms/Lizenz, OSM Attribution — alles unverändert. - Keine String-Resources extrahiert; die neuen UI-Texte stehen direkt im Composable, da v2.5.15 dieselben deutschen Inline-Strings bereits in der alten Kopiersektion verwendet hat. Behält Stil-Konsistenz mit dem Vorgängerstand. ## Artefakte - `GPS2Audio_v2_5_16_waypoint_copy_editmode_signed.apk` (57 MB, mit v2-Keystore signiert, verifiziert via `apksigner verify --print-certs`) - `GPS2Audio_v2_5_16_waypoint_copy_editmode_source.zip` (376 KB, ohne Keystore-Secrets und ohne Build-Artefakte) - `GPS2Audio_v2_5_16_waypoint_copy_editmode_handoff.md` (diese Datei) ## Manueller Testplan 1. **Player-/Playback-Ansicht zeigt KEIN Kopieren** - App starten, Tour wählen, normal in der Wegpunktliste/Map blättern, einzelne Wegpunkte abspielen. - Karte tippen, Wegpunkt-Bubble öffnen → Player/Playback-Steuerung erscheint, jedoch nirgendwo eine „Kopieren“-Aktion auf einzelnen Wegpunkten. - In der Wegpunktliste OHNE Edit-Modus (Stift-Icon nicht aktiviert): kein Stift-/Lösch-Icon, kein Edit-Dialog, somit keine Kopier-Sektion. 2. **Edit-Modus zeigt Kopieren** - In der Wegpunktliste auf das Stift-Icon oben rechts tippen → editMode aktiv. - Stift-Icon bei einem bestehenden Wegpunkt antippen. - Im Dialog direkt unter „Tour-Zuordnung“ wird der Block „Wegpunkt kopieren“ angezeigt, mit Dropdown „Ziel-Tour“ und Button „Kopieren“ sowie darunter „In dieser Tour duplizieren („“)“. - Dasselbe gilt für den Edit-Dialog, der über die Karte (Marker-Aktionsmenü → Bearbeiten) und über den Explorer (Pin-Aktion → Bearbeiten) geöffnet wird. 3. **Kopie in andere Tour** - Mindestens zwei Touren vorhanden. Aktuelle Tour wird im Dropdown NICHT angeboten, andere Touren werden aufgelistet. - Tour wählen, „Kopieren“ tippen → Dialog schließt, Snackbar/Info „Wegpunkt „…“ in Tour „…“ kopiert.“ erscheint. - In der Ziel-Tour ist die Kopie am Ende der Wegpunktliste sichtbar. - Kopie hat alle Clips des Originals (Titel + Datei-Referenzen). - Original-Wegpunkt in der Quelltour bleibt unverändert (Name, Clips, Position, Abspielregeln). - Audio der Kopie ist abspielbar (selbe content://-URIs). 4. **Duplizieren in derselben Tour** - Edit-Dialog → „In dieser Tour duplizieren („“)“ tippen. - Snackbar erscheint, Dialog schließt. - Am Ende der aktuellen Tour erscheint eine 1:1-Kopie. Eigene Waypoint-ID und eigene Clip-IDs (verifizierbar: Original bearbeiten verändert die Kopie nicht und umgekehrt). - `playCount` der Kopie startet bei 0. 5. **Single-Tour-Fall** - Nur die Default-Tour existiert. Edit-Dialog öffnet sich → Kopiersektion erscheint, statt Dropdown ein Hinweistext, plus „In dieser Tour duplizieren“-Button. - Button funktioniert wie unter 4. 6. **Keine Regressionen** - Tour duplizieren (Menüpunkt aus v2.5.15) funktioniert weiterhin → neue Tour erscheint mit allen Wegpunkten/Clips/Cover/Route. - Player-Vollbild umschaltbar (v2.5.15). - Multi-Clip-Wiedergabe + Countdown (v2.5.14): zwischen Clips eines Wegpunkts navigieren, Countdown zählt. - Xiaomi/HyperOS-Hintergrundhilfe (v2.5.13) Dialog/Anleitung weiterhin erreichbar. - Backup/Export/Import, PTT-Aufnahme, Atmo, Explorer (osmdroid + MapLibre), Routing, Terms/Lizenz, OSM Attribution funktionieren wie zuvor. ## Build-Notizen - Build mit Gradle 8.7 (lokal verfügbar) gegen AGP 8.5.2 / Kotlin 2.0.21, compileSdk/targetSdk 35. - Nur die bereits in v2.5.15 vorhandenen Deprecation-Warnings (osmdroid PolylineOptions/MarkerOptions, AutoMirrored Icons, `Modifier.menuAnchor()`-Overload, `Divider`). Keine neuen Warnings durch die v2.5.16-Änderungen. - APK-Signatur: v1+v2+v3 (apksigner Default für `signingConfigs.release`).