list: rework sort dialog internals

Change the sort dialog to allow the following:
1. Allow null initial sort values in the dialog.
2. Make saving only possible if the sort changed.
This commit is contained in:
Alexander Capehart 2023-07-25 18:56:47 -06:00
parent ed08559b94
commit a201cb15bc
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47

View file

@ -22,6 +22,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.button.MaterialButtonToggleGroup
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.DialogSortBinding import org.oxycblt.auxio.databinding.DialogSortBinding
import org.oxycblt.auxio.list.ClickableListListener import org.oxycblt.auxio.list.ClickableListListener
@ -31,10 +32,12 @@ import org.oxycblt.auxio.ui.ViewBindingBottomSheetDialogFragment
import org.oxycblt.auxio.util.systemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
abstract class SortDialog : abstract class SortDialog :
ViewBindingBottomSheetDialogFragment<DialogSortBinding>(), ClickableListListener<Sort.Mode> { ViewBindingBottomSheetDialogFragment<DialogSortBinding>(),
ClickableListListener<Sort.Mode>,
MaterialButtonToggleGroup.OnButtonCheckedListener {
private val modeAdapter = SortModeAdapter(this) private val modeAdapter = SortModeAdapter(this)
abstract fun getInitialSort(): Sort abstract fun getInitialSort(): Sort?
abstract fun applyChosenSort(sort: Sort) abstract fun applyChosenSort(sort: Sort)
@ -50,31 +53,19 @@ abstract class SortDialog :
v.updatePadding(bottom = insets.systemBarInsetsCompat.bottom) v.updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
insets insets
} }
binding.sortModeRecycler.adapter = modeAdapter binding.sortModeRecycler.adapter = modeAdapter
binding.sortDirectionGroup.addOnButtonCheckedListener(this)
binding.sortCancel.setOnClickListener { dismiss() } binding.sortCancel.setOnClickListener { dismiss() }
binding.sortSave.setOnClickListener { binding.sortSave.setOnClickListener {
val initial = getInitialSort() applyChosenSort(requireNotNull(getCurrentSort()))
// FIXME: This won't work for the playlist sort dialog.
val mode = modeAdapter.currentMode ?: initial.mode
val direction =
when (binding.sortDirectionGroup.checkedButtonId) {
R.id.sort_direction_asc -> Sort.Direction.ASCENDING
R.id.sort_direction_dsc -> Sort.Direction.DESCENDING
else -> initial.direction
}
applyChosenSort(Sort(mode, direction))
dismiss() dismiss()
} }
// --- STATE SETUP --- // --- STATE SETUP ---
val initial = getInitialSort() val initial = getInitialSort()
if (initial != null) {
modeAdapter.update(getModeChoices(), UpdateInstructions.Diff) modeAdapter.update(getModeChoices(), UpdateInstructions.Diff)
modeAdapter.setSelected(initial.mode) modeAdapter.setSelected(initial.mode)
val directionId = val directionId =
when (initial.direction) { when (initial.direction) {
Sort.Direction.ASCENDING -> R.id.sort_direction_asc Sort.Direction.ASCENDING -> R.id.sort_direction_asc
@ -82,8 +73,41 @@ abstract class SortDialog :
} }
binding.sortDirectionGroup.check(directionId) binding.sortDirectionGroup.check(directionId)
} }
updateButtons()
}
override fun onDestroyBinding(binding: DialogSortBinding) {
super.onDestroyBinding(binding)
binding.sortDirectionGroup.removeOnButtonCheckedListener(this)
}
override fun onClick(item: Sort.Mode, viewHolder: RecyclerView.ViewHolder) { override fun onClick(item: Sort.Mode, viewHolder: RecyclerView.ViewHolder) {
modeAdapter.setSelected(item) modeAdapter.setSelected(item)
updateButtons()
}
override fun onButtonChecked(
group: MaterialButtonToggleGroup?,
checkedId: Int,
isChecked: Boolean
) {
updateButtons()
}
private fun updateButtons() {
val binding = requireBinding()
binding.sortSave.isEnabled = getCurrentSort() != getInitialSort()
}
private fun getCurrentSort(): Sort? {
val initial = getInitialSort()
val mode = modeAdapter.currentMode ?: initial?.mode ?: return null
val direction =
when (requireBinding().sortDirectionGroup.checkedButtonId) {
R.id.sort_direction_asc -> Sort.Direction.ASCENDING
R.id.sort_direction_dsc -> Sort.Direction.DESCENDING
else -> initial?.direction ?: return null
}
return Sort(mode, direction)
} }
} }