From f59b944bd6783a04740f217129cda02e95b5665b Mon Sep 17 00:00:00 2001 From: Avadhut Tanugade Date: Sun, 4 Feb 2024 14:25:19 +0530 Subject: [PATCH] feat(android): scroll with volume buttons closes: github issue #2936 --- .../omnivore/omnivore/ui/reader/WebReader.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt index 85155f0c6..4dd26c7dd 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.* import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.viewinterop.AndroidView import app.omnivore.omnivore.R +import app.omnivore.omnivore.ui.reader.OmnivoreWebView.Direction import com.google.gson.Gson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -160,6 +161,24 @@ fun WebReader( "utf-8", null ) + requestFocus() + setOnKeyListener { _, keyCode, event -> + if (event.action == KeyEvent.ACTION_DOWN) { + when (keyCode) { + KeyEvent.KEYCODE_VOLUME_UP -> { + scrollVertically(Direction.UP) + return@setOnKeyListener true + } + + KeyEvent.KEYCODE_VOLUME_DOWN -> { + scrollVertically(Direction.DOWN) + return@setOnKeyListener true + } + } + } + // default value + false + } } }, update = { if (javascriptActionLoopUUID != webReaderViewModel.lastJavascriptActionLoopUUID) { @@ -194,6 +213,18 @@ class OmnivoreWebView(context: Context) : WebView(context), OnScrollChangeListen setOnScrollChangeListener(this) } + enum class Direction(val value: Int) { + UP(-1), + DOWN(1) + } + + fun scrollVertically(direction: Direction, heightFactor: Int = 10) { + if (canScrollVertically(direction.value)) { + val scrollByValue = height.div(heightFactor) + scrollBy(0, direction.value.times(scrollByValue)) + } + } + private val actionModeCallback = object : ActionMode.Callback2() { // Called when the action mode is created; startActionMode() was called override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {