diff --git a/ANDROID_KOTLIN_PLAN.md b/ANDROID_KOTLIN_PLAN.md index 518f43d..7ebde89 100644 --- a/ANDROID_KOTLIN_PLAN.md +++ b/ANDROID_KOTLIN_PLAN.md @@ -145,6 +145,8 @@ Kurz: Ziel ist eine native Android-App mit Kotlin + Jetpack Compose, die die Web - [x] Production-Release-Flavor auf Produktiv-Backend parametrisierbar gemacht (`PRODUCTION_API_BASE_URL`, Default `https://harheimertc.de/`). - [x] Release-Signing per sicheren Gradle-Properties vorbereitet (`RELEASE_STORE_FILE`, `RELEASE_STORE_PASSWORD`, `RELEASE_KEY_ALIAS`, `RELEASE_KEY_PASSWORD`) statt Hardcoding. - [x] `:app:assembleProductionRelease` erfolgreich gebaut (Stand 2026-05-29). + - [x] Play-Store-Listing-Basis ergänzt: Datenschutzseite unter `/datenschutz` sowie Skripte für Icon/Feature-Graphic-Export und Screenshot-Anonymisierung inklusive Anleitung (`android-app/PLAYSTORE_ASSETS.md`). + - [x] Konto-Lösch-URL für Play Store ergänzt: öffentliche Seite unter `/konto-loeschen` inklusive Prozessbeschreibung. - [ ] Offen: Finales Upload-Keystore + Credentials in CI/Build-Host hinterlegen, Play-Store-Release-Notes und Store-Metadaten pflegen. [ ] 25. Dokumentation: `README-android.md` mit Setup, Architektur und Release-Anleitung @@ -197,6 +199,7 @@ Kurz: Ziel ist eine native Android-App mit Kotlin + Jetpack Compose, die die Web - 2026-05-28: Caching-Teil von Punkt 17 und MVP-D umgesetzt: OkHttp cached öffentliche GET-Antworten und nutzt gecachte Antworten offline, Coil nutzt denselben authentifizierten Client plus Memory-/Diskcache. Geschützte Daten werden bewusst nicht unverschlüsselt im HTTP-Diskcache persistiert. - 2026-05-28: Testbasis für Punkt 20 begonnen: JVM-Unit-Tests für E-Mail- und ISO-Datum-Validierung ergänzt; `:app:testLocalDebugUnitTest` läuft mit `compileSdk 35` grün. - 2026-05-28: Punkte 17, 19, 21 und 23 weiter umgesetzt: geschützte Mitglieder-/CMS-Daten werden verschlüsselt in Keystore-gestützten Preferences gecacht und bei Ladefehlern genutzt; Galerie-Accessibility und Thumbnail-Decoding verbessert; Sentry-Android 8.42.0 über optionalen `SENTRY_DSN`-Gradle-Parameter integriert. +- 2026-05-29: Play-Store-Listing-Vorbereitung ergänzt: eigenständige Web-Datenschutzseite (`/datenschutz`) sowie Asset-/Anonymisierungs-Skripte und Anleitung in `android-app/PLAYSTORE_ASSETS.md` hinzugefügt. 8) Android-Testumgebungen - Lokal im Emulator: `./gradlew :app:installLocalDebug` verwendet `http://10.0.2.2:3100/` und die App-ID `de.harheimertc.local`. diff --git a/android-app/PLAYSTORE_ASSETS.md b/android-app/PLAYSTORE_ASSETS.md new file mode 100644 index 0000000..6a51c39 --- /dev/null +++ b/android-app/PLAYSTORE_ASSETS.md @@ -0,0 +1,70 @@ +# Play Store Assets - Harheimer TC Android + +## 1) Datenschutzerklaerung (Web-URL) + +Empfohlene URL fuer Play Console: +- https://harheimertc.de/datenschutz + +Die Seite ist in der Web-App als eigene Route vorhanden. + +## 1b) Konto-Loeschung (Web-URL) + +Empfohlene URL fuer Play Console: +- https://harheimertc.de/konto-loeschen + +Die Seite beschreibt den Loeschprozess und Kontaktweg fuer App- und Webkonto. + +## 2) Logo / Grafiken + +### Pflicht +- App-Icon (Play): 512 x 512 PNG + +### Optional, aber empfohlen +- Feature Graphic: 1024 x 500 PNG + +### Generierung + +Im Repo ist ein Script vorhanden, das aus dem Vereinslogo fertige Dateien erzeugt: + +```bash +./scripts/playstore-assets.sh +``` + +Ausgabe in: +- android-app/playstore-assets/generated/playstore-icon-512.png +- android-app/playstore-assets/generated/playstore-feature-graphic-1024x500.png + +## 3) Screenshots (anonymisiert) + +### Grobe Anforderungen (Telefon) +- Mindestens 2 Screenshots +- PNG oder JPEG +- Seitenlaenge je Seite zwischen 320 px und 3840 px + +Empfehlung fuer Android-Phone: +- 1080 x 1920 (Portrait) + +### Anonymisierung + +Script fuer schwarze halbtransparente Balken ueber sensible Bereiche: + +```bash +./scripts/anonymize-playstore-screenshot.sh 'x,y,w,h;x,y,w,h' +``` + +Beispiel: + +```bash +./scripts/anonymize-playstore-screenshot.sh \ + android-app/playstore-assets/raw/screen1.png \ + android-app/playstore-assets/anon/screen1-anon.png \ + '68,118,520,72;70,706,560,98' +``` + +## 4) Upload in Play Console + +- Datenschutzerklaerung: URL eintragen +- Konto-Loeschung: URL eintragen +- App-Icon: playstore-icon-512.png +- Feature Graphic: playstore-feature-graphic-1024x500.png +- Screenshots: anonymisierte PNG/JPEG hochladen diff --git a/android-app/gradle.properties b/android-app/gradle.properties index 132cdec..81b4de3 100644 --- a/android-app/gradle.properties +++ b/android-app/gradle.properties @@ -8,7 +8,7 @@ LOCAL_API_BASE_URL=https://harheimertc.tsschulz.de/ PRODUCTION_API_BASE_URL=https://harheimertc.de/ # Android app versioning for Play Store uploads -ANDROID_VERSION_CODE=3 +ANDROID_VERSION_CODE=4 ANDROID_VERSION_NAME=1.0.0 # Enable R8 for release by default so mapping.txt is generated for Play Console. diff --git a/android-app/playstore-assets/generated/playstore-feature-graphic-1024x500.png b/android-app/playstore-assets/generated/playstore-feature-graphic-1024x500.png new file mode 100644 index 0000000..7801b66 Binary files /dev/null and b/android-app/playstore-assets/generated/playstore-feature-graphic-1024x500.png differ diff --git a/android-app/playstore-assets/generated/playstore-icon-512.png b/android-app/playstore-assets/generated/playstore-icon-512.png new file mode 100644 index 0000000..e8899a0 Binary files /dev/null and b/android-app/playstore-assets/generated/playstore-icon-512.png differ diff --git a/components/Footer.vue b/components/Footer.vue index af6fb86..f0292ca 100644 --- a/components/Footer.vue +++ b/components/Footer.vue @@ -19,6 +19,18 @@ > Impressum + + Datenschutz + + + Konto loeschen + +
+
+

