taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

capture-screenshots.sh (4267B)


      1 #!/usr/bin/env bash
      2 
      3 set -euo pipefail
      4 
      5 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
      6 REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
      7 OUT_DIR="${1:-$REPO_ROOT/merchant-terminal/build/screenshots}"
      8 shift || true
      9 
     10 if [[ $# -gt 0 ]]; then
     11   SCENARIOS=("$@")
     12 else
     13   SCENARIOS=("login" "mfa-select" "mfa-code" "amount-entry" "order" "order-custom" "order-custom-added" "payment" "payment-success" "history" "refund" "refund-qr" "navigation")
     14 fi
     15 
     16 LOCALES=("en" "de" "fr")
     17 
     18 APP_ID="net.taler.merchantpos"
     19 ACTIVITY="$APP_ID/.debug.ScreenshotActivity"
     20 EXTRA_KEY="screenshot_scenario"
     21 EXTRA_LOCALE_KEY="screenshot_locale"
     22 LOGCAT_TAG="SCREENSHOT_READY"
     23 WAIT_TIMEOUT=30
     24 BOOTED_EMULATOR=""
     25 
     26 mkdir -p "$OUT_DIR"
     27 
     28 if ! command -v adb >/dev/null 2>&1; then
     29   echo "adb is required" >&2
     30   exit 1
     31 fi
     32 
     33 find_emulator_cmd() {
     34   if command -v emulator >/dev/null 2>&1; then
     35     echo "emulator"
     36   elif [[ -x "${ANDROID_HOME:-}/emulator/emulator" ]]; then
     37     echo "${ANDROID_HOME}/emulator/emulator"
     38   elif [[ -x "${ANDROID_SDK_ROOT:-}/emulator/emulator" ]]; then
     39     echo "${ANDROID_SDK_ROOT}/emulator/emulator"
     40   else
     41     return 1
     42   fi
     43 }
     44 
     45 shutdown_emulator() {
     46   if [[ -n "$BOOTED_EMULATOR" ]]; then
     47     echo "Shutting down emulator ($BOOTED_EMULATOR)..."
     48     adb -s "$BOOTED_EMULATOR" emu kill 2>/dev/null || true
     49     BOOTED_EMULATOR=""
     50   fi
     51 }
     52 
     53 trap shutdown_emulator EXIT
     54 
     55 CONNECTED_DEVICES=()
     56 while IFS= read -r serial; do
     57   CONNECTED_DEVICES+=("$serial")
     58 done < <(adb devices | awk 'NR > 1 && $2 == "device" { print $1 }')
     59 
     60 if [[ ${#CONNECTED_DEVICES[@]} -eq 0 ]]; then
     61   EMU_CMD="$(find_emulator_cmd)" || {
     62     echo "No device connected and emulator command not found. Set ANDROID_HOME or add emulator to PATH." >&2
     63     exit 1
     64   }
     65 
     66   AVDS=()
     67   while IFS= read -r avd; do
     68     [[ -n "$avd" ]] && AVDS+=("$avd")
     69   done < <("$EMU_CMD" -list-avds 2>/dev/null)
     70 
     71   if [[ ${#AVDS[@]} -eq 0 ]]; then
     72     echo "No device connected and no AVDs found." >&2
     73     exit 1
     74   fi
     75 
     76   AVD="${AVDS[0]}"
     77   echo "No device connected. Booting emulator: $AVD"
     78   "$EMU_CMD" -avd "$AVD" -no-audio -no-boot-anim &>/dev/null &
     79 
     80   echo "Waiting for emulator to boot..."
     81   adb wait-for-device
     82   local_elapsed=0
     83   while [[ "$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" != "1" ]]; do
     84     if [[ $local_elapsed -ge 120 ]]; then
     85       echo "Emulator boot timed out after 120s" >&2
     86       exit 1
     87     fi
     88     sleep 2
     89     local_elapsed=$((local_elapsed + 2))
     90   done
     91   sleep 1
     92   echo "Emulator booted."
     93 
     94   while IFS= read -r serial; do
     95     CONNECTED_DEVICES+=("$serial")
     96   done < <(adb devices | awk 'NR > 1 && $2 == "device" { print $1 }')
     97 
     98   BOOTED_EMULATOR="${CONNECTED_DEVICES[0]}"
     99 fi
    100 
    101 if [[ -n "${ANDROID_SERIAL:-}" ]]; then
    102   ADB_SERIAL="$ANDROID_SERIAL"
    103 elif [[ ${#CONNECTED_DEVICES[@]} -gt 1 ]]; then
    104   ADB_SERIAL="${CONNECTED_DEVICES[0]}"
    105   echo "Multiple devices detected; using $ADB_SERIAL. Set ANDROID_SERIAL to choose another device." >&2
    106 else
    107   ADB_SERIAL="${CONNECTED_DEVICES[0]}"
    108 fi
    109 
    110 if ! printf '%s\n' "${CONNECTED_DEVICES[@]}" | grep -Fxq "$ADB_SERIAL"; then
    111   echo "Selected Android device '$ADB_SERIAL' is not connected and authorized" >&2
    112   adb devices -l >&2
    113   exit 1
    114 fi
    115 
    116 export ANDROID_SERIAL="$ADB_SERIAL"
    117 ADB=(adb -s "$ADB_SERIAL")
    118 
    119 wait_for_ready() {
    120   local scenario="$1"
    121   local elapsed=0
    122   while [[ $elapsed -lt $WAIT_TIMEOUT ]]; do
    123     if "${ADB[@]}" logcat -d -s "$LOGCAT_TAG:I" 2>/dev/null | grep -qF "$scenario"; then
    124       return 0
    125     fi
    126     sleep 0.5
    127     elapsed=$((elapsed + 1))
    128   done
    129   echo "  Warning: timed out waiting for ready signal, capturing anyway" >&2
    130   return 0
    131 }
    132 
    133 "$REPO_ROOT/gradlew" :merchant-terminal:installDebug
    134 
    135 for locale in "${LOCALES[@]}"; do
    136   LOCALE_DIR="$OUT_DIR/$locale"
    137   mkdir -p "$LOCALE_DIR"
    138   echo "=== Locale: $locale ==="
    139 
    140   for scenario in "${SCENARIOS[@]}"; do
    141     echo "  Capturing $scenario ($locale)"
    142     "${ADB[@]}" shell am force-stop "$APP_ID" >/dev/null 2>&1 || true
    143     "${ADB[@]}" logcat -c 2>/dev/null || true
    144     "${ADB[@]}" shell am start -W -n "$ACTIVITY" \
    145       --es "$EXTRA_KEY" "$scenario" \
    146       --es "$EXTRA_LOCALE_KEY" "$locale" >/dev/null
    147     wait_for_ready "$scenario" "$WAIT_TIMEOUT"
    148     sleep 3
    149     "${ADB[@]}" exec-out screencap -p > "$LOCALE_DIR/$scenario.png"
    150   done
    151 done
    152 
    153 echo "Saved screenshots to $OUT_DIR"