app/src/main/java/com/geekorum/ttrss/data/FeedsDao.kt
author Da Risk <da_risk@geekorum.com>
Mon, 15 Sep 2025 14:00:07 -0400
changeset 1370 13e39ef920a8
parent 1174 731f6ee517b6
permissions -rw-r--r--
update license headers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
137
5464f07a306c Update copyright headers for 2019
Da Risk <da_risk@geekorum.com>
parents: 93
diff changeset
     1
/*
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     2
 * Geekttrss is a RSS feed reader application on the Android Platform.
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     3
 *
1370
13e39ef920a8 update license headers
Da Risk <da_risk@geekorum.com>
parents: 1174
diff changeset
     4
 * Copyright (C) 2017-2025 by Frederic-Charles Barthelery.
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     5
 *
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     6
 * This file is part of Geekttrss.
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     7
 *
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     8
 * Geekttrss is free software: you can redistribute it and/or modify
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     9
 * it under the terms of the GNU General Public License as published by
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    10
 * the Free Software Foundation, either version 3 of the License, or
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    11
 * (at your option) any later version.
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    12
 *
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    13
 * Geekttrss is distributed in the hope that it will be useful,
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    16
 * GNU General Public License for more details.
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    17
 *
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    18
 * You should have received a copy of the GNU General Public License
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    19
 * along with Geekttrss.  If not, see <http://www.gnu.org/licenses/>.
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    20
 */
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    21
package com.geekorum.ttrss.data
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    22
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    23
import androidx.room.Dao
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    24
import androidx.room.Delete
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    25
import androidx.room.Insert
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    26
import androidx.room.OnConflictStrategy
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    27
import androidx.room.Query
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    28
import androidx.room.Transaction
700
9391ebf1b753 articles_list: use Flow instead of LiveData in FeedsRepository
Da Risk <da_risk@geekorum.com>
parents: 611
diff changeset
    29
