From 686176b148719e6eddc18fa18cc0c93de3898366 Mon Sep 17 00:00:00 2001 From: KremeCN <3265494849@qq.com> Date: Wed, 26 Aug 2026 07:39:10 +0800 Subject: [PATCH] fix: rethrow UI preference transform IO failures --- .../preferences/DataStoreUiPreferencesRepository.kt | 13 ++++++++++++- .../DataStoreUiPreferencesRepositoryTest.kt | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/android/core/preferences/src/main/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepository.kt b/android/core/preferences/src/main/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepository.kt index cffed9c..9127d88 100644 --- a/android/core/preferences/src/main/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepository.kt +++ b/android/core/preferences/src/main/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepository.kt @@ -38,9 +38,16 @@ class DataStoreUiPreferencesRepository internal constructor( transform: (UiPreferences) -> UiPreferences, ): UiPreferencesWriteResult = try { dataStore.edit { storedPreferences -> - storedPreferences.putAll(transform(preferencesFrom(storedPreferences))) + val updatedPreferences = try { + transform(preferencesFrom(storedPreferences)) + } catch (cause: Throwable) { + throw TransformFailure(cause) + } + storedPreferences.putAll(updatedPreferences) } UiPreferencesWriteResult.Success + } catch (failure: TransformFailure) { + throw failure.cause } catch (cause: CancellationException) { throw cause } catch (_: IOException) { @@ -71,6 +78,10 @@ class DataStoreUiPreferencesRepository internal constructor( private inline fun > String.enumOrDefault(default: T): T = enumValues().firstOrNull { it.name == this } ?: default + private class TransformFailure( + override val cause: Throwable, + ) : RuntimeException(cause) + private companion object { val RENDERER = stringPreferencesKey("renderer") val THEME_MODE = stringPreferencesKey("theme_mode") diff --git a/android/core/preferences/src/test/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepositoryTest.kt b/android/core/preferences/src/test/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepositoryTest.kt index 25fd0bd..bc71d3e 100644 --- a/android/core/preferences/src/test/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepositoryTest.kt +++ b/android/core/preferences/src/test/kotlin/com/flagship/abox/manager/preferences/DataStoreUiPreferencesRepositoryTest.kt @@ -99,6 +99,18 @@ class DataStoreUiPreferencesRepositoryTest { assertEquals(failure, actual) } + @Test + fun updateRethrowsTransformIOException() = runTest { + val repository = DataStoreUiPreferencesRepository(InMemoryPreferencesDataStore()) + val failure = IOException("invalid transform") + + val actual = runCatching { + repository.update { throw failure } + }.exceptionOrNull() + + assertEquals(failure, actual) + } + @Test fun updateRethrowsCancellationException() = runTest { val cancellation = CancellationException("cancelled")