From a201cb15bc49b690e03bd2e930a83116bbc9474e Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Tue, 25 Jul 2023 18:56:47 -0600 Subject: [PATCH] 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. --- .../org/oxycblt/auxio/list/sort/SortDialog.kt | 72 ++++++++++++------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/list/sort/SortDialog.kt b/app/src/main/java/org/oxycblt/auxio/list/sort/SortDialog.kt index 39e14d199..98ead4aa4 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/sort/SortDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/sort/SortDialog.kt @@ -22,6 +22,7 @@ import android.os.Bundle import android.view.LayoutInflater import androidx.core.view.updatePadding import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.button.MaterialButtonToggleGroup import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.DialogSortBinding import org.oxycblt.auxio.list.ClickableListListener @@ -31,10 +32,12 @@ import org.oxycblt.auxio.ui.ViewBindingBottomSheetDialogFragment import org.oxycblt.auxio.util.systemBarInsetsCompat abstract class SortDialog : - ViewBindingBottomSheetDialogFragment(), ClickableListListener { + ViewBindingBottomSheetDialogFragment(), + ClickableListListener, + MaterialButtonToggleGroup.OnButtonCheckedListener { private val modeAdapter = SortModeAdapter(this) - abstract fun getInitialSort(): Sort + abstract fun getInitialSort(): Sort? abstract fun applyChosenSort(sort: Sort) @@ -50,40 +53,61 @@ abstract class SortDialog : v.updatePadding(bottom = insets.systemBarInsetsCompat.bottom) insets } - binding.sortModeRecycler.adapter = modeAdapter - + binding.sortDirectionGroup.addOnButtonCheckedListener(this) binding.sortCancel.setOnClickListener { dismiss() } - binding.sortSave.setOnClickListener { - val initial = getInitialSort() - // 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)) + applyChosenSort(requireNotNull(getCurrentSort())) dismiss() } // --- STATE SETUP --- val initial = getInitialSort() + if (initial != null) { + modeAdapter.update(getModeChoices(), UpdateInstructions.Diff) + modeAdapter.setSelected(initial.mode) + val directionId = + when (initial.direction) { + Sort.Direction.ASCENDING -> R.id.sort_direction_asc + Sort.Direction.DESCENDING -> R.id.sort_direction_dsc + } + binding.sortDirectionGroup.check(directionId) + } + updateButtons() + } - modeAdapter.update(getModeChoices(), UpdateInstructions.Diff) - modeAdapter.setSelected(initial.mode) - - val directionId = - when (initial.direction) { - Sort.Direction.ASCENDING -> R.id.sort_direction_asc - Sort.Direction.DESCENDING -> R.id.sort_direction_dsc - } - binding.sortDirectionGroup.check(directionId) + override fun onDestroyBinding(binding: DialogSortBinding) { + super.onDestroyBinding(binding) + binding.sortDirectionGroup.removeOnButtonCheckedListener(this) } override fun onClick(item: Sort.Mode, viewHolder: RecyclerView.ViewHolder) { 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) } }