Files
Client/tool/screenshots.sh
T
MineTec 1114291313 Add Fastlane Play Store integration with automated screenshots
Fastlane supply config (android/fastlane) with de-DE metadata structure,
integration_test-driven screenshot automation (screenshot_test.dart,
test_driver, tool/screenshots.sh) using stable keys on the login form,
refreshed materials/screenshots (phone + 7-inch) and app banner/symbol.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:43:10 +02:00

117 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Store-Screenshots über den Demo-Login aufnehmen.
#
# Fährt den integration_test-Screenshot-Lauf (integration_test/screenshot_test.dart)
# über flutter drive für die drei von Google Play verlangten Formfaktoren durch
# (Phone + 7″ + 10″ Tablet sind inzwischen Pflicht). Statt drei AVDs zu verwalten,
# wird EIN laufendes Gerät/Emulator pro Durchlauf per `adb shell wm size/density`
# auf die Zielauflösung gebracht; takeScreenshot liefert dann Frames in genau
# dieser Pixelgröße.
#
# Ablage:
# - kanonisch (versioniert): materials/screenshots/android/<formfaktor>/
# - Kopie für den Upload: android/fastlane/metadata/android/de-DE/images/<...>Screenshots/
# Danach: `cd android && fastlane upload_screenshots`.
#
# Voraussetzungen:
# - genau ein per `adb devices` sichtbares Gerät/Emulator (>= Android 8)
# - flutter, adb im PATH
#
# Aufruf (vom Client-Projektwurzelverzeichnis):
# tool/screenshots.sh # debug-Build (schnell)
# BUILD_MODE=profile tool/screenshots.sh
# PROFILES="phone" tool/screenshots.sh # nur eine Größe
set -euo pipefail
cd "$(dirname "$0")/.."
BUILD_MODE="${BUILD_MODE:-debug}"
MATERIALS_BASE="materials/screenshots/android"
FASTLANE_BASE="android/fastlane/metadata/android/de-DE/images"
APP_ID="eu.mhsl.marianum.mobile.client"
# name | breite x höhe (px) | dichte (dpi) | materials-Ordner | fastlane-Ordner
# Phone nutzt die NATIVE Displayauflösung des Geräts (voller Hochformat, nicht
# auf 16:9 gestaucht). Tablets im QUERFORMAT (Breite > Höhe); bei den
# Landscape-Breiten (>1000dp) zeigt Talk zudem die Master-Detail-Splitview.
# Dichten so gewählt, dass die adaptive Bottom-Bar die passende Tab-Anzahl zeigt.
declare -A PROFILE_SIZE=(
[phone]="native" [seven]="1920x1200" [ten]="2560x1600"
)
declare -A PROFILE_DENSITY=(
[phone]="native" [seven]="240" [ten]="280"
)
declare -A PROFILE_MATERIALS=(
[phone]="phone" [seven]="7-inch" [ten]="10-inch"
)
declare -A PROFILE_FASTLANE=(
[phone]="phoneScreenshots"
[seven]="sevenInchScreenshots"
[ten]="tenInchScreenshots"
)
PROFILES="${PROFILES:-phone seven ten}"
# App-APK einmal vorab bauen, damit sie vor jedem `flutter drive` installiert
# und die Notification-Permission gegrantet werden kann (drive deinstalliert die
# App nach jedem Lauf, sonst wäre der Grant weg und ein Systemdialog könnte die
# Screenshots verdecken). Der eigentliche drive-Lauf reinstalliert sie per -r.
APK="build/app/outputs/flutter-apk/app-${BUILD_MODE}.apk"
echo "Baue App-APK ($BUILD_MODE) vorab…"
flutter build apk "--$BUILD_MODE"
reset_display() {
echo "Setze Displaygröße/-dichte zurück…"
adb shell wm size reset || true
adb shell wm density reset || true
}
trap reset_display EXIT
for profile in $PROFILES; do
size="${PROFILE_SIZE[$profile]}"
density="${PROFILE_DENSITY[$profile]}"
materials_dir="$MATERIALS_BASE/${PROFILE_MATERIALS[$profile]}"
fastlane_dir="$FASTLANE_BASE/${PROFILE_FASTLANE[$profile]}"
echo ""
echo "=== Profil '$profile' ($size @ ${density}dpi) -> $materials_dir ==="
mkdir -p "$materials_dir" "$fastlane_dir"
rm -f "$materials_dir"/*.png "$fastlane_dir"/*.png
# "native" -> Geräteauflösung/-dichte verwenden (für Phone), sonst erzwingen.
if [ "$size" = "native" ]; then
adb shell wm size reset
adb shell wm density reset
else
adb shell wm size "$size"
adb shell wm density "$density"
fi
# App sicherstellen, frische (ausgeloggte) Session erzwingen und
# Notification-Permission erteilen, bevor drive läuft. pm clear setzt auch die
# Runtime-Permissions zurück, daher der Grant DANACH.
[ -f "$APK" ] && adb install -r "$APK" >/dev/null 2>&1 || true
adb shell pm clear "$APP_ID" >/dev/null 2>&1 || true
adb shell pm grant "$APP_ID" android.permission.POST_NOTIFICATIONS 2>/dev/null || true
sleep 2
SCREENSHOT_OUT_DIR="$materials_dir" flutter drive \
--driver=test_driver/integration_test.dart \
--target=integration_test/screenshot_test.dart \
--"$BUILD_MODE" \
--no-dds
# Kanonische Bilder in den Fastlane-Upload-Ordner spiegeln.
cp "$materials_dir"/*.png "$fastlane_dir"/
echo "Profil '$profile' fertig: $(ls -1 "$materials_dir"/*.png 2>/dev/null | wc -l) Screenshots"
done
reset_display
trap - EXIT
echo ""
echo "Kanonische Screenshots: $MATERIALS_BASE/{phone,7-inch,10-inch}/"
echo "Upload: cd android && fastlane upload_screenshots"