fix: Fix playlist reordering crash

This commit is contained in:
Prathamesh More 2023-03-15 12:09:53 +05:30
parent 3e93dcfc4d
commit ab16d7e105
3 changed files with 25 additions and 35 deletions

View file

@ -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 {

View file

@ -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 :

View file

@ -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(