From 35f2ded63405fdfb59e1439642e7cf276adb228b Mon Sep 17 00:00:00 2001 From: OneWay Date: Sat, 26 Sep 2026 08:00:15 +0800 Subject: [PATCH] refactor: clean up redundant calls and replace deprecated APIs Unnecessary safe call on a non-null File receiver; unused catch parameters renamed to _; constructor parameter used only in init no longer held as a property; deprecated Configuration.screenHeightDp replaced with LocalWindowInfo.containerSize; redundant filterNotNull on Paging items; deprecated invisibleToUser() replaced with hideFromAccessibility(); redundant alias variable inlined; redundant else in an exhaustive when removed; paging snapshot read moved into the SideEffect that consumes it. --- .../java/com/example/research/MainActivity.kt | 2 +- .../progress/DictionaryPipelineCoordinator.kt | 4 ++-- .../progress/DictionaryProgressPresenter.kt | 2 +- .../com/example/research/ui/about/AboutScreen.kt | 7 +++++-- .../example/research/ui/main/SearchResultsPane.kt | 2 +- .../research/ui/settings/SettingsViewModel.kt | 1 - .../settings/components/DictionaryManagement.kt | 15 +++++++-------- 7 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/example/research/MainActivity.kt b/app/src/main/java/com/example/research/MainActivity.kt index af24008..eaeb56d 100644 --- a/app/src/main/java/com/example/research/MainActivity.kt +++ b/app/src/main/java/com/example/research/MainActivity.kt @@ -181,7 +181,7 @@ class MainActivity : ComponentActivity() { runBlocking { app.preferencesManager.hadNoDictionaries.first() } - } catch (e: Exception) { + } catch (_: Exception) { true } } diff --git a/app/src/main/java/com/example/research/common/progress/DictionaryPipelineCoordinator.kt b/app/src/main/java/com/example/research/common/progress/DictionaryPipelineCoordinator.kt index 883f038..8325335 100644 --- a/app/src/main/java/com/example/research/common/progress/DictionaryPipelineCoordinator.kt +++ b/app/src/main/java/com/example/research/common/progress/DictionaryPipelineCoordinator.kt @@ -62,7 +62,7 @@ class DictionaryPipelineCoordinator( pipelineJob?.cancel() pipelineJob = scope.launch(launchDispatcher) { val dir = File(dictionaryPath()) - val filesBeforeReindex = dir?.listFiles()?.map { it.name }?.toSet() ?: emptySet() + val filesBeforeReindex = dir.listFiles()?.map { it.name }?.toSet() ?: emptySet() try { triggerReindexing(isImport) if (isImport) { @@ -85,7 +85,7 @@ class DictionaryPipelineCoordinator( } cleanupOrphanedFiles(dir) throw e - } catch (e: Exception) { + } catch (_: Exception) { ui.showError() } finally { finishService() diff --git a/app/src/main/java/com/example/research/common/progress/DictionaryProgressPresenter.kt b/app/src/main/java/com/example/research/common/progress/DictionaryProgressPresenter.kt index ae7f925..5d8c8e8 100644 --- a/app/src/main/java/com/example/research/common/progress/DictionaryProgressPresenter.kt +++ b/app/src/main/java/com/example/research/common/progress/DictionaryProgressPresenter.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch class DictionaryProgressPresenter( - private val scope: CoroutineScope, + scope: CoroutineScope, private val progressSnapshot: StateFlow, private val notifications: NotificationPort, mainDispatcher: CoroutineDispatcher = Dispatchers.Main, diff --git a/app/src/main/java/com/example/research/ui/about/AboutScreen.kt b/app/src/main/java/com/example/research/ui/about/AboutScreen.kt index ecf50f6..539a4f7 100644 --- a/app/src/main/java/com/example/research/ui/about/AboutScreen.kt +++ b/app/src/main/java/com/example/research/ui/about/AboutScreen.kt @@ -41,9 +41,10 @@ import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.platform.LocalWindowInfo import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -351,7 +352,9 @@ private fun LicenseDialog( this.alpha = alpha } ) { - val maxHeight = LocalConfiguration.current.screenHeightDp.dp - 96.dp + val maxHeight = with(LocalDensity.current) { + LocalWindowInfo.current.containerSize.height.toDp() + } - 96.dp Surface( shape = AlertDialogDefaults.shape, color = AlertDialogDefaults.containerColor, diff --git a/app/src/main/java/com/example/research/ui/main/SearchResultsPane.kt b/app/src/main/java/com/example/research/ui/main/SearchResultsPane.kt index c617a92..b6867aa 100644 --- a/app/src/main/java/com/example/research/ui/main/SearchResultsPane.kt +++ b/app/src/main/java/com/example/research/ui/main/SearchResultsPane.kt @@ -80,8 +80,8 @@ internal fun SearchResultsPane( } } - val loaded = results.itemSnapshotList.items.filterNotNull() SideEffect { + val loaded = results.itemSnapshotList.items if (results.loadState.refresh is LoadState.NotLoading && loaded.isNotEmpty()) { staleEntries = loaded } diff --git a/app/src/main/java/com/example/research/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/example/research/ui/settings/SettingsViewModel.kt index 25e90a7..9c5f8e8 100644 --- a/app/src/main/java/com/example/research/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/example/research/ui/settings/SettingsViewModel.kt @@ -242,7 +242,6 @@ class SettingsViewModel( refreshDictionaryStatus() } } - else -> {} } SettingsUiState( diff --git a/app/src/main/java/com/example/research/ui/settings/components/DictionaryManagement.kt b/app/src/main/java/com/example/research/ui/settings/components/DictionaryManagement.kt index 7568c6a..8cc4e69 100644 --- a/app/src/main/java/com/example/research/ui/settings/components/DictionaryManagement.kt +++ b/app/src/main/java/com/example/research/ui/settings/components/DictionaryManagement.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.invisibleToUser +import androidx.compose.ui.semantics.hideFromAccessibility import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -88,12 +88,11 @@ fun DictionaryManagement( derivedStateOf { importState is ImportState.Importing || importState is ImportState.Extracting } } val hasEnabledSources by remember(sources) { derivedStateOf { sources.any { it.isEnabled } } } - val isBlockingMutations = isInProgress // Invariant: the mutation-block flag is read only at state-read/gesture time (derivedStateOf, // snapshotFlow, pointerInput callbacks), never at row composition time. A composition-time read // (e.g. Modifier.alpha(if (isDeleteBlocked()) ...)) would invalidate every row on each flip. - val isMutationsBlockedState = rememberUpdatedState(isBlockingMutations) + val isMutationsBlockedState = rememberUpdatedState(isInProgress) val isDeleteBlocked = remember { { isMutationsBlockedState.value } } SectionCard( @@ -149,13 +148,13 @@ fun DictionaryManagement( // Disable accessibility on background content during import to improve performance. // The progress dialog remains accessible for cancellation. - val backgroundModifier = if (isBlockingMutations) { - Modifier.semantics { invisibleToUser() } + val backgroundModifier = if (isInProgress) { + Modifier.semantics { hideFromAccessibility() } } else { Modifier } - if (dictionaries.isEmpty() && !isBlockingMutations) { + if (dictionaries.isEmpty() && !isInProgress) { Column( modifier = backgroundModifier .fillMaxWidth() @@ -177,7 +176,7 @@ fun DictionaryManagement( ) } } else { - if (dictionaryStatus is DictionaryStatus.NeedsUpdate && !isBlockingMutations && hasEnabledSources) { + if (dictionaryStatus is DictionaryStatus.NeedsUpdate && !isInProgress && hasEnabledSources) { DictionaryUpdateCard( onStartDownload = onStartDownload, modifier = backgroundModifier @@ -194,7 +193,7 @@ fun DictionaryManagement( isDeleteBlocked = isDeleteBlocked ) - if (!isBlockingMutations) { + if (!isInProgress) { DictionaryActionButtons( onAddSource = { haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove)