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 7e9748808..1660be528 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 @@ -67,6 +67,11 @@ fun WebReader( settings.domStorageEnabled = true webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + // Add padding to top so TopAppBar doesn't cover content + view?.loadUrl("javascript:(function(){ document.body.style.paddingTop = '48px'})();"); + } } val javascriptInterface = AndroidWebKitMessenger { actionID, json -> @@ -219,10 +224,9 @@ class OmnivoreWebView(context: Context) : WebView(context), OnScrollChangeListen Log.d("wv", "outRect: $outRect, View: $view") if (viewModel?.lastTapCoordinates != null) { val xValue = viewModel!!.lastTapCoordinates!!.tapX.toInt() - val yValue = viewModel!!.lastTapCoordinates!!.tapY.toInt() + (viewModel?.currentToolbarHeight ?: 0) + val yValue = viewModel!!.lastTapCoordinates!!.tapY.toInt() val rect = Rect(xValue, yValue, xValue, yValue) - 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") @@ -253,6 +257,7 @@ class OmnivoreWebView(context: Context) : WebView(context), OnScrollChangeListen override fun onScrollChange(view: View?, x: Int, y: Int, oldX: Int, oldY: Int) { viewModel?.scrollY = y + viewModel?.onScrollChange((oldY - y).toFloat()) } } 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 a69bc28a9..5b02b5bc4 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 @@ -36,6 +36,7 @@ import androidx.compose.ui.unit.dp import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.viewmodel.compose.viewModel import app.omnivore.omnivore.MainActivity import app.omnivore.omnivore.ui.savedItemViews.SavedItemContextMenu import app.omnivore.omnivore.ui.theme.OmnivoreTheme @@ -111,24 +112,12 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, o val webReaderParams: WebReaderParams? by webReaderViewModel.webReaderParamsLiveData.observeAsState(null) val annotation: String? by webReaderViewModel.annotationLiveData.observeAsState(null) val shouldPopView: Boolean by webReaderViewModel.shouldPopViewLiveData.observeAsState(false) + val toolbarHeightPx: Float by webReaderViewModel.currentToolbarHeightLiveData.observeAsState(0.0f) val maxToolbarHeight = 48.dp - val maxToolbarHeightPx = with(LocalDensity.current) { maxToolbarHeight.roundToPx().toFloat() } - val toolbarHeightPx = remember { mutableStateOf(maxToolbarHeightPx) } - - // Create a connection to the nested scroll system and listen to the scroll happening inside child Column - val nestedScrollConnection = remember { - object : NestedScrollConnection { - override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { - val delta = available.y - val newHeight = toolbarHeightPx.value + delta - toolbarHeightPx.value = newHeight.coerceIn(0f, maxToolbarHeightPx) - return Offset.Zero - } - } - } if (webReaderParams == null) { + webReaderViewModel.maxToolbarHeightPx = with(LocalDensity.current) { maxToolbarHeight.roundToPx().toFloat() } webReaderViewModel.loadItem(slug = slug, requestID = requestID) } @@ -136,27 +125,14 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, o Box( modifier = Modifier .fillMaxSize() - .nestedScroll(nestedScrollConnection) ) { - Column( - modifier = Modifier - .fillMaxSize() - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .requiredHeight(height = maxToolbarHeight) - ) { - } WebReader(webReaderParams!!, webReaderViewModel.storedWebPreferences(isSystemInDarkTheme()), webReaderViewModel) - } TopAppBar( modifier = Modifier .height(height = with(LocalDensity.current) { - webReaderViewModel.currentToolbarHeight = toolbarHeightPx.value.toInt() - toolbarHeightPx.value.roundToInt().toDp() - } ), + toolbarHeightPx.roundToInt().toDp() + }), backgroundColor = MaterialTheme.colorScheme.surfaceVariant, title = {}, actions = { 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 6afb14d85..bd271b661 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 @@ -2,6 +2,10 @@ package app.omnivore.omnivore.ui.reader import android.util.Log import androidx.compose.foundation.ScrollState +import androidx.compose.runtime.remember +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -35,13 +39,14 @@ class WebReaderViewModel @Inject constructor( var lastJavascriptActionLoopUUID: UUID = UUID.randomUUID() var javascriptDispatchQueue: MutableList = mutableListOf() var scrollY = 0 - var currentToolbarHeight = 0 + var maxToolbarHeightPx = 0.0f val webReaderParamsLiveData = MutableLiveData(null) val annotationLiveData = MutableLiveData(null) val javascriptActionLoopUUIDLiveData = MutableLiveData(lastJavascriptActionLoopUUID) - val shouldPopViewLiveData = MutableLiveData(false) - val hasFetchError = MutableLiveData(false) + val shouldPopViewLiveData = MutableLiveData(false) + val hasFetchError = MutableLiveData(false) + val currentToolbarHeightLiveData = MutableLiveData(0.0f) var hasTappedExistingHighlight = false var lastTapCoordinates: TapCoordinates? = null @@ -53,6 +58,11 @@ class WebReaderViewModel @Inject constructor( } } + fun onScrollChange(delta: Float) { + val newHeight = (currentToolbarHeightLiveData.value ?: 0.0f) + delta + currentToolbarHeightLiveData.value = newHeight.coerceIn(0f, maxToolbarHeightPx) + } + private suspend fun loadItemUsingSlug(slug: String) { val webReaderParams = loadItemFromServer(slug)