From 96e0068150885b541150d1a49ed7fd67370d29c8 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Fri, 27 Dec 2024 16:44:05 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Horizontal=20gesture=20sensitivi?= =?UTF-8?q?ty=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Additional option for Horizontal gesture (#127) - Sensitivity --- .../core/constants/DataStoreConstants.kt | 1 + .../presentation/reader/ReaderContent.kt | 2 ++ .../reader/ReaderHorizontalGesture.kt | 10 +++--- .../presentation/reader/ReaderLayout.kt | 2 ++ .../presentation/reader/ReaderScaffold.kt | 2 ++ .../reading_mode/ReadingModeSubcategory.kt | 5 +++ .../HorizontalGestureSensitivityOption.kt | 36 +++++++++++++++++++ .../acclorite/book_story/ui/main/MainEvent.kt | 1 + .../acclorite/book_story/ui/main/MainModel.kt | 8 +++++ .../acclorite/book_story/ui/main/MainState.kt | 5 +++ .../book_story/ui/reader/ReaderScreen.kt | 4 +++ app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/components/HorizontalGestureSensitivityOption.kt diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt index 9def269a..bd543275 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt @@ -45,6 +45,7 @@ object DataStoreConstants { val SCREEN_BRIGHTNESS = doublePreferencesKey("screen_brightness") val HORIZONTAL_GESTURE = stringPreferencesKey("horizontal_gesture") val HORIZONTAL_GESTURE_SCROLL = doublePreferencesKey("horizontal_gesture_scroll") + val HORIZONTAL_GESTURE_SENSITIVITY = doublePreferencesKey("horizontal_gesture_sensitivity") val BOTTOM_BAR_PADDING = intPreferencesKey("bottom_bar_padding") // Browse settings diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt index 2f0abe27..8045721b 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt @@ -49,6 +49,7 @@ fun ReaderContent( verticalPadding: Dp, horizontalGesture: ReaderHorizontalGesture, horizontalGestureScroll: Float, + horizontalGestureSensitivity: Dp, paragraphHeight: Dp, sidePadding: Dp, bottomBarPadding: Dp, @@ -123,6 +124,7 @@ fun ReaderContent( verticalPadding = verticalPadding, horizontalGesture = horizontalGesture, horizontalGestureScroll = horizontalGestureScroll, + horizontalGestureSensitivity = horizontalGestureSensitivity, paragraphHeight = paragraphHeight, sidePadding = sidePadding, bottomBarPadding = bottomBarPadding, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderHorizontalGesture.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderHorizontalGesture.kt index ab85525b..bc974840 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderHorizontalGesture.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderHorizontalGesture.kt @@ -15,8 +15,8 @@ import androidx.compose.ui.draw.alpha import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset -import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import kotlin.math.abs @@ -27,10 +27,12 @@ fun Modifier.readerHorizontalGesture( listState: LazyListState, horizontalGesture: ReaderHorizontalGesture, horizontalGestureScroll: Float, + horizontalGestureSensitivity: Dp, isLoading: Boolean ): Modifier { if (horizontalGesture == ReaderHorizontalGesture.OFF || isLoading) return this val inverted = rememberUpdatedState(horizontalGesture == ReaderHorizontalGesture.INVERSE) + val sensitivity = rememberUpdatedState(horizontalGestureSensitivity) val scope = rememberCoroutineScope() val density = LocalDensity.current @@ -61,7 +63,7 @@ fun Modifier.readerHorizontalGesture( @Composable fun calculateAlpha(): Float { return animateFloatAsState( - 1f - (abs(with(density) { horizontalOffset.floatValue.toDp() }.value) / 16f) + 1f - (abs(with(density) { horizontalOffset.floatValue.toDp() }.value) / sensitivity.value.value) ).value } @@ -91,12 +93,12 @@ fun Modifier.readerHorizontalGesture( val horizontalOffsetDp = with(density) { horizontalOffset.floatValue.toDp() } when { - horizontalOffsetDp > 16.dp -> { + horizontalOffsetDp > sensitivity.value -> { if (inverted.value) scrollForward() else scrollBackward() } - horizontalOffsetDp < (-16).dp -> { + horizontalOffsetDp < -sensitivity.value -> { if (inverted.value) scrollBackward() else scrollForward() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt index 7abef3d1..55d522a9 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt @@ -41,6 +41,7 @@ fun ReaderLayout( verticalPadding: Dp, horizontalGesture: ReaderHorizontalGesture, horizontalGestureScroll: Float, + horizontalGestureSensitivity: Dp, paragraphHeight: Dp, sidePadding: Dp, backgroundColor: Color, @@ -132,6 +133,7 @@ fun ReaderLayout( listState = listState, horizontalGesture = horizontalGesture, horizontalGestureScroll = horizontalGestureScroll, + horizontalGestureSensitivity = horizontalGestureSensitivity, isLoading = isLoading ), verticalArrangement = Arrangement.spacedBy(paragraphHeight), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt index 2e330f77..4b58152e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt @@ -54,6 +54,7 @@ fun ReaderScaffold( verticalPadding: Dp, horizontalGesture: ReaderHorizontalGesture, horizontalGestureScroll: Float, + horizontalGestureSensitivity: Dp, paragraphHeight: Dp, sidePadding: Dp, bottomBarPadding: Dp, @@ -149,6 +150,7 @@ fun ReaderScaffold( verticalPadding = verticalPadding, horizontalGesture = horizontalGesture, horizontalGestureScroll = horizontalGestureScroll, + horizontalGestureSensitivity = horizontalGestureSensitivity, paragraphHeight = paragraphHeight, sidePadding = sidePadding, backgroundColor = backgroundColor, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/ReadingModeSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/ReadingModeSubcategory.kt index b4ca36bd..9cc97a17 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/ReadingModeSubcategory.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/ReadingModeSubcategory.kt @@ -11,6 +11,7 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategory import ua.acclorite.book_story.presentation.settings.reader.reading_mode.components.HorizontalGestureOption import ua.acclorite.book_story.presentation.settings.reader.reading_mode.components.HorizontalGestureScrollOption +import ua.acclorite.book_story.presentation.settings.reader.reading_mode.components.HorizontalGestureSensitivityOption fun LazyListScope.ReadingModeSubcategory( titleColor: @Composable () -> Color = { MaterialTheme.colorScheme.primary }, @@ -31,5 +32,9 @@ fun LazyListScope.ReadingModeSubcategory( item { HorizontalGestureScrollOption() } + + item { + HorizontalGestureSensitivityOption() + } } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/components/HorizontalGestureSensitivityOption.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/components/HorizontalGestureSensitivityOption.kt new file mode 100644 index 00000000..10842068 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/reading_mode/components/HorizontalGestureSensitivityOption.kt @@ -0,0 +1,36 @@ +package ua.acclorite.book_story.presentation.settings.reader.reading_mode.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import ua.acclorite.book_story.R +import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture +import ua.acclorite.book_story.presentation.core.components.settings.SliderWithTitle +import ua.acclorite.book_story.ui.main.MainEvent +import ua.acclorite.book_story.ui.main.MainModel +import ua.acclorite.book_story.ui.theme.ExpandingTransition + +@Composable +fun HorizontalGestureSensitivityOption() { + val mainModel = hiltViewModel() + val state = mainModel.state.collectAsStateWithLifecycle() + + ExpandingTransition( + visible = when (state.value.horizontalGesture) { + ReaderHorizontalGesture.OFF -> false + else -> true + } + ) { + SliderWithTitle( + value = state.value.horizontalGestureSensitivity to "%", + toValue = 100, + title = stringResource(id = R.string.horizontal_gesture_sensitivity_option), + onValueChange = { + mainModel.onEvent( + MainEvent.OnChangeHorizontalGestureSensitivity(it) + ) + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt index 35c5a14c..51832a55 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt @@ -47,5 +47,6 @@ sealed class MainEvent { data class OnChangeScreenBrightness(val value: Float) : MainEvent() data class OnChangeHorizontalGesture(val value: String) : MainEvent() data class OnChangeHorizontalGestureScroll(val value: Float) : MainEvent() + data class OnChangeHorizontalGestureSensitivity(val value: Float) : MainEvent() data class OnChangeBottomBarPadding(val value: Int) : MainEvent() } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt index 2d790cc7..aa910bcc 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt @@ -395,6 +395,14 @@ class MainModel @Inject constructor( } ) + is MainEvent.OnChangeHorizontalGestureSensitivity -> handleDatastoreUpdate( + key = DataStoreConstants.HORIZONTAL_GESTURE_SENSITIVITY, + value = event.value.toDouble(), + updateState = { + it.copy(horizontalGestureSensitivity = this.toFloat()) + } + ) + is MainEvent.OnChangeBottomBarPadding -> handleDatastoreUpdate( key = DataStoreConstants.BOTTOM_BAR_PADDING, value = event.value, diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt index 5a52cc5d..c06e2715 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt @@ -90,6 +90,7 @@ data class MainState( ReaderHorizontalGesture.OFF }, val horizontalGestureScroll: Float = provideDefaultValue { 0.7f }, + val horizontalGestureSensitivity: Float = provideDefaultValue { 0.6f }, val bottomBarPadding: Int = provideDefaultValue { 0 }, // Browse Settings @@ -297,6 +298,10 @@ data class MainState( HORIZONTAL_GESTURE_SCROLL, convert = { toFloat() } ) { horizontalGestureScroll }, + horizontalGestureSensitivity = provideValue( + HORIZONTAL_GESTURE_SENSITIVITY, convert = { toFloat() } + ) { horizontalGestureSensitivity }, + bottomBarPadding = provideValue( BOTTOM_BAR_PADDING ) { bottomBarPadding }, diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt index a55582f9..a80ffa47 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt @@ -161,6 +161,9 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { ) { (mainState.value.perceptionExpanderThickness * 0.25f).dp } + val horizontalGestureSensitivity = remember(mainState.value.horizontalGestureSensitivity) { + (36f + mainState.value.horizontalGestureSensitivity * (4f - 36f)).dp + } val density = LocalDensity.current val layoutDirection = LocalLayoutDirection.current @@ -321,6 +324,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { verticalPadding = verticalPadding, horizontalGesture = mainState.value.horizontalGesture, horizontalGestureScroll = mainState.value.horizontalGestureScroll, + horizontalGestureSensitivity = horizontalGestureSensitivity, paragraphHeight = paragraphHeight, sidePadding = sidePadding, bottomBarPadding = bottomBarPadding, diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fb96c020..d5cdb6e6 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -267,6 +267,7 @@ Яскравість Горизонтальний жест Частка прокрутки + Чутливість Відступ нижньої панелі diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70c071e0..6aadbc0b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -268,6 +268,7 @@ Brightness Horizontal gesture Scroll fraction + Sensitivity Bottom bar margin