summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt')
-rw-r--r--app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt30
1 files changed, 22 insertions, 8 deletions
diff --git a/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt b/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
index a89052c..e2b8aa9 100644
--- a/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
+++ b/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
@@ -46,6 +46,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -180,6 +181,10 @@ private fun ReaderContent(
) {
val context = LocalContext.current
val db = remember { AppDatabase.get(context) }
+ // Independently remembered rather than threaded down from ReaderScreen, matching db/scope
+ // above -- Settings is a stateless DataStore wrapper, cheap to construct again, and this
+ // keeps pinch-to-zoom from growing ReaderContent's already-long parameter list any further.
+ val settings = remember { Settings(context) }
val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
@@ -526,19 +531,28 @@ private fun ReaderContent(
// changing it in Settings and coming back to an already-open article
// picks up the new size, without reloading on every unrelated recomposition.
val loadedKey = remember(articleId) { mutableStateOf<Pair<String?, Int>?>(null) }
+ // newReaderWebView's factory runs once per WebView instance, but fontSizePx can
+ // change later (e.g. the user tweaks it in Settings while this same article stays
+ // open) -- rememberUpdatedState keeps the pinch gesture's "what am I scaling from"
+ // read current instead of frozen at whatever it was on first composition.
+ val latestFontSizePx by rememberUpdatedState(fontSizePx)
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { ctx ->
newReaderWebView(
ctx,
- onOpenLink,
- onLongPressLink = { longPressedLink = it },
- onYouTubeVideo = { youtubeVideoId = it },
- onScrollChanged = { scrollY -> ReaderScrollPositions.set(articleId, scrollY) },
- // The page's real content height isn't known until layout finishes
- // -- scrolling to a saved offset any earlier would just clamp back
- // to 0 on a page that hasn't grown tall enough yet.
- onPageFinished = { webView -> webView.scrollTo(0, ReaderScrollPositions.get(articleId)) }
+ ReaderWebViewCallbacks(
+ onOpenLink = onOpenLink,
+ onLongPressLink = { longPressedLink = it },
+ onYouTubeVideo = { youtubeVideoId = it },
+ onScrollChanged = { scrollY -> ReaderScrollPositions.set(articleId, scrollY) },
+ // The page's real content height isn't known until layout finishes
+ // -- scrolling to a saved offset any earlier would just clamp back
+ // to 0 on a page that hasn't grown tall enough yet.
+ onPageFinished = { webView -> webView.scrollTo(0, ReaderScrollPositions.get(articleId)) },
+ currentFontSizePx = { latestFontSizePx },
+ onFontSizeChanged = { newSizePx -> scope.launch { settings.setReaderFontSizePx(newSizePx) } }
+ )
).apply {
val html = wrapReaderHtml(content, article?.title, article?.publishedAt, article?.imageUrl, fontSizePx)
loadDataWithBaseURL(baseUrl, html, "text/html", "UTF-8", null)