Initial release of GPS2Audio

This commit is contained in:
Marcel Mayer
2026-05-05 20:54:05 +02:00
commit b2aa1c167c
48 changed files with 11570 additions and 0 deletions
@@ -0,0 +1,70 @@
package de.waypointaudio.data
import java.util.UUID
/**
* Abspiel-Modus für einen Wegpunkt.
*
* EVERY_ENTRY Standardverhalten: Ton bei jedem erneuten Betreten.
* ONCE Ton nur beim ersten Betreten (playCount == 0).
* LIMITED_COUNT Ton maximal [maxPlayCount] Mal insgesamt.
*/
enum class PlaybackMode {
EVERY_ENTRY,
ONCE,
LIMITED_COUNT
}
/**
* Datenmodell für einen Wegpunkt.
*
* @param id Eindeutige ID (UUID)
* @param name Anzeigename des Wegpunkts
* @param latitude Breitengrad in Dezimalgrad
* @param longitude Längengrad in Dezimalgrad
* @param radiusMeters Erkennungsradius in Metern
* @param soundUri URI zur Audiodatei (content:// oder file://)
* @param soundName Anzeigename der Audiodatei
* @param isActive Ob der Wegpunkt aktiv überwacht wird
* @param tourName Name der Tour/Route (Standard: "Standard"). Rückwärtskompatibel:
* bestehende Wegpunkte ohne dieses Feld erhalten automatisch "Standard".
*
* --- Abspielregeln (optional, Standardwerte = bisheriges Verhalten) ---
*
* @param playbackMode Abspiel-Modus (Standard: EVERY_ENTRY = bisheriges Verhalten)
* @param maxPlayCount Maximale Abspielanzahl für LIMITED_COUNT; null = kein Limit
* @param playCount Bisherige Abspielanzahl (persistent, wird vom Service inkrementiert)
* @param scheduleEnabled Ob der Zeitplan aktiv ist
* @param scheduleStartMillis Frühestes Datum/Uhrzeit (Unix-Millisekunden), ab dem Abspielen erlaubt ist
* @param scheduleEndMillis Spätestes Datum/Uhrzeit (Unix-Millisekunden), bis zu dem Abspielen erlaubt ist
* @param allowedStartMinutes Tagesminute (01439), ab der das tägliche Zeitfenster beginnt
* @param allowedEndMinutes Tagesminute (01439), bis zu der das tägliche Zeitfenster endet
*/
data class Waypoint(
val id: String = UUID.randomUUID().toString(),
val name: String = "",
val latitude: Double = 0.0,
val longitude: Double = 0.0,
val radiusMeters: Float = 50f,
val soundUri: String = "",
val soundName: String = "",
val isActive: Boolean = true,
// Tour-Zuordnung safe default "Standard" für Rückwärtskompatibilität
val tourName: String = DEFAULT_TOUR_NAME,
// Abspielregeln alle optional, Standardwerte entsprechen bisherigem Verhalten
val playbackMode: PlaybackMode = PlaybackMode.EVERY_ENTRY,
val maxPlayCount: Int? = null,
val playCount: Int = 0,
val scheduleEnabled: Boolean = false,
val scheduleStartMillis: Long? = null,
val scheduleEndMillis: Long? = null,
val allowedStartMinutes: Int? = null,
val allowedEndMinutes: Int? = null
) {
companion object {
/** Standard-Tourname für bestehende Wegpunkte ohne tourName-Feld. */
const val DEFAULT_TOUR_NAME = "Standard"
}
}