fix(settings): pre-populate ServerSettings with homelab defaults + clear cache on save

- ServerSettings init: pre-populate bookshelf_url, abs_url, abs_token with
  homelab defaults if not already set (books.dueattendant149.org + ABS token).
- ServerSettingsViewModel.save(): clear BookshelfApiClientFactory and
  AudiobookshelfApiClientFactory caches after save so new URL takes effect.
- Defaults also returned from getters if value is blank.
- ':app:assembleOssDebug' passes, APK deployed.
This commit is contained in:
Atte149 2026-06-27 21:16:10 +03:00
parent 5011c51516
commit fc863e132d
2 changed files with 27 additions and 10 deletions

View file

@ -22,6 +22,8 @@ class ServerSettingsViewModel
@Inject @Inject
constructor( constructor(
private val serverSettings: ServerSettings, private val serverSettings: ServerSettings,
private val bookshelfClientFactory: org.dueattendant149.bookreader.data.remote.bookshelfapi.BookshelfApiClientFactory,
private val absClientFactory: org.dueattendant149.bookreader.data.remote.audiobookshelf.AudiobookshelfApiClientFactory,
) : ViewModel() { ) : ViewModel() {
private val _uiState = MutableStateFlow(ServerSettingsUiState()) private val _uiState = MutableStateFlow(ServerSettingsUiState())
@ -52,6 +54,8 @@ class ServerSettingsViewModel
serverSettings.setBookshelfUrl(_uiState.value.bookshelfUrl.trim()) serverSettings.setBookshelfUrl(_uiState.value.bookshelfUrl.trim())
serverSettings.setAbsUrl(_uiState.value.absUrl.trim()) serverSettings.setAbsUrl(_uiState.value.absUrl.trim())
serverSettings.setAbsToken(_uiState.value.absToken.trim()) serverSettings.setAbsToken(_uiState.value.absToken.trim())
bookshelfClientFactory.clearCache()
absClientFactory.clearCache()
_uiState.value = _uiState.value.copy(saved = true) _uiState.value = _uiState.value.copy(saved = true)
} }
} }

View file

@ -12,10 +12,10 @@ private const val KEY_BOOKSHELF_URL = "bookshelf_url"
private const val KEY_ABS_URL = "abs_url" private const val KEY_ABS_URL = "abs_url"
private const val KEY_ABS_TOKEN = "abs_token" private const val KEY_ABS_TOKEN = "abs_token"
/** private const val DEFAULT_BOOKSHELF_URL = "https://books.dueattendant149.org/"
* Minimal server URL/token storage. Replaces the full DataStore-based settings private const val DEFAULT_ABS_URL = "https://books.dueattendant149.org/"
* from Book's Story for Phase 2 backend scaffolding. private const val DEFAULT_ABS_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5ZmFhZTFiYS1mYTdiLTQwNjgtYWY1NC05YmZmZmQ1MzE1MTAiLCJ1c2VybmFtZSI6InZsYWRpayIsImlhdCI6MTc4MDI2OTY0NH0.bf7XvvcKQnnr0PCj8hSa-5n4PrsW4POTns_pj5TkncU"
*/
@Singleton @Singleton
class ServerSettings class ServerSettings
@Inject @Inject
@ -24,21 +24,34 @@ class ServerSettings
) { ) {
private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
fun getBookshelfUrl(): String? = prefs.getString(KEY_BOOKSHELF_URL, null) init {
// Pre-populate defaults for homelab if not set
if (!prefs.contains(KEY_BOOKSHELF_URL)) {
prefs.edit { putString(KEY_BOOKSHELF_URL, DEFAULT_BOOKSHELF_URL) }
}
if (!prefs.contains(KEY_ABS_URL)) {
prefs.edit { putString(KEY_ABS_URL, DEFAULT_ABS_URL) }
}
if (!prefs.contains(KEY_ABS_TOKEN)) {
prefs.edit { putString(KEY_ABS_TOKEN, DEFAULT_ABS_TOKEN) }
}
}
fun getBookshelfUrl(): String? = prefs.getString(KEY_BOOKSHELF_URL, DEFAULT_BOOKSHELF_URL)
fun setBookshelfUrl(url: String) { fun setBookshelfUrl(url: String) {
prefs.edit { putString(KEY_BOOKSHELF_URL, url) } prefs.edit { putString(KEY_BOOKSHELF_URL, url.ifBlank { DEFAULT_BOOKSHELF_URL }) }
} }
fun getAbsUrl(): String? = prefs.getString(KEY_ABS_URL, null) fun getAbsUrl(): String? = prefs.getString(KEY_ABS_URL, DEFAULT_ABS_URL)
fun setAbsUrl(url: String) { fun setAbsUrl(url: String) {
prefs.edit { putString(KEY_ABS_URL, url) } prefs.edit { putString(KEY_ABS_URL, url.ifBlank { DEFAULT_ABS_URL }) }
} }
fun getAbsToken(): String? = prefs.getString(KEY_ABS_TOKEN, null) fun getAbsToken(): String? = prefs.getString(KEY_ABS_TOKEN, DEFAULT_ABS_TOKEN)
fun setAbsToken(token: String) { fun setAbsToken(token: String) {
prefs.edit { putString(KEY_ABS_TOKEN, token) } prefs.edit { putString(KEY_ABS_TOKEN, token) }
} }
} }