Rework main query filters
This commit is contained in:
parent
c31a0cde20
commit
e6c880a79f
@ -18,8 +18,8 @@ import com.readrops.app.R
|
||||
import com.readrops.app.util.theme.LargeSpacer
|
||||
import com.readrops.app.util.theme.ShortSpacer
|
||||
import com.readrops.app.util.theme.spacing
|
||||
import com.readrops.db.filters.ListSortType
|
||||
import com.readrops.db.queries.QueryFilters
|
||||
import com.readrops.db.filters.OrderType
|
||||
import com.readrops.db.filters.QueryFilters
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@ -68,7 +68,7 @@ fun FilterBottomSheet(
|
||||
.clickable(onClick = onSetSortTypeState)
|
||||
) {
|
||||
Checkbox(
|
||||
checked = filters.sortType == ListSortType.OLDEST_TO_NEWEST,
|
||||
checked = filters.orderType == OrderType.ASC,
|
||||
onCheckedChange = { onSetSortTypeState() }
|
||||
)
|
||||
|
||||
|
@ -20,12 +20,12 @@ import com.readrops.db.Database
|
||||
import com.readrops.db.entities.Feed
|
||||
import com.readrops.db.entities.Folder
|
||||
import com.readrops.db.entities.Item
|
||||
import com.readrops.db.filters.ListSortType
|
||||
import com.readrops.db.filters.MainFilter
|
||||
import com.readrops.db.filters.OrderType
|
||||
import com.readrops.db.filters.QueryFilters
|
||||
import com.readrops.db.filters.SubFilter
|
||||
import com.readrops.db.pojo.ItemWithFeed
|
||||
import com.readrops.db.queries.ItemsQueryBuilder
|
||||
import com.readrops.db.queries.QueryFilters
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
@ -161,8 +161,8 @@ class TimelineScreenModel(
|
||||
screenModelScope.launch(dispatcher) {
|
||||
val filterPair = with(filters.value) {
|
||||
when (subFilter) {
|
||||
SubFilter.FEED -> SyncWorker.FEED_ID_KEY to filterFeedId
|
||||
SubFilter.FOLDER -> SyncWorker.FOLDER_ID_KEY to filterFolderId
|
||||
SubFilter.FEED -> SyncWorker.FEED_ID_KEY to feedId
|
||||
SubFilter.FOLDER -> SyncWorker.FOLDER_ID_KEY to folderId
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
@ -247,8 +247,8 @@ class TimelineScreenModel(
|
||||
it.filters.copy(
|
||||
mainFilter = selection,
|
||||
subFilter = SubFilter.ALL,
|
||||
filterFeedId = 0,
|
||||
filterFolderId = 0
|
||||
feedId = 0,
|
||||
folderId = 0
|
||||
)
|
||||
},
|
||||
isDrawerOpen = false
|
||||
@ -262,8 +262,8 @@ class TimelineScreenModel(
|
||||
filters = updateFilters {
|
||||
it.filters.copy(
|
||||
subFilter = SubFilter.FOLDER,
|
||||
filterFolderId = folder.id,
|
||||
filterFeedId = 0
|
||||
folderId = folder.id,
|
||||
feedId = 0
|
||||
)
|
||||
},
|
||||
filterFolderName = folder.name!!,
|
||||
@ -278,8 +278,8 @@ class TimelineScreenModel(
|
||||
filters = updateFilters {
|
||||
it.filters.copy(
|
||||
subFilter = SubFilter.FEED,
|
||||
filterFeedId = feed.id,
|
||||
filterFolderId = 0
|
||||
feedId = feed.id,
|
||||
folderId = 0
|
||||
)
|
||||
},
|
||||
filterFeedName = feed.name!!,
|
||||
@ -336,11 +336,11 @@ class TimelineScreenModel(
|
||||
when (_timelineState.value.filters.subFilter) {
|
||||
SubFilter.FEED ->
|
||||
repository?.setAllItemsReadByFeed(
|
||||
feedId = _timelineState.value.filters.filterFeedId
|
||||
feedId = _timelineState.value.filters.feedId
|
||||
)
|
||||
|
||||
SubFilter.FOLDER -> repository?.setAllItemsReadByFolder(
|
||||
folderId = _timelineState.value.filters.filterFolderId
|
||||
folderId = _timelineState.value.filters.folderId
|
||||
)
|
||||
|
||||
else -> when (_timelineState.value.filters.mainFilter) {
|
||||
@ -374,12 +374,12 @@ class TimelineScreenModel(
|
||||
}
|
||||
}
|
||||
|
||||
fun setSortTypeState(sortType: ListSortType) {
|
||||
fun setOrderTypeState(orderType: OrderType) {
|
||||
_timelineState.update {
|
||||
it.copy(
|
||||
filters = updateFilters {
|
||||
it.filters.copy(
|
||||
sortType = sortType
|
||||
orderType = orderType
|
||||
)
|
||||
}
|
||||
)
|
||||
|
@ -67,8 +67,8 @@ import com.readrops.app.util.components.Placeholder
|
||||
import com.readrops.app.util.components.RefreshScreen
|
||||
import com.readrops.app.util.components.dialog.TwoChoicesDialog
|
||||
import com.readrops.app.util.theme.spacing
|
||||
import com.readrops.db.filters.ListSortType
|
||||
import com.readrops.db.filters.MainFilter
|
||||
import com.readrops.db.filters.OrderType
|
||||
import com.readrops.db.filters.SubFilter
|
||||
import com.readrops.db.pojo.ItemWithFeed
|
||||
import kotlinx.coroutines.flow.filter
|
||||
@ -212,11 +212,12 @@ object TimelineTab : Tab {
|
||||
screenModel.setShowReadItemsState(!state.filters.showReadItems)
|
||||
},
|
||||
onSetSortTypeState = {
|
||||
screenModel.setSortTypeState(
|
||||
if (state.filters.sortType == ListSortType.NEWEST_TO_OLDEST)
|
||||
ListSortType.OLDEST_TO_NEWEST
|
||||
else
|
||||
ListSortType.NEWEST_TO_OLDEST
|
||||
screenModel.setOrderTypeState(
|
||||
if (state.filters.orderType == OrderType.DESC) {
|
||||
OrderType.ASC
|
||||
} else {
|
||||
OrderType.DESC
|
||||
}
|
||||
)
|
||||
},
|
||||
onDismiss = { screenModel.closeDialog() }
|
||||
|
@ -78,10 +78,10 @@ fun TimelineDrawer(
|
||||
badge = {
|
||||
Text(folderEntry.value.sumOf { it.unreadCount }.toString())
|
||||
},
|
||||
selected = state.filters.filterFolderId == folder.id,
|
||||
selected = state.filters.folderId == folder.id,
|
||||
onClick = { onFolderClick(folder) },
|
||||
feeds = folderEntry.value,
|
||||
selectedFeed = state.filters.filterFeedId,
|
||||
selectedFeed = state.filters.feedId,
|
||||
onFeedClick = { onFeedClick(it) },
|
||||
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding)
|
||||
)
|
||||
@ -104,7 +104,7 @@ fun TimelineDrawer(
|
||||
)
|
||||
},
|
||||
badge = { Text(feed.unreadCount.toString()) },
|
||||
selected = feed.id == state.filters.filterFeedId,
|
||||
selected = feed.id == state.filters.feedId,
|
||||
onClick = { onFeedClick(feed) },
|
||||
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding)
|
||||
)
|
||||
|
@ -4,11 +4,11 @@ import android.content.Context
|
||||
import androidx.room.Room
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.readrops.db.filters.ListSortType
|
||||
import com.readrops.db.filters.OrderType
|
||||
import com.readrops.db.filters.MainFilter
|
||||
import com.readrops.db.filters.SubFilter
|
||||
import com.readrops.db.queries.ItemsQueryBuilder
|
||||
import com.readrops.db.queries.QueryFilters
|
||||
import com.readrops.db.filters.QueryFilters
|
||||
import junit.framework.TestCase.assertFalse
|
||||
import junit.framework.TestCase.assertTrue
|
||||
import org.junit.After
|
||||
@ -52,7 +52,7 @@ class ItemsQueryBuilderTest {
|
||||
@Test
|
||||
fun feedFilterCaseTest() {
|
||||
val queryFilters = QueryFilters(accountId = 1, subFilter = SubFilter.FEED,
|
||||
filterFeedId = 15)
|
||||
feedId = 15)
|
||||
|
||||
val query = ItemsQueryBuilder.buildItemsQuery(queryFilters)
|
||||
database.query(query)
|
||||
@ -72,17 +72,17 @@ class ItemsQueryBuilderTest {
|
||||
|
||||
@Test
|
||||
fun folderFilterCaseTest() {
|
||||
val queryFilters = QueryFilters(accountId = 1, subFilter = SubFilter.FOLDER, filterFolderId = 1)
|
||||
val queryFilters = QueryFilters(accountId = 1, subFilter = SubFilter.FOLDER, folderId = 1)
|
||||
|
||||
val query = ItemsQueryBuilder.buildItemsQuery(queryFilters)
|
||||
database.query(query)
|
||||
|
||||
assertTrue(query.sql.contains("folder_id = ${queryFilters.filterFolderId}"))
|
||||
assertTrue(query.sql.contains("folder_id = ${queryFilters.folderId}"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun oldestSortCaseTest() {
|
||||
val queryFilters = QueryFilters(accountId = 1, sortType = ListSortType.OLDEST_TO_NEWEST,
|
||||
val queryFilters = QueryFilters(accountId = 1, orderType = OrderType.ASC,
|
||||
showReadItems = false)
|
||||
|
||||
val query = ItemsQueryBuilder.buildItemsQuery(queryFilters)
|
||||
|
@ -10,4 +10,19 @@ enum class SubFilter {
|
||||
FEED,
|
||||
FOLDER,
|
||||
ALL
|
||||
}
|
||||
}
|
||||
|
||||
enum class OrderType {
|
||||
DESC,
|
||||
ASC
|
||||
}
|
||||
|
||||
data class QueryFilters(
|
||||
val showReadItems: Boolean = true,
|
||||
val feedId: Int = 0,
|
||||
val folderId: Int = 0,
|
||||
val accountId: Int = 0,
|
||||
val mainFilter: MainFilter = MainFilter.ALL,
|
||||
val subFilter: SubFilter = SubFilter.ALL,
|
||||
val orderType: OrderType = OrderType.DESC,
|
||||
)
|
@ -1,6 +0,0 @@
|
||||
package com.readrops.db.filters
|
||||
|
||||
enum class ListSortType {
|
||||
NEWEST_TO_OLDEST,
|
||||
OLDEST_TO_NEWEST
|
||||
}
|
@ -2,8 +2,9 @@ package com.readrops.db.queries
|
||||
|
||||
import androidx.sqlite.db.SupportSQLiteQuery
|
||||
import androidx.sqlite.db.SupportSQLiteQueryBuilder
|
||||
import com.readrops.db.filters.ListSortType
|
||||
import com.readrops.db.filters.MainFilter
|
||||
import com.readrops.db.filters.OrderType
|
||||
import com.readrops.db.filters.QueryFilters
|
||||
import com.readrops.db.filters.SubFilter
|
||||
|
||||
object ItemsQueryBuilder {
|
||||
@ -39,9 +40,9 @@ object ItemsQueryBuilder {
|
||||
private const val SEPARATE_STATE_JOIN =
|
||||
"LEFT JOIN ItemState On Item.remote_id = ItemState.remote_id"
|
||||
|
||||
private const val ORDER_BY_ASC = "pub_date DESC"
|
||||
private const val ORDER_BY_DESC = "pub_date DESC"
|
||||
|
||||
private const val ORDER_BY_DESC = "pub_date ASC"
|
||||
private const val ORDER_BY_ASC = "pub_date ASC"
|
||||
|
||||
fun buildItemsQuery(queryFilters: QueryFilters, separateState: Boolean): SupportSQLiteQuery =
|
||||
buildQuery(queryFilters, separateState)
|
||||
@ -54,7 +55,7 @@ object ItemsQueryBuilder {
|
||||
if (accountId == 0)
|
||||
throw IllegalArgumentException("AccountId must be greater than 0")
|
||||
|
||||
if (queryFilters.subFilter == SubFilter.FEED && filterFeedId == 0)
|
||||
if (queryFilters.subFilter == SubFilter.FEED && feedId == 0)
|
||||
throw IllegalArgumentException("FeedId must be greater than 0 if current filter is FEED_FILTER")
|
||||
|
||||
val columns = if (separateState)
|
||||
@ -68,7 +69,7 @@ object ItemsQueryBuilder {
|
||||
SupportSQLiteQueryBuilder.builder(selectAllJoin).run {
|
||||
columns(columns)
|
||||
selection(buildWhereClause(this@with, separateState), null)
|
||||
orderBy(if (sortType == ListSortType.NEWEST_TO_OLDEST) ORDER_BY_ASC else ORDER_BY_DESC)
|
||||
orderBy(if (orderType == OrderType.DESC) this@ItemsQueryBuilder.ORDER_BY_DESC else this@ItemsQueryBuilder.ORDER_BY_ASC)
|
||||
|
||||
create()
|
||||
}
|
||||
@ -99,8 +100,8 @@ object ItemsQueryBuilder {
|
||||
}
|
||||
|
||||
when (queryFilters.subFilter) {
|
||||
SubFilter.FEED -> append("And feed_id = ${queryFilters.filterFeedId} ")
|
||||
SubFilter.FOLDER -> append("And folder_id = ${queryFilters.filterFolderId} ")
|
||||
SubFilter.FEED -> append("And feed_id = ${queryFilters.feedId} ")
|
||||
SubFilter.FOLDER -> append("And folder_id = ${queryFilters.folderId} ")
|
||||
else -> {}
|
||||
}
|
||||
|
||||
@ -109,12 +110,3 @@ object ItemsQueryBuilder {
|
||||
|
||||
}
|
||||
|
||||
data class QueryFilters(
|
||||
val showReadItems: Boolean = true,
|
||||
val filterFeedId: Int = 0,
|
||||
val filterFolderId: Int = 0,
|
||||
val accountId: Int = 0,
|
||||
val mainFilter: MainFilter = MainFilter.ALL,
|
||||
val subFilter: SubFilter = SubFilter.ALL,
|
||||
val sortType: ListSortType = ListSortType.NEWEST_TO_OLDEST,
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user