docs(qa-261): ajoute documents conformité et scripts QA pour release Android

- Ajoute privacy-policy-v1.md et release-compliance-checklist.md
- Ajoute documents QA gates #238-#243
- Ajoute scripts de validation repo-only et device runbooks
- Prépare checklists exécutables avant upload Play fermé

Ticket #261
This commit is contained in:
2026-08-28 23:11:16 +02:00
parent 313e755895
commit d4df3822b7
13 changed files with 1623 additions and 0 deletions

138
tool/qa_device_health_connect.sh Executable file
View File

@ -0,0 +1,138 @@
#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="/home/anthony/Documents/Projects/GameTime"
ARTIFACT_BASE="${ARTIFACT_BASE:-$PROJECT_ROOT/.ideai/artifacts/qa-device}"
PHONE_SERIAL="${PHONE_SERIAL:-}"
PACKAGE_NAME="${PACKAGE_NAME:-com.idea.gametime}"
usage() {
cat <<'EOF'
Usage:
./tool/qa_device_health_connect.sh start
./tool/qa_device_health_connect.sh stop <artifact_dir>
Environment:
PHONE_SERIAL Optional adb serial for the phone under test
ARTIFACT_BASE Optional artifact root
PACKAGE_NAME Optional Android package name (default: com.idea.gametime)
EOF
}
adb_cmd() {
if [[ -n "$PHONE_SERIAL" ]]; then
adb -s "$PHONE_SERIAL" "$@"
else
adb "$@"
fi
}
require_adb() {
command -v adb >/dev/null 2>&1 || {
echo "adb not found in PATH." >&2
exit 1
}
adb start-server >/dev/null
adb_cmd get-state >/dev/null 2>&1 || {
echo "No adb device available. Connect the phone or set PHONE_SERIAL." >&2
exit 1
}
}
timestamp() {
date -u +"%Y%m%dT%H%M%SZ"
}
start_capture() {
require_adb
local dir="$ARTIFACT_BASE/health-connect-$(timestamp)"
mkdir -p "$dir"
adb devices -l >"$dir/adb-devices.txt"
adb_cmd shell getprop ro.build.fingerprint >"$dir/phone-build-fingerprint.txt"
adb_cmd shell dumpsys package "$PACKAGE_NAME" >"$dir/package-dumpsys-before.txt" || true
adb_cmd logcat -c
adb_cmd logcat -v threadtime >"$dir/logcat.txt" 2>&1 &
local pid=$!
echo "$pid" >"$dir/logcat.pid"
cat >"$dir/steps.md" <<EOF
# Health Connect manual QA
Date: $(date -u +"%Y-%m-%d %H:%M:%SZ")
Package: $PACKAGE_NAME
## Preconditions
- Fresh GameTime phone build installed on the connected Android device.
- Health Connect available on device.
- Device unlocked.
## Manual flow
1. Open GameTime.
2. Go to Paramètres > Intégrations > Health Connect.
3. Validate the visible initial status.
4. Tap "Autoriser l'accès" or "Gérer les autorisations".
5. Validate the expected path:
- permission sheet opens, or
- settings fallback opens cleanly.
6. Grant or deny permissions according to the scenario under test.
7. Return to GameTime and validate the refreshed status.
8. Start and finish a workout if export-after-workout must be checked.
9. Confirm the final Health Connect export outcome shown by the app.
## Evidence to collect
- Screenshot(s) of the visible status before and after permission handling.
- Screenshot(s) of Health Connect permission/settings UI if opened.
- Notes on whether the path used the permission contract or settings fallback.
- Result of export-after-workout if exercised.
EOF
echo "$dir"
}
stop_capture() {
local dir="${1:-}"
[[ -n "$dir" ]] || {
usage >&2
exit 2
}
require_adb
[[ -d "$dir" ]] || {
echo "Artifact directory not found: $dir" >&2
exit 1
}
if [[ -f "$dir/logcat.pid" ]]; then
kill "$(cat "$dir/logcat.pid")" >/dev/null 2>&1 || true
fi
adb_cmd shell dumpsys package "$PACKAGE_NAME" >"$dir/package-dumpsys-after.txt" || true
adb_cmd shell settings list secure >"$dir/settings-secure.txt" || true
cat <<EOF
Health Connect manual QA artifacts finalized in:
$dir
Archive expected:
- adb-devices.txt
- phone-build-fingerprint.txt
- package-dumpsys-before.txt
- package-dumpsys-after.txt
- logcat.txt
- steps.md
EOF
}
case "${1:-}" in
start)
start_capture
;;
stop)
shift
stop_capture "${1:-}"
;;
*)
usage
exit 2
;;
esac

View File

