# GPS2Audio v2.7.32 — Handoff Two regression fixes on top of v2.7.31. Targeted changes only; no refactors. ## 1. Tour ordering: first & last visible tour could not be moved **Symptom:** In the audio library "Touren ordnen" dialog, the first and last tour entries stayed fixed; only middle tours moved. **Root cause:** `TourReorderDialog` is fed `viewModel.visibleTourList` (the Standard/blueprint tour `DEFAULT_TOUR_NAME` is filtered out of the UI), but `WaypointViewModel.moveTour(from, to)` operated on raw `_tourList` indices, which still include `DEFAULT_TOUR_NAME`. When the hidden Standard tour sat at index 0, every visible index was off by one — moving "visible 0" actually moved the hidden Standard tour, so the first/last real tours appeared locked. **Fix:** `moveTour` now interprets `from`/`to` in the **visible** index space (real tours only), performs the move there, then merges the result back into `_tourList`, keeping the hidden `DEFAULT_TOUR_NAME` at its original relative position. Hidden-Standard behavior is preserved (still not shown as an editable tour); all real tours — including first and last — are now freely sortable. - File: `app/src/main/kotlin/de/waypointaudio/viewmodel/WaypointViewModel.kt` - Function: `moveTour(fromIndex, toIndex)` ## 2. Audioplayer: custom player no longer appeared during manual playback **Symptom:** Tracks/clips still played, but the established GPS2Audio player (`ClipDetailSheet` / `ClipDetailFullscreen`) no longer became visible when a track was started manually. **Root cause:** The detail player is gated by `clipDetailWaypointId`. It was only set by tapping a waypoint card (`onOpenDetail`) or by the in-sheet auto-follow effect (which only runs while the sheet is already open). Starting playback via a card's play button (`manualPlaySingle`) or the `ManualPlayerBar` never set `clipDetailWaypointId`, so the player stayed hidden. **Fix:** Added a top-level `LaunchedEffect` in `WaypointListScreen` keyed on the currently-playing waypoint (`singlePlayingWaypointId` for single mode, else `currentPlayable?.waypointId` while `manualPlaying`). When playback begins, it opens the player to the active waypoint if not already showing it. Manual close + same-waypoint replay does not re-open (key unchanged); starting a different waypoint re-opens. Existing auto-follow on clip change and the maximized/minimized toggle are untouched (writes are idempotent, guarded by `!=`). - File: `app/src/main/kotlin/de/waypointaudio/ui/WaypointListScreen.kt` - Added: `activePlaybackWaypointId` + `LaunchedEffect` after the `clipDetailFullscreen` state (~line 165). ## Version - `app/build.gradle.kts`: `versionCode 137 → 138`, `versionName 2.7.31 → 2.7.32` with a changelog comment block. ## Build & test - Command: `./gradlew :app:assembleRelease --no-daemon` - Result: **BUILD SUCCESSFUL** (only pre-existing deprecation warnings: `Divider`, `Icons.Filled.DirectionsBike` — unrelated to these changes). - No ABI splits are configured, so the single APK is the universal build. - Signing: release `signingConfig` from `keystore.properties` (`GPS2Audio_release_keystore_v2.jks`). APK is signed — verified: `Signer #1 certificate DN: CN=GPS2Audio, OU=NesoHub, O=GPS2Audio, ...` (SHA-256 `490511f3…d4e5`). - No unit/instrumented test suite present in the project; verification was build + signature + code-path review. UI was not exercised on a device/emulator in this environment. ## Regression scope (unchanged / preserved) Multi-clip playback, clip navigation, countdown, maximized detail player, background playback, PTT pause behavior, current-tour playback persistence, Explorer, MapLibre, tour line/planline rendering, POI settings, map preferences, licensing gates, backup/import/export, tour duplication, waypoint copy, Atmo, recorder, route planning / manual route drawing — none touched. ## Artifacts - `GPS2Audio_v2.7.32_universal-release-signed.apk` — signed universal release APK. - `GPS2Audio_v2.7.32_src.zip` — clean source (excludes `.gradle`, `.idea`, `.kotlin`, and all `build/` dirs). > Note: the source ZIP retains `keystore.properties` and `local.properties` as > they exist in the repo. `keystore.properties` contains the keystore path and > passwords — strip it before distributing the source externally. ## Changed files 1. `app/src/main/kotlin/de/waypointaudio/viewmodel/WaypointViewModel.kt` 2. `app/src/main/kotlin/de/waypointaudio/ui/WaypointListScreen.kt` 3. `app/build.gradle.kts`