From 17bdca71b1ba0ff7b2e0faf644109fea178de14e Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Tue, 31 Oct 2023 22:20:50 +0800 Subject: [PATCH] Reduce drawer and history item gesture sensitivity --- .../com/hippo/ehviewer/ui/MainActivity.kt | 117 +++++++++--------- .../hippo/ehviewer/ui/scene/HistoryScene.kt | 57 +++++---- .../ui/tools/LocalTouchSlopProvider.kt | 19 +++ 3 files changed, 109 insertions(+), 84 deletions(-) create mode 100644 app/src/main/kotlin/com/hippo/ehviewer/ui/tools/LocalTouchSlopProvider.kt 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 6238097b4..8cbabf086 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -98,6 +98,7 @@ import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs import com.hippo.ehviewer.ui.scene.ProgressScene import com.hippo.ehviewer.ui.scene.navAnimated import com.hippo.ehviewer.ui.scene.navWithUrl +import com.hippo.ehviewer.ui.tools.LocalTouchSlopProvider import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.addTextToClipboard import com.hippo.ehviewer.util.buildWindowInsets @@ -242,71 +243,73 @@ class MainActivity : EhActivity() { BackHandler(drawerState.isOpen) { closeDrawer() } - ModalNavigationDrawer( - drawerContent = { - ModalDrawerSheet( - modifier = Modifier.widthIn(max = (configuration.screenWidthDp - 56).dp), - windowInsets = WindowInsets(0, 0, 0, 0), - ) { - val scrollState = rememberScrollState() - Column( - modifier = Modifier.verticalScroll(scrollState).navigationBarsPadding(), + LocalTouchSlopProvider(3f) { + ModalNavigationDrawer( + drawerContent = { + ModalDrawerSheet( + modifier = Modifier.widthIn(max = (configuration.screenWidthDp - 56).dp), + windowInsets = WindowInsets(0, 0, 0, 0), ) { - Image( - painter = painterResource(id = R.drawable.sadpanda_low_poly), - contentDescription = null, - modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), - contentScale = ContentScale.FillWidth, - ) - navItems.forEach { (id, stringId, icon) -> - NavigationDrawerItem( - label = { - Text(text = stringResource(id = stringId)) - }, - selected = isSelected(id), - onClick = { - closeDrawer() - onNavDestinationSelected2(id, navController) - }, - modifier = Modifier.padding(horizontal = 12.dp), - icon = { - Icon(imageVector = icon, contentDescription = null) - }, + val scrollState = rememberScrollState() + Column( + modifier = Modifier.verticalScroll(scrollState).navigationBarsPadding(), + ) { + Image( + painter = painterResource(id = R.drawable.sadpanda_low_poly), + contentDescription = null, + modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), + contentScale = ContentScale.FillWidth, ) + navItems.forEach { (id, stringId, icon) -> + NavigationDrawerItem( + label = { + Text(text = stringResource(id = stringId)) + }, + selected = isSelected(id), + onClick = { + closeDrawer() + onNavDestinationSelected2(id, navController) + }, + modifier = Modifier.padding(horizontal = 12.dp), + icon = { + Icon(imageVector = icon, contentDescription = null) + }, + ) + } } } + }, + drawerState = drawerState, + gesturesEnabled = !drawerLocked || drawerState.isOpen, + ) { + val insets = buildWindowInsets { + set( + WindowInsetsCompat.Type.statusBars(), + WindowInsets.statusBars, + ) + set( + WindowInsetsCompat.Type.navigationBars(), + WindowInsets.navigationBars, + ) + set( + WindowInsetsCompat.Type.ime(), + WindowInsets.ime, + ) } - }, - drawerState = drawerState, - gesturesEnabled = !drawerLocked || drawerState.isOpen, - ) { - val insets = buildWindowInsets { - set( - WindowInsetsCompat.Type.statusBars(), - WindowInsets.statusBars, - ) - set( - WindowInsetsCompat.Type.navigationBars(), - WindowInsets.navigationBars, - ) - set( - WindowInsetsCompat.Type.ime(), - WindowInsets.ime, - ) - } - AndroidViewBinding(factory = { inflater, parent, attachToParent -> - ActivityMainBinding.inflate(inflater, parent, attachToParent).apply { - val navHostFragment = fragmentContainer.getFragment() - navController = navHostFragment.navController.apply { - graph = navInflater.inflate(R.navigation.nav_graph).apply { - check(launchPage in 0..3) - setStartDestination(navItems[launchPage].first) + AndroidViewBinding(factory = { inflater, parent, attachToParent -> + ActivityMainBinding.inflate(inflater, parent, attachToParent).apply { + val navHostFragment = fragmentContainer.getFragment() + navController = navHostFragment.navController.apply { + graph = navInflater.inflate(R.navigation.nav_graph).apply { + check(launchPage in 0..3) + setStartDestination(navItems[launchPage].first) + } } + isInitializedFlow.value = true } - isInitializedFlow.value = true + }) { + ViewCompat.dispatchApplyWindowInsets(root, insets) } - }) { - ViewCompat.dispatchApplyWindowInsets(root, insets) } } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryScene.kt index d11b0377b..5998a42fb 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryScene.kt @@ -66,6 +66,7 @@ import com.hippo.ehviewer.ui.setMD3Content import com.hippo.ehviewer.ui.tools.CrystalCard import com.hippo.ehviewer.ui.tools.Deferred import com.hippo.ehviewer.ui.tools.FastScrollLazyColumn +import com.hippo.ehviewer.ui.tools.LocalTouchSlopProvider import com.hippo.ehviewer.ui.tools.rememberDialogState import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.system.pxToDp @@ -133,33 +134,35 @@ class HistoryScene : BaseScene() { true }, ) - SwipeToDismiss( - state = dismissState, - background = {}, - dismissContent = { - // TODO: item delete & add animation - // Bug tracker: https://issuetracker.google.com/issues/150812265 - GalleryInfoListItem( - onClick = { - navAnimated( - R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GALLERY_INFO, - GalleryDetailScene.KEY_GALLERY_INFO to info, - ), - ) - }, - onLongClick = { - coroutineScope.launchIO { - dialogState.doGalleryInfoAction(info, context) - } - }, - info = info, - modifier = Modifier.height(cardHeight), - ) - }, - directions = setOf(DismissDirection.EndToStart), - ) + LocalTouchSlopProvider(3f) { + SwipeToDismiss( + state = dismissState, + background = {}, + dismissContent = { + // TODO: item delete & add animation + // Bug tracker: https://issuetracker.google.com/issues/150812265 + GalleryInfoListItem( + onClick = { + navAnimated( + R.id.galleryDetailScene, + bundleOf( + GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GALLERY_INFO, + GalleryDetailScene.KEY_GALLERY_INFO to info, + ), + ) + }, + onLongClick = { + coroutineScope.launchIO { + dialogState.doGalleryInfoAction(info, context) + } + }, + info = info, + modifier = Modifier.height(cardHeight), + ) + }, + directions = setOf(DismissDirection.EndToStart), + ) + } } else { CrystalCard( modifier = Modifier 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 new file mode 100644 index 000000000..de826b84e --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/LocalTouchSlopProvider.kt @@ -0,0 +1,19 @@ +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, + ) +}