Drei Fehler, die den Flow gebrochen haetten:
- Ein Abbruch im Browser liefert bei AppAuth ein regulaeres Ergebnis mit
USER_CANCELED_AUTH_FLOW, nicht null. Der bisherige Null-Check lief ins
Leere und "Zurueck" endete in einer roten Fehlermeldung.
- launch(intent) lag ausserhalb von runCatching. Verlaesst der Nutzer den
Screen waehrend der Discovery, ist der Result-Launcher abgemeldet und die
IllegalStateException haette die App beendet.
- Nonce und Provider lagen nur in ViewModel-Feldern. Der Custom Tab laeuft
in eigener Task, dieser Prozess wird dabei routinemaessig getoetet — die
Anmeldung waere nach erfolgreichem Login beim IdP gescheitert. Der Nonce
kommt jetzt aus AuthorizationResponse.request, Provider und Client-ID
werden vor dem Start persistiert.
Weiter: AuthState.update verlangt genau eines von (Response, Exception) und
haette bei null/null geworfen; onCleared() verwarf den @Singleton-Service
fuer die zweite AuthViewModel-Instanz mit.
Neu ist der geforderte Hintergrund-Refresh: laeuft das Calendarr-Token
binnen 24 h ab, wird beim Start ueber den Provider-Refresh-Token ein frisches
ID-Token geholt und getauscht — ohne Browser. Best effort; schlaegt es fehl,
bleibt das vorhandene Token in Kraft.
Ausserdem: Scopes kommen ausschliesslich vom Server (mobile_scopes), Spinner
pro Provider statt global, fehlender Browser als eigener Fehlerfall, Issuer
wird validiert, keine namenlosen Identitaeten mehr.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>