taler-android

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

capture-screenshots.sh (3990B)


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