diff options
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.kt | 28 |
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 -- |
