From 40778a88dd673ae2c19dc36e5466292ea0c511c9 Mon Sep 17 00:00:00 2001 From: Stanislav Khromov Date: Mon, 30 Jun 2025 01:36:51 +0200 Subject: [PATCH] Add option to invert reader navigation controls Introduces a new setting allowing users to invert navigation controls for page and chapter switching in the reader. Updates preferences, strings, and control logic to support swapping the direction of volume button and tap navigation. --- .../kotatsu/core/prefs/AppSettings.kt | 4 ++++ .../reader/ui/ReaderControlDelegate.kt | 20 +++++++++---------- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/pref_reader.xml | 6 ++++++ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index fc646784d..165b25ac3 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -143,6 +143,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val isReaderControlAlwaysLTR: Boolean get() = prefs.getBoolean(KEY_READER_CONTROL_LTR, false) + val isReaderNavigationInverted: Boolean + get() = prefs.getBoolean(KEY_READER_NAVIGATION_INVERTED, false) + val isReaderFullscreenEnabled: Boolean get() = prefs.getBoolean(KEY_READER_FULLSCREEN, true) @@ -631,6 +634,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_READER_DOUBLE_PAGES = "reader_double_pages" const val KEY_READER_ZOOM_BUTTONS = "reader_zoom_buttons" const val KEY_READER_CONTROL_LTR = "reader_taps_ltr" + const val KEY_READER_NAVIGATION_INVERTED = "reader_navigation_inverted" const val KEY_READER_FULLSCREEN = "reader_fullscreen" const val KEY_READER_VOLUME_BUTTONS = "reader_volume_buttons" const val KEY_READER_ORIENTATION = "reader_orientation" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt index e1e6d20ae..657b82e54 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt @@ -60,28 +60,28 @@ class ReaderControlDelegate( KeyEvent.KEYCODE_L -> switchBy(-1, null, false) KeyEvent.KEYCODE_VOLUME_UP -> if (settings.isReaderVolumeButtonsEnabled) { - switchBy(-1, event, false) + switchBy(if (settings.isReaderNavigationInverted) 1 else -1, event, false) } else { return false } KeyEvent.KEYCODE_VOLUME_DOWN -> if (settings.isReaderVolumeButtonsEnabled) { - switchBy(1, event, false) + switchBy(if (settings.isReaderNavigationInverted) -1 else 1, event, false) } else { return false } - KeyEvent.KEYCODE_DPAD_RIGHT -> switchByRelative(1, event) + KeyEvent.KEYCODE_DPAD_RIGHT -> switchByRelative(if (settings.isReaderNavigationInverted) -1 else 1, event) - KeyEvent.KEYCODE_DPAD_LEFT -> switchByRelative(-1, event) + KeyEvent.KEYCODE_DPAD_LEFT -> switchByRelative(if (settings.isReaderNavigationInverted) 1 else -1, event) KeyEvent.KEYCODE_DPAD_CENTER -> listener.toggleUiVisibility() KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP, - KeyEvent.KEYCODE_DPAD_UP -> switchBy(-1, event, true) + KeyEvent.KEYCODE_DPAD_UP -> switchBy(if (settings.isReaderNavigationInverted) 1 else -1, event, true) KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN, - KeyEvent.KEYCODE_DPAD_DOWN -> switchBy(1, event, true) + KeyEvent.KEYCODE_DPAD_DOWN -> switchBy(if (settings.isReaderNavigationInverted) -1 else 1, event, true) else -> return false } @@ -95,10 +95,10 @@ class ReaderControlDelegate( private fun processAction(action: TapAction) { when (action) { - TapAction.PAGE_NEXT -> listener.switchPageBy(1) - TapAction.PAGE_PREV -> listener.switchPageBy(-1) - TapAction.CHAPTER_NEXT -> listener.switchChapterBy(1) - TapAction.CHAPTER_PREV -> listener.switchChapterBy(-1) + TapAction.PAGE_NEXT -> listener.switchPageBy(if (settings.isReaderNavigationInverted) -1 else 1) + TapAction.PAGE_PREV -> listener.switchPageBy(if (settings.isReaderNavigationInverted) 1 else -1) + TapAction.CHAPTER_NEXT -> listener.switchChapterBy(if (settings.isReaderNavigationInverted) -1 else 1) + TapAction.CHAPTER_PREV -> listener.switchChapterBy(if (settings.isReaderNavigationInverted) 1 else -1) TapAction.TOGGLE_UI -> listener.toggleUiVisibility() TapAction.SHOW_MENU -> listener.openMenu() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e40d729f4..47e1ea0d0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -565,6 +565,8 @@ Configure actions for tappable screen areas Enable volume buttons Use volume buttons for switching pages + Invert navigation controls + Swap the direction of volume button and screen tap navigation (left becomes right, right becomes left) Tap action Long tap action None diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index 894bed8f3..3045b3d0a 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -75,6 +75,12 @@ android:summary="@string/switch_pages_volume_buttons_summary" android:title="@string/switch_pages_volume_buttons" /> + +