diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt index 0700c662e..5a0b2aab4 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt @@ -171,9 +171,6 @@ object Settings : DataStorePreferences(null) { var language by stringPref("app_language", "system").observed { updateWhenLocaleChanges() } var lastUpdateTime by longPref("last_update_time", 0) - // TODO: Remove this after swipe gestures are correctly handled in compose - var touchSlopFactor = intPref("touch_slop", 3) - // Tachiyomi Reader var newReader by boolPref("new_compose_reader", false) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt index f3de706e7..8223605dc 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -97,7 +97,6 @@ import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp @@ -134,7 +133,6 @@ import com.hippo.ehviewer.ui.settings.showNewVersion import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.LabeledCheckbox import com.hippo.ehviewer.ui.tools.LocalDialogState -import com.hippo.ehviewer.ui.tools.LocalTouchSlopProvider import com.hippo.ehviewer.ui.tools.LocalWindowSizeClass import com.hippo.ehviewer.updater.AppUpdater import com.hippo.ehviewer.util.addTextToClipboard @@ -353,7 +351,6 @@ class MainActivity : EhActivity() { val lockDrawerHandle = remember { mutableStateListOf() } var snackbarFabPadding by remember { mutableStateOf(0.dp) } val drawerLocked = lockDrawerHandle.isNotEmpty() - val viewConfiguration = LocalViewConfiguration.current val density = LocalDensity.current val windowSizeClass = calculateWindowSizeClass(this) CompositionLocalProvider( @@ -376,92 +373,85 @@ class MainActivity : EhActivity() { ) }, ) { - val touchSlopFactor by Settings.touchSlopFactor.collectAsState { it.toFloat() } - LocalTouchSlopProvider(touchSlopFactor) { - var minOffset by remember { - mutableFloatStateOf(-with(density) { DrawerDefaults.MaximumDrawerWidth.toPx() }) - } - ModalNavigationDrawer( - drawerContent = { - ModalDrawerSheet( - drawerState = navDrawerState, - modifier = Modifier.widthIn(max = (configuration.screenWidthDp - 56).dp) - .onSizeChanged { minOffset = -it.width.toFloat() }, - windowInsets = WindowInsets.systemBars.only(WindowInsetsSides.Start), + var minOffset by remember { + mutableFloatStateOf(-with(density) { DrawerDefaults.MaximumDrawerWidth.toPx() }) + } + ModalNavigationDrawer( + drawerContent = { + ModalDrawerSheet( + drawerState = navDrawerState, + modifier = Modifier.widthIn(max = (configuration.screenWidthDp - 56).dp) + .onSizeChanged { minOffset = -it.width.toFloat() }, + windowInsets = WindowInsets.systemBars.only(WindowInsetsSides.Start), + ) { + val scrollState = rememberScrollState() + Column( + modifier = Modifier.verticalScroll(scrollState) + .windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom)), ) { - val scrollState = rememberScrollState() - Column( - modifier = Modifier.verticalScroll(scrollState) - .windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom)), - ) { - Image( - painter = painterResource(id = R.drawable.sadpanda_low_poly), - contentDescription = null, - modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), - contentScale = ContentScale.FillWidth, + Image( + painter = painterResource(id = R.drawable.sadpanda_low_poly), + contentDescription = null, + modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), + contentScale = ContentScale.FillWidth, + ) + navItems.forEach { (direction, stringId, icon) -> + NavigationDrawerItem( + label = { + Text(text = stringResource(id = stringId)) + }, + selected = currentDestination === direction, + onClick = { + navigator.navigate(direction) + closeDrawer() + }, + modifier = Modifier.padding(horizontal = 12.dp), + icon = { + Icon(imageVector = icon, contentDescription = null) + }, ) - navItems.forEach { (direction, stringId, icon) -> - NavigationDrawerItem( - label = { - Text(text = stringResource(id = stringId)) - }, - selected = currentDestination === direction, - onClick = { - navigator.navigate(direction) - closeDrawer() - }, - modifier = Modifier.padding(horizontal = 12.dp), - icon = { - Icon(imageVector = icon, contentDescription = null) - }, - ) - } + } + } + } + }, + drawerState = navDrawerState, + gesturesEnabled = !drawerLocked || navDrawerState.isOpen, + ) { + val sheet = sideSheet.firstOrNull() + val radius by remember { + snapshotFlow { + val step = calculateFraction(minOffset, 0f, navDrawerState.currentOffset) + with(density) { lerp(0, 10, step).dp.toPx() } + } + }.collectAsState(0f) + ModalSideDrawer( + drawerContent = { + if (sheet != null) { + ModalDrawerSheet( + modifier = Modifier.widthIn(max = (configuration.screenWidthDp - 112).dp), + drawerShape = ShapeDefaults.Large.copy(topEnd = CornerSize(0), bottomEnd = CornerSize(0)), + windowInsets = WindowInsets.systemBars.only(WindowInsetsSides.Top + WindowInsetsSides.End), + ) { + sheet(sideSheetState) } } }, - drawerState = navDrawerState, - gesturesEnabled = !drawerLocked || navDrawerState.isOpen, + modifier = Modifier.graphicsLayer { + if (radius != 0f) { + renderEffect = BlurEffect(radius, radius, TileMode.Clamp) + shape = RectangleShape + clip = true + } + }, + drawerState = sideSheetState, + gesturesEnabled = sheet != null && !drawerLocked, ) { - val sheet = sideSheet.firstOrNull() - val radius by remember { - snapshotFlow { - val step = calculateFraction(minOffset, 0f, navDrawerState.currentOffset) - with(density) { lerp(0, 10, step).dp.toPx() } - } - }.collectAsState(0f) - ModalSideDrawer( - drawerContent = { - if (sheet != null) { - ModalDrawerSheet( - modifier = Modifier.widthIn(max = (configuration.screenWidthDp - 112).dp), - drawerShape = ShapeDefaults.Large.copy(topEnd = CornerSize(0), bottomEnd = CornerSize(0)), - windowInsets = WindowInsets.systemBars.only(WindowInsetsSides.Top + WindowInsetsSides.End), - ) { - CompositionLocalProvider(LocalViewConfiguration provides viewConfiguration) { - sheet(sideSheetState) - } - } - } - }, - modifier = Modifier.graphicsLayer { - if (radius != 0f) { - renderEffect = BlurEffect(radius, radius, TileMode.Clamp) - shape = RectangleShape - clip = true - } - }, - drawerState = sideSheetState, - gesturesEnabled = sheet != null && !drawerLocked, - ) { - CompositionLocalProvider(LocalViewConfiguration provides viewConfiguration) { - DestinationsNavHost( - navGraph = NavGraphs.root, - startRoute = if (Settings.needSignIn) SignInScreenDestination else StartDestination, - defaultTransitions = rememberEhNavAnim(), - navController = navController, - ) - } - } + DestinationsNavHost( + navGraph = NavGraphs.root, + startRoute = if (Settings.needSignIn) SignInScreenDestination else StartDestination, + defaultTransitions = rememberEhNavAnim(), + navController = navController, + ) } } } 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 fe3cfdaa0..6c9adbf6a 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 @@ -48,6 +48,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBoxDefaults import androidx.compose.material3.SwipeToDismissBoxState import androidx.compose.material3.SwipeToDismissBoxValue @@ -110,7 +111,6 @@ import com.hippo.ehviewer.ui.tools.Deferred import com.hippo.ehviewer.ui.tools.FastScrollLazyColumn import com.hippo.ehviewer.ui.tools.FastScrollLazyVerticalStaggeredGrid import com.hippo.ehviewer.ui.tools.HapticFeedbackType -import com.hippo.ehviewer.ui.tools.SwipeToDismissBox2 import com.hippo.ehviewer.ui.tools.delegateSnapshotUpdate import com.hippo.ehviewer.ui.tools.rememberHapticFeedback import com.hippo.ehviewer.ui.tools.rememberInVM @@ -356,9 +356,10 @@ fun DownloadsScreen(navigator: DestinationsNavigator) = composing(navigator) { } } ReorderableItem(reorderableLabelState, enabled = editEnable, key = id) { isDragging -> - SwipeToDismissBox2( + SwipeToDismissBox( state = dismissState, backgroundContent = {}, + enableDismissFromStartToEnd = false, gesturesEnabled = editEnable, ) { val elevation by animateDpAsState( 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 7c8aadd86..99767cce9 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 @@ -44,6 +44,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBoxDefaults import androidx.compose.material3.SwipeToDismissBoxState import androidx.compose.material3.SwipeToDismissBoxValue @@ -123,7 +124,6 @@ import com.hippo.ehviewer.ui.main.ImageSearch import com.hippo.ehviewer.ui.main.SearchFilter import com.hippo.ehviewer.ui.tools.Deferred import com.hippo.ehviewer.ui.tools.HapticFeedbackType -import com.hippo.ehviewer.ui.tools.SwipeToDismissBox2 import com.hippo.ehviewer.ui.tools.animateFloatMergePredictiveBackAsState import com.hippo.ehviewer.ui.tools.delegateSnapshotUpdate import com.hippo.ehviewer.ui.tools.foldToLoadResult @@ -409,9 +409,10 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) = c } } } - SwipeToDismissBox2( + SwipeToDismissBox( state = dismissState, backgroundContent = {}, + enableDismissFromStartToEnd = false, ) { val elevation by animateDpAsState( if (isDragging) { 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 358906f2a..87c75038b 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 @@ -13,6 +13,7 @@ import androidx.compose.material.icons.filled.ClearAll import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text import androidx.compose.material3.rememberSwipeToDismissBoxState @@ -52,7 +53,6 @@ import com.hippo.ehviewer.ui.main.GalleryInfoListItem import com.hippo.ehviewer.ui.main.plus import com.hippo.ehviewer.ui.tools.Deferred import com.hippo.ehviewer.ui.tools.FastScrollLazyColumn -import com.hippo.ehviewer.ui.tools.SwipeToDismissBox2 import com.hippo.ehviewer.ui.tools.rememberInVM import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.util.FavouriteStatusRouter @@ -141,10 +141,11 @@ fun HistoryScreen(navigator: DestinationsNavigator) = composing(navigator) { true }, ) - SwipeToDismissBox2( + SwipeToDismissBox( state = dismissState, backgroundContent = {}, modifier = Modifier.thenIf(animateItems) { animateItem() }, + enableDismissFromStartToEnd = false, ) { GalleryInfoListItem( onClick = { navigate(info.asDst()) }, 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 916b884b9..15793a1ae 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 @@ -152,13 +152,6 @@ fun AdvancedScreen(navigator: DestinationsNavigator) { title = stringResource(id = R.string.animate_items), summary = stringResource(id = R.string.animate_items_summary), ) - IntSliderPreference( - maxValue = 5, - minValue = 1, - title = stringResource(id = R.string.settings_advanced_touch_slop), - summary = stringResource(id = R.string.settings_advanced_touch_slop_summary), - value = Settings.touchSlopFactor::value, - ) var userAgent by Settings::userAgent.observed val userAgentTitle = stringResource(id = R.string.user_agent) Preference( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/LocalTouchSlopProvider.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/LocalTouchSlopProvider.kt deleted file mode 100644 index de826b84e..000000000 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/LocalTouchSlopProvider.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.hippo.ehviewer.ui.tools - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.ui.platform.LocalViewConfiguration -import androidx.compose.ui.platform.ViewConfiguration - -// TODO: https://issuetracker.google.com/issues/269627294 -@Composable -fun LocalTouchSlopProvider(factor: Float, content: @Composable () -> Unit) { - val current = LocalViewConfiguration.current - CompositionLocalProvider( - value = LocalViewConfiguration provides object : ViewConfiguration by current { - override val touchSlop: Float - get() = current.touchSlop * factor - }, - content = content, - ) -} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SwipeToDismissBox2.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SwipeToDismissBox2.kt deleted file mode 100644 index 888060372..000000000 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SwipeToDismissBox2.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.hippo.ehviewer.ui.tools - -import androidx.compose.foundation.layout.RowScope -import androidx.compose.material3.SwipeToDismissBox -import androidx.compose.material3.SwipeToDismissBoxState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalViewConfiguration -import com.hippo.ehviewer.Settings -import com.hippo.ehviewer.collectAsState - -@Composable -fun SwipeToDismissBox2( - state: SwipeToDismissBoxState, - backgroundContent: @Composable RowScope.() -> Unit, - modifier: Modifier = Modifier, - gesturesEnabled: Boolean = true, - content: @Composable RowScope.() -> Unit, -) { - val viewConfiguration = LocalViewConfiguration.current - val touchSlopFactor by Settings.touchSlopFactor.collectAsState { it.toFloat() } - LocalTouchSlopProvider(touchSlopFactor) { - SwipeToDismissBox( - state = state, - backgroundContent = backgroundContent, - modifier = modifier, - enableDismissFromStartToEnd = false, - gesturesEnabled = gesturesEnabled, - ) { - CompositionLocalProvider(LocalViewConfiguration provides viewConfiguration) { - content() - } - } - } -} diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e63d1d6d2..cea38a6df 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -355,8 +355,6 @@ 已保存日志至 %s 阅读缓存大小 App 界面语言 - [实验性] 触摸溢出系数 - 增大此项将降低滑动手势敏感度 导出数据 保存数据至外置存储器,例如下载列表,快速搜索列表 已导出数据至 %s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 96a2eb66c..c27b546db 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -347,8 +347,6 @@ 已將紀錄檔儲存至 %s 閱讀快取大小 應用程式介面語言 - [測試] 觸控溢出係數 - 提高係數將降低滑動手勢敏感度 匯出檔案 儲存資料至外接儲存設備,例如下載列表,快速搜尋列表 已匯出資料至 %s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9200ea07b..c8dd7fff5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -398,8 +398,6 @@ Logcat dumped to %s Read cache size App language - [Experimental] Touch slop factor - Increasing this will reduce swipe gesture sensitivity Export data Save data like download list, quick search list, to external storage Exported data to %s