mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
add filter to match archive status
This commit is contained in:
parent
cfdf3150eb
commit
4694dd16f1
3 changed files with 162 additions and 13 deletions
|
|
@ -13,10 +13,72 @@ fun DataService.libraryLiveData(
|
|||
labels: List<SavedItemLabel>
|
||||
): LiveData<List<SavedItemCardDataWithLabels>> {
|
||||
Log.d("lld", "primaryFilter: $primaryFilter, labels: $labels")
|
||||
|
||||
val queryParams = LibraryLiveDataQueryParams.make(primaryFilter)
|
||||
|
||||
return when (sortFilter) {
|
||||
SavedItemSortFilter.NEWEST -> db.savedItemDao().getLibraryLiveData()
|
||||
SavedItemSortFilter.OLDEST -> db.savedItemDao().getLibraryLiveDataSortedByOldest()
|
||||
SavedItemSortFilter.RECENTLY_READ -> db.savedItemDao().getLibraryLiveDataSortedByRecentlyRead()
|
||||
SavedItemSortFilter.RECENTLY_PUBLISHED -> db.savedItemDao().getLibraryLiveDataSortedByRecentlyPublished()
|
||||
SavedItemSortFilter.NEWEST -> db.savedItemDao().getLibraryLiveData(
|
||||
archiveFilter = queryParams.archiveFilter
|
||||
)
|
||||
SavedItemSortFilter.OLDEST -> db.savedItemDao().getLibraryLiveDataSortedByOldest(
|
||||
archiveFilter = queryParams.archiveFilter
|
||||
)
|
||||
SavedItemSortFilter.RECENTLY_READ -> db.savedItemDao().getLibraryLiveDataSortedByRecentlyRead(
|
||||
archiveFilter = queryParams.archiveFilter
|
||||
)
|
||||
SavedItemSortFilter.RECENTLY_PUBLISHED -> db.savedItemDao().getLibraryLiveDataSortedByRecentlyPublished(
|
||||
archiveFilter = queryParams.archiveFilter
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private data class LibraryLiveDataQueryParams(
|
||||
val archiveFilter: Int
|
||||
) {
|
||||
companion object {
|
||||
fun make(savedItemFilter: SavedItemFilter): LibraryLiveDataQueryParams {
|
||||
return when (savedItemFilter) {
|
||||
SavedItemFilter.INBOX -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 1, // Filter out items marked as archive
|
||||
)
|
||||
}
|
||||
SavedItemFilter.READ_LATER -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 1, // Filter out items marked as archive
|
||||
)
|
||||
}
|
||||
SavedItemFilter.NEWSLETTERS -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 1, // Filter out items marked as archive
|
||||
)
|
||||
}
|
||||
SavedItemFilter.RECOMMENDED -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 1, // Filter out items marked as archive
|
||||
)
|
||||
}
|
||||
SavedItemFilter.ALL -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 2, // Don't filter anything out (2 will not match anything)
|
||||
)
|
||||
}
|
||||
SavedItemFilter.ARCHIVED -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 0, // Filter out items not marked as archived
|
||||
)
|
||||
}
|
||||
SavedItemFilter.HAS_HIGHLIGHTS -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 1, // Filter out items marked as archive
|
||||
)
|
||||
}
|
||||
SavedItemFilter.FILES -> {
|
||||
LibraryLiveDataQueryParams(
|
||||
archiveFilter = 1, // Filter out items marked as archive
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import androidx.core.net.toUri
|
|||
import androidx.lifecycle.LiveData
|
||||
import androidx.room.*
|
||||
import app.omnivore.omnivore.BuildConfig
|
||||
import app.omnivore.omnivore.models.ServerSyncStatus
|
||||
import app.omnivore.omnivore.ui.library.SavedItemSortFilter
|
||||
import java.util.*
|
||||
|
||||
|
|
@ -113,23 +114,109 @@ interface SavedItemDao {
|
|||
fun update(savedItem: SavedItem)
|
||||
|
||||
@Transaction
|
||||
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt DESC")
|
||||
fun getLibraryLiveData(): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
@Query(
|
||||
"SELECT ${SavedItemQueryConstants.columns} " +
|
||||
"FROM SavedItem " +
|
||||
"WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " +
|
||||
"ORDER BY savedAt DESC"
|
||||
)
|
||||
fun getLibraryLiveData(archiveFilter: Int): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
|
||||
@Transaction
|
||||
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt ASC")
|
||||
fun getLibraryLiveDataSortedByOldest(): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
@Query(
|
||||
"SELECT ${SavedItemQueryConstants.columns} " +
|
||||
"FROM SavedItem " +
|
||||
"WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " +
|
||||
"ORDER BY savedAt ASC"
|
||||
)
|
||||
fun getLibraryLiveDataSortedByOldest(archiveFilter: Int): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
|
||||
@Transaction
|
||||
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY readAt DESC, savedAt DESC")
|
||||
fun getLibraryLiveDataSortedByRecentlyRead(): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
@Query(
|
||||
"SELECT ${SavedItemQueryConstants.columns} " +
|
||||
"FROM SavedItem " +
|
||||
"WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " +
|
||||
"ORDER BY readAt DESC, savedAt DESC"
|
||||
)
|
||||
fun getLibraryLiveDataSortedByRecentlyRead(archiveFilter: Int): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
|
||||
@Transaction
|
||||
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY publishDate DESC")
|
||||
fun getLibraryLiveDataSortedByRecentlyPublished(): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
@Query(
|
||||
"SELECT ${SavedItemQueryConstants.columns} " +
|
||||
"FROM SavedItem " +
|
||||
"WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " +
|
||||
"ORDER BY publishDate DESC"
|
||||
)
|
||||
fun getLibraryLiveDataSortedByRecentlyPublished(archiveFilter: Int): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
}
|
||||
|
||||
|
||||
object SavedItemQueryConstants {
|
||||
const val columns = "savedItemId, slug, publisherURLString, title, author, imageURLString, isArchived, pageURLString, contentReader "
|
||||
}
|
||||
|
||||
// Archive Status:
|
||||
|
||||
//INBOX("Inbox", rawValue = "inbox", "in:inbox"),
|
||||
//READ_LATER("Read Later", "readlater", "in:inbox -label:Newsletter"),
|
||||
//NEWSLETTERS("Newsletters", "newsletters", "in:inbox label:Newsletter"),
|
||||
//RECOMMENDED("Recommended", "recommended", "recommendedBy:*"),
|
||||
//ALL("All", "all", "in:all"),
|
||||
//ARCHIVED("Archived", "archived", "in:archive"),
|
||||
//HAS_HIGHLIGHTS("Highlighted", "hasHighlights", "has:highlights"),
|
||||
//FILES("Files", "files", "type:file"),
|
||||
|
||||
|
||||
//let notInArchivePredicate = NSPredicate(
|
||||
//format: "%K == %@", #keyPath(LinkedItem.isArchived), Int(truncating: false) as NSNumber
|
||||
//)
|
||||
|
||||
//switch self {
|
||||
// case .inbox:
|
||||
// // non-archived items
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, notInArchivePredicate])
|
||||
|
||||
// case .readlater:
|
||||
// // non-archived or deleted items without the Newsletter label
|
||||
// let nonNewsletterLabelPredicate = NSPredicate(
|
||||
// format: "NOT SUBQUERY(labels, $label, $label.name == \"Newsletter\") .@count > 0"
|
||||
// )
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [
|
||||
// undeletedPredicate, notInArchivePredicate, nonNewsletterLabelPredicate
|
||||
// ])
|
||||
// case .newsletters:
|
||||
// // non-archived or deleted items with the Newsletter label
|
||||
// let newsletterLabelPredicate = NSPredicate(
|
||||
// format: "SUBQUERY(labels, $label, $label.name == \"Newsletter\").@count > 0"
|
||||
// )
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [notInArchivePredicate, newsletterLabelPredicate])
|
||||
// case .recommended:
|
||||
// // non-archived or deleted items with the Newsletter label
|
||||
// let recommendedPredicate = NSPredicate(
|
||||
// format: "recommendations.@count > 0"
|
||||
// )
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [notInArchivePredicate, recommendedPredicate])
|
||||
// case .all:
|
||||
// // include everything undeleted
|
||||
// return undeletedPredicate
|
||||
// case .archived:
|
||||
// let inArchivePredicate = NSPredicate(
|
||||
// format: "%K == %@", #keyPath(LinkedItem.isArchived), Int(truncating: true) as NSNumber
|
||||
// )
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, inArchivePredicate])
|
||||
// case .files:
|
||||
// // include pdf only
|
||||
// let isPDFPredicate = NSPredicate(
|
||||
// format: "%K == %@", #keyPath(LinkedItem.contentReader), "PDF"
|
||||
// )
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, isPDFPredicate])
|
||||
// case .hasHighlights:
|
||||
// let hasHighlightsPredicate = NSPredicate(
|
||||
// format: "highlights.@count > 0"
|
||||
// )
|
||||
// return NSCompoundPredicate(andPredicateWithSubpredicates: [
|
||||
// hasHighlightsPredicate
|
||||
// ])
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ class LibraryViewModel @Inject constructor(
|
|||
// Live Data
|
||||
val searchTextLiveData = MutableLiveData("")
|
||||
val searchItemsLiveData = MutableLiveData<List<SavedItemCardDataWithLabels>>(listOf())
|
||||
private var itemsLiveDataInternal = dataService.db.savedItemDao().getLibraryLiveData()
|
||||
private var itemsLiveDataInternal = dataService.libraryLiveData(SavedItemFilter.INBOX, SavedItemSortFilter.NEWEST, listOf())
|
||||
val itemsLiveData = MediatorLiveData<List<SavedItemCardDataWithLabels>>()
|
||||
val appliedFilterLiveData = MutableLiveData(SavedItemFilter.INBOX)
|
||||
val appliedSortFilterLiveData = MutableLiveData(SavedItemSortFilter.NEWEST)
|
||||
|
|
|
|||
Loading…
Reference in a new issue