use web scroll changes to change top app bar height

This commit is contained in:
Satindar Dhillon 2023-02-07 12:22:51 -08:00
parent b14aba02ed
commit 2c738d111d
3 changed files with 25 additions and 34 deletions

View file

@ -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())
}
}

View file

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

View file

@ -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<String> = mutableListOf()
var scrollY = 0
var currentToolbarHeight = 0
var maxToolbarHeightPx = 0.0f
val webReaderParamsLiveData = MutableLiveData<WebReaderParams?>(null)
val annotationLiveData = MutableLiveData<String?>(null)
val javascriptActionLoopUUIDLiveData = MutableLiveData(lastJavascriptActionLoopUUID)
val shouldPopViewLiveData = MutableLiveData<Boolean>(false)
val hasFetchError = MutableLiveData<Boolean>(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)