# GPS2Audio v2.5.36 — MapLibre Phantom Layer Fix Handoff ## Release-Übersicht | Feld | Wert | |---|---| | Version | 2.5.36 | | VersionCode | 90 | | applicationId | de.waypointaudio | | APK | GPS2Audio_v2_5_36_maplibre_phantom_layer_fix_universal_signed.apk | | Signatur | v2 (APK Signature Scheme v2), Keystore GPS2Audio_release_keystore_v2.jks | | ABI-Abdeckung | arm64-v8a, armeabi-v7a, x86, x86_64 (universal) | --- ## Problem-Beschreibung **Gemeldeter Bug**: Im Standard-Explorer (selectedTour == DEFAULT_TOUR_NAME, Einstieg aus Home/Audio-Bibliothek) war bei 0 Wegpunkten eine lange weiße GPX-/Track-Linie sichtbar. Der Bug blieb trotz v2.5.35-Guards bestehen. --- ## Root Cause — Konkrete Diagnose Der Fehler hatte **zwei zusammenwirkende Ursachen**: ### Ursache 1: Falsche Reihenfolge in `visibleTrack` (ExplorerScreenMapLibre.kt) In der `when`-Kette für `visibleTrack` wurde `currentTrack.isNotEmpty()` **vor** dem `isNeutralStandard`-Guard geprüft: ```kotlin // v2.5.35 — FEHLERHAFT: val visibleTrack: List = when { isRecording -> currentTrack activeDraft != null -> activeDraft.points currentTrack.isNotEmpty() -> currentTrack // ← feuert zuerst! isNeutralStandard -> emptyList() // ← wird nie erreicht, wenn currentTrack != empty else -> persistedTrack } ``` ### Ursache 2: Manager-Track wird für DEFAULT_TOUR befüllt (WaypointViewModel.kt) `loadPersistedTrackForCurrentTour()` rief `TrackRecordingManager.setTrack(_persistedTrack.value)` auf — auch dann, wenn die aktuelle Tour `DEFAULT_TOUR_NAME` war und kein aktives Recording lief. Damit wurde `currentTrack` (= `TrackRecordingManager.currentTrack`) nicht-leer, was die falsche Prüfung in Ursache 1 auslöste. ```kotlin // v2.5.33 — Problem: setTrack auch für DEFAULT_TOUR: if (TrackRecordingManager.currentTrack.value.isEmpty()) { TrackRecordingManager.setTrack(_persistedTrack.value) // ← für DEFAULT_TOUR verboten! } ``` **Zusammenspiel**: Beim Öffnen des Explorers für DEFAULT_TOUR_NAME wurde der persistierte Track der Standardtour in den TrackRecordingManager geladen → `currentTrack.isNotEmpty()` wurde wahr → die `isNeutralStandard`-Prüfung wurde nie erreicht → Phantom-Linie erschien. --- ## Fix — Implementierte Änderungen ### Datei 1: `app/src/main/kotlin/de/waypointaudio/ui/ExplorerScreenMapLibre.kt` **Änderung**: `isNeutralStandard`-Guard vor `currentTrack.isNotEmpty()` verschoben. ```kotlin // v2.5.36 — KORREKT: val visibleTrack: List = when { isRecording -> currentTrack activeDraft != null -> activeDraft.points // Phantom-Guard VOR currentTrack.isNotEmpty() — bewusste Reihenfolge! isNeutralStandard -> emptyList() currentTrack.isNotEmpty() -> currentTrack else -> persistedTrack } ``` ### Datei 2: `app/src/main/kotlin/de/waypointaudio/viewmodel/WaypointViewModel.kt` **Änderung**: `loadPersistedTrackForCurrentTour()` befüllt den Manager-Track nicht mehr für die neutrale Standardtour. ```kotlin // v2.5.36 — Guard für DEFAULT_TOUR_NAME: val isDefaultNeutral = _selectedTour.value == Waypoint.DEFAULT_TOUR_NAME && !TrackRecordingManager.isRecording.value if (!TrackRecordingManager.isRecording.value) { if (_persistedTrack.value.isNotEmpty() && !isDefaultNeutral) { // Nur für echte Touren: Manager-Track befüllen if (TrackRecordingManager.currentTrack.value.isEmpty()) { TrackRecordingManager.setTrack(_persistedTrack.value) } } else { // Neue/leere Tour ODER neutrale Standardtour → Manager leeren TrackRecordingManager.clearTrack() } } ``` ### Datei 3: `app/src/main/kotlin/de/waypointaudio/ui/ExplorerScreen.kt` (osmdroid-Fallback) **Änderung**: Analog zu ExplorerScreenMapLibre, `isNeutralStandard`-Guard vor `currentTrack.isNotEmpty()` eingefügt. --- ## Untersuchte Linienquellen im Explorer Alle folgenden MapLibre-Linienquellen wurden analysiert: | Quelle | Typ | Neutral Standard (leer?) | Aktive Tour | Laufende Aufzeichnung | |---|---|---|---|---| | `visibleTrack` (GPS-Track/Draft) | Compose-State → Polyline-Annotation | ✓ leer (Fix v2.5.36) | Track sichtbar | Live-Track sichtbar | | `savedRouteLine` (persistente TourRoute) | Compose-State → Polyline-Annotation | ✓ leer (Guard v2.5.35) | Route sichtbar | Route sichtbar | | `manualRoutePoints` (manuell gezeichnet) | Compose-State → Polyline-Annotation | ✓ leer (Guard v2.5.35) | Manuelle Route sichtbar | — | | `routeLine` (OSRM-berechnete Route) | Compose-State → Polyline-Annotation | ✓ leer (wird bei Tour-Wechsel resettet) | Route sichtbar | Route sichtbar | | `routePlanline` (Planlinie/Luftlinie) | Compose-State → Polyline-Annotation | ✓ leer (kein Plan aktiv) | Nur wenn Planer offen | — | | `clipLineGeometry` (Clip-Längenlinien) | Abhängig von obigen | ✓ null → keine Clip-Linien | Entlang Geometrie | Entlang Live-Track | | MapLibre Style JSON Sources | Nur Raster-Tiles + ggf. DEM | Keine GeoJSON-Sources im Style | Keine GeoJSON-Sources | Keine GeoJSON-Sources | **Befund**: Es gibt keine stale GeoJSON-Sources im MapLibre Style. Alle Linien werden als MapLibre Polyline-Annotations (nicht als GeoJSON-Layer) gezeichnet und bei jedem Overlay-Refresh aktiv entfernt und neu gezeichnet. Das Problem war ausschließlich ein Compose-State-Problem. --- ## Verhalten nach Fix | Szenario | Ergebnis | |---|---| | Standard-Explorer, 0 Wegpunkte | Karte leer — keine Phantom-Linie | | Standard-Explorer, persistierter Track vorhanden | Track nicht sichtbar (korrekt) | | Echte Tour mit Wegpunkten | Track, Route, Clip-Linien sichtbar | | Laufende Aufzeichnung (beliebige Tour) | Live-Track sichtbar | | Aktiver Draft | Draft-Track sichtbar | | Tour wechseln | Korrekte Linien der neuen Tour | | Manuelle Route auf echter Tour | Sichtbar | | OSRM-berechnete Route | Sichtbar | --- ## APK-Verifikation ``` apksigner verify --verbose: Verifies Verified using v2 scheme (APK Signature Scheme v2): true Number of signers: 1 aapt dump badging: package: name='de.waypointaudio' versionCode='90' versionName='2.5.36' native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' ``` --- ## Artefakte | Datei | Beschreibung | |---|---| | `GPS2Audio_v2_5_36_maplibre_phantom_layer_fix_universal_signed.apk` | Signierte Universal-APK | | `GPS2Audio_v2_5_36_maplibre_phantom_layer_fix_source.zip` | Quellcode-ZIP (ohne Keystore) | | `GPS2Audio_v2_5_36_maplibre_phantom_layer_fix_handoff.md` | Diese Datei | --- ## Keine Gitea-Veröffentlichung durchgeführt.