Add support for all cases of setting all items read for all account types

This commit is contained in:
Shinokuni 2024-06-24 16:07:32 +02:00
parent ed7adb5b76
commit 1e95408500
4 changed files with 195 additions and 32 deletions

View File

@ -111,32 +111,95 @@ abstract class BaseRepository(
}
}
open suspend fun setAllItemsRead(accountId: Int) {
database.newItemDao().setAllItemsRead(accountId)
}
open suspend fun setAllItemsRead() {
val accountId = account.id
open suspend fun setAllStarredItemsRead(accountId: Int) {
database.newItemDao().setAllStarredItemsRead(accountId)
}
open suspend fun setAllNewItemsRead(accountId: Int) {
database.newItemDao().setAllNewItemsRead(accountId)
}
open suspend fun setAllItemsReadByFeed(feedId: Int, accountId: Int) {
when {
account.config.useSeparateState || !account.isLocal -> {
database.newItemStateChangeDao().upsertItemReadStateChangesByFeed(feedId, accountId)
account.config.useSeparateState -> {
database.newItemStateChangeDao().upsertAllItemsReadStateChanges(accountId)
database.newItemStateDao().setAllItemsRead(accountId)
}
account.isLocal -> {
database.newItemDao().setAllItemsRead(account.id)
}
else -> {
database.newItemStateChangeDao().upsertAllItemsReadStateChanges(accountId)
database.newItemDao().setAllItemsRead(accountId)
}
}
}
open suspend fun setAllStarredItemsRead() {
val accountId = account.id
when {
account.config.useSeparateState -> {
database.newItemStateChangeDao().upsertStarredItemReadStateChanges(accountId)
database.newItemStateDao().setAllStarredItemsRead(accountId)
}
account.isLocal -> {
database.newItemDao().setAllStarredItemsRead(accountId)
}
else -> {
database.newItemStateChangeDao().upsertStarredItemReadStateChanges(accountId)
database.newItemDao().setAllStarredItemsRead(accountId)
}
}
}
open suspend fun setAllNewItemsRead() {
val accountId = account.id
when {
account.config.useSeparateState -> {
database.newItemStateChangeDao().upsertNewItemReadStateChanges(accountId)
database.newItemStateDao().setAllNewItemsRead(accountId)
}
account.isLocal -> {
database.newItemDao().setAllNewItemsRead(accountId)
}
else -> {
database.newItemStateChangeDao().upsertNewItemReadStateChanges(accountId)
database.newItemDao().setAllNewItemsRead(accountId)
}
}
}
open suspend fun setAllItemsReadByFeed(feedId: Int) {
val accountId = account.id
when {
account.config.useSeparateState -> {
database.newItemStateChangeDao()
.upsertItemReadStateChangesByFeed(feedId, accountId)
database.newItemStateDao().setAllItemsReadByFeed(feedId, accountId)
}
account.isLocal -> {
database.newItemDao().setAllItemsReadByFeed(feedId, accountId)
}
else -> {
database.newItemStateChangeDao().upsertItemReadStateChangesByFeed(feedId, accountId)
database.newItemDao().setAllItemsReadByFeed(feedId, accountId)
}
}
}
open suspend fun setAllItemsReadByFolder(folderId: Int, accountId: Int) {
database.newItemDao().setAllItemsReadByFolder(folderId, accountId)
open suspend fun setAllItemsReadByFolder(folderId: Int) {
val accountId = account.id
when {
account.config.useSeparateState -> {
database.newItemStateChangeDao().upsertItemReadStateChangesByFolder(folderId, accountId)
database.newItemStateDao().setAllItemsReadByFolder(folderId, accountId)
}
account.isLocal -> {
database.newItemDao().setAllItemsReadByFolder(folderId, accountId)
}
else -> {
database.newItemStateChangeDao().upsertItemReadStateChangesByFolder(folderId, accountId)
database.newItemDao().setAllItemsReadByFolder(folderId, accountId)
}
}
}
suspend fun insertOPMLFoldersAndFeeds(

View File

@ -274,24 +274,20 @@ class TimelineScreenModel(
fun setAllItemsRead() {
screenModelScope.launch(dispatcher) {
val accountId = currentAccount!!.id
when (_timelineState.value.filters.subFilter) {
SubFilter.FEED ->
repository?.setAllItemsReadByFeed(
feedId = _timelineState.value.filters.filterFeedId,
accountId = accountId
feedId = _timelineState.value.filters.filterFeedId
)
SubFilter.FOLDER -> repository?.setAllItemsReadByFolder(
folderId = _timelineState.value.filters.filterFolderId,
accountId = accountId
folderId = _timelineState.value.filters.filterFolderId
)
else -> when (_timelineState.value.filters.mainFilter) {
MainFilter.STARS -> repository?.setAllStarredItemsRead(accountId)
MainFilter.ALL -> repository?.setAllItemsRead(accountId)
MainFilter.NEW -> repository?.setAllNewItemsRead(accountId)
MainFilter.STARS -> repository?.setAllStarredItemsRead()
MainFilter.ALL -> repository?.setAllItemsRead()
MainFilter.NEW -> repository?.setAllNewItemsRead()
}
}
}

View File

@ -97,18 +97,77 @@ interface NewItemStateChangeDao: NewBaseDao<ItemStateChange> {
@Query("Update ItemStateChange set star_change = :starChange Where id = :id")
suspend fun updateItemStarStateChange(starChange: Boolean, id: Int)
suspend fun upsertAllItemsReadStateChanges(accountId: Int) {
upsertAllItemsReadStateChangesByUpdate(accountId)
upsertAllItemsReadStateChangesByInsert(accountId)
}
@Query("""Update ItemStateChange Set read_change = 1 Where id In (Select Item.id From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId)""")
suspend fun upsertAllItemsReadStateChangesByUpdate(accountId: Int)
@Query("""Insert Or Ignore Into ItemStateChange(id, read_change, star_change, account_id)
Select Item.id, 1 as read_change, 0 as star_change, account_id
From Item Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId""")
suspend fun upsertAllItemsReadStateChangesByInsert(accountId: Int)
suspend fun upsertItemReadStateChangesByFeed(feedId: Int, accountId: Int) {
upsertItemsReadStateChangesByFeedByUpdate(feedId, accountId)
upsertItemsReadStateChangesByFeedByInsert(feedId, accountId)
upsertItemReadStateChangesByFeedByUpdate(feedId, accountId)
upsertItemReadStateChangesByFeedByInsert(feedId, accountId)
}
@Query("""Update ItemStateChange Set read_change = 1 Where id In (Select Item.id From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And feed_id = :feedId)""")
suspend fun upsertItemsReadStateChangesByFeedByUpdate(feedId: Int, accountId: Int)
suspend fun upsertItemReadStateChangesByFeedByUpdate(feedId: Int, accountId: Int)
@Query("""Insert Or Ignore Into ItemStateChange(id, read_change, star_change, account_id)
Select Item.id, 1 as read_change, 0 as star_change, account_id
From Item Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And feed_id = :feedId""")
suspend fun upsertItemsReadStateChangesByFeedByInsert(feedId: Int, accountId: Int)
suspend fun upsertItemReadStateChangesByFeedByInsert(feedId: Int, accountId: Int)
suspend fun upsertItemReadStateChangesByFolder(folderId: Int, accountId: Int) {
upsertItemReadStateChangesByFolderByUpdate(folderId, accountId)
upsertItemReadStateChangesByFolderByInsert(folderId, accountId)
}
@Query("""Update ItemStateChange Set read_change = 1 Where id In (Select Item.id From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And folder_id = :folderId)""")
suspend fun upsertItemReadStateChangesByFolderByUpdate(folderId: Int, accountId: Int)
@Query("""Insert Or Ignore Into ItemStateChange(id, read_change, star_change, account_id)
Select Item.id, 1 as read_change, 0 as star_change, account_id
From Item Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And folder_id = :folderId""")
suspend fun upsertItemReadStateChangesByFolderByInsert(folderId: Int, accountId: Int)
suspend fun upsertStarredItemReadStateChanges(accountId: Int) {
upsertStarredItemReadStateChangesByUpdate(accountId)
upsertStarredItemReadStateChangesByInsert(accountId)
}
@Query("""Update ItemStateChange Set read_change = 1 Where id In (Select Item.id From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And starred = 1)""")
suspend fun upsertStarredItemReadStateChangesByUpdate(accountId: Int)
@Query("""Insert Or Ignore Into ItemStateChange(id, read_change, star_change, account_id)
Select Item.id, 1 as read_change, 0 as star_change, account_id
From Item Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And starred = 1""")
suspend fun upsertStarredItemReadStateChangesByInsert(accountId: Int)
suspend fun upsertNewItemReadStateChanges(accountId: Int) {
upsertNewItemReadStateChangesByUpdate(accountId)
upsertNewItemReadStateChangesByInsert(accountId)
}
@Query("""Update ItemStateChange Set read_change = 1 Where id In (Select Item.id From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId
And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now"))""")
suspend fun upsertNewItemReadStateChangesByUpdate(accountId: Int)
@Query("""Insert Or Ignore Into ItemStateChange(id, read_change, star_change, account_id)
Select Item.id, 1 as read_change, 0 as star_change, account_id
From Item Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId
And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now")""")
suspend fun upsertNewItemReadStateChangesByInsert(accountId: Int)
}

View File

@ -16,7 +16,8 @@ interface NewItemStateDao : NewBaseDao<ItemState> {
@Query("Update ItemState set starred = :star Where remote_id = :remoteId And account_id = :accountId")
suspend fun updateItemStarState(star: Boolean, remoteId: String, accountId: Int)
@Query("Select case When Exists (Select remote_id, account_id From ItemState Where remote_id = :remoteId And account_id = :accountId) Then 1 else 0 End")
@Query("""Select case When Exists (Select remote_id, account_id From ItemState
Where remote_id = :remoteId And account_id = :accountId) Then 1 else 0 End""")
suspend fun itemStateExists(remoteId: String, accountId: Int): Boolean
suspend fun upsertItemReadState(itemState: ItemState) {
@ -35,8 +36,18 @@ interface NewItemStateDao : NewBaseDao<ItemState> {
}
}
@Query("Insert Or Replace Into ItemState(read, remote_id) Select 1 as read, Item.remoteId From Item Inner Join Feed On Feed.account_id = :accountId")
suspend fun setAllItemsRead(accountId: Int)
suspend fun setAllItemsRead(accountId: Int) {
setAllItemsReadByUpdate(accountId)
//setAllItemsReadByInsert(accountId) //TODO use this after putting ItemState.remoteId UNIQUE?
}
@Query("""Update ItemState set read = 1 Where remote_id In (Select Item.remoteId From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId)""")
suspend fun setAllItemsReadByUpdate(accountId: Int)
@Query("""Insert Or Ignore Into ItemState(read, starred, remote_id) Select 1 as read, 0 as starred,
Item.remoteId From Item Inner Join Feed Where Feed.account_id = :accountId""")
suspend fun setAllItemsReadByInsert(accountId: Int)
suspend fun setAllItemsReadByFeed(feedId: Int, accountId: Int) {
setAllItemsReadByFeedByUpdate(feedId, accountId)
@ -50,4 +61,38 @@ interface NewItemStateDao : NewBaseDao<ItemState> {
@Query("""Insert Or Ignore Into ItemState(read, starred, remote_id) Select 1 as read, 0 as starred,
Item.remoteId From Item Inner Join Feed Where Feed.account_id = :accountId And feed_id = :feedId""")
suspend fun setAllItemsReadByFeedByInsert(feedId: Int, accountId: Int)
suspend fun setAllItemsReadByFolder(folderId: Int, accountId: Int) {
setAllItemsReadByFolderByUpdate(folderId, accountId)
//setAllItemsReadByFolderByInsert(folderId, accountId) //TODO use this after putting ItemState.remoteId UNIQUE?
}
@Query("""Update ItemState set read = 1 Where remote_id In (Select Item.remoteId From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId and folder_id = :folderId)""")
suspend fun setAllItemsReadByFolderByUpdate(folderId: Int, accountId: Int)
@Query("""Insert Or Ignore Into ItemState(read, starred, remote_id) Select 1 as read, 0 as starred,
Item.remoteId From Item Inner Join Feed Where Feed.account_id = :accountId And folder_id = :folderId""")
suspend fun setAllItemsReadByFolderByInsert(folderId: Int, accountId: Int)
@Query("""Update ItemState set read = 1 Where remote_id In (Select Item.remoteId From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId And starred = 1)""")
suspend fun setAllStarredItemsRead(accountId: Int)
suspend fun setAllNewItemsRead(accountId: Int) {
setAllNewItemsReadByUpdate(accountId)
//setAllItemsReadByInsert(accountId) //TODO use this after putting ItemState.remoteId UNIQUE?
}
@Query("""Update ItemState set read = 1 Where remote_id In (Select Item.remoteId From Item
Inner Join Feed On Feed.id = Item.feed_id Where account_id = :accountId
And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now"))""")
suspend fun setAllNewItemsReadByUpdate(accountId: Int)
@Query("""Insert Or Ignore Into ItemState(read, starred, remote_id) Select 1 as read, 0 as starred,
Item.remoteId From Item Inner Join Feed Where Feed.account_id = :accountId
And DateTime(Round(Item.pub_date / 1000), 'unixepoch')
Between DateTime(DateTime("now"), "-24 hour") And DateTime("now")""")
suspend fun setAllNewItemsReadByInsert(accountId: Int)
}