diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt
index d1b7199f8..b89cfc9e4 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt
@@ -192,7 +192,7 @@ class AlbumDetailFragment :
override fun onShuffle() {
playbackModel.shuffle(unlikelyToBeNull(detailModel.currentAlbum.value))
}
-
+
override fun onOpenSortMenu() {
findNavController().navigateSafe(AlbumDetailFragmentDirections.sort())
}
diff --git a/app/src/main/java/org/oxycblt/auxio/list/sort/SortAdapter.kt b/app/src/main/java/org/oxycblt/auxio/list/sort/SortAdapter.kt
new file mode 100644
index 000000000..16ac05fd2
--- /dev/null
+++ b/app/src/main/java/org/oxycblt/auxio/list/sort/SortAdapter.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2023 Auxio Project
+ * SortAdapter.kt is part of Auxio.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.oxycblt.auxio.list.sort
+
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.RecyclerView
+import org.oxycblt.auxio.databinding.ItemSortModeBinding
+import org.oxycblt.auxio.list.Sort
+import org.oxycblt.auxio.list.adapter.FlexibleListAdapter
+import org.oxycblt.auxio.util.inflater
+
+class SortAdapter(var selectedMode: Sort.Mode) :
+ FlexibleListAdapter(SortModeViewHolder.DIFF_CALLBACK) {
+ var currentlySelected = selectedMode
+ private set
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+ SortModeViewHolder.from(parent)
+
+ override fun onBindViewHolder(holder: SortModeViewHolder, position: Int) {
+ throw NotImplementedError()
+ }
+
+ override fun onBindViewHolder(holder: SortModeViewHolder, position: Int, payload: List) {
+ val mode = getItem(position)
+ if (payload.isEmpty()) {
+ holder.bind(mode)
+ }
+ holder.setSelected(mode == currentlySelected)
+ }
+
+ fun setSelected(mode: Sort.Mode) {
+ if (mode == currentlySelected) return
+ val oldMode = currentList.indexOf(currentlySelected)
+ val newMode = currentList.indexOf(mode)
+ currentlySelected = selectedMode
+ notifyItemChanged(oldMode, PAYLOAD_SELECTION_CHANGED)
+ notifyItemChanged(newMode, PAYLOAD_SELECTION_CHANGED)
+ }
+
+ private companion object {
+ val PAYLOAD_SELECTION_CHANGED = Any()
+ }
+}
+
+class SortModeViewHolder private constructor(private val binding: ItemSortModeBinding) :
+ RecyclerView.ViewHolder(binding.root) {
+ fun bind(mode: Sort.Mode) {
+ // TODO: Add names to sort.mode
+ binding.sortRadio.text = mode.toString()
+ }
+
+ fun setSelected(selected: Boolean) {
+ binding.sortRadio.isChecked = selected
+ }
+
+ companion object {
+ fun from(parent: View) =
+ SortModeViewHolder(ItemSortModeBinding.inflate(parent.context.inflater))
+
+ val DIFF_CALLBACK =
+ object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: Sort.Mode, newItem: Sort.Mode) =
+ oldItem == newItem
+
+ override fun areContentsTheSame(oldItem: Sort.Mode, newItem: Sort.Mode) =
+ oldItem == newItem
+ }
+ }
+}
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..f6391ce87 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
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2023 Auxio Project
- * SortDialog.kt is part of Auxio.
+ * MenuDialogFragment.kt is part of Auxio.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,74 +16,126 @@
* along with this program. If not, see .
*/
-package org.oxycblt.auxio.list.sort
+package org.oxycblt.auxio.list.menu
+import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater
-import androidx.core.view.updatePadding
+import android.view.MenuInflater
+import android.view.MenuItem
+import androidx.appcompat.view.menu.MenuBuilder
+import androidx.core.view.children
+import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView
-import org.oxycblt.auxio.R
-import org.oxycblt.auxio.databinding.DialogSortBinding
+import org.oxycblt.auxio.databinding.DialogMenuBinding
import org.oxycblt.auxio.list.ClickableListListener
-import org.oxycblt.auxio.list.Sort
+import org.oxycblt.auxio.list.ListViewModel
+import org.oxycblt.auxio.list.Menu
import org.oxycblt.auxio.list.adapter.UpdateInstructions
import org.oxycblt.auxio.ui.ViewBindingBottomSheetDialogFragment
-import org.oxycblt.auxio.util.systemBarInsetsCompat
+import org.oxycblt.auxio.util.collectImmediately
+import org.oxycblt.auxio.util.logD
-abstract class SortDialog :
- ViewBindingBottomSheetDialogFragment(), ClickableListListener {
- private val modeAdapter = SortModeAdapter(this)
+/**
+ * A [ViewBindingBottomSheetDialogFragment] that displays basic music information and a series of
+ * options.
+ *
+ * @author Alexander Capehart (OxygenCobalt)
+ *
+ * TODO: Extend the amount of music info shown in the dialog
+ */
+abstract class MenuDialogFragment :
+ ViewBindingBottomSheetDialogFragment(), ClickableListListener