From 22ec511ca755b129d5aee3baffef62905568a9ff Mon Sep 17 00:00:00 2001 From: gabriel20xx Date: Sat, 25 Oct 2025 16:17:28 +0200 Subject: [PATCH] feat: Enhance PreferencesManager and SyncRepository for better server settings management and error handling --- .../data/preferences/PreferencesManager.kt | 30 ++++++++++++++++-- .../app/data/repository/SyncRepository.kt | 6 ++++ .../app/ui/screens/ServerSetupViewModel.kt | 2 ++ .../app/ui/screens/SettingsScreen.kt | 10 ++++-- CollabTableAndroid/build-output.txt | Bin 4844 -> 4866 bytes 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt index 076d362..9e1da2b 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt @@ -18,9 +18,14 @@ class PreferencesManager(context: Context) { } fun setServerUrl(url: String) { - val cleanUrl = url.trim().let { - if (it.endsWith("/")) it else "$it/" + val raw = url.trim() + if (raw.isBlank()) { + // Remove the key entirely to fall back to default URL on reads + prefs.edit().remove(KEY_SERVER_URL).apply() + _serverUrl.value = getServerUrl() + return } + val cleanUrl = raw.let { if (it.endsWith("/")) it else "$it/" } prefs.edit().putString(KEY_SERVER_URL, cleanUrl).apply() _serverUrl.value = cleanUrl } @@ -38,13 +43,32 @@ class PreferencesManager(context: Context) { } fun setServerPassword(password: String) { - prefs.edit().putString(KEY_SERVER_PASSWORD, password).apply() + if (password.isBlank()) { + prefs.edit().remove(KEY_SERVER_PASSWORD).apply() + } else { + prefs.edit().putString(KEY_SERVER_PASSWORD, password).apply() + } + } + + // Clear sync-related state so the next sync starts from scratch + fun clearSyncState() { + prefs.edit().remove(KEY_LAST_SYNC_TIMESTAMP).apply() + } + + fun clearServerSettings() { + prefs.edit() + .remove(KEY_SERVER_URL) + .remove(KEY_SERVER_PASSWORD) + .remove(KEY_LAST_SYNC_TIMESTAMP) + .apply() + _serverUrl.value = getServerUrl() } companion object { private const val KEY_SERVER_URL = "server_url" private const val KEY_FIRST_RUN = "first_run" private const val KEY_SERVER_PASSWORD = "server_password" + private const val KEY_LAST_SYNC_TIMESTAMP = "last_sync_timestamp" private const val DEFAULT_SERVER_URL = "http://10.0.2.2:3000/api/" @Volatile diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/repository/SyncRepository.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/repository/SyncRepository.kt index 5237422..79d4132 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/repository/SyncRepository.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/repository/SyncRepository.kt @@ -121,6 +121,12 @@ class SyncRepository(context: Context) { return@withContext Result.success(Unit) } else { + if (response.code() == 401) { + // Unauthorized: likely bad/missing password. Reset sync baseline and surface a clear error. + Logger.e("Sync", "[ERROR] Unauthorized (401). Check server password in Settings.") + setLastSyncTimestamp(0) + return@withContext Result.failure(Exception("Unauthorized (401). Please verify server password.")) + } Logger.e("Sync", "[ERROR] Sync failed: HTTP ${response.code()}") return@withContext Result.failure(Exception("Sync failed: ${response.code()}")) } diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ServerSetupViewModel.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ServerSetupViewModel.kt index ae4e8e3..e5f5713 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ServerSetupViewModel.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ServerSetupViewModel.kt @@ -160,6 +160,8 @@ class ServerSetupViewModel( // Password is valid, save both URL and password preferencesManager.setServerUrl(finalUrl) preferencesManager.setServerPassword(password) + // Reset sync baseline for a fresh initial sync on new server + preferencesManager.clearSyncState() preferencesManager.setIsFirstRun(false) ApiClient.setBaseUrl(finalUrl) _validationResult.value = true diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt index 449ef6e..f93d821 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.collabtable.app.R import com.collabtable.app.data.database.CollabTableDatabase +import com.collabtable.app.data.api.ApiClient import com.collabtable.app.data.preferences.PreferencesManager import com.collabtable.app.data.repository.SyncRepository import com.collabtable.app.utils.Logger @@ -174,10 +175,13 @@ fun SettingsScreen( CollabTableDatabase.clearDatabase(context) } - // Clear preferences - preferencesManager.setServerUrl("") - preferencesManager.setServerPassword("") + // Clear preferences (URL, password, last sync) + preferencesManager.clearServerSettings() preferencesManager.setIsFirstRun(true) + // Clear in-memory logs as part of local data + Logger.clear() + // Reset API client base URL to current preference (default) + ApiClient.setBaseUrl(preferencesManager.getServerUrl()) Logger.i("Settings", "Left server successfully") diff --git a/CollabTableAndroid/build-output.txt b/CollabTableAndroid/build-output.txt index 1068bcea8e4edd1470602dd62f2df6b65e42762c..74e70f2afeb22c7f551c390d9475e82fa1243053 100644 GIT binary patch delta 48 zcmaE(+N8GO7|-NQEJm9j@myh*He*m=NM)!1;$((Wh7us1!k_~bGiETDd{Iam0D&D1 AIRF3v delta 53 zcmZotd!xGH7|-M&4u#EscrLIqnom9}Bra#fV9B7sP|8ripvzFgkPjqN7!rZ3R0duK GE(QR>jtv?B