diff --git a/.maestro/screenshots-nn.yaml b/.maestro/screenshots-nn.yaml new file mode 100644 index 0000000..dae75a5 --- /dev/null +++ b/.maestro/screenshots-nn.yaml @@ -0,0 +1,72 @@ +# Maestro flow: Capture F-Droid screenshots for nn-NO (Nynorsk) +# +# Nynorsk is not supported as a system locale on stock Android. +# This flow uses per-app locale (API 33+) which requires NOT clearing app state, +# since clearState wipes per-app locale settings. +# +# Run the main screenshots.yaml first (any locale) so that map tiles are cached. +# Then set the per-app locale and run this flow: +# +# adb shell "cmd locale set-app-locales no.naiv.tilfluktsrom --locales nn" +# maestro test .maestro/screenshots-nn.yaml + +appId: no.naiv.tilfluktsrom + +env: + OUTPUT_DIR: "fastlane/metadata/android" + +--- + +# Mock GPS: Bergen centrum (Torgallmenningen) +- setLocation: + latitude: 60.3913 + longitude: 5.3221 + +# Launch WITHOUT clearing state (preserves per-app locale and cached tiles) +- launchApp: + appId: no.naiv.tilfluktsrom + clearState: false + permissions: + android.permission.ACCESS_FINE_LOCATION: allow + android.permission.ACCESS_COARSE_LOCATION: allow + +# Wait for shelter data to load +- extendedWaitUntil: + visible: + id: "statusText" + timeout: 15000 + +# Wait for shelter list to populate +- extendedWaitUntil: + visible: + id: "shelterList" + timeout: 15000 + +- waitForAnimationToEnd + +# Screenshot 1: Map view +- takeScreenshot: + path: "${OUTPUT_DIR}/nn-NO/images/phoneScreenshots/1_map_view" + +# Screenshot 2: Tap second shelter +- tapOn: "Håkonsgaten 5" +- waitForAnimationToEnd +- takeScreenshot: + path: "${OUTPUT_DIR}/nn-NO/images/phoneScreenshots/2_shelter_selected" + +# Screenshot 3: Compass view +- tapOn: + id: "toggleViewFab" +- waitForAnimationToEnd +- takeScreenshot: + path: "${OUTPUT_DIR}/nn-NO/images/phoneScreenshots/3_compass_view" + +# Screenshot 4: Civil defense dialog +- tapOn: + id: "toggleViewFab" +- waitForAnimationToEnd +- tapOn: + id: "infoButton" +- waitForAnimationToEnd +- takeScreenshot: + path: "${OUTPUT_DIR}/nn-NO/images/phoneScreenshots/4_civil_defense_info" diff --git a/.maestro/screenshots.yaml b/.maestro/screenshots.yaml new file mode 100644 index 0000000..de15230 --- /dev/null +++ b/.maestro/screenshots.yaml @@ -0,0 +1,95 @@ +# Maestro flow: Capture F-Droid screenshots for Tilfluktsrom +# +# Usage (from project root): +# maestro test .maestro/screenshots.yaml +# +# With a specific locale: +# LOCALE=nb-NO maestro test .maestro/screenshots.yaml +# +# Prerequisites: +# - Android emulator (API 31+) or device running +# - App installed: ./gradlew installDebug +# - Internet connection (needed for map tile caching) +# - Install Maestro: curl -Ls https://get.maestro.mobile.dev | bash +# +# GPS is mocked to Bergen centrum (Torgallmenningen area), +# which has several shelters within walking distance. + +appId: no.naiv.tilfluktsrom + +env: + LOCALE: "en-US" + OUTPUT_DIR: "fastlane/metadata/android" + +--- + +# Mock GPS: Bergen centrum (Torgallmenningen) +- setLocation: + latitude: 60.3913 + longitude: 5.3221 + +# Grant location permission and launch with fresh state +- launchApp: + appId: no.naiv.tilfluktsrom + clearState: true + permissions: + android.permission.ACCESS_FINE_LOCATION: allow + android.permission.ACCESS_COARSE_LOCATION: allow + +# Wait for shelter data to load from bundled asset. +- extendedWaitUntil: + visible: + id: "statusText" + timeout: 15000 + +# The app shows a map caching prompt on first GPS fix when no cache exists. +# Tap "Cache map" and wait for caching to complete (~15s). +# This prevents the overlay from re-appearing on subsequent GPS updates. +- extendedWaitUntil: + visible: + id: "loadingOkButton" + timeout: 15000 + +- tapOn: + id: "loadingOkButton" + +# Wait for caching to finish (4 zoom levels x 9 grid points x 300ms ≈ 11s + network) +- extendedWaitUntil: + notVisible: + id: "loadingOverlay" + timeout: 30000 + +# Let the map settle and shelter list populate after caching +- waitForAnimationToEnd +- extendedWaitUntil: + visible: + id: "shelterList" + timeout: 10000 + +# Screenshot 1: Map view with shelter markers and bottom sheet +- takeScreenshot: + path: "${OUTPUT_DIR}/${LOCALE}/images/phoneScreenshots/1_map_view" + +# Screenshot 2: Tap the second shelter (Håkonsgaten 5) to show a different selection. +# Shelter addresses are locale-independent, so this works in all languages. +- tapOn: "Håkonsgaten 5" +- waitForAnimationToEnd +- takeScreenshot: + path: "${OUTPUT_DIR}/${LOCALE}/images/phoneScreenshots/2_shelter_selected" + +# Screenshot 3: Switch to compass view +- tapOn: + id: "toggleViewFab" +- waitForAnimationToEnd +- takeScreenshot: + path: "${OUTPUT_DIR}/${LOCALE}/images/phoneScreenshots/3_compass_view" + +# Screenshot 4: Switch back to map, open civil defense info dialog +- tapOn: + id: "toggleViewFab" +- waitForAnimationToEnd +- tapOn: + id: "infoButton" +- waitForAnimationToEnd +- takeScreenshot: + path: "${OUTPUT_DIR}/${LOCALE}/images/phoneScreenshots/4_civil_defense_info" diff --git a/.maestro/take-screenshots.sh b/.maestro/take-screenshots.sh new file mode 100755 index 0000000..d44bb4e --- /dev/null +++ b/.maestro/take-screenshots.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +# Generate F-Droid screenshots for all locales using Maestro. +# +# Prerequisites: +# 1. Install Maestro: curl -Ls https://get.maestro.mobile.dev | bash +# 2. Start an Android emulator (API 33+): emulator -avd +# 3. Build and install the app: ./gradlew installDebug +# 4. Run this script: .maestro/take-screenshots.sh +# +# Screenshots are saved directly into fastlane/metadata/android//images/ +# +# Locale handling: +# - en-US and nb-NO use system locale (settings put system system_locales) +# - nn-NO (Nynorsk) requires per-app locale since Android doesn't support +# Nynorsk as a system locale — it falls back to Bokmål + +set -euo pipefail +cd "$(dirname "$0")/.." + +FLOW=".maestro/screenshots.yaml" +FLOW_NN=".maestro/screenshots-nn.yaml" + +restart_framework() { + adb shell stop 2>/dev/null + sleep 2 + adb shell start 2>/dev/null + sleep 8 +} + +ensure_root() { + adb root 2>/dev/null || true + sleep 1 +} + +echo "=== Ensuring root access ===" +ensure_root + +# --- en-US --- +echo "=== Capturing screenshots for en-US ===" +mkdir -p "fastlane/metadata/android/en-US/images/phoneScreenshots" +rm -f "fastlane/metadata/android/en-US/images/.gitkeep" + +adb shell "settings put system system_locales en-US" +restart_framework + +sed -i 's/LOCALE: ".*"/LOCALE: "en-US"/' "$FLOW" +maestro test "$FLOW" +echo "=== Done: en-US ===" +echo "" + +# --- nb-NO --- +echo "=== Capturing screenshots for nb-NO ===" +mkdir -p "fastlane/metadata/android/nb-NO/images/phoneScreenshots" +rm -f "fastlane/metadata/android/nb-NO/images/.gitkeep" + +adb shell "settings put system system_locales nb-NO" +restart_framework + +sed -i 's/LOCALE: ".*"/LOCALE: "nb-NO"/' "$FLOW" +maestro test "$FLOW" +sed -i 's/LOCALE: "nb-NO"/LOCALE: "en-US"/' "$FLOW" +echo "=== Done: nb-NO ===" +echo "" + +# --- nn-NO (Nynorsk) --- +# Android doesn't support nn as a system locale, so we use per-app locale. +# The main flow must have run first to cache map tiles (nn flow uses clearState: false). +echo "=== Capturing screenshots for nn-NO ===" +mkdir -p "fastlane/metadata/android/nn-NO/images/phoneScreenshots" +rm -f "fastlane/metadata/android/nn-NO/images/.gitkeep" + +adb shell "am force-stop no.naiv.tilfluktsrom" +adb shell "cmd locale set-app-locales no.naiv.tilfluktsrom --locales nn" +sleep 2 + +maestro test "$FLOW_NN" +echo "=== Done: nn-NO ===" +echo "" + +# Restore en-US +adb shell "settings put system system_locales en-US" +adb shell "cmd locale set-app-locales no.naiv.tilfluktsrom --locales en" +restart_framework + +echo "All screenshots captured." +echo "Check: fastlane/metadata/android/*/images/phoneScreenshots/" diff --git a/fastlane/metadata/android/en-US/images/.gitkeep b/fastlane/metadata/android/en-US/images/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1_map_view.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1_map_view.png new file mode 100644 index 0000000..5d9675f Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/1_map_view.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2_shelter_selected.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2_shelter_selected.png new file mode 100644 index 0000000..85dcd32 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/2_shelter_selected.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3_compass_view.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3_compass_view.png new file mode 100644 index 0000000..22f723e Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/3_compass_view.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4_civil_defense_info.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/4_civil_defense_info.png new file mode 100644 index 0000000..c732755 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/4_civil_defense_info.png differ diff --git a/fastlane/metadata/android/nb-NO/images/.gitkeep b/fastlane/metadata/android/nb-NO/images/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/1_map_view.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/1_map_view.png new file mode 100644 index 0000000..bddc652 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/1_map_view.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/2_shelter_selected.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/2_shelter_selected.png new file mode 100644 index 0000000..2fe8b38 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/2_shelter_selected.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/3_compass_view.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/3_compass_view.png new file mode 100644 index 0000000..a89d2a2 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/3_compass_view.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/4_civil_defense_info.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/4_civil_defense_info.png new file mode 100644 index 0000000..9b5edb0 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/4_civil_defense_info.png differ diff --git a/fastlane/metadata/android/nn-NO/images/.gitkeep b/fastlane/metadata/android/nn-NO/images/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/fastlane/metadata/android/nn-NO/images/phoneScreenshots/1_map_view.png b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/1_map_view.png new file mode 100644 index 0000000..2a3b179 Binary files /dev/null and b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/1_map_view.png differ diff --git a/fastlane/metadata/android/nn-NO/images/phoneScreenshots/2_shelter_selected.png b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/2_shelter_selected.png new file mode 100644 index 0000000..037c472 Binary files /dev/null and b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/2_shelter_selected.png differ diff --git a/fastlane/metadata/android/nn-NO/images/phoneScreenshots/3_compass_view.png b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/3_compass_view.png new file mode 100644 index 0000000..1128bb9 Binary files /dev/null and b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/3_compass_view.png differ diff --git a/fastlane/metadata/android/nn-NO/images/phoneScreenshots/4_civil_defense_info.png b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/4_civil_defense_info.png new file mode 100644 index 0000000..da75ca3 Binary files /dev/null and b/fastlane/metadata/android/nn-NO/images/phoneScreenshots/4_civil_defense_info.png differ