use MediatorLiveData to update library live data when sort filter changes

This commit is contained in:
Satindar Dhillon 2023-02-18 10:11:06 -08:00
parent 0212c31d66
commit 88bf3a1a8d
2 changed files with 37 additions and 7 deletions

View file

@ -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<List<SavedItemCardData>>
@Query("SELECT * FROM savedItem")
fun getAll(): List<SavedItem>
@ -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<List<SavedItemCardDataWithLabels>>
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt DESC")
fun getLibraryLiveData(): LiveData<List<SavedItemCardDataWithLabels>>
@Transaction
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY savedAt ASC")
fun getLibraryLiveDataSortedByOldest(): LiveData<List<SavedItemCardDataWithLabels>>
@Transaction
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY readAt DESC, savedAt DESC")
fun getLibraryLiveDataSortedByRecentlyRead(): LiveData<List<SavedItemCardDataWithLabels>>
@Transaction
@Query("SELECT ${SavedItemQueryConstants.columns} FROM SavedItem ORDER BY publishDate DESC")
fun getLibraryLiveDataSortedByRecentlyPublished(): LiveData<List<SavedItemCardDataWithLabels>>
}
object SavedItemQueryConstants {
const val columns = "savedItemId, slug, publisherURLString, title, author, imageURLString, isArchived, pageURLString, contentReader "
}

View file

@ -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<List<SavedItemCardDataWithLabels>>(listOf())
val itemsLiveData = dataService.db.savedItemDao().getLibraryLiveDataWithLabels()
private var itemsLiveDataInternal = dataService.db.savedItemDao().getLibraryLiveData()
val itemsLiveData = MediatorLiveData<List<SavedItemCardDataWithLabels>>()
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)
}
}