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"