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