Files
2026-06-22 11:07:32 +00:00

294 lines
30 KiB
Markdown
Raw Permalink 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.
# GPS2Audio Release-Übersicht
Diese Übersicht fasst die offiziell hochgeladenen GPS2Audio-Releases zusammen. Sie beginnt mit dem ersten signierten Release `v1.6.2-osm-layout` und dokumentiert danach die fortlaufende 2.x-Entwicklung bis zur aktuellen Basis `v2.1.3`.
## Aktuelle stabile Version
**GPS2Audio v2.1.3** ist aktuell die empfohlene Basis. Diese Version enthält die vollständige PTT-Recorder-Funktion mit automatischer Speicherung, Anhören, Zuweisen zu Wegpunkten und sichtbarem Löschen in der PTT-Aufnahmen-Bibliothek.
Release: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.1.3
## Veröffentlichte Versionen
| Version | Schwerpunkt | Inhalt |
|---|---|---|
| `v1.6.2-osm-layout` | Erstes signiertes Release | OSM-Layout, stabile Basis, signierte APK als erste updatefähige Veröffentlichung. |
| `v2.0.0` | UI-Überarbeitung Phase 1 | Grundlegende Anpassungen nach der neuen UI-Vorlage, modernisierte Startseite und strukturierteres Layout. |
| `v2.0.1` | Direkte Reihenfolge-Bearbeitung | Waypoints konnten einfacher umgeordnet werden, ohne vorher explizit in einen Bearbeitungsmodus wechseln zu müssen. |
| `v2.0.2` | Drag-and-drop-Reihenfolge | Umstellung der Waypoint-Sortierung auf direktes Drag-and-drop. |
| `v2.0.3` | PTT pausiert Waypoint-Audio | Wenn PTT gedrückt wird, pausiert laufendes Waypoint-Audio und wird danach korrekt fortgesetzt. |
| `v2.0.4` | Atmo-Hintergrundwiedergabe | Erste Anpassungen, damit Atmo-Streams beim Minimieren der App weiterlaufen. |
| `v2.0.5` | Atmo-Service-Hotfix | Stabilisierung des Hintergrunddienstes für Atmo-Wiedergabe. |
| `v2.0.6` | Atmo-Hintergrund-Fix | Weitere Korrekturen am Hintergrundverhalten der Atmo-Wiedergabe. |
| `v2.0.7` | Service-eigener Atmo-Player | Der Atmo-Player wurde in den Service verlagert, damit Streams zuverlässig im Hintergrund weiterlaufen. |
| `v2.0.8` | Stream-Playlist | Erweiterung von Atmo um eine richtige Stream-Playlist statt nur einer einzelnen URL. |
| `v2.1.0` | PTT-Recorder | Einführung der Recorder-Funktion für PTT-Notizen. |
| `v2.1.1` | PTT-Aufnahmen anhören und zuweisen | Aufnahmen können in der Bibliothek angehört und Wegpunkten zugewiesen werden; neue Wegpunkte können aus Aufnahmen erstellt werden. |
| `v2.1.2` | Automatisches Speichern | Nach dem Loslassen der PTT wird ohne störende Nachfrage automatisch im Hintergrund gespeichert. |
| `v2.1.3` | Sichtbarer Löschen-Button | Die PTT-Aufnahmen-Bibliothek erhielt einen klar sichtbaren Löschen-Button pro Aufnahme. |
| `v2.4.0` | MapLibre Engine Cutover | Aktiver Renderer im Explorer wurde auf MapLibre Native umgestellt. osmdroid bleibt nur noch als interner Fallback erhalten. |
| `v2.4.1` | Map-Stile und Terrain | Modern hell, Dunkel, Topografisch, Terrain/3D und Satellit als auswählbare Stile (persistent). |
| `v2.4.2` | Explorer-Routenplanung | Eigener Routenplaner direkt im Explorer: Start/Via/Ziel aus mehreren Quellen, OSRM-Routing optional, Planlinien-Fallback ohne Endpunkt, Routen als Tour-Entwurf speicherbar. |
| `v2.4.3` | Routenplaner Layout-Hotfix | Reines UI-/Layout-Fix: BottomSheet wird scrollbar, respektiert die System-Navigationsleiste (`navigationBarsPadding`), und die primären Aktionen 'Route berechnen' / 'Planlinie' liegen in einer Sticky Bottom Action Bar oberhalb der Gestenleiste. Keine neuen Features, keine API-Änderungen. |
| `v2.4.4` | Routenplaner Endpunkt-Hotfix | „Route berechnen" ist nicht mehr stumm/grau, wenn kein Endpunkt gesetzt ist: der Button reagiert mit klarem Statushinweis. Im Sheet steht zusätzlich ein One-Tap-Button „OSRM-Demo nutzen", der den öffentlichen Testserver hinterlegt. Die Endpunkt-URL wird normalisiert — sowohl `https://router.project-osrm.org` als auch die vollständige `/route/v1/driving`-Variante werden akzeptiert (keine Doppelprefixe). Fehler werden in Deutsch mit Detail angezeigt. Keine Layout-Regressionen. |
| `v2.4.5` | Karten-UX-Hotfix Clip-Linie und Planlinie | Reiner Karten-UX-Hotfix. Der Clip-Längenabschnitt beginnt jetzt AM Waypoint und erstreckt sich nach vorne entlang der Route/Track-Geometrie — nicht mehr symmetrisch um den Projektionspunkt. Damit wirkt der Waypoint visuell als Trigger-Start des Clips. Zusätzlich wird die Luftlinie/Planlinie nur noch angezeigt, wenn keine berechnete Route vorhanden ist; die Doppeldarstellung von Route und Planlinie ist entfernt. Legende im Routenplaner spiegelt den aktiven Layer (Route ODER Planlinie). Routing-/Endpunkt-Verhalten und Layout aus v2.4.4/v2.4.3 unverändert. |
| `v2.5.36` | MapLibre Phantom-Layer-Fix | Root-Cause-Fix der weißen Phantom-GPX-Linie im neutralen Standard-Explorer (0 Wegpunkte). Ursache: `currentTrack.isNotEmpty()` in `visibleTrack` feuerte vor der `isNeutralStandard`-Prüfung, weil `loadPersistedTrackForCurrentTour` den TrackRecordingManager auch für DEFAULT_TOUR_NAME befüllte. Fix: (1) `isNeutralStandard`-Guard vor `currentTrack.isNotEmpty()` verschoben; (2) ViewModel befüllt den Manager-Track nicht mehr für die neutrale Standardtour. Alle echten Touren, laufende Aufzeichnungen und aktive Drafts unverändert. Versionscode 90. |
| `v2.4.6` | Persistente Tourrouten | Reiner Datenmodell-/Persistenzschritt. Eine Tour kann eine dauerhaft gespeicherte Route besitzen (Start, Ziel, Via, Geometrie, Profil, Endpunkt/Quelle, Distanz/Dauer, Zeitstempel). Routenplaner kann die berechnete Route oder die Planlinie an die aktuelle Tour binden („Tourroute speichern/ersetzen/löschen"). Clipabschnitte folgen primär der frisch berechneten Route, dann der gespeicherten Tourroute, dann dem Track, zuletzt einer Planlinie — keine freien Linien. Wegpunkte bleiben Bausteine ohne fest verdrahtete Route und lassen sich später in andere Touren kopieren. Rückwärtskompatibel: bestehende JSON/Backups ohne Tourroute laden weiterhin; Backup-Export/Import nehmen Tourrouten mit. Versionscode 53. |
| `v2.6.2` | Route-Persistenz-Fix | Berechnete Route/Tourlinie bleibt beim Workspace-Wechsel erhalten. Root Cause: `routeLine` lebte nur im Compose-State (remember) und wurde beim Verlassen des Explorers verworfen. Fix: (1) `currentSessionRoute` StateFlow im ViewModel speichert die zuletzt berechnete Route tour-gebunden. (2) Nach erfolgreicher OSRM-Berechnung wird die Route via `setCurrentSessionRoute()` im ViewModel gesichert und gleichzeitig dauerhaft als `TourRoute` persistiert. (3) `LaunchedEffect(selectedTour)` stellt beim Zurückkehren die Route wieder her — statt des bisherigen `LaunchedEffect(selectedTour, activeTourRoute?.id)`, das beim Auto-Speichern sofort wieder zurücksetzte. (4) Planlinie und Tourverlauf-Begriffe aus v2.6.1/v2.6.0 unverändert. versionCode 105. |
| `v2.7.0` | Tourverlauf-Editor | Neues TourverlaufEditorSheet (v2.7.0): Verlaufspunkte manuell auf der Karte setzen (Tipp-Modus oder Kartenmitte), letzten Punkt entfernen, Verlauf löschen, Verlaufspunkt als Audio-Wegpunkt erstellen. Einklappbarer Online-Routing-Abschnitt. Race-Guard (v2.7.1) gegen zu frühes Auto-Save (manualRouteInitialized). versionCode 106/107. |
| `v2.7.2` | Tourverlauf-Persistenz-Fix | Root Cause: routePlan (Start/Via/Ziel des RoutePlannerSheet) lebte nur im lokalen Compose-State und wurde beim Workspace-Wechsel verloren. Planlinie („Planlinie zeigen“) wurde nicht als Session-Route persistiert. Fix: (1) Neuer currentSessionPlan StateFlow im ViewModel — speichert den RoutePlan tour-gebunden und überlebt Workspace-Wechsel. (2) onPlanChange → viewModel.setCurrentSessionPlan(). (3) onShowPlanline → buildTourRouteFromState() + setCurrentSessionRoute() (wie OSRM). (4) LaunchedEffect(selectedTour): restauriert Plan aus Session, kein blindes Reset. (5) Kalt-Start-Restore: activeTourRoute mit Start/Destination wird als RoutePlan wiederhergestellt. (6) manualRouteInitialized-Guard aus v2.7.1 unverändert. versionCode 108. |
| `v2.7.9` | Explorer State Isolation | v2.7.9 — Explorer-State-Isolation: LaunchedEffect(selectedTour) im ExplorerScreenMapLibre räumt alle Waypoint-Dialog-States (actionMenuWaypoint, editDialogWaypoint, showEditDialog, deleteConfirm, tapMode) bei Tour-Wechsel sofort auf, damit keine alte Wegpunkt-Referenz in den Dialog der neuen Tour gelangen kann. Marker der Vorgänger-Tour werden explizit vor dem waypoints-Redraw-Effekt gelöscht. versionCode 115. |
| `v2.7.10` | Waypoint-Persistence-Fix (Unbenannte Tour) | Root Cause: selectDefaultTour() setzte bei jedem Einstieg in den Explorer aus der Audio-Bibliothek/Home blind auf DEFAULT_TOUR_NAME („Standard“). War zuvor eine spontane „Unbenannte Tour“ angelegt worden, filterten Waypoints und Explorer-Karte nach „Standard“ und zeigten leere Ansicht. Fix: selectDefaultTour() prüft synchron, ob echte (nicht-Standard) Touren in _tourList vorhanden sind. Ist das der Fall, wird sofort zur ersten echten Tour gewechselt statt auf DEFAULT zu fallen und auf den asynchronen combine-Kollektor (v2.7.5) zu warten, der den Reset dann ggf. rückabwickelte. Keine Regressionen: Lizenz, Backup, Multiclip, PTT, Atmo, Bibliothek, MapLibre, POIs, Tourverlauf, GPS-Track, Explorer-State-Isolation. versionCode 116. |
| `v2.7.8` | Unbenannte Tour + Planlinie Auto-Render | (1) 'Spontane Tour' → 'Unbenannte Tour': UI-String explorer_spontane_tour und createSpontaneousTour()-Basis geändert, Schlüssel/Funktionsname intern beibehalten. (2) Root Cause Planlinie: savedRouteLine wurde korrekt befüllt, aber nicht in routeLine übertragen; routeLine ist die primäre Zeichnungsquelle im draw-LaunchedEffect. Bei Kaltstart und ohne Button-Druck fehlte der Transfer. Fix 1: Neues LaunchedEffect(savedRouteLine, selectedTour) überträgt savedRouteLine → routeLine, wenn routeLine leer und keine Session-Route vorhanden ist. Fix 2: Auto-Persistenz-Effekt (LaunchedEffect routePlanline) ruft zusätzlich setCurrentSessionRoute() auf, statt nur saveTourRouteFor() — füllt Session-Route auch ohne Button. Fix 3: activeTourRoute als zusätzlicher Key im Zeichen-LaunchedEffect. Keine Regressionen. versionCode 114. |
| `v2.7.26` | Persistent Map Preferences | Globale Kartenpräferenzen dauerhaft gespeichert: Wegpunkt-Marker, Audio-Radius/Reichweite, GPS-Track/Draft-Linien, POIs-automatisch-nachladen jetzt persistent (MapStyleStore). Bestehende Persistenz (baseStyle, showAudioLength, showAudioLines, POI-Kategorien, POI-Namen, perspectiveTilt, Standort-Folgen) unverändert erweitert. Standort-Folgen entschärft: Jede manuelle Kartenverschiebung deaktiviert Follow sofort (statt nur bei >40m Distanz). Kein Auto-Zentrieren beim nächsten GPS-Fix. Beim Öffnen des Explorers: Kamera auf Tour/Wegpunkte, nicht auf Live-Standort (sofern Follow aus). Keine Regressionen. versionCode 132. |
| `v2.7.39` | Audio-Stabilitätsfix ohne manuelle Zwangspause | Die in v2.7.37 eingeführte feste Stille-Pause zwischen Clips/Wegpunkten im manuellen Tour-Play wurde entfernt, weil sie auf Samsung-Geräten zu uneindeutigem Player-State und der Meldung „Audio konnte nicht abgespielt werden“ führen konnte. Manueller Auto-Advance startet den nächsten aktiven Clip/Wegpunkt wieder direkt. GPS-Wiedergabe bleibt getrennt und wurde nicht verändert. Keine Änderung an Lizenz, Backup, Karten/Explorer, PTT, Atmo oder Hintergrundwiedergabe. versionCode 145. |
## Release-Links
- `v1.6.2-osm-layout`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v1.6.2-osm-layout
- `v2.0.0`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.0
- `v2.0.1`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.1
- `v2.0.2`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.2
- `v2.0.3`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.3
- `v2.0.4`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.4
- `v2.0.5`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.5
- `v2.0.6`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.6
- `v2.0.7`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.7
- `v2.0.8`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.0.8
- `v2.1.0`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.1.0
- `v2.1.1`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.1.1
- `v2.1.2`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.1.2
- `v2.1.3`: https://gitea.nesohub.org/marcel/GPS2Audio/releases/tag/v2.1.3
## Installationshinweis
Die signierten Release-APKs sind als Update-Linie gedacht. Für Updates muss eine neuere Version über eine bestehende Installation installiert werden, die mit demselben Release-Keystore signiert wurde. Debug-Builds und parallel installierbare Zwischenstände gehören nicht zur offiziellen Update-Linie.
## Sicherheits- und Archivhinweis
Die hochgeladenen Release-Pakete enthalten APK, Quellcode-ZIP und Handoff beziehungsweise Release Notes. Keystore-Dateien, Passwörter und lokale Build-Geheimnisse gehören nicht in das Repository und wurden nicht als Release-Anhang veröffentlicht.
## Empfohlene Nutzung
Für neue Nutzer ist `v2.1.3` der beste Einstieg. Ältere Versionen bleiben als Archiv erhalten, damit Entwicklungsschritte, Fehlerbehebungen und Zwischenstände nachvollziehbar bleiben.
## v2.7.17 — Route-first Explorer (2026)
**GPS2Audio v2.7.17** führt den konservativen UI-/Bedienlogik-Umbau „Route-first Explorer" ein.
### Was ist neu
- **Route zuerst**: Der mentale Ablauf ist jetzt „Route planen → Tourpunkte setzen → Audio hinzufügen".
- **Tourpunkt-Konzept**: Verlaufspunkte werden als „Tourpunkte" bezeichnet. Ein Tourpunkt kann zunächst nur die Route formen; Audio wird bewusst nachträglich hinzugefügt.
- **Klarere Labels**: „Route planen" statt „Tourverlauf planen", „Routenlinie anzeigen" statt „Planlinie zeigen", „Audio hier hinzufügen" statt technischem „Als Audio-Wegpunkt erstellen".
- **Route bearbeiten**: Der Tourverlauf-Editor heißt nun „Route bearbeiten" klarer, weniger abschreckend.
- **Abwärtskompatibel**: Bestehende Audio-Wegpunkte und Verlaufslinien aus v2.7.16 bleiben vollständig erhalten.
### Geschützte Funktionen
Keine Änderungen an: MapLibre-Rendering, Waypoint-Rendering, routeRenderKey/waypointRenderKey/overlayRenderNonce, Planlinie-Autorender, Explorer-Kontext-Isolation, POI-Autoload, Kartenstile, Lizenzsystem, Backup/Restore, Multiclip, manuelle Wiedergabe, GPS-Aufzeichnung.
### Build-Details
- versionCode: 123
- versionName: 2.7.17
## v2.7.18 — Unified Tour Layers (2026)
**GPS2Audio v2.7.18** konsolidiert die Karten-Darstellung zu einem einheitlichen Tour-System.
### Was ist neu
- **Einheitliche Tourlinie**: Routing, manuelles Zeichnen und gespeicherte Tourlinie wirken jetzt als ein System. Eine manuell gezeichnete Route wird im gespeicherten Zustand als grüne Tourlinie dargestellt (wie eine OSRM-berechnete Route) — keine verwirrende Doppellinie mehr.
- **Bearbeitungs-Vorschau nur im Zeichenmodus**: Die violette Vorschaulinie erscheint nur noch, während der Nutzer aktiv Verlaufspunkte zeichnet (manualRouteMode=true). Im Normalbetrieb ist die Karte übersichtlicher.
- **Verlaufspunkt-Marker reduziert**: Kleine Punkt-Marker für Verlaufspunkte erscheinen ebenfalls nur im Bearbeitungsmodus — reduziert visuelles Rauschen im Explorer.
- **Planungs-Vorschau bleibt erkennbar**: Die orange/gedimmte Planlinie (Routing-Werkzeug) bleibt visuell als Werkzeug-Vorschau erkennbar.
- **Abwärtskompatibel**: Kein Datenmodell-Umbau, bestehende Routen/Wegpunkte unverändert.
### Geschützte Funktionen
Keine Änderungen an: experimentellem Routing/Route berechnen, Route planen, Routenlinie anzeigen, Route bearbeiten/manuelles Zeichnen, Audio-Waypoints, Multiclip, manuelle Wiedergabe, PTT, Atmo, MapLibre Initial-Render-Fixes, Planlinie-Autorender, routeRenderKey/waypointRenderKey/overlayRenderNonce, Explorer-Kontext-Isolation, POI-Autoload, Kartenstile, Lizenzsystem, Backup/Restore.
### Build-Details
- versionCode: 124
- versionName: 2.7.18
## v2.7.19 — Tourplaner Integration Fix (2026)
**GPS2Audio v2.7.19** behebt den Verlust von Start-, Ziel- und Via-Punkten im Tourplaner und integriert das manuelle Zeichnen als Werkzeug des Tourplaners.
### Was ist neu
- **Fix: Start/Ziel/Via dauerhaft gespeichert**: Der Tourplaner schreibt den Routenplan jetzt sofort in die Datenbank, sobald Start und Ziel gesetzt sind. Bisher wurde nur die In-Memory-Session gespeichert — nach einem Prozess-Kill (App-Neustart) war der Plan verloren. Jetzt bleibt er auch nach Neustart vollständig erhalten.
- **Manuelles Zeichnen im Tourplaner**: Die Schaltfläche „Zeichenmodus öffnen“ ist jetzt direkt im Tourplaner (RoutePlannerSheet) eingebettet. Routing und manuelles Zeichnen sind gleichwertige Bearbeitungsmethoden im selben Planer.
- **Kein Rückschritt beim Doppellinien-Fix**: Die violette Bearbeitungs-Vorschau erscheint weiterhin nur im aktiven Zeichenmodus (wie in v2.7.18).
- **Abwärtskompatibel**: Kein Datenmodell-Umbau, bestehende Routen/Wegpunkte unverändert.
### Geschützte Funktionen
Keine Änderungen an: experimentellem Routing/Route berechnen, Routenlinie anzeigen, Route bearbeiten/manuelles Zeichnen, Audio-Waypoints, Multiclip, manuelle Wiedergabe, PTT, Atmo, MapLibre Initial-Render-Fixes, Planlinie-Autorender, routeRenderKey/waypointRenderKey/overlayRenderNonce, Explorer-Kontext-Isolation, POI-Autoload, Kartenstile, Lizenzsystem, Backup/Restore.
### Build-Details
- versionCode: 125
- versionName: 2.7.19
## v2.7.20 — Flexible Route Shaping (2026)
**GPS2Audio v2.7.20** führt flexible Routenformung per Karten-Tap ein.
### Was ist neu
- **AddViaPoint-Modus**: Neuer TapMode für direkte Zwischenpunkt-Setzung per Karten-Tap aus dem Routenplaner heraus.
- **Intuitiver Fallback**: 1. Tap = Start, 2. Tap = Ziel, weitere Taps = Zwischenpunkte.
- **Via-Sektion**: Im Tourplaner klar als „Zwischenpunkte (Route formen)" bezeichnet.
### Build-Details
- versionCode: 126
- versionName: 2.7.20
## v2.7.21 — Waypoint Preservation Fix (2026)
**GPS2Audio v2.7.21** behebt kritischen Datenverlust: Audio-Wegpunkte innerhalb einer Tour wurden beim Öffnen des Routenplaners unter bestimmten Bedingungen gelöscht.
### Root Cause
Race-Condition in `duplicateTour()`, `deleteTour()` und `renameTour()`: Diese Funktionen lasen `_waypoints.value` aus dem In-Memory-State (MutableStateFlow). Wenn der DataStore-Erstladevorgang noch nicht abgeschlossen war, enthielt `_waypoints.value` noch die initiale leere Liste. Ein `saveAll(emptyList() + newWps)` überschrieb dann alle bestehenden Wegpunkte aller Touren.
Zusätzlich: Kein globaler Schutz vor einem `saveAll([])` bei nicht-leerer DataStore-Wegpunktliste.
### Fixes
1. **`WaypointStore.saveAll()` Preservation-Guard**: Wenn die übergebene Liste leer ist, aber die DataStore-Wegpunktliste nicht-leer ist, wird der Schreibvorgang blockiert (atomarer Check in `dataStore.edit`). Verhindert versehentlichen Totalverlust.
2. **`WaypointStore.saveAllForced()`**: Neue Methode für explizite Lösch-/Restore-Operationen, die den Preservation-Guard umgehen dürfen.
3. **Race-Condition-Fix in `duplicateTour`/`deleteTour`/`renameTour`**: Lesen jetzt mit `repository.waypoints.first()` direkt aus DataStore statt aus dem möglicherweise noch leeren `_waypoints.value`.
4. **AddViaPoint-Pfad (v2.7.20) bestätigt sicher**: Kein Waypoint-Speicherpfad wird durch Route-Planen, AddViaPoint oder Planlinie-Auto-Persistenz ausgelöst.
5. **Architektonische Invariante dokumentiert**: `saveTourRoute`/`saveTourRouteFor` schreiben ausschließlich in `KEY_TOUR_ROUTES`, nie in `KEY_WAYPOINTS`.
### Geschützte Funktionen
Alle Funktionen aus v2.7.20 unverändert: AddViaPoint, flexible Routenformung, v2.7.19 Start/Via/Ziel-Persistenz, v2.7.18 Doppellinie-Fix, Audio-Waypoints, Multiclip, manuelle Wiedergabe, PTT, Atmo, MapLibre-Render-Fixes, Planlinie-Autorender, routeRenderKey/waypointRenderKey/overlayRenderNonce, POI-Autoload, Kartenstile, Lizenzsystem, Backup/Restore.
### Build-Details
- versionCode: 127
- versionName: 2.7.21
---
## v2.7.22 — Saved Route Render Fix
**Problem**: Ein gespeicherter Tourverlauf (manuell gezeichnet, Quelle MANUAL) war im RoutePlannerSheet sichtbar (Karte mit Buttons "Tourverlauf ersetzen/löschen"), wurde aber visuell nicht als Linie auf der Karte angezeigt. Zusätzlich zeigte der Tourplaner "Noch keine Route. Routenlinie anzeigen genügt — Online-Routing ist optional."
**Root Cause**: `savedRouteLine` (die Hilfsliste, aus der die Kartenrenderschicht die grüne Tourlinie zeichnet) schloss MANUAL-Routen explizit mit `emptyList()` aus (Zeile 290, v2.5.3-Kommentar). Die ursprüngliche Intention war, Doppellinien zu verhindern (v2.7.18). Aber v2.7.18 hat die Bearbeitungs-Vorschau (manualRoutePolylines, violett) bereits auf `manualRouteMode == true` beschränkt. Damit war der Ausschluss in `savedRouteLine` überflüssig und verhinderte die korrekte Darstellung.
**Fixes (ExplorerScreenMapLibre.kt)**:
1. **Fix 1**`savedRouteLine`-Berechnung: MANUAL nicht mehr pauschal mit `emptyList()` ausgeschlossen. Stattdessen gleiches Verhalten wie OSRM: Route wird als Punkte zurückgegeben, Phantom-Guard auf Standardtour bleibt erhalten.
2. **Fix 2**`LaunchedEffect(savedRouteLine)`: MANUAL-Quellen überspringen (wie PLANLINE), damit MANUAL via `hasSavedRoute`-Pfad grün gezeichnet wird (nicht blau als OSRM-Route). Kein `routeLine`-Load für MANUAL.
3. **Fix 3** — RoutePlannerSheet-Aufruf: `hasRoute = routeLine.size >= 2 || savedRouteLine.size >= 2` — "Noch keine Route" erscheint nicht mehr, wenn eine gespeicherte MANUAL- oder OSRM-TourRoute vorhanden ist.
### Geschützte Funktionen
Alle Funktionen aus v2.7.21 unverändert: Waypoint-Preservation-Guard, AddViaPoint, flexible Routenformung, v2.7.19 Start/Via/Ziel-Persistenz, v2.7.18 Doppellinie-Fix (manualRouteMode-Guard bleibt), Audio-Waypoints, Multiclip, manuelle Wiedergabe, PTT, Atmo, MapLibre-Render-Fixes, Planlinie-Autorender, routeRenderKey/waypointRenderKey/overlayRenderNonce, POI-Autoload, Kartenstile, Lizenzsystem, Backup/Restore.
### Build-Details
- versionCode: 128
- versionName: 2.7.22
---
## v2.7.23 — Route Planner Flow Fix
**Problem**: Der Routenplaner zeigte eine violette/orange Planlinie auf der Karte, aber diese konnte nicht sinnvoll als Tourverlauf gespeichert oder mit dem Tourverlauf verknüpft werden. Audio-Wegpunkte ließen sich zwar als Start/Ziel/Via wählen, aber der Weg von der Planlinie zum persistierten Tourverlauf war unklar.
**Root Cause**: Es fehlte ein direkt zugänglicher, klar benannter "Als Tourverlauf übernehmen"-Button in der Sticky Action Bar des Tourplaners. Die vorhandene `TourRouteStatusCard` im scrollbaren Bereich war nicht sichtbar genug, und die Buttons "Speichern"/"Ersetzen" dort waren bei bestehenden Routen in der Karte verborgen. Zusätzlich nutzte `onShowPlanline` und `onSaveTourRoute` `routePlanline` aus der Compose-Remember-Chain, ohne einen Inline-Fallback für den Fall, dass die Recomposition noch nicht stattgefunden hatte.
**Fixes**:
1. **Neuer "Als Tourverlauf übernehmen"-Button** in der Sticky Action Bar (neben "Routenlinie anzeigen"). Aktiviert wenn `hasPlanline || hasRoute`. Speichert direkt — kein zusätzliches Scrolling nötig.
2. **`onAdoptAsTourRoute`-Callback** in ExplorerScreenMapLibre: Wählt OSRM-Route (wenn vorhanden) oder Planlinie als TourRoute-Quelle, schreibt in DB und Session-Route, zeigt Statusmeldung.
3. **Inline Planline-Fallback**: `onShowPlanline`, `onSaveTourRoute`, `onReplaceTourRoute` berechnen die Planline-Koordinaten inline aus `routePlan.orderedStops()` als Fallback, falls `routePlanline` (remember-computed) noch leer ist.
4. **setCurrentSessionRoute zusätzlich bei Save/Replace**: Session-Route wird nach Speichern auch im ViewModel gesetzt, damit Workspace-Wechsel sofort die neue Route kennt.
5. **TourRouteStatusCard-Hinweis**: Zeigt proaktiv `route_planner_adopt_planline_hint` wenn Planlinie vorhanden aber noch kein gespeicherter Verlauf.
### Audio-Wegpunkte als Planpunkte
- Auswahl eines Audio-Wegpunkts für Start/Ziel/Via: unverändert über WaypointPickerDialog → applyStopToRole() → onPlanChange().
- Keine Waypoint-Löschung, keine Duplikation (Waypoint-Preservation-Guard aus v2.7.21 bleibt aktiv).
- Nach Auswahl: routePlanline auto-computed, hasPlanline=true, Buttons aktiv.
### Geschützte Funktionen
Alle Funktionen aus v2.7.22 unverändert: Saved Route Render Fix, Waypoint-Preservation-Guard, AddViaPoint, flexible Routenformung, v2.7.19 Start/Via/Ziel-Persistenz, v2.7.18 Doppellinie-Fix, Audio-Waypoints, Multiclip, manuelle Wiedergabe, PTT, Atmo, MapLibre-Render-Fixes, Planlinie-Autorender, routeRenderKey/waypointRenderKey/overlayRenderNonce, POI-Autoload, Kartenstile, Lizenzsystem, Backup/Restore.
### Build-Details
- versionCode: 129
- versionName: 2.7.23
---
## v2.7.24 — Tourverlauf UX Polish
Tourverlauf-UX-Polish: Verbesserte Nutzererfahrung beim Verwalten gespeicherter Tourverlauf-Linien im Explorer. Keine neue Funktionalität — nur UX-Feinschliff und Code-Qualität.
### Build-Details
- versionCode: 130
- versionName: 2.7.24
---
## v2.7.25 — Tourline Initial Render Fix
**Problem**: Die gespeicherte Tourlinie erschien beim ersten Öffnen des Explorers nicht sofort auf der Karte. Erst eine spätere UI-Interaktion (z.B. Abspielen eines Clips) löste den Render aus.
**Root Cause**: Zwei zusammenwirkende Timing-Probleme:
1. **Doppelter Style-Load**: `LaunchedEffect(layerState.baseStyle, mapStyleSettings.perspectiveTilt, styleReady)` enthielt `styleReady` als Key. Wenn der initiale Style-Load (im `AndroidView` factory Callback) `styleReady=true` setzte, feuerte dieser Effect erneut und rief `ml.setStyle()` ein zweites Mal auf. Das wischte alle bereits gezeichneten Polylines weg und trigerred einen zweiten asynchronen Style-Load.
2. **Late activeTourRoute**: `activeTourRoute` wird asynchron aus der Datenbank geladen (via `StateFlow` im ViewModel). Kam der zweite Style-Load vor dem DB-Load ab, war `savedRouteLine` noch leer. Der `overlayRenderNonce`-Mechanismus hatte bereits gefeuert, bevor die Route verfügbar war. Obwohl `savedRouteLine` als Key im Overlay-`LaunchedEffect` gelistet ist, konnten Compose-Snapshot-Caching-Effekte das erneute Feuern verhindern.
**Fixes**:
1. **`styleReady` aus Style-Change-LaunchedEffect-Keys entfernt** (v2.7.25): Verhindert den Doppel-Reload. Der Effect feuert jetzt nur noch bei echten `baseStyle`- oder `perspectiveTilt`-Änderungen.
2. **Dedizierter `LaunchedEffect(savedRouteLine.size, styleReady, mapLibreMap)`** (v2.7.25): Feuert wenn `savedRouteLine` mindestens 2 Punkte hat UND Style bereit UND Map initialisiert. Inkrementiert `overlayRenderNonce`, sodass der Zeichnungseffekt garantiert neu startet — unabhängig davon, wann `activeTourRoute` aus der DB ankommt.
**Nicht geändert**:
- Speicherlogik (keine Änderungen an `saveTourRouteFor`, `activeTourRoute`, `_tourRoutes`)
- v2.7.24 Tourverlauf UX Polish
- v2.7.23 'Als Tourverlauf übernehmen' Flow Fix
- v2.7.22 Saved Route Render Fix
- v2.7.21 Waypoint Preservation Guard
- v2.7.18 Doppellinie-Fix (manualRouteMode-Guard)
- Alle anderen Funktionen (AddViaPoint, OSRM, PLANLINE, MANUAL, Audio-Waypoints, PTT, Atmo, Backup, Lizenzsystem)
### Build-Details
- versionCode: 131
- versionName: 2.7.25
---
## v2.7.30 — MapLibre Overlay Rebuild Fix
**Problem (Nutzerbericht nach v2.7.29)**: "nein das hat nichts verändert. Das ist der Live Standort und die Waypoints bzw. Planlinie wird nicht angezeigt." Screenshot zeigte nur einen hellen/weißen Kreis als Live-Standort, keine Waypoint-Marker, keine Planlinie.
**Root-Cause-Analyse (warum v2.7.29 nicht wirkte)**:
1. **yield() zu kurz**: Das einzige `yield()` (Wartedauer: 1 Frame ≈ 16ms) nach `styleReady` in den Overlay-LaunchedEffects war nicht ausreichend für MapLibres GL-Thread und AnnotationManager-Initialisierung nach `setStyle()`. `addMarker()` und `addPolyline()` schlugen still fehl — keine Exception, aber Rückgabewert null/leer.
2. **Kein Retry-Mechanismus**: Wenn der erste Render-Versuch (150ms nach Style-Load) scheiterte, gab es keinen weiteren Versuch. Nur Nutzerinteraktion (State-Änderung) löste einen neuen Render aus.
3. **runCatching fehlte**: Fehlschlagende `addMarker()`/`addPolyline()`-Aufrufe warfen keine Exception in die Coroutine, aber gaben null zurück. Ohne `runCatching` konnte ein unerwarteter Fehler die Coroutine abbrechen und alle nachfolgenden Zeichenoperationen verhindern.
4. **clearAllAnnotationsCaches Lücke**: `planlinePolylines` und `routeStopMarkers` wurden beim Style-Cleanup (vor `setStyle()`) nicht geleert — veraltete Referenzen blieben im Cache und führten zu nutzlosen `removePolyline()`-Aufrufen auf ungültigen Objekten.
5. **v2.7.29 Puck-Fix: Early-Return-Problem**: `lastLat ?: return@LaunchedEffect` vor `yield()` bedeutete: Hatte der Nutzer beim Style-Load noch keinen GPS-Fix, blieb der Puck dauerhaft leer (bis zum nächsten GPS-Fix). Wurde der Fix vor GPS-Empfang aufgerufen, war `lastLat` null → sofortiger Return → kein Puck gezeichnet.
**Fixes v2.7.30**:
1. **delay(150ms) statt yield()** in beiden Overlay-LaunchedEffects (Waypoints/Tracks + Routen/Planline): Gibt dem AnnotationManager ausreichend Zeit nach Style-Load.
2. **Zentraler Retry-Mechanismus (500ms)**: `LaunchedEffect(styleReady, mapLibreMap)` wartet 500ms nach jedem Style-Ready und inkrementiert `overlayRenderNonce` ein zweites Mal. Ergebnis: Zwei Render-Versuche — bei 150ms und bei 650ms nach Style-Load. Der zweite ist garantiert erfolgreich, da der AnnotationManager nach 500ms sicher bereit ist.
3. **delay(200ms) + runCatching im Puck-Rehydrate-LaunchedEffect**: Puck-Marker wird robuster gezeichnet, Fehler werden abgefangen.
4. **runCatching um alle addMarker/addPolyline-Aufrufe**: In `drawExplorerOverlaysMapLibre` und der Route-LaunchedEffect — verhindert silent-Crashes und gibt dem 500ms-Retry die Chance, alle fehlgeschlagenen Overlays nachzuzeichnen.
5. **clearAllAnnotationsCaches erweitert**: `planlinePolylines` und `routeStopMarkers` werden jetzt ebenfalls beim Style-Cleanup geleert (neue optionale Parameter).
**Nicht geändert**:
- v2.7.28 Map Style Apply Fix (appliedBaseStyle/appliedPerspectiveTilt guard)
- v2.7.27 Kartenpräferenz-Persistenz
- v2.7.26 Standort-Folgen-Fix
- v2.7.25 Initial-Render-Fix (savedRouteLine.size LaunchedEffect)
- v2.7.24 UX Polish, v2.7.23 Tourverlauf übernehmen
- v2.7.21 Waypoint Preservation Guard
- Alle Funktionen: Routenplanung, POIs, Kartenstile, Audio-Waypoints, Multiclip, PTT, Atmo, Lizenzsystem, Backup/Restore
### Build-Details
- versionCode: 136
- versionName: 2.7.30