@ -0,0 +1,129 @@
#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="/home/anthony/Documents/Projects/GameTime"
ARTIFACT_BASE="${ARTIFACT_BASE:-$PROJECT_ROOT/.ideai/artifacts/qa-device}"
PHONE_SERIAL="${PHONE_SERIAL:-}"
PACKAGE_NAME="${PACKAGE_NAME:-com.idea.gametime}"
usage() {
cat <<'EOF'
Usage:
./tool/qa_device_import_export_real.sh start
./tool/qa_device_import_export_real.sh stop <artifact_dir>
Environment:
PHONE_SERIAL Optional adb serial for the phone under test
ARTIFACT_BASE Optional artifact root
PACKAGE_NAME Optional Android package name (default: com.idea.gametime)
EOF
}
adb_cmd() {
if [[ -n "$PHONE_SERIAL" ]]; then
adb -s "$PHONE_SERIAL" "$@"
else
adb "$@"
fi
}
require_adb() {
command -v adb >/dev/null 2>&1 || {
echo "adb not found in PATH." >&2
exit 1
}
adb start-server >/dev/null
adb_cmd get-state >/dev/null 2>&1 || {
echo "No adb device available. Connect the phone or set PHONE_SERIAL." >&2
exit 1
}
}
timestamp() {
date -u +"%Y%m%dT%H%M%SZ"
}
start_capture() {
require_adb
local dir="$ARTIFACT_BASE/import-export-real-$(timestamp)"
mkdir -p "$dir"
adb devices -l >"$dir/adb-devices.txt"
adb_cmd shell getprop ro.build.fingerprint >"$dir/phone-build-fingerprint.txt"
adb_cmd shell dumpsys package "$PACKAGE_NAME" >"$dir/package-dumpsys-before.txt" || true
adb_cmd logcat -c
adb_cmd logcat -v threadtime >"$dir/logcat.txt" 2>&1 &
echo "$!" >"$dir/logcat.pid"
cat >"$dir/steps.md" <<EOF
# Import / export real-device QA
Date: $(date -u +"%Y-%m-%d %H:%M:%SZ")
Package: $PACKAGE_NAME
## Preconditions
- Fresh GameTime phone build installed on the connected Android device.
- At least one exercise, one program and one workout template available locally.
- File picker available on device.
## Manual flow
1. Open GameTime.
2. Go to the profile/settings surface exposing import/export.
3. Export local data and confirm a file is produced.
4. Record the exported filename and storage location.
5. Re-import the same file in merge mode and validate the expected result.
6. Re-import in replace-all mode only on a disposable dataset.
7. If relevant, try importing while an active workout exists and validate the expected refusal.
## Evidence to collect
- Screenshot(s) before export and after export confirmation.
- Exported filename and location.
- Screenshot(s) after merge import and replace-all import.
- Notes on any refusal caused by active workout protection.
EOF
echo "$dir"
}
stop_capture() {
local dir="${1:-}"
[[ -n "$dir" ]] || {
usage >&2
exit 2
}
require_adb
[[ -d "$dir" ]] || {
echo "Artifact directory not found: $dir" >&2
exit 1
}
[[ -f "$dir/logcat.pid" ]] && kill "$(cat "$dir/logcat.pid")" >/dev/null 2>&1 || true
adb_cmd shell dumpsys package "$PACKAGE_NAME" >"$dir/package-dumpsys-after.txt" || true
cat <<EOF
Import/export manual QA artifacts finalized in:
$dir
Archive expected:
- adb-devices.txt
- phone-build-fingerprint.txt
- package-dumpsys-before.txt
- package-dumpsys-after.txt
- logcat.txt
- steps.md
EOF
}
case "${1:-}" in
start)
start_capture
;;
stop)
shift
stop_capture "${1:-}"
;;
*)
usage
exit 2
;;
esac

154
tool/qa_device_watch_companion.sh Executable file
View File

