diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibraryLiveData.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibraryLiveData.kt index 661a81776..cbfd976a5 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibraryLiveData.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/LibraryLiveData.kt @@ -13,10 +13,72 @@ fun DataService.libraryLiveData( labels: List ): LiveData> { 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 + ) + } + } + } } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt index b608c4786..4848ccb3f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt @@ -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> + @Query( + "SELECT ${SavedItemQueryConstants.columns} " + + "FROM SavedItem " + + "WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " + + "ORDER BY savedAt DESC" + ) + fun getLibraryLiveData(archiveFilter: Int): LiveData> @Transaction - @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt ASC") - fun getLibraryLiveDataSortedByOldest(): LiveData> + @Query( + "SELECT ${SavedItemQueryConstants.columns} " + + "FROM SavedItem " + + "WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " + + "ORDER BY savedAt ASC" + ) + fun getLibraryLiveDataSortedByOldest(archiveFilter: Int): LiveData> @Transaction - @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY readAt DESC, savedAt DESC") - fun getLibraryLiveDataSortedByRecentlyRead(): LiveData> + @Query( + "SELECT ${SavedItemQueryConstants.columns} " + + "FROM SavedItem " + + "WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " + + "ORDER BY readAt DESC, savedAt DESC" + ) + fun getLibraryLiveDataSortedByRecentlyRead(archiveFilter: Int): LiveData> @Transaction - @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY publishDate DESC") - fun getLibraryLiveDataSortedByRecentlyPublished(): LiveData> + @Query( + "SELECT ${SavedItemQueryConstants.columns} " + + "FROM SavedItem " + + "WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " + + "ORDER BY publishDate DESC" + ) + fun getLibraryLiveDataSortedByRecentlyPublished(archiveFilter: Int): LiveData> } 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 +// ]) +//} +//} +//} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 7d52ebe0d..4ae32dd0e 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -37,7 +37,7 @@ class LibraryViewModel @Inject constructor( // Live Data val searchTextLiveData = MutableLiveData("") val searchItemsLiveData = MutableLiveData>(listOf()) - private var itemsLiveDataInternal = dataService.db.savedItemDao().getLibraryLiveData() + private var itemsLiveDataInternal = dataService.libraryLiveData(SavedItemFilter.INBOX, SavedItemSortFilter.NEWEST, listOf()) val itemsLiveData = MediatorLiveData>() val appliedFilterLiveData = MutableLiveData(SavedItemFilter.INBOX) val appliedSortFilterLiveData = MutableLiveData(SavedItemSortFilter.NEWEST)