diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d9faebb..2124d65 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "com.devlab.app" minSdk = 26 targetSdk = 37 - versionCode = 9 - versionName = "1.7.0" + versionCode = 10 + versionName = "1.7.1" } buildTypes { diff --git a/android/app/src/main/java/com/devlab/app/MainActivity.kt b/android/app/src/main/java/com/devlab/app/MainActivity.kt index 79b4b8a..5c7f174 100644 --- a/android/app/src/main/java/com/devlab/app/MainActivity.kt +++ b/android/app/src/main/java/com/devlab/app/MainActivity.kt @@ -158,7 +158,6 @@ fun AppRoot() { popUpTo(0) { inclusive = true } } SessionManager.consumeLogoutRequest() - SessionManager.restoreSession() } } } diff --git a/android/app/src/main/java/com/devlab/app/data/api/AuthInterceptor.kt b/android/app/src/main/java/com/devlab/app/data/api/AuthInterceptor.kt index 3da33ab..e419230 100644 --- a/android/app/src/main/java/com/devlab/app/data/api/AuthInterceptor.kt +++ b/android/app/src/main/java/com/devlab/app/data/api/AuthInterceptor.kt @@ -11,7 +11,7 @@ class AuthInterceptor(private val token: String) : Interceptor { .build() val response = chain.proceed(request) - if (response.code == 401 && token.isNotBlank()) { + if (response.code == 401 && token.isNotBlank() && SessionManager.isSessionValid.value) { SessionManager.invalidateSession() } diff --git a/android/app/src/main/java/com/devlab/app/data/api/SessionManager.kt b/android/app/src/main/java/com/devlab/app/data/api/SessionManager.kt index e37061a..290978b 100644 --- a/android/app/src/main/java/com/devlab/app/data/api/SessionManager.kt +++ b/android/app/src/main/java/com/devlab/app/data/api/SessionManager.kt @@ -12,15 +12,20 @@ object SessionManager { private val _onLogoutRequest = MutableStateFlow(false) val onLogoutRequest: StateFlow = _onLogoutRequest.asStateFlow() - fun invalidateSession() { + private val _invalidating = MutableStateFlow(false) + + fun invalidateSession(): Boolean { + if (_invalidating.value) return false + _invalidating.value = true _isSessionValid.value = false _onLogoutRequest.value = true RetrofitClient.setToken("") + return true } fun restoreSession() { _isSessionValid.value = true - _onLogoutRequest.value = false + _invalidating.value = false } fun consumeLogoutRequest() { diff --git a/android/app/src/main/java/com/devlab/app/ui/login/LoginViewModel.kt b/android/app/src/main/java/com/devlab/app/ui/login/LoginViewModel.kt index 49628f9..8da959f 100644 --- a/android/app/src/main/java/com/devlab/app/ui/login/LoginViewModel.kt +++ b/android/app/src/main/java/com/devlab/app/ui/login/LoginViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.devlab.app.ServerManagerApp import com.devlab.app.data.api.RetrofitClient +import com.devlab.app.data.api.SessionManager import com.devlab.app.data.repository.AuthRepository import com.devlab.app.util.PreferencesManager import kotlinx.coroutines.flow.MutableStateFlow @@ -70,6 +71,7 @@ class LoginViewModel : ViewModel() { loginResult.token, loginResult.userId, loginResult.username, loginResult.email, loginResult.role ) + SessionManager.restoreSession() _uiState.value = _uiState.value.copy( isLoading = false, isConnected = true, @@ -87,10 +89,10 @@ class LoginViewModel : ViewModel() { } fun logout() { + _uiState.value = LoginUiState() + RetrofitClient.setToken("") viewModelScope.launch { prefs.clear() - RetrofitClient.setToken("") - _uiState.value = LoginUiState() } } } diff --git a/public/sysadmin.apk b/public/sysadmin.apk index b4e3cc5..043131c 100644 Binary files a/public/sysadmin.apk and b/public/sysadmin.apk differ