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"