From d913c472d83578843d2a32b4d5fe5acd56c35d4a Mon Sep 17 00:00:00 2001 From: Dude so hot Date: Sun, 30 Mar 2025 22:06:30 +0800 Subject: [PATCH 1/2] Drop optional animateItems --- .../kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt | 7 +------ .../com/hippo/ehviewer/ui/screen/DownloadsScreen.kt | 8 +++----- .../com/hippo/ehviewer/ui/screen/FavoritesScreen.kt | 6 ++---- .../com/hippo/ehviewer/ui/screen/GalleryCommentsScreen.kt | 4 +--- .../com/hippo/ehviewer/ui/screen/GalleryListScreen.kt | 4 +--- .../kotlin/com/hippo/ehviewer/ui/screen/HistoryScreen.kt | 4 +--- .../com/hippo/ehviewer/ui/screen/SearchBarScreen.kt | 4 +--- .../com/hippo/ehviewer/ui/settings/AdvancedScreen.kt | 7 ------- .../kotlin/com/hippo/ehviewer/ui/settings/FilterScreen.kt | 8 ++------ app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-zh-rCN/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- app/src/main/res/values/strings.xml | 2 -- 13 files changed, 12 insertions(+), 48 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt index ac56be1339..e27db9f718 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt @@ -22,7 +22,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -35,14 +34,11 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import arrow.core.raise.ensure import com.hippo.ehviewer.R -import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryInfo.Companion.S_LANG_TAGS -import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.DropdownFilterChip -import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.toIntOrDefault import kotlinx.coroutines.launch @@ -72,7 +68,6 @@ fun SearchFilter( ) = Column(modifier) { val scope = rememberCoroutineScope() val context = LocalContext.current - val animateItems by Settings.animateItems.collectAsState() fun isCategoryChecked(bit: Int) = category and bit != 0 val categories = remember(category) { categoryTable.sortedBy { !isCategoryChecked(it.first) } } LazyRow( @@ -87,7 +82,7 @@ fun SearchFilter( selected = isCategoryChecked(it.first), onClick = { onCategoryChange(category xor it.first) }, label = { Text(text = stringResource(id = it.second)) }, - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), ) } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt index c48dd41d46..b28d0ced94 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt @@ -116,7 +116,6 @@ import com.hippo.ehviewer.ui.tools.HapticFeedbackType import com.hippo.ehviewer.ui.tools.asyncState import com.hippo.ehviewer.ui.tools.rememberHapticFeedback import com.hippo.ehviewer.ui.tools.rememberInVM -import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.mapToLongArray import com.hippo.ehviewer.util.takeAndClear import com.jamal.composeprefs3.ui.ifTrueThen @@ -143,7 +142,6 @@ fun AnimatedVisibilityScope.DownloadsScreen(navigator: DestinationsNavigator) = var invalidateKey by rememberSaveable { mutableStateOf(false) } var searchBarExpanded by rememberSaveable { mutableStateOf(false) } var searchBarOffsetY by remember { mutableIntStateOf(0) } - val animateItems by Settings.animateItems.collectAsState() var fabExpanded by remember { mutableStateOf(false) } var fabHidden by remember { mutableStateOf(false) } @@ -364,7 +362,7 @@ fun AnimatedVisibilityScope.DownloadsScreen(navigator: DestinationsNavigator) = reorderableLabelState, id, enabled = editEnable, - animateItemModifier = Modifier.thenIf(animateItems) { animateItem() }, + animateItemModifier = Modifier.animateItem(), ) { isDragging -> SwipeToDismissBox( state = dismissState, @@ -560,7 +558,7 @@ fun AnimatedVisibilityScope.DownloadsScreen(navigator: DestinationsNavigator) = onClick = ::onItemClick.partially1(info), onLongClick = { navigate(info.galleryInfo.asDst()) }, info = info, - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), showLanguage = false, ) } @@ -575,7 +573,7 @@ fun AnimatedVisibilityScope.DownloadsScreen(navigator: DestinationsNavigator) = val checked = info.gid in checkedInfoMap CheckableItem( checked = checked, - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), ) { interactionSource -> DownloadCard( onClick = { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt index b92af7937c..2d11d2fc12 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt @@ -83,7 +83,6 @@ import com.hippo.ehviewer.ui.tools.EmptyWindowInsets import com.hippo.ehviewer.ui.tools.asyncState import com.hippo.ehviewer.ui.tools.foldToLoadResult import com.hippo.ehviewer.ui.tools.rememberInVM -import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.mapToLongArray import com.hippo.ehviewer.util.takeAndClear import com.ramcosta.composedestinations.annotation.Destination @@ -105,7 +104,6 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) = // Immutables val localFavName = stringResource(R.string.local_favorites) val cloudFavName = stringResource(R.string.cloud_favorites) - val animateItems by Settings.animateItems.collectAsState() val hasSignedIn by Settings.hasSignedIn.collectAsState() // Meta State @@ -284,7 +282,7 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) = val checked = info.gid in checkedInfoMap CheckableItem( checked = checked, - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), ) { interactionSource -> GalleryInfoListItem( onClick = { @@ -313,7 +311,7 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) = val checked = info.gid in checkedInfoMap CheckableItem( checked = checked, - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), ) { interactionSource -> GalleryInfoGridItem( onClick = { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryCommentsScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryCommentsScreen.kt index c7d0f0c78e..3c8dfc1a59 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryCommentsScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryCommentsScreen.kt @@ -99,7 +99,6 @@ import com.hippo.ehviewer.ui.tools.animateFloatMergePredictiveBackAsState import com.hippo.ehviewer.ui.tools.normalizeSpan import com.hippo.ehviewer.ui.tools.rememberBBCodeTextToolbar import com.hippo.ehviewer.ui.tools.snackBarPadding -import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.ui.tools.toBBCode import com.hippo.ehviewer.ui.tools.updateSpan import com.hippo.ehviewer.util.ReadableTime @@ -173,7 +172,6 @@ fun AnimatedVisibilityScope.GalleryCommentsScreen(gid: Long, navigator: Destinat val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() var commenting by rememberSaveable { mutableStateOf(false) } val animationProgress by animateFloatMergePredictiveBackAsState(enable = commenting) { commenting = false } - val animateItems by Settings.animateItems.collectAsState() val galleryDetail = remember { detailCache[gid]!! } val userCommentBackField = remember { mutableStateOf(TextFieldValue()) } @@ -390,7 +388,7 @@ fun AnimatedVisibilityScope.GalleryCommentsScreen(gid: Long, navigator: Destinat }() GalleryCommentCard( - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), comment = item, onUserClick = { navigate( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index bf71900299..7ae69f4ebf 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -119,7 +119,6 @@ import com.hippo.ehviewer.ui.tools.foldToLoadResult import com.hippo.ehviewer.ui.tools.rememberHapticFeedback import com.hippo.ehviewer.ui.tools.rememberInVM import com.hippo.ehviewer.ui.tools.rememberMutableStateInDataStore -import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.FavouriteStatusRouter import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph @@ -160,7 +159,6 @@ fun AnimatedVisibilityScope.GalleryListScreen(lub: ListUrlBuilder, navigator: De var urlBuilder by rememberSaveable(lub) { mutableStateOf(lub) } var searchBarExpanded by rememberSaveable { mutableStateOf(false) } var searchBarOffsetY by remember { mutableIntStateOf(0) } - val animateItems by Settings.animateItems.collectAsState() var category by rememberMutableStateInDataStore("SearchCategory") { EhUtils.ALL_CATEGORY } var advancedSearchOption by rememberMutableStateInDataStore("AdvancedSearchOption") { AdvancedSearchOption() } @@ -364,7 +362,7 @@ fun AnimatedVisibilityScope.GalleryListScreen(lub: ListUrlBuilder, navigator: De ReorderableItem( reorderableLazyListState, item.id!!, - animateItemModifier = Modifier.thenIf(animateItems) { animateItem() }, + animateItemModifier = Modifier.animateItem(), ) { isDragging -> // Not using rememberSwipeToDismissBoxState to prevent LazyColumn from reusing it // SQLite may reuse ROWIDs from previously deleted rows so they'll have the same key diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/HistoryScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/HistoryScreen.kt index 2a017f2ac6..4c6ad7463c 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/HistoryScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/HistoryScreen.kt @@ -59,7 +59,6 @@ import com.hippo.ehviewer.ui.main.plus import com.hippo.ehviewer.ui.tools.Await import com.hippo.ehviewer.ui.tools.FastScrollLazyColumn import com.hippo.ehviewer.ui.tools.rememberInVM -import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.FavouriteStatusRouter import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph @@ -74,7 +73,6 @@ import kotlinx.coroutines.launch fun AnimatedVisibilityScope.HistoryScreen(navigator: DestinationsNavigator) = Screen(navigator) { val title = stringResource(id = R.string.history) val hint = stringResource(R.string.search_bar_hint, title) - val animateItems by Settings.animateItems.collectAsState() var searchBarExpanded by rememberSaveable { mutableStateOf(false) } var searchBarOffsetY by remember { mutableIntStateOf(0) } @@ -158,7 +156,7 @@ fun AnimatedVisibilityScope.HistoryScreen(navigator: DestinationsNavigator) = Sc SwipeToDismissBox( state = dismissState, backgroundContent = {}, - modifier = Modifier.thenIf(animateItems) { animateItem() }, + modifier = Modifier.animateItem(), enableDismissFromStartToEnd = false, ) { GalleryInfoListItem( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt index 8bf1a20cbd..2bcaede897 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/SearchBarScreen.kt @@ -65,7 +65,6 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.client.data.TagNamespace -import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.dao.Search import com.hippo.ehviewer.dao.SearchDao import com.hippo.ehviewer.ui.LocalNavDrawerState @@ -120,7 +119,6 @@ fun SearchBarScreen( val mSearchDatabase = searchDatabase.searchDao() val scope = rememberCoroutineScope { Dispatchers.IO } val context = LocalContext.current - val animateItems by Settings.animateItems.collectAsState() class TagSuggestion( override val hint: String?, @@ -294,7 +292,7 @@ fun SearchBarScreen( } }, colors = ListItemDefaults.colors(containerColor = Color.Transparent), - modifier = Modifier.clickable { it.onClick() }.thenIf(animateItems) { animateItem() }, + modifier = Modifier.clickable { it.onClick() }.animateItem(), ) } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index fb975d91ff..9a862bffd4 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -196,13 +196,6 @@ fun AdvancedScreen(navigator: DestinationsNavigator) { title = stringResource(id = R.string.preload_thumb_aggressively), value = Settings::preloadThumbAggressively, ) - var animateItems by Settings.animateItems.asMutableState() - SwitchPref( - checked = animateItems, - onMutate = { animateItems = !animateItems }, - title = stringResource(id = R.string.animate_items), - summary = stringResource(id = R.string.animate_items_summary), - ) val exportFailed = stringResource(id = R.string.settings_advanced_export_data_failed) LauncherPreference( title = stringResource(id = R.string.settings_advanced_export_data), diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/FilterScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/FilterScreen.kt index 4f8a611644..6711d4f1c7 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/FilterScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/FilterScreen.kt @@ -53,17 +53,14 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp import com.hippo.ehviewer.R -import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhFilter import com.hippo.ehviewer.client.EhFilter.forget import com.hippo.ehviewer.client.EhFilter.remember import com.hippo.ehviewer.client.EhFilter.trigger -import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.dao.Filter import com.hippo.ehviewer.dao.FilterMode import com.hippo.ehviewer.ui.Screen import com.hippo.ehviewer.ui.tools.Await -import com.hippo.ehviewer.ui.tools.thenIf import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator @@ -79,7 +76,6 @@ fun AnimatedVisibilityScope.FilterScreen(navigator: DestinationsNavigator) = Scr val allFilterMap = remember { async { EhFilter.filters.await().groupByToObserved { it.mode } } } val textIsEmpty = stringResource(R.string.text_is_empty) val labelExist = stringResource(R.string.label_text_exist) - val animateItems by Settings.animateItems.collectAsState() fun addFilter() { launch { @@ -231,7 +227,7 @@ fun AnimatedVisibilityScope.FilterScreen(navigator: DestinationsNavigator) = Scr item(key = filterMode) { Text( text = stringResource(id = title), - modifier = Modifier.padding(horizontal = 24.dp, vertical = 8.dp).thenIf(animateItems) { animateItem() }, + modifier = Modifier.padding(horizontal = 24.dp, vertical = 8.dp).animateItem(), color = MaterialTheme.colorScheme.tertiary, style = MaterialTheme.typography.titleMedium, ) @@ -239,7 +235,7 @@ fun AnimatedVisibilityScope.FilterScreen(navigator: DestinationsNavigator) = Scr items(filters, key = { requireNotNull(it.id) }) { filter -> val filterCheckBoxRecomposeScope = currentRecomposeScope Row( - modifier = Modifier.fillMaxWidth().thenIf(animateItems) { animateItem() }.clickable { filter.trigger { filterCheckBoxRecomposeScope.invalidate() } }, + modifier = Modifier.fillMaxWidth().animateItem().clickable { filter.trigger { filterCheckBoxRecomposeScope.invalidate() } }, verticalAlignment = Alignment.CenterVertically, ) { Checkbox( diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 026866f4dc..ee92c0c821 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -493,8 +493,6 @@ 詳細モードのサムネイルの大きさ アカウント サムネイルを積極的にプリロードする - リスト項目のアニメーション - クラッシュやフレームドロップが発生する場合はこれを無効化してください 自動で更新を確認する しない 毎日 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ff08c399c8..508f003190 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -491,8 +491,6 @@ 详情模式下缩略图大小 账户 激进地预载缩略图 - 列表项目动画 - 如遇崩溃/掉帧请尝试禁用此项 自动检查更新 从不 每天 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 78a67c2a3c..2cd46d3b73 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -477,8 +477,6 @@ 詳情模式下縮圖大小 帳號 積極地預載入縮圖 - 列表項目動畫 - 如遇崩潰/低幀率請嘗試停用此項 自動檢查更新 從不 每天 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9f42976d4d..c38340b653 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -510,8 +510,6 @@ Thumb size in detail mode Account Preload thumbs aggressively - List item animations - Try disabling this if you are facing crashes / frame drops Automatically check for updates Never Daily From 4719055dfd920ab0dd03ba66f2451f87e0826a8e Mon Sep 17 00:00:00 2001 From: Dude so hot Date: Sun, 30 Mar 2025 22:08:43 +0800 Subject: [PATCH 2/2] Cleanup --- .../main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt | 1 - .../kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt index b28d0ced94..3d3dae3982 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt @@ -362,7 +362,6 @@ fun AnimatedVisibilityScope.DownloadsScreen(navigator: DestinationsNavigator) = reorderableLabelState, id, enabled = editEnable, - animateItemModifier = Modifier.animateItem(), ) { isDragging -> SwipeToDismissBox( state = dismissState, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index 7ae69f4ebf..525ae87ea6 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -362,7 +362,6 @@ fun AnimatedVisibilityScope.GalleryListScreen(lub: ListUrlBuilder, navigator: De ReorderableItem( reorderableLazyListState, item.id!!, - animateItemModifier = Modifier.animateItem(), ) { isDragging -> // Not using rememberSwipeToDismissBoxState to prevent LazyColumn from reusing it // SQLite may reuse ROWIDs from previously deleted rows so they'll have the same key