@ -0,0 +1,154 @@
#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="/home/anthony/Documents/Projects/GameTime"
ARTIFACT_BASE="${ARTIFACT_BASE:-$PROJECT_ROOT/.ideai/artifacts/qa-device}"
PHONE_SERIAL="${PHONE_SERIAL:-}"
WATCH_SERIAL="${WATCH_SERIAL:-}"
PACKAGE_NAME="${PACKAGE_NAME:-com.idea.gametime}"
WATCH_PACKAGE_NAME="${WATCH_PACKAGE_NAME:-com.idea.gametime}"
usage() {
cat <<'EOF'
Usage:
./tool/qa_device_watch_companion.sh start
./tool/qa_device_watch_companion.sh stop <artifact_dir>
Environment:
PHONE_SERIAL Optional adb serial for the phone under test
WATCH_SERIAL Optional adb serial for the Wear device under test
ARTIFACT_BASE Optional artifact root
PACKAGE_NAME Optional phone package name
WATCH_PACKAGE_NAME Optional watch package name
EOF
}
adb_phone() {
if [[ -n "$PHONE_SERIAL" ]]; then
adb -s "$PHONE_SERIAL" "$@"
else
adb "$@"
fi
}
adb_watch() {
[[ -n "$WATCH_SERIAL" ]] || {
echo "WATCH_SERIAL is required for watch companion QA." >&2
exit 1
}
adb -s "$WATCH_SERIAL" "$@"
}
require_adb() {
command -v adb >/dev/null 2>&1 || {
echo "adb not found in PATH." >&2
exit 1
}
adb start-server >/dev/null
adb_phone get-state >/dev/null 2>&1 || {
echo "No phone adb device available." >&2
exit 1
}
adb_watch get-state >/dev/null 2>&1 || {
echo "No watch adb device available." >&2
exit 1
}
}
timestamp() {
date -u +"%Y%m%dT%H%M%SZ"
}
start_capture() {
require_adb
local dir="$ARTIFACT_BASE/watch-companion-$(timestamp)"
mkdir -p "$dir"
adb devices -l >"$dir/adb-devices.txt"
adb_phone shell getprop ro.build.fingerprint >"$dir/phone-build-fingerprint.txt"
adb_watch shell getprop ro.build.fingerprint >"$dir/watch-build-fingerprint.txt"
adb_phone shell dumpsys package "$PACKAGE_NAME" >"$dir/phone-package-dumpsys-before.txt" || true
adb_watch shell dumpsys package "$WATCH_PACKAGE_NAME" >"$dir/watch-package-dumpsys-before.txt" || true
adb_phone logcat -c
adb_watch logcat -c
adb_phone logcat -v threadtime >"$dir/phone-logcat.txt" 2>&1 &
echo "$!" >"$dir/phone-logcat.pid"
adb_watch logcat -v threadtime >"$dir/watch-logcat.txt" 2>&1 &
echo "$!" >"$dir/watch-logcat.pid"
cat >"$dir/steps.md" <<EOF
# Watch companion manual QA
Date: $(date -u +"%Y-%m-%d %H:%M:%SZ")
Phone package: $PACKAGE_NAME
Watch package: $WATCH_PACKAGE_NAME
## Preconditions
- Phone and watch connected through adb.
- Same GameTime app version installed on both.
- Watch paired to the phone and reachable.
## Manual flow
1. Launch GameTime on the phone.
2. Start a workout from the phone.
3. Validate that the active session is projected to the watch.
4. Validate visible metrics on watch, including steps if available.
5. Trigger at least one action from the watch that must affect the phone session.
6. Validate phone UI updates correctly after the watch action.
7. Finish the workout and validate the watch teardown / final state.
## Evidence to collect
- Screenshot(s) on phone and watch while a session is active.
- Notes on connection status and any visible lag.
- Notes on step visibility if data is present.
- Final verdict on session projection and round-trip actions.
EOF
echo "$dir"
}
stop_capture() {
local dir="${1:-}"
[[ -n "$dir" ]] || {
usage >&2
exit 2
}
require_adb
[[ -d "$dir" ]] || {
echo "Artifact directory not found: $dir" >&2
exit 1
}
[[ -f "$dir/phone-logcat.pid" ]] && kill "$(cat "$dir/phone-logcat.pid")" >/dev/null 2>&1 || true
[[ -f "$dir/watch-logcat.pid" ]] && kill "$(cat "$dir/watch-logcat.pid")" >/dev/null 2>&1 || true
adb_phone shell dumpsys package "$PACKAGE_NAME" >"$dir/phone-package-dumpsys-after.txt" || true
adb_watch shell dumpsys package "$WATCH_PACKAGE_NAME" >"$dir/watch-package-dumpsys-after.txt" || true
cat <<EOF
Watch companion manual QA artifacts finalized in:
$dir
Archive expected:
- adb-devices.txt
- phone-build-fingerprint.txt
- watch-build-fingerprint.txt
- phone-logcat.txt
- watch-logcat.txt
- steps.md
EOF
}
case "${1:-}" in
start)
start_capture
;;
stop)
shift
stop_capture "${1:-}"
;;
*)
usage
exit 2
;;
esac

View File

@ -0,0 +1,17 @@
#!/usr/bin/env bash
set -euo pipefail
export HOME=/tmp
export XDG_CONFIG_HOME=/tmp
export FLUTTER_SUPPRESS_ANALYTICS=true
export DART_SUPPRESS_ANALYTICS=true
exec ./.ideai/flutter-sdk-1785572580/bin/flutter test \
test/presentation/home_screen_test.dart \
test/presentation/exercise_library_screen_test.dart \
test/presentation/program_screen_test.dart \
test/presentation/workout_template_screen_test.dart \
test/presentation/workout_execution_screen_test.dart \
test/presentation/history_screen_test.dart \
test/presentation/progression_screen_test.dart \
test/presentation/profile_screen_test.dart

View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
export HOME=/tmp
export XDG_CONFIG_HOME=/tmp
export FLUTTER_SUPPRESS_ANALYTICS=true
export DART_SUPPRESS_ANALYTICS=true
exec ./.ideai/flutter-sdk-1785572580/bin/flutter test \
test/presentation/profile_screen_test.dart \
test/presentation/share_inbox_screen_test.dart \
test/presentation/settings_screen_test.dart \
test/application/health_connect_use_cases_test.dart \
test/application/watch_companion_projection_test.dart