fix: Fix playlist reordering crash
This commit is contained in:
parent
3e93dcfc4d
commit
ab16d7e105
3 changed files with 25 additions and 35 deletions
|
@ -26,6 +26,7 @@ import code.name.monkey.retromusic.db.toSongsEntity
|
||||||
import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
|
import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
|
import code.name.monkey.retromusic.util.ViewUtil
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -50,11 +51,7 @@ class OrderablePlaylistSongAdapter(
|
||||||
override fun getItemId(position: Int): Long {
|
override fun getItemId(position: Int): Long {
|
||||||
// requires static value, it means need to keep the same value
|
// requires static value, it means need to keep the same value
|
||||||
// even if the item position has been changed.
|
// even if the item position has been changed.
|
||||||
return if (position != 0) {
|
return dataSet[position].id
|
||||||
dataSet[position - 1].id
|
|
||||||
} else {
|
|
||||||
-1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
|
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
|
||||||
|
@ -99,26 +96,22 @@ class OrderablePlaylistSongAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean {
|
override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean {
|
||||||
if (dataSet.size == 0 or 1 || isInQuickSelectMode) {
|
if (isInQuickSelectMode) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
val dragHandle = holder.dragView ?: return false
|
return ViewUtil.hitTest(holder.imageText!!, x, y) || ViewUtil.hitTest(
|
||||||
|
holder.dragView!!,
|
||||||
val handleWidth = dragHandle.width
|
x,
|
||||||
val handleHeight = dragHandle.height
|
y
|
||||||
val handleLeft = dragHandle.left
|
)
|
||||||
val handleTop = dragHandle.top
|
|
||||||
|
|
||||||
return (x >= handleLeft && x < handleLeft + handleWidth &&
|
|
||||||
y >= handleTop && y < handleTop + handleHeight) && position != 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
|
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
|
||||||
dataSet.add(toPosition - 1, dataSet.removeAt(fromPosition - 1))
|
dataSet.add(toPosition, dataSet.removeAt(fromPosition))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange {
|
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange? {
|
||||||
return ItemDraggableRange(0, itemCount - 1)
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
|
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import androidx.recyclerview.widget.SimpleItemAnimator
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
|
import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
|
||||||
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailNewBinding
|
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailNewBinding
|
||||||
|
@ -34,7 +35,6 @@ import com.google.android.material.transition.MaterialArcMotion
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
|
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator
|
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
|
@ -126,15 +126,11 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
val wrappedAdapter: RecyclerView.Adapter<*> =
|
val wrappedAdapter: RecyclerView.Adapter<*> =
|
||||||
dragDropManager.createWrappedAdapter(playlistSongAdapter)
|
dragDropManager.createWrappedAdapter(playlistSongAdapter)
|
||||||
|
|
||||||
|
|
||||||
val animator: GeneralItemAnimator = DraggableItemAnimator()
|
|
||||||
binding.recyclerView.itemAnimator = animator
|
|
||||||
|
|
||||||
dragDropManager.attachRecyclerView(binding.recyclerView)
|
|
||||||
|
|
||||||
binding.recyclerView.apply {
|
binding.recyclerView.apply {
|
||||||
|
adapter = wrappedAdapter
|
||||||
layoutManager = LinearLayoutManager(requireContext())
|
layoutManager = LinearLayoutManager(requireContext())
|
||||||
binding.recyclerView.adapter = wrappedAdapter
|
itemAnimator = DraggableItemAnimator()
|
||||||
|
dragDropManager.attachRecyclerView(this)
|
||||||
ThemedFastScroller.create(this)
|
ThemedFastScroller.create(this)
|
||||||
}
|
}
|
||||||
playlistSongAdapter.registerAdapterDataObserver(object :
|
playlistSongAdapter.registerAdapterDataObserver(object :
|
||||||
|
|
|
@ -80,9 +80,6 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
|
||||||
recyclerViewDragDropManager = RecyclerViewDragDropManager()
|
recyclerViewDragDropManager = RecyclerViewDragDropManager()
|
||||||
recyclerViewSwipeManager = RecyclerViewSwipeManager()
|
recyclerViewSwipeManager = RecyclerViewSwipeManager()
|
||||||
|
|
||||||
val animator = DraggableItemAnimator()
|
|
||||||
animator.supportsChangeAnimations = false
|
|
||||||
|
|
||||||
playingQueueAdapter = PlayingQueueAdapter(
|
playingQueueAdapter = PlayingQueueAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
MusicPlayerRemote.playingQueue.toMutableList(),
|
MusicPlayerRemote.playingQueue.toMutableList(),
|
||||||
|
@ -94,12 +91,15 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
|
||||||
|
|
||||||
linearLayoutManager = LinearLayoutManager(requireContext())
|
linearLayoutManager = LinearLayoutManager(requireContext())
|
||||||
|
|
||||||
binding.recyclerView.layoutManager = linearLayoutManager
|
|
||||||
binding.recyclerView.adapter = wrappedAdapter
|
binding.recyclerView.apply {
|
||||||
binding.recyclerView.itemAnimator = animator
|
layoutManager = linearLayoutManager
|
||||||
recyclerViewTouchActionGuardManager?.attachRecyclerView(binding.recyclerView)
|
adapter = wrappedAdapter
|
||||||
recyclerViewDragDropManager?.attachRecyclerView(binding.recyclerView)
|
itemAnimator = DraggableItemAnimator()
|
||||||
recyclerViewSwipeManager?.attachRecyclerView(binding.recyclerView)
|
recyclerViewTouchActionGuardManager?.attachRecyclerView(this)
|
||||||
|
recyclerViewDragDropManager?.attachRecyclerView(this)
|
||||||
|
recyclerViewSwipeManager?.attachRecyclerView(this)
|
||||||
|
}
|
||||||
linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0)
|
linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0)
|
||||||
|
|
||||||
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
||||||
|
@ -184,6 +184,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
|
||||||
|
|
||||||
private fun setupToolbar() {
|
private fun setupToolbar() {
|
||||||
binding.appBarLayout.toolbar.subtitle = getUpNextAndQueueTime()
|
binding.appBarLayout.toolbar.subtitle = getUpNextAndQueueTime()
|
||||||
|
binding.appBarLayout.toolbar.isTitleCentered = false
|
||||||
binding.clearQueue.backgroundTintList = ColorStateList.valueOf(accentColor())
|
binding.clearQueue.backgroundTintList = ColorStateList.valueOf(accentColor())
|
||||||
ColorStateList.valueOf(
|
ColorStateList.valueOf(
|
||||||
MaterialValueHelper.getPrimaryTextColor(
|
MaterialValueHelper.getPrimaryTextColor(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue