Use separate state when needed to get new items unread count

This commit is contained in:
Shinokuni 2024-06-28 21:12:03 +02:00
parent 4382bbb061
commit d51cf041b8
4 changed files with 27 additions and 9 deletions

View File

@ -12,7 +12,11 @@ class GetFoldersWithFeeds(
private val database: Database,
) {
fun get(accountId: Int, mainFilter: MainFilter, useSeparateState: Boolean): Flow<Map<Folder?, List<Feed>>> {
fun get(
accountId: Int,
mainFilter: MainFilter,
useSeparateState: Boolean
): Flow<Map<Folder?, List<Feed>>> {
val query = FeedUnreadCountQueryBuilder.build(accountId, mainFilter, useSeparateState)
return combine(
@ -56,4 +60,11 @@ class GetFoldersWithFeeds(
foldersWithFeeds.toSortedMap(nullsLast(Folder::compareTo))
}
}
fun getNewItemsUnreadCount(accountId: Int, useSeparateState: Boolean): Flow<Int> =
if (useSeparateState) {
database.newItemDao().selectUnreadNewItemsCountByItemState(accountId)
} else {
database.newItemDao().selectUnreadNewItemsCount(accountId)
}
}

View File

@ -97,12 +97,13 @@ class TimelineScreenModel(
}
screenModelScope.launch(dispatcher) {
accountEvent.flatMapConcat { database.newItemDao().selectUnreadNewItemsCount(it.id) }
.collectLatest { count ->
_timelineState.update {
it.copy(unreadNewItemsCount = count)
}
accountEvent.flatMapConcat {
getFoldersWithFeeds.getNewItemsUnreadCount(it.id, it.config.useSeparateState)
}.collectLatest { count ->
_timelineState.update {
it.copy(unreadNewItemsCount = count)
}
}
}
}

View File

@ -51,10 +51,16 @@ abstract class NewItemDao : NewBaseDao<Item> {
"On Feed.folder_id = Folder.id Where Folder.id = :folderId And Folder.account_id = :accountId)")
abstract suspend fun setAllItemsReadByFolder(folderId: Int, accountId: Int)
@Query("Select count(*) From Item Inner Join Feed On Item.feed_id = Feed.id Where read = 0 and account_id = :accountId " +
"And DateTime(Round(Item.pub_date / 1000), 'unixepoch') Between DateTime(DateTime(\"now\"), \"-24 hour\") And DateTime(\"now\")")
@Query("""Select count(*) From Item Inner Join Feed On Item.feed_id = Feed.id Where read = 0
And account_id = :accountId And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now")""")
abstract fun selectUnreadNewItemsCount(accountId: Int): Flow<Int>
@Query("""Select count(*) From ItemState Inner Join Item On Item.remoteId = ItemState.remote_id
Where ItemState.read = 0 and account_id = :accountId And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now")""")
abstract fun selectUnreadNewItemsCountByItemState(accountId: Int): Flow<Int>
@RawQuery(observedEntities = [Item::class, ItemState::class])
abstract fun selectFeedUnreadItemsCount(query: SupportSQLiteQuery):
Flow<Map<@MapColumn(columnName = "feed_id") Int, @MapColumn(columnName = "item_count") Int>>

View File

@ -106,7 +106,7 @@ interface NewItemStateDao : NewBaseDao<ItemState> {
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now"))""")
suspend fun setAllNewItemsReadByUpdate(accountId: Int)
@Query("""Insert Into ItemState(read, starred, remote_id, account_id) Select 1 as read, 0 as starred,
@Query("""Insert Or Ignore Into ItemState(read, starred, remote_id, account_id) Select 1 as read, 0 as starred,
Item.remoteId As remote_id, account_id From Item Inner Join Feed On Feed.id = Item.feed_id
Where Feed.account_id = :accountId And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now")""")