From effdc2a1ad1a0e99ad3af5844d7c5b61f200d090 Mon Sep 17 00:00:00 2001 From: Gato Date: Sat, 6 Jun 2026 16:34:36 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20d=C3=A9marrage=20imm=C3=A9diat=20+=20ses?= =?UTF-8?q?sion=20conserv=C3=A9e=20hors-ligne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AuthViewModel: affiche l'app immédiatement si un token existe, sans attendre le refresh réseau — le refresh + sync se font en arrière-plan - BonsaiAuthManager.refreshIfNeeded: ne déconnecte l'utilisateur que sur 401/403 (token invalide), pas sur erreur réseau ou timeout Co-Authored-By: Claude Sonnet 4.6 --- app/build.gradle.kts | 2 +- .../mobile/data/bonsai/BonsaiAuthManager.kt | 21 ++++++++++++++----- .../planify/mobile/ui/auth/AuthViewModel.kt | 10 ++++----- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index db0c6bb..3480dcd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ android { minSdk = 26 targetSdk = 35 versionCode = 1 - versionName = "0.0.18" + versionName = "0.0.19" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/planify/mobile/data/bonsai/BonsaiAuthManager.kt b/app/src/main/java/com/planify/mobile/data/bonsai/BonsaiAuthManager.kt index 94e1ad4..8d032f9 100644 --- a/app/src/main/java/com/planify/mobile/data/bonsai/BonsaiAuthManager.kt +++ b/app/src/main/java/com/planify/mobile/data/bonsai/BonsaiAuthManager.kt @@ -97,12 +97,23 @@ class BonsaiAuthManager @Inject constructor( runCatching { httpClient.newCall(request).execute().use { response -> - if (!response.isSuccessful) return@withContext false - val raw = response.body?.string() ?: return@withContext false - saveTokens(JSONObject(raw)) - true + when { + response.isSuccessful -> { + val raw = response.body?.string() ?: return@withContext true + saveTokens(JSONObject(raw)) + true + } + response.code == 401 || response.code == 403 -> { + // Refresh token genuinely invalid — must re-login. + false + } + else -> { + // Server error or network issue — keep existing token, don't logout. + true + } + } } - }.getOrDefault(false) + }.getOrDefault(true) // Network exception (offline, timeout) → keep existing token. } fun logout() { diff --git a/app/src/main/java/com/planify/mobile/ui/auth/AuthViewModel.kt b/app/src/main/java/com/planify/mobile/ui/auth/AuthViewModel.kt index dc3df72..3b5406f 100644 --- a/app/src/main/java/com/planify/mobile/ui/auth/AuthViewModel.kt +++ b/app/src/main/java/com/planify/mobile/ui/auth/AuthViewModel.kt @@ -38,12 +38,12 @@ class AuthViewModel @Inject constructor( _status.value = AuthStatus.NotAuthenticated return@launch } - if (authManager.refreshIfNeeded()) { - _status.value = AuthStatus.Authenticated(authManager.getUsername()) + // Show the app immediately — don't block on a network call. + _status.value = AuthStatus.Authenticated(authManager.getUsername()) + // Refresh token + sync in background without blocking startup. + viewModelScope.launch { + authManager.refreshIfNeeded() syncManager.sync() - } else { - authManager.logout() - _status.value = AuthStatus.NotAuthenticated } } }