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.kt28
1 files changed, 19 insertions, 9 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 3c3ab66..a89052c 100644
--- a/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
+++ b/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
@@ -41,6 +41,7 @@ import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -56,6 +57,7 @@ import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import org.terst.feedreader.data.AppDatabase
import org.terst.feedreader.data.ArticleEntity
+import org.terst.feedreader.data.DEFAULT_READER_FONT_SIZE_PX
import org.terst.feedreader.data.FeedEntity
import org.terst.feedreader.data.Settings
import org.terst.feedreader.data.ensureStandaloneArticle
@@ -99,6 +101,7 @@ fun ReaderScreen(
val db = remember { AppDatabase.get(context) }
val settings = remember { Settings(context) }
val scope = rememberCoroutineScope()
+ val fontSizePx by settings.readerFontSizePx.collectAsState(initial = DEFAULT_READER_FONT_SIZE_PX)
var previousId by remember(articleId) { mutableStateOf<String?>(null) }
var nextId by remember(articleId) { mutableStateOf<String?>(null) }
@@ -156,7 +159,8 @@ fun ReaderScreen(
hasNext = nextId != null,
onPrevious = ::goToPreviousArticle,
onNext = ::goToNextArticle,
- onNextKeepUnread = ::goToNextArticleKeepUnread
+ onNextKeepUnread = ::goToNextArticleKeepUnread,
+ fontSizePx = fontSizePx
)
}
@@ -171,7 +175,8 @@ private fun ReaderContent(
hasNext: Boolean,
onPrevious: () -> Unit,
onNext: () -> Unit,
- onNextKeepUnread: () -> Unit
+ onNextKeepUnread: () -> Unit,
+ fontSizePx: Int
) {
val context = LocalContext.current
val db = remember { AppDatabase.get(context) }
@@ -516,8 +521,11 @@ private fun ReaderContent(
// flipping while a Stash save is in flight. Reloading the WebView's HTML
// on those unrelated recompositions was resetting scroll position mid-swipe,
// which is what made scrolling feel unsmooth/janky. Track what's actually
- // loaded and only reload when the content string itself changes.
- val loadedContent = remember(articleId) { mutableStateOf<String?>(null) }
+ // loaded and only reload when the content string or font size actually
+ // changes -- fontSizePx is included deliberately (not just content) so
+ // 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) }
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { ctx ->
@@ -532,14 +540,16 @@ private fun ReaderContent(
// to 0 on a page that hasn't grown tall enough yet.
onPageFinished = { webView -> webView.scrollTo(0, ReaderScrollPositions.get(articleId)) }
).apply {
- loadDataWithBaseURL(baseUrl, wrapReaderHtml(content, article?.title, article?.publishedAt, article?.imageUrl), "text/html", "UTF-8", null)
- loadedContent.value = content
+ val html = wrapReaderHtml(content, article?.title, article?.publishedAt, article?.imageUrl, fontSizePx)
+ loadDataWithBaseURL(baseUrl, html, "text/html", "UTF-8", null)
+ loadedKey.value = content to fontSizePx
}
},
update = { webView ->
- if (loadedContent.value != content) {
- webView.loadDataWithBaseURL(baseUrl, wrapReaderHtml(content, article?.title, article?.publishedAt, article?.imageUrl), "text/html", "UTF-8", null)
- loadedContent.value = content
+ if (loadedKey.value != content to fontSizePx) {
+ val html = wrapReaderHtml(content, article?.title, article?.publishedAt, article?.imageUrl, fontSizePx)
+ webView.loadDataWithBaseURL(baseUrl, html, "text/html", "UTF-8", null)
+ loadedKey.value = content to fontSizePx
}
},
// AndroidView does not destroy() the underlying WebView on its own --