import kotlinx.coroutines.flow.Flow
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    30
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    31
/**
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    32
 * Dao to access Feeds and Categories
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    33
 */
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    34
@Dao
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    35
abstract class FeedsDao {
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    36
1032
fdca7174bdb7 app: use room-compiler with ksp
Da Risk <da_risk@geekorum.com>
parents: 943
diff changeset
    37
    @Query("SELECT * FROM feeds WHERE unread_count > 0 ORDER BY title")
1034
267c33ff995f app: Display favicon in FeedListNavigationMenu
Da Risk <da_risk@geekorum.com>
parents: 1032
diff changeset
    38
    @Transaction
267c33ff995f app: Display favicon in FeedListNavigationMenu
Da Risk <da_risk@geekorum.com>
parents: 1032
diff changeset
    39
    abstract fun getAllUnreadFeeds(): Flow<List<FeedWithFavIcon>>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    40
1032
fdca7174bdb7 app: use room-compiler with ksp
Da Risk <da_risk@geekorum.com>
parents: 943
diff changeset
    41
    @Query("SELECT * FROM feeds ORDER BY title")
1034
267c33ff995f app: Display favicon in FeedListNavigationMenu
Da Risk <da_risk@geekorum.com>
parents: 1032
diff changeset
    42
    @Transaction
267c33ff995f app: Display favicon in FeedListNavigationMenu
Da Risk <da_risk@geekorum.com>
parents: 1032
diff changeset
    43
    abstract fun getAllFeeds(): Flow<List<FeedWithFavIcon>>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    44
148
2911fd5b9abe FeedsDao: use suspendable transactions
Da Risk <da_risk@geekorum.com>
parents: 137
diff changeset
    45
    @Query("SELECT * FROM feeds")
2911fd5b9abe FeedsDao: use suspendable transactions
Da Risk <da_risk@geekorum.com>
parents: 137
diff changeset
    46
    internal abstract suspend fun getAllFeedsList(): List<Feed>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    47
1032
fdca7174bdb7 app: use room-compiler with ksp
Da Risk <da_risk@geekorum.com>
parents: 943
diff changeset
    48
    @Query("SELECT * FROM categories ORDER BY title")
fdca7174bdb7 app: use room-compiler with ksp
Da Risk <da_risk@geekorum.com>
parents: 943
diff changeset
    49
    abstract fun getAllCategories(): Flow<List<Category>>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    50
1032
fdca7174bdb7 app: use room-compiler with ksp
Da Risk <da_risk@geekorum.com>
parents: 943
diff changeset
    51
    @Query("SELECT * FROM categories WHERE unread_count > 0 ORDER BY title")
fdca7174bdb7 app: use room-compiler with ksp
Da Risk <da_risk@geekorum.com>
parents: 943
diff changeset
    52
    abstract fun getAllUnreadCategories(): Flow<List<Category>>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    53
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    54
    @Query("SELECT * FROM categories")
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    55
    internal abstract suspend fun getAllCategoriesList(): List<Category>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    56
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    57
    @Insert(onConflict = OnConflictStrategy.REPLACE)
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    58
    abstract suspend fun insertFeeds(feeds: Collection<Feed>)
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    59
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    60
    @Delete
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    61
    internal abstract suspend fun deleteFeeds(feeds: Collection<Feed>)
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    62
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    63
    @Query("DELETE FROM ARTICLES where feed_id=:feedId")
148
2911fd5b9abe FeedsDao: use suspendable transactions
Da Risk <da_risk@geekorum.com>
parents: 137
diff changeset
    64
    internal abstract suspend fun deleteArticleFromFeed(feedId: Long)
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    65
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    66
    @Transaction
148
2911fd5b9abe FeedsDao: use suspendable transactions
Da Risk <da_risk@geekorum.com>
parents: 137
diff changeset
    67
    open suspend fun deleteFeedsAndArticles(toBeDelete: List<Feed>) {
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    68
        for ((id) in toBeDelete) {
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    69
            deleteArticleFromFeed(id)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    70
        }
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    71
        deleteFeeds(toBeDelete)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    72
    }
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    73
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    74
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    75
    @Query("SELECT * FROM feeds WHERE _id=:id")
700
9391ebf1b753 articles_list: use Flow instead of LiveData in FeedsRepository
Da Risk <da_risk@geekorum.com>
parents: 611
diff changeset
    76
    abstract fun getFeedById(id: Long): Flow<Feed?>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    77
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    78
    @Insert(onConflict = OnConflictStrategy.REPLACE)
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    79
    abstract suspend fun insertCategories(categories: Collection<Category>)
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    80
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    81
    @Delete
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    82
    abstract suspend fun deleteCategories(categories: Collection<Category>)
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    83
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    84
    @Query("SELECT * FROM feeds WHERE unread_count > 0 AND cat_id=:catId ORDER BY title")
700
9391ebf1b753 articles_list: use Flow instead of LiveData in FeedsRepository
Da Risk <da_risk@geekorum.com>
parents: 611
diff changeset
    85
    abstract fun getUnreadFeedsForCategory(catId: Long): Flow<List<Feed>>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    86
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    87
    @Query("SELECT * FROM feeds WHERE cat_id=:catId ORDER BY title")
700
9391ebf1b753 articles_list: use Flow instead of LiveData in FeedsRepository
Da Risk <da_risk@geekorum.com>
parents: 611
diff changeset
    88
    abstract fun getFeedsForCategory(catId: Long): Flow<List<Feed>>
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    89
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    90
    @Transaction
148
2911fd5b9abe FeedsDao: use suspendable transactions
Da Risk <da_risk@geekorum.com>
parents: 137
diff changeset
    91
    open suspend fun setFeedsAndCategories(feeds: Collection<Feed>, categories: Collection<Category>) {
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    92
        setCategories(categories)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    93
        setFeeds(feeds)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    94
    }
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    95
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
    96
    private suspend fun setFeeds(feeds: Collection<Feed>) {
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    97
        val feedsIds: List<Long> = feeds.map { it.id }
148
2911fd5b9abe FeedsDao: use suspendable transactions
Da Risk <da_risk@geekorum.com>
parents: 137
diff changeset
    98
        val toDelete = getAllFeedsList().filter { it.id !in feedsIds }
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    99
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   100
        deleteFeedsAndArticles(toDelete)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   101
        insertFeeds(feeds)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   102
    }
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   103
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
   104
    private suspend fun setCategories(categories: Collection<Category>) {
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   105
        val categoriesIds: List<Long> = categories.map { category -> category.id }
61
4c99647b9a58 Make Room DAO functions suspendable when possible
Da Risk <da_risk@geekorum.com>
parents: 36
diff changeset
   106
        val toDelete = getAllCategoriesList().filter { it.id !in categoriesIds }
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   107
        deleteCategories(toDelete)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   108
        insertCategories(categories)
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   109
    }
445
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   110
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   111
    @Query("UPDATE feeds SET unread_count=:unreadCount WHERE _id=:id")
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   112
    abstract suspend fun updateFeedUnreadCount(id: Long, unreadCount: Int)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   113
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   114
    @Query("UPDATE categories SET unread_count=:unreadCount WHERE _id=:id")
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   115
    abstract suspend fun updateCategoryUnreadCount(id: Long, unreadCount: Int)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   116
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   117
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   118
    @Transaction
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   119
    open suspend fun updateFeedsAndCategoriesUnreadCount(
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   120
        feeds: Collection<Feed>, categories: Collection<Category>
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   121
    ) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   122
        internalUpdateCategoriesUnreadCount(categories)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   123
        internalUpdateFeedsUnreadCount(feeds)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   124
    }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   125
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   126
    private suspend fun internalUpdateFeedsUnreadCount(feeds: Collection<Feed>) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   127
        val feedsIds: List<Long> = feeds.map { it.id }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   128
        val currentFeeds = getAllFeedsList()
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   129
        val currentFeedsIds = currentFeeds.map { it.id }
