track scrolling from webview rather than webview container

This commit is contained in:
Satindar Dhillon 2023-02-06 20:40:05 -08:00
parent fc0bbe391a
commit b14aba02ed
3 changed files with 15 additions and 25 deletions

View file

@ -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) {

View file

@ -141,8 +141,6 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, o
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(webReaderViewModel.scrollState)
) {
Row(
modifier = Modifier

View file

@ -34,7 +34,7 @@ class WebReaderViewModel @Inject constructor(
): ViewModel() {
var lastJavascriptActionLoopUUID: UUID = UUID.randomUUID()
var javascriptDispatchQueue: MutableList<String> = mutableListOf()
var scrollState = ScrollState(0)
var scrollY = 0
var currentToolbarHeight = 0
val webReaderParamsLiveData = MutableLiveData<WebReaderParams?>(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