Rework main query filters

This commit is contained in:
Shinokuni 2024-09-02 16:36:21 +02:00
parent c31a0cde20
commit e6c880a79f
8 changed files with 57 additions and 55 deletions

View File

@ -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() }
)

View File

@ -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
)
}
)

View File

@ -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() }

View File

@ -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)
)

View File

@ -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)

View File

@ -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,
)

View File

@ -1,6 +0,0 @@
package com.readrops.db.filters
enum class ListSortType {
NEWEST_TO_OLDEST,
OLDEST_TO_NEWEST
}

View File

@ -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,
)