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 } } }