chahinebrini 63fae25531 fix(android-protection): explicit specialUse FGS type — Samsung/Android 16 crash loop
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>
2026-06-10 22:33:28 +02:00

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