From e0b1b182992aa193df6bebfbac08ca1cea7acc42 Mon Sep 17 00:00:00 2001
From: FooIbar <118464521+FooIbar@users.noreply.github.com>
Date: Sun, 1 Dec 2024 15:11:03 +0800
Subject: [PATCH] Support reverse physical key controls in reader
---
app/src/main/kotlin/com/hippo/ehviewer/Settings.kt | 1 +
.../kotlin/com/hippo/ehviewer/ui/reader/KeyEventHandler.kt | 5 +++--
.../com/hippo/ehviewer/ui/reader/ReaderGeneralSetting.kt | 4 ++++
.../main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt | 2 ++
app/src/main/res/values-zh-rCN/strings.xml | 1 +
app/src/main/res/values/strings.xml | 1 +
6 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt
index 5cccc8355..49252ce1e 100644
--- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt
+++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt
@@ -195,6 +195,7 @@ object Settings : DataStorePreferences(null) {
val keepScreenOn = boolPref("pref_keep_screen_on_key", true)
val readerLongTapAction = boolPref("reader_long_tap", true)
val pageTransitions = boolPref("pref_enable_transitions_key", true)
+ val readerReverseControls = boolPref("reader_volume_keys_inverted", false)
val grayScale = boolPref("pref_grayscale", false)
val invertedColors = boolPref("pref_inverted_colors", false)
val readerWebtoonNav = intPref("reader_navigation_mode_webtoon", 0)
diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/KeyEventHandler.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/KeyEventHandler.kt
index 3e34a5644..ada910322 100644
--- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/KeyEventHandler.kt
+++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/KeyEventHandler.kt
@@ -9,13 +9,14 @@ import androidx.compose.ui.input.key.type
fun Modifier.keyEventHandler(
enabled: () -> Boolean,
+ reverse: () -> Boolean,
movePrevious: () -> Unit,
moveNext: () -> Unit,
) = onPreviewKeyEvent {
if (enabled() && it.type == KeyEventType.KeyDown) {
when (it.key) {
- Key.DirectionUp, Key.PageUp, Key.VolumeUp -> movePrevious()
- Key.DirectionDown, Key.PageDown, Key.VolumeDown -> moveNext()
+ Key.DirectionUp, Key.PageUp, Key.VolumeUp -> if (reverse()) moveNext() else movePrevious()
+ Key.DirectionDown, Key.PageDown, Key.VolumeDown -> if (reverse()) movePrevious() else moveNext()
else -> return@onPreviewKeyEvent false
}
true
diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderGeneralSetting.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderGeneralSetting.kt
index 1cfb9cc13..29204ac14 100644
--- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderGeneralSetting.kt
+++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderGeneralSetting.kt
@@ -63,4 +63,8 @@ fun ReaderGeneralSetting() = Column(modifier = Modifier.verticalScroll(rememberS
title = stringResource(id = R.string.pref_page_transitions),
field = Settings.pageTransitions.asMutableState(),
)
+ SwitchChoice(
+ title = stringResource(id = R.string.settings_read_reverse_controls),
+ field = Settings.readerReverseControls.asMutableState(),
+ )
}
diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt
index 1cf7e87b6..ef5650e6d 100644
--- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt
+++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt
@@ -188,6 +188,7 @@ fun AnimatedVisibilityScope.ReaderScreen(pageLoader: PageLoader, info: BaseGalle
}
val showSeekbar by Settings.showReaderSeekbar.collectAsState()
val readingMode by Settings.readingMode.collectAsState { ReadingModeType.fromPreference(it) }
+ val reverseControls by Settings.readerReverseControls.collectAsState()
val fullscreen by Settings.fullscreen.collectAsState()
val cutoutShort by Settings.cutoutShort.collectAsState()
val uiController = rememberSystemUiController()
@@ -207,6 +208,7 @@ fun AnimatedVisibilityScope.ReaderScreen(pageLoader: PageLoader, info: BaseGalle
Box(
Modifier.keyEventHandler(
enabled = { !appbarVisible },
+ reverse = { reverseControls },
movePrevious = {
launch {
if (isWebtoon) lazyListState.scrollUp() else pagerState.moveToPrevious()
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index c92bbabfb..15aa58869 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -312,6 +312,7 @@
https://github.com/EhTagTranslation/Editor/wiki
屏蔽列表
根据标题、上传者、标签、评论者屏蔽画廊或评论
+ 反转物理按键控制
[实验性] 屏蔽外部广告
[可选] 选择替换外部广告的图片
下载
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f5c074014..14962ddc5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -328,6 +328,7 @@
https://placeholder
Blockers
Block gallery or comment by title, uploader, tags and commenter
+ Reverse physical key controls
[Experimental] Block extraneous ads
[Optional] Pick placeholder to replace ads
Download