+ Datenschutzerklärung +

+
+ +
+
+

+ 1. Datenschutz auf einen Blick +

+

+ Der Schutz Ihrer personenbezogenen Daten hat für den Harheimer TC 1954 e.V. einen hohen Stellenwert. + Wir verarbeiten personenbezogene Daten vertraulich und entsprechend den gesetzlichen Datenschutzvorschriften. +

+
+ +
+

+ 2. Verantwortliche Stelle +

+

+ Harheimer TC 1954 e.V.
+ Kontakt über die Angaben im + + Impressum + + . +

+
+ +
+

+ 3. Verarbeitung personenbezogener Daten +

+

+ Wir verarbeiten personenbezogene Daten insbesondere in folgenden Fällen: +

+
    +
  • Kontaktanfragen über Formulare oder E-Mail
  • +
  • Mitgliedschaftsanträge
  • +
  • Nutzung des Mitgliederbereichs (Login, Profilfunktionen)
  • +
  • Newsletter-Anmeldung und -Abmeldung
  • +
+
+ +
+

+ 4. Technische und organisatorische Maßnahmen +

+

+ Für besonders schützenswerte Daten setzen wir technische Schutzmaßnahmen ein, + darunter Verschlüsselung, rollenbasierte Zugriffssteuerung und abgesicherte + Authentifizierungsverfahren. +

+
+ +
+

+ 5. Ihre Rechte +

+

+ Sie haben im Rahmen der gesetzlichen Vorgaben insbesondere folgende Rechte: +

