From b14aba02ed1d231be0f01c55d4a39bbab52fe8d8 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 6 Feb 2023 20:40:05 -0800 Subject: [PATCH] track scrolling from webview rather than webview container --- .../omnivore/omnivore/ui/reader/WebReader.kt | 34 +++++++------------ .../ui/reader/WebReaderLoadingContainer.kt | 2 -- .../omnivore/ui/reader/WebReaderViewModel.kt | 4 +-- 3 files changed, 15 insertions(+), 25 deletions(-) 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 2d38bcef9..7e9748808 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 @@ -7,39 +7,24 @@ import android.content.Context import android.graphics.Rect import android.util.Log import android.view.* +import android.view.View.OnScrollChangeListener +import android.view.ViewTreeObserver.OnScrollChangedListener import android.webkit.JavascriptInterface import android.webkit.WebView import android.webkit.WebViewClient -import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.ModalBottomSheetValue -import androidx.compose.material.TopAppBar -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Menu -import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.NestedScrollSource -import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import app.omnivore.omnivore.R -import app.omnivore.omnivore.ui.save.SaveSheetActivityBase -import app.omnivore.omnivore.ui.savedItemViews.SavedItemContextMenu import com.google.gson.Gson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.* -import kotlin.math.roundToInt @SuppressLint("SetJavaScriptEnabled") @Composable @@ -142,10 +127,14 @@ fun WebReader( } } -class OmnivoreWebView(context: Context) : WebView(context) { +class OmnivoreWebView(context: Context) : WebView(context), OnScrollChangeListener { var viewModel: WebReaderViewModel? = null var actionMode: ActionMode? = null + init { + setOnScrollChangeListener(this) + } + private val actionModeCallback = object : ActionMode.Callback2() { // Called when the action mode is created; startActionMode() was called override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { @@ -229,12 +218,11 @@ class OmnivoreWebView(context: Context) : WebView(context) { override fun onGetContentRect(mode: ActionMode?, view: View?, outRect: Rect?) { Log.d("wv", "outRect: $outRect, View: $view") if (viewModel?.lastTapCoordinates != null) { - val scrollYOffset = viewModel?.scrollState?.value ?: 0 val xValue = viewModel!!.lastTapCoordinates!!.tapX.toInt() - val yValue = viewModel!!.lastTapCoordinates!!.tapY.toInt() + scrollYOffset + (viewModel?.currentToolbarHeight ?: 0) + val yValue = viewModel!!.lastTapCoordinates!!.tapY.toInt() + (viewModel?.currentToolbarHeight ?: 0) val rect = Rect(xValue, yValue, xValue, yValue) - Log.d("wvt", "scrollState: ${viewModel?.scrollState?.value}, bar height: ${viewModel?.currentToolbarHeight}") + Log.d("wvt", "bar height: ${viewModel?.currentToolbarHeight}") Log.d("wvt", "setting rect based on last tapped rect: ${viewModel?.lastTapCoordinates.toString()}") Log.d("wvt", "rect: $rect") @@ -262,6 +250,10 @@ class OmnivoreWebView(context: Context) : WebView(context) { Log.d("wv", "startActionMode:type called") return super.startActionMode(actionModeCallback, type) } + + override fun onScrollChange(view: View?, x: Int, y: Int, oldX: Int, oldY: Int) { + viewModel?.scrollY = y + } } class AndroidWebKitMessenger(val messageHandler: (String, String) -> Unit) { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt index 0bee40bc6..a69bc28a9 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt @@ -141,8 +141,6 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, o Column( modifier = Modifier .fillMaxSize() - .verticalScroll(webReaderViewModel.scrollState) - ) { Row( modifier = Modifier diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt index 4bb3b4fa3..6afb14d85 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt @@ -34,7 +34,7 @@ class WebReaderViewModel @Inject constructor( ): ViewModel() { var lastJavascriptActionLoopUUID: UUID = UUID.randomUUID() var javascriptDispatchQueue: MutableList = mutableListOf() - var scrollState = ScrollState(0) + var scrollY = 0 var currentToolbarHeight = 0 val webReaderParamsLiveData = MutableLiveData(null) @@ -195,7 +195,7 @@ class WebReaderViewModel @Inject constructor( shouldPopViewLiveData.postValue(false) webReaderParamsLiveData.value = null annotationLiveData.value = null - scrollState = ScrollState(0) + scrollY = 0 javascriptDispatchQueue = mutableListOf() hasTappedExistingHighlight = false lastTapCoordinates = null