diff --git a/app/src/main/java/me/ash/reader/data/dao/ArticleDao.kt b/app/src/main/java/me/ash/reader/data/dao/ArticleDao.kt index 3a15a031..6540efe1 100644 --- a/app/src/main/java/me/ash/reader/data/dao/ArticleDao.kt +++ b/app/src/main/java/me/ash/reader/data/dao/ArticleDao.kt @@ -4,6 +4,7 @@ import androidx.paging.PagingSource import androidx.room.* import kotlinx.coroutines.flow.Flow import me.ash.reader.data.model.article.Article +import me.ash.reader.data.model.article.ArticleMeta import me.ash.reader.data.model.article.ArticleWithFeed import me.ash.reader.data.model.feed.ImportantNum import java.util.* @@ -553,6 +554,18 @@ interface ArticleDao { ) suspend fun queryById(id: String): ArticleWithFeed? + @Transaction + @Query( + """ + SELECT id, isUnread, isStarred FROM article + WHERE accountId = :accountId + ORDER BY date DESC + """ + ) + fun queryArticleMetadataAll( + accountId: Int + ): List + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(vararg article: Article) diff --git a/app/src/main/java/me/ash/reader/data/model/article/ArticleMeta.kt b/app/src/main/java/me/ash/reader/data/model/article/ArticleMeta.kt new file mode 100644 index 00000000..83dc8b50 --- /dev/null +++ b/app/src/main/java/me/ash/reader/data/model/article/ArticleMeta.kt @@ -0,0 +1,17 @@ +package me.ash.reader.data.model.article + +import androidx.room.ColumnInfo +import androidx.room.PrimaryKey + +/** + * Data class for article metadata processing only. + */ + +data class ArticleMeta( + @PrimaryKey + var id: String, + @ColumnInfo + var isUnread: Boolean = true, + @ColumnInfo + var isStarred: Boolean = false, +) diff --git a/app/src/main/java/me/ash/reader/data/repository/FeverRssRepository.kt b/app/src/main/java/me/ash/reader/data/repository/FeverRssRepository.kt index 1cdb76e2..d99e4e07 100644 --- a/app/src/main/java/me/ash/reader/data/repository/FeverRssRepository.kt +++ b/app/src/main/java/me/ash/reader/data/repository/FeverRssRepository.kt @@ -17,6 +17,7 @@ import me.ash.reader.data.dao.FeedDao import me.ash.reader.data.dao.GroupDao import me.ash.reader.data.model.account.security.FeverSecurityKey import me.ash.reader.data.model.article.Article +import me.ash.reader.data.model.article.ArticleMeta import me.ash.reader.data.model.feed.Feed import me.ash.reader.data.model.group.Group import me.ash.reader.data.module.DefaultDispatcher @@ -91,7 +92,8 @@ class FeverRssRepository @Inject constructor( * 1. Fetch the Fever groups * 2. Fetch the Fever feeds * 3. Fetch the Fever articles - * 4. Fetch the Fever favicons + * 4. Synchronize read/unread and starred/un-starred items + * 5. TODO: Fetch the Fever favicons */ override suspend fun sync(coroutineWorker: CoroutineWorker): ListenableWorker.Result = supervisorScope { coroutineWorker.setProgress(SyncWorker.setIsSyncing(true)) @@ -171,7 +173,23 @@ class FeverRssRepository @Inject constructor( } } - // TODO: 4. Fetch the Fever favicons + // 4. Synchronize read/unread and starred/un-starred + val unreadArticleIds = feverAPI.getUnreadItems().unread_item_ids?.split(",") + val starredArticleIds = feverAPI.getSavedItems().saved_item_ids?.split(",") + val articleMeta = articleDao.queryArticleMetadataAll(accountId) + for (meta: ArticleMeta in articleMeta) { + val articleId = meta.id.dollarLast() + val shouldBeUnread = unreadArticleIds?.contains(articleId) + val shouldBeStarred = starredArticleIds?.contains(articleId) + if (meta.isUnread != shouldBeUnread) { + articleDao.markAsReadByArticleId(accountId, meta.id, shouldBeUnread?:true) + } + if (meta.isStarred != shouldBeStarred){ + articleDao.markAsStarredByArticleId(accountId, meta.id, shouldBeStarred?:false) + } + } + + // TODO: 5. Fetch the Fever favicons Log.i("RLog", "onCompletion: ${System.currentTimeMillis() - preTime}") accountDao.update(account.apply {