585
a0a0afe6b6ea FeedsDao: fix update of feeds unread count
Da Risk <da_risk@geekorum.com>
parents: 445
diff changeset
   130
        val (toDelete, toUpdateDb) = currentFeeds.partition { it.id !in feedsIds }
a0a0afe6b6ea FeedsDao: fix update of feeds unread count
Da Risk <da_risk@geekorum.com>
parents: 445
diff changeset
   131
        val toUpdateDbIds = toUpdateDb.map { it.id }
a0a0afe6b6ea FeedsDao: fix update of feeds unread count
Da Risk <da_risk@geekorum.com>
parents: 445
diff changeset
   132
        val toUpdate = feeds.filter { it.id in toUpdateDbIds }
445
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   133
        val toInsert = feeds.filter {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   134
            it.id !in currentFeedsIds
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   135
        }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   136
        // will be delete on next sync
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   137
        setFeedsUnreadCountTo0(toDelete)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   138
        updateFeedsUnreadCount(toUpdate)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   139
        insertFeeds(toInsert)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   140
    }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   141
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   142
    private suspend fun updateFeedsUnreadCount(feeds: Collection<Feed>) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   143
        feeds.forEach {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   144
            updateFeedUnreadCount(it.id, it.unreadCount)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   145
        }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   146
    }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   147
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   148
    private suspend fun setFeedsUnreadCountTo0(feeds: List<Feed>) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   149
        feeds.forEach {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   150
            updateFeedUnreadCount(it.id, 0)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   151
        }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   152
    }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   153
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   154
    private suspend fun internalUpdateCategoriesUnreadCount(categories: Collection<Category>) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   155
        val categoriesIds: List<Long> = categories.map { it.id }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   156
        val currentCategories = getAllCategoriesList()
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   157
        val currentCategoriesIds = currentCategories.map { it.id }
585
a0a0afe6b6ea FeedsDao: fix update of feeds unread count
Da Risk <da_risk@geekorum.com>
parents: 445
diff changeset
   158
        val (toDelete, toUpdateDb) = currentCategories.partition { it.id !in categoriesIds }
a0a0afe6b6ea FeedsDao: fix update of feeds unread count
Da Risk <da_risk@geekorum.com>
parents: 445
diff changeset
   159
        val toUpdateDbIds = toUpdateDb.map { it.id }
a0a0afe6b6ea FeedsDao: fix update of feeds unread count
Da Risk <da_risk@geekorum.com>
parents: 445
diff changeset
   160
        val toUpdate = categories.filter { it.id in toUpdateDbIds }
445
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   161
        val toInsert = categories.filter {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   162
            it.id !in currentCategoriesIds
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   163
        }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   164
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   165
        // will be delete on next sync
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   166
        setCategoriesUnreadCountTo0(toDelete)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   167
        updateCategoriesUnreadCount(toUpdate)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   168
        insertCategories(toInsert)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   169
    }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   170
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   171
    private suspend fun updateCategoriesUnreadCount(categories: Collection<Category>) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   172
        categories.forEach {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   173
            updateCategoryUnreadCount(it.id, it.unreadCount)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   174
        }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   175
    }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   176
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   177
    private suspend fun setCategoriesUnreadCountTo0(categories: Collection<Category>) {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   178
        categories.forEach {
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   179
            updateCategoryUnreadCount(it.id, 0)
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   180
        }
e7ce32b3c43b FeedsViewModel: only update unreadCount when refreshing feeds
Da Risk <da_risk@geekorum.com>
parents: 148
diff changeset
   181
    }
0
14443efede32 Initial commit
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   182
}