summaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/org/terst/feedreader/work/FeedFetchWorker.kt23
1 files changed, 22 insertions, 1 deletions
diff --git a/app/src/main/java/org/terst/feedreader/work/FeedFetchWorker.kt b/app/src/main/java/org/terst/feedreader/work/FeedFetchWorker.kt
index ecd186b..5583014 100644
--- a/app/src/main/java/org/terst/feedreader/work/FeedFetchWorker.kt
+++ b/app/src/main/java/org/terst/feedreader/work/FeedFetchWorker.kt
@@ -19,6 +19,7 @@ import org.terst.feedreader.data.FeedParser
import org.terst.feedreader.data.Net
import org.terst.feedreader.data.Settings
import org.terst.feedreader.data.await
+import org.terst.feedreader.readability.ReaderExtractor
import okhttp3.Request
import java.security.MessageDigest
import java.util.concurrent.atomic.AtomicInteger
@@ -30,6 +31,10 @@ import java.util.concurrent.atomic.AtomicInteger
* costs a 304 instead of a full re-download and re-parse. Only ever triggered by
* fetchNow -- a fresh app launch or an explicit tap on the refresh button, never
* a background schedule.
+ *
+ * For a reader-mode feed, new articles are also run through ReaderExtractor right
+ * here, so extractedContent is already cached by the time the user opens one --
+ * see fetchOne.
*/
class FeedFetchWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
@@ -128,7 +133,23 @@ class FeedFetchWorker(context: Context, params: WorkerParameters) : CoroutineWor
// Room returns -1 for a row OnConflictStrategy.IGNORE actually skipped
// (already stored), and the real inserted rowid (>= 0) for a genuinely new
// one -- count only the latter so "N new articles" reflects reality.
- val newCount = db.articleDao().insertNew(articles).count { it != -1L }
+ val insertResults = db.articleDao().insertNew(articles)
+ val newArticles = articles.zip(insertResults).mapNotNull { (article, result) -> article.takeIf { result != -1L } }
+ val newCount = newArticles.size
+
+ if (feed.readerModeEnabled) {
+ // Pre-extract reader-mode content right here during the fetch, instead of
+ // lazily the first time the article is opened (see ReaderScreen's
+ // LaunchedEffect). For a reader-mode feed like West Hawaii Today, that
+ // lazy path meant every fresh article's first open sat on a spinner for a
+ // hidden WebView load + Readability JS eval (several seconds, sometimes
+ // much longer on a slow/heavy page) before any content showed. By the time
+ // the user actually taps into it here, it's already cached.
+ for (newArticle in newArticles) {
+ val extracted = ReaderExtractor.extract(applicationContext, newArticle.link)
+ extracted?.content?.let { db.articleDao().setExtractedContent(newArticle.id, it) }
+ }
+ }
db.feedDao().updateFetchResult(
id = feed.id,