|
|
|
|
@ -7,13 +7,17 @@ import android.view.View
|
|
|
|
|
import android.view.ViewGroup
|
|
|
|
|
import android.widget.AdapterView
|
|
|
|
|
import android.widget.ArrayAdapter
|
|
|
|
|
import androidx.annotation.IdRes
|
|
|
|
|
import androidx.core.view.isGone
|
|
|
|
|
import androidx.core.view.updatePadding
|
|
|
|
|
import androidx.fragment.app.FragmentManager
|
|
|
|
|
import com.google.android.material.button.MaterialButtonToggleGroup
|
|
|
|
|
import com.google.android.material.chip.Chip
|
|
|
|
|
import org.koitharu.kotatsu.R
|
|
|
|
|
import org.koitharu.kotatsu.core.model.GenericSortOrder
|
|
|
|
|
import org.koitharu.kotatsu.core.model.SortDirection
|
|
|
|
|
import org.koitharu.kotatsu.core.model.titleResId
|
|
|
|
|
import org.koitharu.kotatsu.core.ui.model.titleRes
|
|
|
|
|
import org.koitharu.kotatsu.core.ui.model.direction
|
|
|
|
|
import org.koitharu.kotatsu.core.ui.sheet.BaseAdaptiveSheet
|
|
|
|
|
import org.koitharu.kotatsu.core.ui.widgets.ChipsView
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
|
|
|
|
@ -21,6 +25,7 @@ import org.koitharu.kotatsu.core.util.ext.getDisplayName
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.observe
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.parentView
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.showDistinct
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.sortedByOrdinal
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.textAndVisible
|
|
|
|
|
import org.koitharu.kotatsu.databinding.SheetFilterBinding
|
|
|
|
|
import org.koitharu.kotatsu.filter.ui.FilterOwner
|
|
|
|
|
@ -30,12 +35,14 @@ import org.koitharu.kotatsu.parsers.model.ContentRating
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaState
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.SortOrder
|
|
|
|
|
import org.koitharu.kotatsu.parsers.util.mapToSet
|
|
|
|
|
import java.util.EnumSet
|
|
|
|
|
import java.util.Locale
|
|
|
|
|
import com.google.android.material.R as materialR
|
|
|
|
|
|
|
|
|
|
class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
AdapterView.OnItemSelectedListener,
|
|
|
|
|
ChipsView.OnChipClickListener {
|
|
|
|
|
ChipsView.OnChipClickListener, MaterialButtonToggleGroup.OnButtonCheckedListener {
|
|
|
|
|
|
|
|
|
|
override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetFilterBinding {
|
|
|
|
|
return SheetFilterBinding.inflate(inflater, container, false)
|
|
|
|
|
@ -51,6 +58,7 @@ class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
}
|
|
|
|
|
val filter = requireFilter()
|
|
|
|
|
filter.filterSortOrder.observe(viewLifecycleOwner, this::onSortOrderChanged)
|
|
|
|
|
filter.filterSortDirection.observe(viewLifecycleOwner, this::onSortDirectionChanged)
|
|
|
|
|
filter.filterLocale.observe(viewLifecycleOwner, this::onLocaleChanged)
|
|
|
|
|
filter.filterTags.observe(viewLifecycleOwner, this::onTagsChanged)
|
|
|
|
|
filter.filterTagsExcluded.observe(viewLifecycleOwner, this::onTagsExcludedChanged)
|
|
|
|
|
@ -63,12 +71,24 @@ class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
binding.chipsContentRating.onChipClickListener = this
|
|
|
|
|
binding.chipsGenres.onChipClickListener = this
|
|
|
|
|
binding.chipsGenresExclude.onChipClickListener = this
|
|
|
|
|
binding.layoutSortDirection.addOnButtonCheckedListener(this)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onButtonChecked(group: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean) {
|
|
|
|
|
if (isChecked) {
|
|
|
|
|
setSortDirection(getSortDirection(checkedId))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
|
|
|
|
|
val filter = requireFilter()
|
|
|
|
|
when (parent.id) {
|
|
|
|
|
R.id.spinner_order -> filter.setSortOrder(filter.filterSortOrder.value.availableItems[position])
|
|
|
|
|
R.id.spinner_order -> {
|
|
|
|
|
val genericOrder = filter.filterSortOrder.value.availableItems[position]
|
|
|
|
|
val direction = getSortDirection(requireViewBinding().layoutSortDirection.checkedButtonId)
|
|
|
|
|
filter.setSortOrder(genericOrder[direction])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
R.id.spinner_locale -> filter.setLanguage(filter.filterLocale.value.availableItems[position])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -90,7 +110,7 @@ class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun onSortOrderChanged(value: FilterProperty<SortOrder>) {
|
|
|
|
|
private fun onSortOrderChanged(value: FilterProperty<GenericSortOrder>) {
|
|
|
|
|
val b = viewBinding ?: return
|
|
|
|
|
b.textViewOrderTitle.isGone = value.isEmpty()
|
|
|
|
|
b.cardOrder.isGone = value.isEmpty()
|
|
|
|
|
@ -102,7 +122,7 @@ class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
b.spinnerOrder.context,
|
|
|
|
|
android.R.layout.simple_spinner_dropdown_item,
|
|
|
|
|
android.R.id.text1,
|
|
|
|
|
value.availableItems.map { b.spinnerOrder.context.getString(it.titleRes) },
|
|
|
|
|
value.availableItems.map { b.spinnerOrder.context.getString(it.titleResId) },
|
|
|
|
|
)
|
|
|
|
|
val selectedIndex = value.availableItems.indexOf(selected)
|
|
|
|
|
if (selectedIndex >= 0) {
|
|
|
|
|
@ -110,6 +130,25 @@ class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun onSortDirectionChanged(value: FilterProperty<SortDirection>) {
|
|
|
|
|
val b = viewBinding ?: return
|
|
|
|
|
b.layoutSortDirection.isGone = value.isEmpty()
|
|
|
|
|
if (value.isEmpty()) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
val selected = value.selectedItems.single()
|
|
|
|
|
b.buttonOrderAsc.isEnabled = SortDirection.ASC in value.availableItems
|
|
|
|
|
b.buttonOrderDesc.isEnabled = SortDirection.DESC in value.availableItems
|
|
|
|
|
b.layoutSortDirection.removeOnButtonCheckedListener(this)
|
|
|
|
|
b.layoutSortDirection.check(
|
|
|
|
|
when (selected) {
|
|
|
|
|
SortDirection.ASC -> R.id.button_order_asc
|
|
|
|
|
SortDirection.DESC -> R.id.button_order_desc
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
b.layoutSortDirection.addOnButtonCheckedListener(this)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun onLocaleChanged(value: FilterProperty<Locale?>) {
|
|
|
|
|
val b = viewBinding ?: return
|
|
|
|
|
b.textViewLocaleTitle.isGone = value.isEmpty()
|
|
|
|
|
@ -239,6 +278,19 @@ class FilterSheetFragment : BaseAdaptiveSheet<SheetFilterBinding>(),
|
|
|
|
|
|
|
|
|
|
private fun requireFilter() = (requireActivity() as FilterOwner).filter
|
|
|
|
|
|
|
|
|
|
private fun setSortDirection(direction: SortDirection) {
|
|
|
|
|
val filter = requireFilter()
|
|
|
|
|
val currentOrder = filter.filterSortOrder.value.selectedItems.single()
|
|
|
|
|
val newOrder = currentOrder[direction]
|
|
|
|
|
filter.setSortOrder(newOrder)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun getSortDirection(@IdRes buttonId: Int): SortDirection = when (buttonId) {
|
|
|
|
|
R.id.button_order_asc -> SortDirection.ASC
|
|
|
|
|
R.id.button_order_desc -> SortDirection.DESC
|
|
|
|
|
else -> throw IllegalArgumentException("Wrong button id $buttonId")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
|
|
|
|
|
private const val TAG = "FilterSheet"
|
|
|
|
|
|