detail: extend smart queue disabling to detail
Add the queue disabling functionality from 47fca78
to the album detail
fragment as well.
This commit is contained in:
parent
6e6252b033
commit
eadf4cc86d
6 changed files with 50 additions and 21 deletions
|
@ -21,7 +21,7 @@ Auxio is a local music player with a fast, reliable UI/UX without the many usele
|
|||
|
||||
I primarily built Auxio for myself, but you can use it too, I guess.
|
||||
|
||||
**This branch is the development version of the repository. For a stable version, see the master branch.**
|
||||
**The default branch is the development version of the repository. For a stable version, see the master branch.**
|
||||
|
||||
## Screenshots
|
||||
|
||||
|
|
|
@ -23,10 +23,12 @@ import android.os.Bundle
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.view.children
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.navigation.fragment.navArgs
|
||||
import androidx.recyclerview.widget.LinearSmoothScroller
|
||||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.databinding.FragmentDetailBinding
|
||||
import org.oxycblt.auxio.detail.recycler.AlbumDetailAdapter
|
||||
import org.oxycblt.auxio.music.ActionHeader
|
||||
import org.oxycblt.auxio.music.Album
|
||||
|
@ -43,6 +45,8 @@ import org.oxycblt.auxio.util.showToast
|
|||
/**
|
||||
* The [DetailFragment] for an album.
|
||||
* @author OxygenCobalt
|
||||
* TODO: Disable queue adding when there is no playback here too, however make it so that
|
||||
* it updates when the song changes.
|
||||
*/
|
||||
class AlbumDetailFragment : DetailFragment() {
|
||||
private val args: AlbumDetailFragmentArgs by navArgs()
|
||||
|
@ -65,12 +69,20 @@ class AlbumDetailFragment : DetailFragment() {
|
|||
binding.lifecycleOwner = viewLifecycleOwner
|
||||
|
||||
setupToolbar(detailModel.curAlbum.value!!, R.menu.menu_album_detail) { itemId ->
|
||||
if (itemId == R.id.action_queue_add) {
|
||||
when (itemId) {
|
||||
R.id.action_play_next -> {
|
||||
playbackModel.playNext(detailModel.curAlbum.value!!)
|
||||
requireContext().showToast(R.string.lbl_queue_added)
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
||||
R.id.action_queue_add -> {
|
||||
playbackModel.addToQueue(detailModel.curAlbum.value!!)
|
||||
requireContext().showToast(R.string.lbl_queue_added)
|
||||
true
|
||||
}
|
||||
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,6 +91,8 @@ class AlbumDetailFragment : DetailFragment() {
|
|||
item is Header || item is ActionHeader || item is Album
|
||||
}
|
||||
|
||||
updateQueueActions(playbackModel.song.value, binding)
|
||||
|
||||
// -- DETAILVIEWMODEL SETUP ---
|
||||
|
||||
detailModel.albumData.observe(viewLifecycleOwner) { data ->
|
||||
|
@ -137,6 +151,8 @@ class AlbumDetailFragment : DetailFragment() {
|
|||
// --- PLAYBACKVIEWMODEL SETUP ---
|
||||
|
||||
playbackModel.song.observe(viewLifecycleOwner) { song ->
|
||||
updateQueueActions(song, binding)
|
||||
|
||||
if (playbackModel.playbackMode.value == PlaybackMode.IN_ALBUM &&
|
||||
playbackModel.parent.value?.id == detailModel.curAlbum.value!!.id
|
||||
) {
|
||||
|
@ -152,6 +168,17 @@ class AlbumDetailFragment : DetailFragment() {
|
|||
return binding.root
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the queue actions when
|
||||
*/
|
||||
private fun updateQueueActions(song: Song?, binding: FragmentDetailBinding) {
|
||||
for (item in binding.detailToolbar.menu.children) {
|
||||
if (item.itemId == R.id.action_play_next || item.itemId == R.id.action_queue_add) {
|
||||
item.isEnabled = song != null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scroll to an song using its [id].
|
||||
*/
|
||||
|
|
|
@ -57,19 +57,19 @@ abstract class DetailFragment : Fragment() {
|
|||
/**
|
||||
* Shortcut method for doing setup of the detail toolbar.
|
||||
* @param data Parent data to use as the toolbar title
|
||||
* @param menu Menu resource to use
|
||||
* @param menuId Menu resource to use
|
||||
* @param onMenuClick (Optional) a click listener for that menu
|
||||
*/
|
||||
protected fun setupToolbar(
|
||||
data: MusicParent,
|
||||
@MenuRes menu: Int = -1,
|
||||
@MenuRes menuId: Int = -1,
|
||||
onMenuClick: ((itemId: Int) -> Boolean)? = null
|
||||
) {
|
||||
binding.detailToolbar.apply {
|
||||
title = data.resolvedName
|
||||
|
||||
if (menu != -1) {
|
||||
inflateMenu(menu)
|
||||
if (menuId != -1) {
|
||||
inflateMenu(menuId)
|
||||
}
|
||||
|
||||
setNavigationOnClickListener {
|
||||
|
|
|
@ -214,8 +214,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
*/
|
||||
fun removeQueueDataItem(adapterIndex: Int, apply: () -> Unit) {
|
||||
val adjusted = adapterIndex + (playbackManager.queue.size - mNextUp.value!!.size)
|
||||
logD("$adjusted")
|
||||
|
||||
if (adjusted in mNextUp.value!!.indices) {
|
||||
if (adjusted in playbackManager.queue.indices) {
|
||||
apply()
|
||||
playbackManager.removeQueueItem(adjusted)
|
||||
}
|
||||
|
@ -230,7 +231,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
val from = adapterFrom + delta
|
||||
val to = adapterTo + delta
|
||||
|
||||
if (from in mNextUp.value!!.indices && to in mNextUp.value!!.indices) {
|
||||
if (from in playbackManager.queue.indices && to in playbackManager.queue.indices) {
|
||||
apply()
|
||||
playbackManager.moveQueueItems(from, to)
|
||||
return true
|
||||
|
|
|
@ -23,6 +23,7 @@ import androidx.annotation.IdRes
|
|||
import androidx.annotation.MenuRes
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.widget.PopupMenu
|
||||
import androidx.core.view.children
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import org.oxycblt.auxio.R
|
||||
|
@ -82,9 +83,11 @@ class ActionMenu(
|
|||
inflate(menuRes)
|
||||
|
||||
// Disable any queue options if we don't have anything playing.
|
||||
val queueEnabled = playbackModel.song.value != null
|
||||
menu.findItem(R.id.action_play_next)?.isEnabled = queueEnabled
|
||||
menu.findItem(R.id.action_queue_add)?.isEnabled = queueEnabled
|
||||
for (item in menu.children) {
|
||||
if (item.itemId == R.id.action_play_next || item.itemId == R.id.action_queue_add) {
|
||||
item.isEnabled = playbackModel.song.value != null
|
||||
}
|
||||
}
|
||||
|
||||
setOnMenuItemClickListener { item ->
|
||||
onMenuClick(item.itemId)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="lbl_sort">排序方式</string>
|
||||
<string name="lbl_sort_name">名称</string>
|
||||
<string name="lbl_sort_artist">艺术家</string>
|
||||
<string name="lbl_sort_album">专辑/string>
|
||||
<string name="lbl_sort_album">专辑</string>
|
||||
<string name="lbl_sort_year">年份</string>
|
||||
<string name="lbl_sort_asc">首字符(正序)</string>
|
||||
|
||||
|
@ -169,12 +169,10 @@
|
|||
<string name="fmt_songs_loaded">已加载 %d 首曲目</string>
|
||||
|
||||
<plurals name="fmt_song_count">
|
||||
<item quantity="one">%d 首歌曲</item>
|
||||
<item quantity="other">%d 首歌曲</item>
|
||||
<item quantity="other">"%d 首歌曲"</item>
|
||||
</plurals>
|
||||
|
||||
<plurals name="fmt_album_count">
|
||||
<item quantity="one">%d 张专辑</item>
|
||||
<item quantity="other">%d 张专辑</item>
|
||||
<item quantity="other">"%d 张专辑"</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in a new issue