RebreakVpnService.onStartCommand crashed with SecurityException because Android 16's validateForegroundServiceType rejects the implicit 2-arg startForeground(). Now passes FOREGROUND_SERVICE_TYPE_SPECIAL_USE explicitly (Google's documented best practice) and guards the call so a failed foreground promotion stops the service cleanly instead of crashing the app. Verified vs reported Galaxy A54 / Android 16 signature (97% of crash events, 1-user crash loop). Bundles pending working-tree work across native/marketing/locales/mac + graphify-out rebuild. gitignore: google-services.json + /screenshots/. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
82 lines
2.0 KiB
YAML
82 lines
2.0 KiB
YAML
# screens/04-sos-lyra.yaml
|
||
#
|
||
# Marketing-Screenshot 04: SOS / Chat mit Lyra
|
||
#
|
||
# Ziel: Lyra-Chat-Screen im SOS-Modus mit sichtbarer Nachricht und Chip-Row.
|
||
# Für vorzeigbaren Marketing-Screenshot: nach Lyra-Antwort warten, dann Screenshot.
|
||
# Die Chips ("Atemübung" etc.) müssen sichtbar sein — das beweist Live-Lyra.
|
||
#
|
||
# Timing: Groq cold start auf Staging = 6–12s. 20s-Wait für Response inklusive.
|
||
#
|
||
# Screenshot-Output: screenshots/04-sos-lyra.png
|
||
# Env-Vars: E2E_TEST_USER, E2E_TEST_PASSWORD
|
||
|
||
appId: org.rebreak.app
|
||
---
|
||
- launchApp:
|
||
clearState: true
|
||
|
||
- waitForAnimationToEnd:
|
||
timeout: 5000
|
||
|
||
# --- Auth ---
|
||
- assertVisible:
|
||
text: "E-Mail"
|
||
- tapOn:
|
||
text: "E-Mail"
|
||
- inputText: ${E2E_TEST_USER}@rebreak.internal
|
||
- tapOn:
|
||
text: "Passwort"
|
||
- inputText: ${E2E_TEST_PASSWORD}
|
||
- tapOn:
|
||
text: "Anmelden"
|
||
- waitForAnimationToEnd:
|
||
timeout: 10000
|
||
|
||
- assertVisible:
|
||
text: "ReBreak"
|
||
|
||
# --- SOS öffnen via Header-Dropdown ---
|
||
# FRAGILE: Avatar-Button hat kein testID → Koordinaten-Tap
|
||
# Ersetzen mit: tapOn: { id: "header-avatar-btn" } nach testID-Ergänzung
|
||
- tapOn:
|
||
id: "header-avatar-btn"
|
||
- waitForAnimationToEnd:
|
||
timeout: 2000
|
||
|
||
- assertVisible:
|
||
text: "SOS"
|
||
- tapOn:
|
||
text: "SOS"
|
||
|
||
# SOS-Screen startet RiveAvatar + Lyra-Streaming
|
||
- waitForAnimationToEnd:
|
||
timeout: 12000
|
||
|
||
- assertVisible:
|
||
text: "Was beschäftigt dich?"
|
||
|
||
# Erste Lyra-Nachricht schon sichtbar → Screenshot der leeren/Start-State für clean look
|
||
# Für vorzeigbareren Shot: eine Nachricht senden und auf Antwort warten
|
||
- tapOn:
|
||
text: "Was beschäftigt dich?"
|
||
- waitForAnimationToEnd:
|
||
timeout: 500
|
||
|
||
# Realistischer, nicht-klinischer Testtext für Marketing-Screenshot
|
||
- inputText: "Ich weiß nicht mehr weiter."
|
||
- pressKey: Return
|
||
|
||
# Warten bis Lyra antwortet und Chips erscheinen
|
||
- waitForAnimationToEnd:
|
||
timeout: 20000
|
||
|
||
# Chip "Atemübung" bestätigt aktive Lyra-Response
|
||
- assertVisible:
|
||
text: "Atemübung"
|
||
|
||
- waitForAnimationToEnd:
|
||
timeout: 1000
|
||
|
||
- takeScreenshot: screenshots/04-sos-lyra
|