Release GPS2Audio v2.7.38 Samsung audio fix

This commit is contained in:
Perplexity Computer
2026-06-22 09:55:44 +00:00
parent 2eeb086481
commit a3382bb0aa
23 changed files with 4914 additions and 1564 deletions
@@ -175,8 +175,45 @@ class WaypointStore(private val context: Context) {
}
}
/** Speichert die gesamte Wegpunktliste. */
/**
* Speichert die gesamte Wegpunktliste.
*
* v2.7.21 — Waypoint-Preservation-Guard:
* Wenn [waypoints] leer ist, aber im DataStore bereits Wegpunkte vorhanden
* sind, wird der Schreibvorgang NICHT ausgeführt. Das verhindert, dass eine
* versehentlich leere oder veraltete In-Memory-Liste (`_waypoints.value`
* aus einem Race-Condition-Fenster) bestehende Wegpunkte überschreibt.
*
* Explizites Leeren (Tour-Löschung, Migration) muss [saveAllForced] verwenden.
*/
suspend fun saveAll(waypoints: List<Waypoint>) {
context.dataStore.edit { prefs ->
// v2.7.21 — Preservation Guard: nie eine leere Liste über eine
// nicht-leere Liste schreiben. Schutz gegen Race-Condition-Verlust.
if (waypoints.isEmpty()) {
val existingJson = prefs[KEY_WAYPOINTS] ?: "[]"
val existingList = runCatching {
gson.fromJson<List<Waypoint>>(existingJson, waypointListType)
}.getOrNull()
if (!existingList.isNullOrEmpty()) {
// Vorhandene Wegpunkte schützen — leere Liste wird NICHT geschrieben.
android.util.Log.w(
"WaypointStore",
"saveAll() mit leerer Liste blockiert: ${existingList.size} bestehende Wegpunkte bleiben erhalten."
)
return@edit
}
}
prefs[KEY_WAYPOINTS] = gson.toJson(waypoints)
}
}
/**
* v2.7.21 — Forciertes Speichern ohne Preservation-Guard.
* Nur für explizite Lösch- und Migrationsoperationen verwenden,
* bei denen eine leere Liste das gewünschte Ergebnis ist.
*/
suspend fun saveAllForced(waypoints: List<Waypoint>) {
context.dataStore.edit { prefs ->
prefs[KEY_WAYPOINTS] = gson.toJson(waypoints)
}
@@ -228,6 +265,12 @@ class WaypointStore(private val context: Context) {
* v2.4.6 — Speichert (oder ersetzt) die gespeicherte Route einer Tour.
* Setzt [TourRoute.updatedAtMillis] auf die aktuelle Zeit, sofern das
* übergebene Objekt nicht selbst einen neueren Zeitstempel mitbringt.
*
* v2.7.21 — Waypoint-Preservation-Invariante:
* Diese Funktion schreibt AUSSCHLIESSLICH in [KEY_TOUR_ROUTES].
* [KEY_WAYPOINTS] (Audio-Wegpunkte) wird durch diesen Aufruf NIEMALS
* verändert. Tourrouten und Audio-Wegpunkte sind vollständig getrennte
* Speicherbereiche.
*/
suspend fun saveTourRoute(tourName: String, route: TourRoute) {
context.dataStore.edit { prefs ->