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>
66 lines
2.2 KiB
YAML
66 lines
2.2 KiB
YAML
# screens/03-blocked.yaml
|
|
#
|
|
# Marketing-Screenshot 03: Block-Screen (gesperrte Casino-Seite)
|
|
#
|
|
# WICHTIG: Dieser Screen ist NICHT direkt per Maestro-Flow erzeugbar.
|
|
# Der Block-Screen erscheint im System-Browser (Safari / Chrome) wenn das VPN-DNS
|
|
# eine Domain blockiert und zur Rebreak-Blockpage weiterleitet — außerhalb der App.
|
|
# Maestro kann keine externen Browser-Fenster oder System-Level-UI öffnen.
|
|
#
|
|
# OPTIONEN für diesen Screenshot (manuell):
|
|
# A) VPN aktiv auf Simulator/Device → Safari öffnen → casino.com aufrufen →
|
|
# Screenshot via Cmd+S (Simulator) oder Seitenknopf+Lautstärke (Device).
|
|
# B) In-App-Blocked-Webview: Falls die App einen eigenen WebView mit Block-Page hat
|
|
# (z.B. app/help/crisis.tsx oder eine BlockedScreen-Komponente), diesen ansteuern.
|
|
# C) Platzhalter akzeptieren bis manuell erstellt.
|
|
#
|
|
# Dieser Flow versucht Option B: Öffnen des Help-Screens als nächstbestes sichtbares
|
|
# "Schutz greift ein"-Äquivalent.
|
|
#
|
|
# Screenshot-Output: screenshots/03-blocked.png
|
|
# Env-Vars: E2E_TEST_USER, E2E_TEST_PASSWORD
|
|
#
|
|
# STATUS: MANUELL — Flow läuft durch, macht Screenshot des Help/Crisis-Screens als
|
|
# Proxy. Echter Block-Screen muss manuell via Safari+aktivem VPN erstellt werden.
|
|
|
|
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"
|
|
|
|
# Header-Dropdown öffnen für Zugriff auf Hilfe-Menü
|
|
# FRAGILE: Koordinaten-Tap — ersetzen durch testID="header-avatar-btn" wenn vorhanden
|
|
- tapOn:
|
|
id: "header-avatar-btn"
|
|
- waitForAnimationToEnd:
|
|
timeout: 2000
|
|
|
|
# Falls Dropdown kein direktes "Hilfe" hat: Abbruch und Screenshot des Dropdowns selbst
|
|
# Das Dropdown zeigt immerhin den "SOS"-Eintrag — nahegelegener Kontext
|
|
- assertVisible:
|
|
text: "SOS"
|
|
|
|
# Screenshot des Dropdown-States als Proxy für "Schutz ist da"
|
|
# Für echten Block-Screen: MANUELL via Safari mit aktivem VPN
|
|
- takeScreenshot: screenshots/03-blocked
|