Refactor quick filter implementation
parent
d00822a6c3
commit
8b71f99666
@ -0,0 +1,25 @@
|
|||||||
|
package org.koitharu.kotatsu.history.domain
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
|
import org.koitharu.kotatsu.history.data.HistoryRepository
|
||||||
|
import org.koitharu.kotatsu.list.domain.ListFilterOption
|
||||||
|
import org.koitharu.kotatsu.list.domain.MangaListQuickFilter
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class HistoryListQuickFilter @Inject constructor(
|
||||||
|
private val settings: AppSettings,
|
||||||
|
private val repository: HistoryRepository,
|
||||||
|
) : MangaListQuickFilter() {
|
||||||
|
|
||||||
|
override suspend fun getAvailableFilterOptions(): List<ListFilterOption> = buildList {
|
||||||
|
add(ListFilterOption.Downloaded)
|
||||||
|
if (settings.isTrackerEnabled) {
|
||||||
|
add(ListFilterOption.Macro.NEW_CHAPTERS)
|
||||||
|
}
|
||||||
|
add(ListFilterOption.Macro.COMPLETED)
|
||||||
|
add(ListFilterOption.Macro.FAVORITE)
|
||||||
|
repository.getPopularTags(3).mapTo(this) {
|
||||||
|
ListFilterOption.Tag(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
package org.koitharu.kotatsu.list.domain
|
||||||
|
|
||||||
|
import androidx.collection.ArraySet
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import org.koitharu.kotatsu.core.ui.widgets.ChipsView
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.QuickFilter
|
||||||
|
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
||||||
|
|
||||||
|
abstract class MangaListQuickFilter : QuickFilterListener {
|
||||||
|
|
||||||
|
private val appliedFilter = MutableStateFlow<Set<ListFilterOption>>(emptySet())
|
||||||
|
private val availableFilterOptions = SuspendLazy {
|
||||||
|
getAvailableFilterOptions()
|
||||||
|
}
|
||||||
|
|
||||||
|
val appliedOptions
|
||||||
|
get() = appliedFilter.asStateFlow()
|
||||||
|
|
||||||
|
override fun toggleFilterOption(option: ListFilterOption) {
|
||||||
|
appliedFilter.value = ArraySet(appliedFilter.value).also {
|
||||||
|
if (option in it) {
|
||||||
|
it.remove(option)
|
||||||
|
} else {
|
||||||
|
it.add(option)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clearFilter() {
|
||||||
|
appliedFilter.value = emptySet()
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun filterItem(
|
||||||
|
selectedOptions: Set<ListFilterOption>,
|
||||||
|
) = QuickFilter(
|
||||||
|
items = availableFilterOptions.tryGet().getOrNull()?.map { option ->
|
||||||
|
ChipsView.ChipModel(
|
||||||
|
title = option.titleText,
|
||||||
|
titleResId = option.titleResId,
|
||||||
|
icon = option.iconResId,
|
||||||
|
isCheckable = true,
|
||||||
|
isChecked = option in selectedOptions,
|
||||||
|
data = option,
|
||||||
|
)
|
||||||
|
}.orEmpty(),
|
||||||
|
)
|
||||||
|
|
||||||
|
protected abstract suspend fun getAvailableFilterOptions(): List<ListFilterOption>
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package org.koitharu.kotatsu.list.domain
|
||||||
|
|
||||||
|
interface QuickFilterListener {
|
||||||
|
|
||||||
|
fun toggleFilterOption(option: ListFilterOption)
|
||||||
|
|
||||||
|
fun clearFilter()
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:pathData="M21.41 11.58L12.41 2.58A2 2 0 0 0 11 2H4A2 2 0 0 0 2 4V11A2 2 0 0 0 2.59 12.42L11.59 21.42A2 2 0 0 0 13 22A2 2 0 0 0 14.41 21.41L21.41 14.41A2 2 0 0 0 22 13A2 2 0 0 0 21.41 11.58M13 20L4 11V4H11L20 13M6.5 5A1.5 1.5 0 1 1 5 6.5A1.5 1.5 0 0 1 6.5 5Z" />
|
||||||
|
</vector>
|
||||||
Loading…
Reference in New Issue