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 506534964..b608c4786 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 @@ -3,6 +3,8 @@ package app.omnivore.omnivore.persistence.entities import androidx.core.net.toUri import androidx.lifecycle.LiveData import androidx.room.* +import app.omnivore.omnivore.BuildConfig +import app.omnivore.omnivore.ui.library.SavedItemSortFilter import java.util.* @Entity @@ -86,9 +88,6 @@ data class SavedItemCardData( @Dao interface SavedItemDao { - @Query("SELECT savedItemId, slug, publisherURLString, title, author, imageURLString, isArchived, pageURLString, contentReader FROM SavedItem ORDER BY savedAt DESC") - fun getLibraryLiveData(): LiveData> - @Query("SELECT * FROM savedItem") fun getAll(): List @@ -114,6 +113,23 @@ interface SavedItemDao { fun update(savedItem: SavedItem) @Transaction - @Query("SELECT savedItemId, slug, publisherURLString, title, author, imageURLString, isArchived, pageURLString, contentReader FROM SavedItem ORDER BY savedAt DESC") - fun getLibraryLiveDataWithLabels(): LiveData> + @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt DESC") + fun getLibraryLiveData(): LiveData> + + @Transaction + @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt ASC") + fun getLibraryLiveDataSortedByOldest(): LiveData> + + @Transaction + @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY readAt DESC, savedAt DESC") + fun getLibraryLiveDataSortedByRecentlyRead(): LiveData> + + @Transaction + @Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY publishDate DESC") + fun getLibraryLiveDataSortedByRecentlyPublished(): LiveData> +} + + +object SavedItemQueryConstants { + const val columns = "savedItemId, slug, publisherURLString, title, author, imageURLString, isArchived, pageURLString, contentReader " } 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 9c16abf9b..9ee6188fa 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 @@ -5,6 +5,8 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -35,7 +37,8 @@ class LibraryViewModel @Inject constructor( // Live Data val searchTextLiveData = MutableLiveData("") val searchItemsLiveData = MutableLiveData>(listOf()) - val itemsLiveData = dataService.db.savedItemDao().getLibraryLiveDataWithLabels() + private var itemsLiveDataInternal = dataService.db.savedItemDao().getLibraryLiveData() + val itemsLiveData = MediatorLiveData>() val appliedFilterLiveData = MutableLiveData(SavedItemFilter.INBOX) val appliedSortFilterLiveData = MutableLiveData(SavedItemSortFilter.NEWEST) @@ -66,6 +69,10 @@ class LibraryViewModel @Inject constructor( } } } + + viewModelScope.launch { + handleFilterChanges() + } } fun updateSearchText(text: String) { @@ -125,7 +132,14 @@ class LibraryViewModel @Inject constructor( if (searchTextLiveData.value != "") { performSearch(true) } else { - // TODO: implement + itemsLiveData.removeSource(itemsLiveDataInternal) + itemsLiveDataInternal = when (appliedSortFilterLiveData.value ?: SavedItemSortFilter.NEWEST) { + SavedItemSortFilter.NEWEST -> dataService.db.savedItemDao().getLibraryLiveData() + SavedItemSortFilter.OLDEST -> dataService.db.savedItemDao().getLibraryLiveDataSortedByOldest() + SavedItemSortFilter.RECENTLY_READ -> dataService.db.savedItemDao().getLibraryLiveDataSortedByRecentlyRead() + SavedItemSortFilter.RECENTLY_PUBLISHED -> dataService.db.savedItemDao().getLibraryLiveDataSortedByRecentlyPublished() + } + itemsLiveData.addSource(itemsLiveDataInternal, itemsLiveData::setValue) } }