+
    +
  • Auskunft über gespeicherte Daten
  • +
  • Berichtigung unrichtiger Daten
  • +
  • Löschung oder Einschränkung der Verarbeitung
  • +
  • Widerspruch gegen die Verarbeitung
  • +
  • Datenübertragbarkeit
  • +
+
+ +
+

+ 6. Kontakt zum Datenschutz +

+

+ Bei Fragen zum Datenschutz nutzen Sie bitte die Kontaktangaben im + + Impressum + + oder unser + + Kontaktformular + + . +

+
+
+
+
+ + + diff --git a/pages/konto-loeschen.vue b/pages/konto-loeschen.vue new file mode 100644 index 0000000..62a50ba --- /dev/null +++ b/pages/konto-loeschen.vue @@ -0,0 +1,75 @@ + + + diff --git a/scripts/anonymize-playstore-screenshot.sh b/scripts/anonymize-playstore-screenshot.sh new file mode 100755 index 0000000..1212258 --- /dev/null +++ b/scripts/anonymize-playstore-screenshot.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $# -lt 3 ]]; then + echo "Nutzung: $0 " + echo "rects Format: x,y,w,h;x,y,w,h" + echo "Beispiel: $0 shot.png shot-anon.png '80,120,420,70;72,720,540,90'" + exit 1 +fi + +INPUT="$1" +OUTPUT="$2" +RECTS="$3" + +if ! command -v magick >/dev/null 2>&1; then + echo "Fehler: 'magick' (ImageMagick) ist nicht installiert." + exit 1 +fi + +TMP="$OUTPUT.tmp.png" +cp "$INPUT" "$TMP" + +IFS=';' read -r -a BOXES <<< "$RECTS" +for box in "${BOXES[@]}"; do + IFS=',' read -r x y w h <<< "$box" + magick "$TMP" \ + \( -size "${w}x${h}" xc:black -alpha set -channel a -evaluate set 70% +channel \) \ + -geometry "+${x}+${y}" -composite "$TMP" +done + +mv "$TMP" "$OUTPUT" +echo "Anonymisierte Datei geschrieben: $OUTPUT" diff --git a/scripts/playstore-assets.mjs b/scripts/playstore-assets.mjs new file mode 100644 index 0000000..0da4aea --- /dev/null +++ b/scripts/playstore-assets.mjs @@ -0,0 +1,69 @@ +#!/usr/bin/env node +import { mkdir, readFile } from 'node:fs/promises' +import path from 'node:path' +import sharp from 'sharp' +import { fileURLToPath } from 'node:url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const rootDir = path.resolve(__dirname, '..') +const logoSrc = path.join(rootDir, 'public', 'images', 'logos', 'Harheimer TC.svg') +const outDir = path.join(rootDir, 'android-app', 'playstore-assets', 'generated') + +const iconOut = path.join(outDir, 'playstore-icon-512.png') +const featureOut = path.join(outDir, 'playstore-feature-graphic-1024x500.png') + +const featureOverlaySvg = ` + + + + + + + + + Harheimer TC + Tischtennis in Frankfurt-Harheim + +` + +async function generateAssets() { + await mkdir(outDir, { recursive: true }) + + const logoBuffer = await readFile(logoSrc) + const resizedLogoForIcon = await sharp(logoBuffer) + .resize(440, 440, { fit: 'contain' }) + .png() + .toBuffer() + + await sharp({ + create: { + width: 512, + height: 512, + channels: 4, + background: { r: 0, g: 0, b: 0, alpha: 0 }, + }, + }) + .composite([{ input: resizedLogoForIcon, gravity: 'center' }]) + .png() + .toFile(iconOut) + + const resizedLogoForFeature = await sharp(logoBuffer) + .resize(320, 320, { fit: 'contain' }) + .png() + .toBuffer() + + await sharp(Buffer.from(featureOverlaySvg)) + .composite([{ input: resizedLogoForFeature, left: 72, top: 90 }]) + .png() + .toFile(featureOut) + + console.log(`Fertig. Assets erzeugt in: ${outDir}`) + console.log(`- ${path.basename(iconOut)}`) + console.log(`- ${path.basename(featureOut)}`) +} + +generateAssets().catch((error) => { + console.error('Fehler bei der Asset-Generierung:', error) + process.exitCode = 1 +}) diff --git a/scripts/playstore-assets.sh b/scripts/playstore-assets.sh new file mode 100755 index 0000000..b94c4bc --- /dev/null +++ b/scripts/playstore-assets.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +node "$ROOT_DIR/scripts/playstore-assets.mjs"