From 5151665216360aa2b2c170c75995f001fd7041c5 Mon Sep 17 00:00:00 2001 From: OneWay Date: Tue, 1 Sep 2026 17:28:17 +0800 Subject: [PATCH] perf: mark Compose state types as @Immutable Compose compiler reports showed DownloadState's sealed root as Uncertain and DownloadProgressState/SettingsUiState as runtime stability, so skippability checks were deferred to runtime. The annotations make them compile-time stable and turn any future mutable field into an explicit contract break. --- app/src/main/java/com/example/research/DictionaryStatus.kt | 3 +++ .../example/research/core/domain/model/IndexingProgress.kt | 3 +++ .../example/research/feature/download/model/DownloadState.kt | 4 ++++ .../main/java/com/example/research/ui/settings/ImportState.kt | 3 +++ .../java/com/example/research/ui/settings/SettingsUiState.kt | 2 ++ 5 files changed, 15 insertions(+) diff --git a/app/src/main/java/com/example/research/DictionaryStatus.kt b/app/src/main/java/com/example/research/DictionaryStatus.kt index 771ec60..68071c7 100644 --- a/app/src/main/java/com/example/research/DictionaryStatus.kt +++ b/app/src/main/java/com/example/research/DictionaryStatus.kt @@ -1,5 +1,8 @@ package com.example.research +import androidx.compose.runtime.Immutable + +@Immutable sealed interface DictionaryStatus { data object Unknown : DictionaryStatus data object Checking : DictionaryStatus diff --git a/app/src/main/java/com/example/research/core/domain/model/IndexingProgress.kt b/app/src/main/java/com/example/research/core/domain/model/IndexingProgress.kt index f3bd41c..ce1e13f 100644 --- a/app/src/main/java/com/example/research/core/domain/model/IndexingProgress.kt +++ b/app/src/main/java/com/example/research/core/domain/model/IndexingProgress.kt @@ -1,6 +1,8 @@ package com.example.research.core.domain.model import kotlin.math.roundToInt +import androidx.compose.runtime.Immutable + /** * Snapshot of an ongoing indexing operation. * @@ -11,6 +13,7 @@ import kotlin.math.roundToInt * [perFileProgress] is kept for diagnostics; callers should prefer * [progress] / [progressPercent]. */ +@Immutable data class IndexingProgress( val currentFile: String = "", val currentIndex: Int = 0, diff --git a/app/src/main/java/com/example/research/feature/download/model/DownloadState.kt b/app/src/main/java/com/example/research/feature/download/model/DownloadState.kt index f8fd0f4..9260a9e 100644 --- a/app/src/main/java/com/example/research/feature/download/model/DownloadState.kt +++ b/app/src/main/java/com/example/research/feature/download/model/DownloadState.kt @@ -1,4 +1,8 @@ package com.example.research.feature.download.model + +import androidx.compose.runtime.Immutable + +@Immutable sealed class DownloadState { data object Idle : DownloadState() data object Loading : DownloadState() diff --git a/app/src/main/java/com/example/research/ui/settings/ImportState.kt b/app/src/main/java/com/example/research/ui/settings/ImportState.kt index 0bbd170..65bc3a9 100644 --- a/app/src/main/java/com/example/research/ui/settings/ImportState.kt +++ b/app/src/main/java/com/example/research/ui/settings/ImportState.kt @@ -1,5 +1,8 @@ package com.example.research.ui.settings +import androidx.compose.runtime.Immutable + +@Immutable sealed interface ImportState { data object Idle : ImportState data class Importing(val progress: Float) : ImportState diff --git a/app/src/main/java/com/example/research/ui/settings/SettingsUiState.kt b/app/src/main/java/com/example/research/ui/settings/SettingsUiState.kt index f7fda98..b593303 100644 --- a/app/src/main/java/com/example/research/ui/settings/SettingsUiState.kt +++ b/app/src/main/java/com/example/research/ui/settings/SettingsUiState.kt @@ -1,6 +1,7 @@ package com.example.research.ui.settings import android.net.Uri +import androidx.compose.runtime.Immutable import com.example.research.core.domain.model.AppTheme import com.example.research.core.domain.model.Dictionary import com.example.research.core.domain.model.DictionarySource @@ -8,6 +9,7 @@ import com.example.research.core.domain.model.IndexingProgress import com.example.research.DictionaryStatus import com.example.research.feature.download.model.DownloadState +@Immutable data class SettingsUiState( val theme: AppTheme = AppTheme.SYSTEM, val language: String = "system",