# GPS2Audio v2.5.17 — Lizenz & Nutzung / GPS2Audio Pro auf der About-Seite Interner Build. Nicht auf Gitea veröffentlicht, keine Release-Erstellung. ## Ausgangsbasis - Ausgangspunkt: `GPS2Audio_v2_5_16_waypoint_copy_editmode_source.zip` (Workspace). - Keine bestehenden Funktionen entfernt oder verändert: - Multi-Clip pro Waypoint (v2.5.12) - Manueller Sequenzplayer über Clips/Waypoints, Countdown, maximierbare Player-Detailansicht (v2.5.14 / v2.5.15) - Tour duplizieren (v2.5.15) - Waypoint im Edit-Modus in andere/eigene Tour kopieren (v2.5.15 + v2.5.16) - Explorer / MapLibre / Routing - Backup / Import - PTT / Atmo / Hintergrundwiedergabe (Xiaomi-Hilfe v2.5.13) ## Ziel - Bisherige Spenden-/„Entwicklung unterstützen“-Sektion auf der „Über diese App“-Seite vollständig entfernen. - Ersetzen durch professionellen Bereich „Lizenz & Nutzung“ / „GPS2Audio Pro“. - Lizenzstatus-Anzeige crashfrei vorbereiten (Platzhalter „Keine Lizenz importiert“ / „-“ / „Basisfunktionen“). - Skelett für spätere Offline-Lizenzprüfung anlegen (Public Key eingebettet, KEIN aktiver Feature-Gate, KEIN Private Key in der App). - Versions-Bump auf v2.5.17 (versionCode 71), signiert mit dem neuen Release-Keystore v2. ## Was wurde geändert ### Strings (Deutsch) `app/src/main/res/values/strings.xml` - Entfernt: `about_support_label`, `about_support_text`, `about_support_button`, `about_support_open_cd`, `about_support_url` (alter Spenden-Block). - Neu („Lizenz & Nutzung / GPS2Audio Pro“): - `about_pro_section_label` = „Lizenz & Nutzung“ - `about_pro_title` = „GPS2Audio Pro / Kommerzielle Lizenz“ - `about_pro_price_label` / `about_pro_price_value` = „Preis“ / „555 € pro Jahr“ - `about_pro_required_intro` + `about_pro_required_line1..4`: benötigt für kommerzielle Nutzung, bezahlte Touren, institutionelle Nutzung (Behörden, Tourismusverbände, Reiseveranstalter, Bildungsträger), Kundenprojekte/Whitelabel. - `about_pro_private_note`: private/interne Nutzung bleibt gemäß Apache 2.0 + Commons Clause möglich. - `about_pro_manual_note`: Lizenzdatei wird nach Zahlung und manueller Prüfung individuell ausgestellt. - `about_pro_request_button` = „Pro-Lizenz per PayPal anfragen“ (KEIN Spenden-Wording). - `about_pro_request_url` = `https://paypal.me/nesohub` (unverändert). - `about_pro_contact_hint`: vor Zahlung kurz Verwendungszweck, Firma/Institution und Lizenznehmer-Namen per E-Mail mitteilen. - Neu („Lizenzstatus“-Block, Platzhalter): - `about_license_status_label` = „Lizenzstatus“ - `about_license_status_state_label` / `_value` = „Status“ / „Keine Lizenz importiert“ - `about_license_status_holder_label` / `_value` = „Lizenznehmer“ / „-“ - `about_license_status_validity_label` / `_value` = „Gültigkeit“ / „-“ - `about_license_status_features_label` / `_value` = „Freigeschaltete Funktionen“ / „Basisfunktionen“ - `about_license_status_hint`: Hinweis, dass eine importierte Lizenzdatei hier künftig angezeigt wird und bis dahin alle bestehenden Funktionen ohne Einschränkung verfügbar bleiben. ### About-Dialog `app/src/main/kotlin/de/waypointaudio/ui/AboutDialog.kt` - Klassendoku aktualisiert (verweist jetzt auf v2.5.17 Lizenz-/Pro-Bereich). - Die alte „Entwicklung unterstützen“-Card (primaryContainer mit PayPal- Spenden-Button) wurde vollständig durch zwei neue Cards ersetzt: 1. **GPS2Audio Pro / Kommerzielle Lizenz** (primaryContainer): Titel, „Preis: 555 € pro Jahr“, Aufzählung der lizenzpflichtigen Nutzungsformen, Hinweis zur privaten/internen Nutzung, Hinweis zur manuellen Ausstellung, primärer Button „Pro-Lizenz per PayPal anfragen“ (öffnet `paypal.me/nesohub`), Kontakt-Hinweis. 2. **Lizenzstatus** (surfaceVariant): Status / Lizenznehmer / Gültigkeit / Freigeschaltete Funktionen plus erklärender Hinweis. - Neuer privater Composable `AboutInlineRow(label, value, color)` für kompakte „Label: Wert“-Zeilen innerhalb der Cards. - Die `LicenseStatus`-Instanz kommt aus `de.waypointaudio.license.LicenseStatusProvider.current()` und ist in `remember { ... }` gewrappt — Composition-stabil, kein Crash-Risiko. - Alle übrigen Blöcke (App-Name, Beschreibung, Version, Entwickler, E-Mail, Nutzungsbedingungen, Apache 2.0 + Commons Clause, Drittanbieter-Lizenzen, Background-Reliability-Card, Copyright) bleiben unverändert. ### Lizenz-Skelett (KEIN Feature-Gate) Neu unter `app/src/main/kotlin/de/waypointaudio/license/`: - `LicenseStatus.kt`: Data-Class mit den vier Anzeigefeldern und einem `isPro: Boolean`. - `LicenseStatusProvider.kt`: liefert aktuell IMMER den Platzhalter „Keine Lizenz importiert / - / - / Basisfunktionen, isPro = false“. Keine Datei- oder Signaturprüfung, kein Persist-Zugriff. - `LicenseValidator.kt`: Skelett mit zwei Funktionen: - `readEmbeddedPublicKeyPem(context)` liest die eingebettete Raw-Resource `R.raw.gps2audio_license_public` und gibt den PEM- String zurück. Wirft NIE — wirft intern alles und liefert dann `null`, damit die App garantiert nicht crashen kann. - `verifyOffline(context, licenseFileBytes)` ist ein Stub und liefert aktuell IMMER `null`. Aktiviert wird das später in einer Folgeversion. - Diese drei Klassen werden NUR aus dem About-Dialog gelesen (nur `LicenseStatusProvider.current()`), nirgendwo sonst — es gibt keinen einzigen Feature-Gate-Aufruf. ### Public Key - Datei `app/src/main/res/raw/gps2audio_license_public.pem` ist identisch mit `/home/user/workspace/gps2audio_license_public-4.pem` (RSA 4096, PEM SPKI, `-----BEGIN PUBLIC KEY-----`). - **Der Private Key wurde NICHT eingebettet.** Nichts im Source-Zip, nichts im APK enthält private Schlüssel. ### Versionierung / Build `app/build.gradle.kts` - `versionCode = 71` (v2.5.16 war 70) - `versionName = "2.5.17"` - Kommentar aktualisiert: erklärt Pro-Lizenz-Block, Lizenzstatus-Card, Public-Key-Einbettung und betont, dass alle bisherigen Funktionen unverändert bleiben. ## Build / Signing - Build mit Gradle 8.7 gegen AGP 8.5.2 / Kotlin 2.0.21, compileSdk/ targetSdk 35, minSdk 26. - Release-Signing aktiv über `keystore.properties` (nur lokal, NICHT im Source-Zip): - Keystore: `/home/user/workspace/GPS2Audio_release_keystore_v2.jks` - Alias: `gps2audio_release_v2` - `gradle :app:assembleRelease` → **BUILD SUCCESSFUL in 1m 58s**. Nur die bereits in v2.5.16 vorhandenen Deprecation-Warnings (osmdroid PolylineOptions/MarkerOptions, MapLibre Marker/Polyline- Annotations, AutoMirrored Icons, `Modifier.menuAnchor()`-Overload, `Divider`). Keine neuen Warnings oder Fehler durch v2.5.17. - APK-Signaturprüfung mit `apksigner verify --verbose`: - `Verifies` ✅ - APK Signature Scheme v2: true (Standard-Signaturlinie der v2.5.x- Builds mit dem Release-Keystore v2). - Es wurden in dieser Version keine automatisierten Tests ausgeführt — das Projekt enthält wie schon in v2.5.16 keine eigene Test-Suite. Der reine Compile-/Assemble-Erfolg ist der primäre Smoke-Test. ## Artefakte Ablage: `/home/user/workspace/` - `GPS2Audio_v2_5_17_license_pro_about_signed.apk` (≈ 56 MiB, v2 signiert mit Release-Keystore v2). - `GPS2Audio_v2_5_17_license_pro_about_source.zip` (≈ 390 KiB, ohne `keystore.properties`, ohne `local.properties`, ohne `build/` und `.gradle/`; mit `keystore.properties.example`). - `GPS2Audio_v2_5_17_license_pro_about_handoff.md` (diese Datei). ## Manuelle Verifikation der About-Seite Im laufenden APK ist auf der „Über diese App“-Seite folgendes sichtbar (von oben nach unten): 1. Titel „Über diese App“. 2. App-Name + Beschreibung. 3. **Neu (primaryContainer-Card):** - Untertitel „Lizenz & Nutzung“. - Titel „GPS2Audio Pro / Kommerzielle Lizenz“. - „Preis: 555 € pro Jahr“. - „Eine gültige Pro-Lizenz wird benötigt für:“ + vier Aufzählungspunkte (kommerziell / bezahlte Touren / institutionell / Kundenprojekte). - Hinweis: private und interne Nutzung bleibt gemäß den oben angezeigten Lizenzbedingungen möglich. - Hinweis: Lizenzdatei wird nach Zahlung und manueller Prüfung individuell ausgestellt. - Primärer Button „Pro-Lizenz per PayPal anfragen“ → öffnet `https://paypal.me/nesohub`. - Kontakt-Hinweis (E-Mail vor Zahlung). 4. **Neu (surfaceVariant-Card) Lizenzstatus:** - Status: Keine Lizenz importiert - Lizenznehmer: - - Gültigkeit: - - Freigeschaltete Funktionen: Basisfunktionen - Hinweis, dass alle bestehenden Funktionen ohne Pro-Lizenz verfügbar bleiben. 5. Wie bisher: Version, Entwickler, E-Mail, Nutzungsbedingungen, Apache 2.0 + Commons Clause, Drittanbieter-Komponenten, Hintergrundwiedergabe-Card, Copyright. Der bisherige Spenden-Block (Card mit „Entwicklung unterstützen“ / „Mit PayPal unterstützen“) erscheint **nirgendwo mehr** im Dialog. ## Sicherheits- und Archivhinweise - `keystore.properties`, `local.properties`, `build/` und `.gradle/` wurden vor dem Erstellen des Source-Zips entfernt. - Der Public Key liegt sowohl im APK (`res/raw/`) als auch im Source- Zip; der Private Key ist nirgendwo in den Artefakten enthalten. - Aufgrund des neuen Release-Keystores (v2) sind In-Place-Updates auf alte v2.5.x-Builds, die noch mit dem ursprünglich verlorenen Keystore signiert wurden, weiterhin nicht möglich — das ist seit v2.5.11 bekannt und unverändert. ## Geänderte / neu angelegte Dateien | Datei | Änderung | |---|---| | `app/build.gradle.kts` | versionCode 70 → 71, versionName 2.5.16 → 2.5.17, Versions-Kommentar aktualisiert | | `app/src/main/res/values/strings.xml` | Spenden-Strings entfernt, Pro-Lizenz- und Lizenzstatus-Strings hinzugefügt | | `app/src/main/kotlin/de/waypointaudio/ui/AboutDialog.kt` | Spenden-Card durch Pro-Lizenz-Card + Lizenzstatus-Card ersetzt, `AboutInlineRow` ergänzt | | `app/src/main/kotlin/de/waypointaudio/license/LicenseStatus.kt` | NEU — Data-Class | | `app/src/main/kotlin/de/waypointaudio/license/LicenseStatusProvider.kt` | NEU — liefert Platzhalter-Status | | `app/src/main/kotlin/de/waypointaudio/license/LicenseValidator.kt` | NEU — Public-Key-Lookup-Stub + `verifyOffline()`-Stub | | `app/src/main/res/raw/gps2audio_license_public.pem` | NEU — eingebetteter Public Key (RSA 4096) |