Remove shadow types used for CardData from Android types
This commit is contained in:
@ -1,126 +0,0 @@
|
||||
package app.omnivore.omnivore.dataService
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MediatorLiveData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardDataWithLabels
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemLabel
|
||||
import app.omnivore.omnivore.ui.library.SavedItemFilter
|
||||
import app.omnivore.omnivore.ui.library.SavedItemSortFilter
|
||||
|
||||
fun DataService.libraryLiveData(
|
||||
primaryFilter: SavedItemFilter,
|
||||
sortFilter: SavedItemSortFilter,
|
||||
labels: List<SavedItemLabel>
|
||||
): LiveData<List<SavedItemCardDataWithLabels>> {
|
||||
val mediatorLiveData = MediatorLiveData<List<SavedItemCardDataWithLabels>>()
|
||||
val queryParams = LibraryLiveDataQueryParams.make(primaryFilter)
|
||||
|
||||
val libraryLiveData = when (sortFilter) {
|
||||
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
|
||||
)
|
||||
}
|
||||
|
||||
mediatorLiveData.addSource(libraryLiveData) { result ->
|
||||
when (primaryFilter) {
|
||||
SavedItemFilter.INBOX -> {
|
||||
mediatorLiveData.value = result
|
||||
}
|
||||
SavedItemFilter.READ_LATER -> {
|
||||
mediatorLiveData.value = result.filter { item ->
|
||||
!item.labels.any { it.name.lowercase() == "newsletter" }
|
||||
}
|
||||
}
|
||||
SavedItemFilter.NEWSLETTERS -> {
|
||||
mediatorLiveData.value = result.filter { item ->
|
||||
item.labels.any { it.name.lowercase() == "newsletter" }
|
||||
}
|
||||
}
|
||||
SavedItemFilter.RECOMMENDED -> {
|
||||
mediatorLiveData.value = result // TODO: "recommendations.@count > 0"
|
||||
}
|
||||
SavedItemFilter.ALL -> {
|
||||
mediatorLiveData.value = result
|
||||
}
|
||||
SavedItemFilter.ARCHIVED -> {
|
||||
mediatorLiveData.value = result
|
||||
}
|
||||
SavedItemFilter.HAS_HIGHLIGHTS -> {
|
||||
mediatorLiveData.value = result // TODO: "highlights.@count > 0"
|
||||
}
|
||||
SavedItemFilter.FILES -> {
|
||||
mediatorLiveData.value = result.filter { item ->
|
||||
item.cardData.contentReader == "PDF"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (labels.isNotEmpty()) {
|
||||
mediatorLiveData.value = (mediatorLiveData.value ?: listOf()).filter {
|
||||
it.labels.intersect(labels.toSet()).any()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mediatorLiveData
|
||||
}
|
||||
|
||||
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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,12 +1,7 @@
|
||||
package app.omnivore.omnivore.networking
|
||||
|
||||
import app.omnivore.omnivore.graphql.generated.SearchQuery
|
||||
import app.omnivore.omnivore.graphql.generated.TypeaheadSearchQuery
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItem
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemLabel
|
||||
import app.omnivore.omnivore.persistence.entities.TypeaheadCardData
|
||||
import com.apollographql.apollo3.api.Optional
|
||||
|
||||
data class SearchQueryResponse(
|
||||
val cursor: String?,
|
||||
|
||||
@ -2,12 +2,7 @@ package app.omnivore.omnivore.persistence.entities
|
||||
|
||||
import androidx.core.net.toUri
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.room.*
|
||||
import app.omnivore.omnivore.BuildConfig
|
||||
import app.omnivore.omnivore.graphql.generated.SearchQuery
|
||||
import app.omnivore.omnivore.models.ServerSyncStatus
|
||||
import app.omnivore.omnivore.ui.library.SavedItemSortFilter
|
||||
import java.util.*
|
||||
|
||||
@Entity
|
||||
@ -69,30 +64,6 @@ data class SavedItem(
|
||||
}
|
||||
}
|
||||
|
||||
data class SavedItemCardData(
|
||||
val savedItemId: String,
|
||||
val slug: String,
|
||||
val publisherURLString: String?,
|
||||
val title: String,
|
||||
val author: String?,
|
||||
val imageURLString: String?,
|
||||
val isArchived: Boolean,
|
||||
val pageURLString: String,
|
||||
val contentReader: String?,
|
||||
val savedAt: String,
|
||||
val readingProgress: Double,
|
||||
val wordsCount: Int?
|
||||
) {
|
||||
fun publisherDisplayName(): String? {
|
||||
return publisherURLString?.toUri()?.host
|
||||
}
|
||||
|
||||
fun isPDF(): Boolean {
|
||||
val hasPDFSuffix = pageURLString.endsWith("pdf")
|
||||
return contentReader == "PDF" || hasPDFSuffix
|
||||
}
|
||||
}
|
||||
|
||||
data class TypeaheadCardData(
|
||||
val savedItemId: String,
|
||||
val slug: String,
|
||||
@ -126,42 +97,6 @@ interface SavedItemDao {
|
||||
@Update
|
||||
fun update(savedItem: SavedItem)
|
||||
|
||||
@Transaction
|
||||
@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 " +
|
||||
"WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " +
|
||||
"ORDER BY savedAt ASC"
|
||||
)
|
||||
fun getLibraryLiveDataSortedByOldest(archiveFilter: Int): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
|
||||
@Transaction
|
||||
@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 " +
|
||||
"WHERE serverSyncStatus != 2 AND isArchived != :archiveFilter " +
|
||||
"ORDER BY publishDate DESC"
|
||||
)
|
||||
fun getLibraryLiveDataSortedByRecentlyPublished(archiveFilter: Int): LiveData<List<SavedItemCardDataWithLabels>>
|
||||
|
||||
@Transaction
|
||||
@Query(
|
||||
"SELECT ${SavedItemQueryConstants.libraryColumns} " +
|
||||
|
||||
@ -44,25 +44,6 @@ data class SavedItemAndSavedItemLabelCrossRef(
|
||||
val savedItemId: String
|
||||
)
|
||||
|
||||
data class SavedItemWithLabels(
|
||||
@Embedded val savedItem: SavedItem,
|
||||
@Relation(
|
||||
parentColumn = "savedItemId",
|
||||
entityColumn = "savedItemLabelId",
|
||||
associateBy = Junction(SavedItemAndSavedItemLabelCrossRef::class)
|
||||
)
|
||||
val labels: List<SavedItemLabel>
|
||||
)
|
||||
|
||||
data class SavedItemCardDataWithLabels(
|
||||
@Embedded val cardData: SavedItemCardData,
|
||||
@Relation(
|
||||
parentColumn = "savedItemId",
|
||||
entityColumn = "savedItemLabelId",
|
||||
associateBy = Junction(SavedItemAndSavedItemLabelCrossRef::class)
|
||||
)
|
||||
val labels: List<SavedItemLabel>
|
||||
)
|
||||
|
||||
@Dao
|
||||
interface SavedItemAndSavedItemLabelCrossRefDao {
|
||||
|
||||
@ -3,13 +3,11 @@ package app.omnivore.omnivore.ui.library
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.fadeIn
|
||||
import androidx.compose.animation.fadeOut
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.text.KeyboardActions
|
||||
import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.*
|
||||
import androidx.compose.material.icons.outlined.Close
|
||||
import androidx.compose.material.icons.outlined.Delete
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
@ -19,14 +17,10 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.focus.FocusRequester
|
||||
import androidx.compose.ui.focus.focusRequester
|
||||
import androidx.compose.ui.focus.onFocusChanged
|
||||
import androidx.compose.ui.res.colorResource
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.navigation.NavHostController
|
||||
import app.omnivore.omnivore.R
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardDataWithLabels
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemWithLabelsAndHighlights
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
|
||||
@ -33,8 +33,6 @@ import androidx.compose.ui.unit.dp
|
||||
import androidx.navigation.NavHostController
|
||||
import app.omnivore.omnivore.R
|
||||
import app.omnivore.omnivore.Routes
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardDataWithLabels
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemWithLabelsAndHighlights
|
||||
import app.omnivore.omnivore.ui.components.LabelsSelectionSheet
|
||||
import app.omnivore.omnivore.ui.savedItemViews.SavedItemCard
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package app.omnivore.omnivore.ui.library
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemWithLabelsAndHighlights
|
||||
|
||||
interface SavedItemViewModel {
|
||||
|
||||
@ -22,8 +22,6 @@ import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.navigation.NavHostController
|
||||
import app.omnivore.omnivore.R
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardDataWithLabels
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemWithLabelsAndHighlights
|
||||
import app.omnivore.omnivore.ui.reader.WebReaderLoadingContainerActivity
|
||||
import app.omnivore.omnivore.persistence.entities.TypeaheadCardData
|
||||
|
||||
@ -21,8 +21,6 @@ import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.*
|
||||
import app.omnivore.omnivore.R
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemLabel
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemWithLabelsAndHighlights
|
||||
import app.omnivore.omnivore.ui.components.LabelChipColors
|
||||
import app.omnivore.omnivore.ui.library.LibraryViewModel
|
||||
|
||||
@ -17,8 +17,6 @@ import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.*
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemCardData
|
||||
import app.omnivore.omnivore.persistence.entities.SavedItemLabel
|
||||
import app.omnivore.omnivore.persistence.entities.TypeaheadCardData
|
||||
import app.omnivore.omnivore.ui.components.LabelChipColors
|
||||
import app.omnivore.omnivore.ui.library.SavedItemAction
|
||||
|
||||
Reference in New Issue
Block a user