add filter to match archive status

This commit is contained in:
Satindar Dhillon 2023-02-18 16:11:01 -08:00
parent cfdf3150eb
commit 4694dd16f1
3 changed files with 162 additions and 13 deletions

View file

@ -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
)
}
}
}
}
}

View file

@ -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
// ])
//}
//}
//}

View file

@ -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)