diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java index 34c6243e..0684c251 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java @@ -7,11 +7,16 @@ import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.view.View; +import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter; +import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder; +import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange; +import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.dialogs.RemoveFromPlaylistDialog; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.util.ViewUtil; import java.util.ArrayList; import java.util.List; @@ -21,13 +26,16 @@ import java.util.List; * @author Karim Abou Zeid (kabouzeid) */ @SuppressWarnings("unchecked") -public class PlaylistSongAdapter extends SongAdapter { +public class PlaylistSongAdapter extends SongAdapter implements DraggableItemAdapter { public static final String TAG = PlaylistSongAdapter.class.getSimpleName(); - public PlaylistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { + private OnMoveItemListener onMoveItemListener; + + public PlaylistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder, @Nullable OnMoveItemListener onMoveItemListener) { super(activity, (ArrayList) (List) dataSet, itemLayoutRes, usePalette, cabHolder); overrideMultiSelectMenuRes(R.menu.menu_playlists_songs_selection); + this.onMoveItemListener = onMoveItemListener; } @Override @@ -44,12 +52,39 @@ public class PlaylistSongAdapter extends SongAdapter { } } - public class ViewHolder extends SongAdapter.ViewHolder { + @Override + public boolean onCheckCanStartDrag(ViewHolder holder, int position, int x, int y) { + return onMoveItemListener != null && ViewUtil.hitTest(holder.dragView, x, y); + } + + @Override + public ItemDraggableRange onGetItemDraggableRange(ViewHolder holder, int position) { + return null; + } + + @Override + public void onMoveItem(int fromPosition, int toPosition) { + if (onMoveItemListener != null && fromPosition != toPosition) { + onMoveItemListener.onMoveItem(fromPosition, toPosition); + } + } + + public interface OnMoveItemListener { + void onMoveItem(int fromPosition, int toPosition); + } + + public class ViewHolder extends SongAdapter.ViewHolder implements DraggableItemViewHolder { + @DraggableItemStateFlags + private int mDragStateFlags; public ViewHolder(@NonNull View itemView) { super(itemView); if (dragView != null) { - dragView.setVisibility(View.VISIBLE); + if (onMoveItemListener != null) { + dragView.setVisibility(View.VISIBLE); + } else { + dragView.setVisibility(View.GONE); + } } } @@ -67,5 +102,16 @@ public class PlaylistSongAdapter extends SongAdapter { } return super.onSongMenuItemClick(item); } + + @Override + public void setDragStateFlags(@DraggableItemStateFlags int flags) { + mDragStateFlags = flags; + } + + @Override + @DraggableItemStateFlags + public int getDragStateFlags() { + return mDragStateFlags; + } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index 8a9733d7..73c56a96 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -2,7 +2,7 @@ package com.kabouzeid.gramophone.ui.activities; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; @@ -11,6 +11,10 @@ import android.view.View; import android.widget.TextView; import com.afollestad.materialcab.MaterialCab; +import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; +import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator; +import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager; +import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.song.PlaylistSongAdapter; import com.kabouzeid.gramophone.adapter.song.SmartPlaylistSongAdapter; @@ -19,7 +23,6 @@ import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; -import com.kabouzeid.gramophone.misc.DragSortRecycler; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; @@ -54,6 +57,9 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme private MaterialCab cab; private SongAdapter adapter; + private RecyclerView.Adapter wrappedAdapter; + private RecyclerViewDragDropManager recyclerViewDragDropManager; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -79,33 +85,30 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme } private void setUpRecyclerView() { - recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); if (playlist instanceof AbsSmartPlaylist) { adapter = new SmartPlaylistSongAdapter(this, loadSmartPlaylistDataSet(), R.layout.item_list, false, this); + recyclerView.setAdapter(adapter); } else { - adapter = new PlaylistSongAdapter(this, loadPlaylistDataSet(), R.layout.item_list, false, this); - - DragSortRecycler dragSortRecycler = new DragSortRecycler(); - dragSortRecycler.setViewHandleId(R.id.drag_view); - dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() { + recyclerViewDragDropManager = new RecyclerViewDragDropManager(); + final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator(); + adapter = new PlaylistSongAdapter(this, loadPlaylistDataSet(), R.layout.item_list, false, this, new PlaylistSongAdapter.OnMoveItemListener() { @Override - public void onItemMoved(int from, int to) { - if (from == to) return; - - if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, from, to)) { - Song song = adapter.getDataSet().remove(from); - adapter.getDataSet().add(to, song); - adapter.notifyItemMoved(from, to); + public void onMoveItem(int fromPosition, int toPosition) { + if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, fromPosition, toPosition)) { + Song song = adapter.getDataSet().remove(fromPosition); + adapter.getDataSet().add(toPosition, song); + adapter.notifyItemMoved(fromPosition, toPosition); } } }); + wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(adapter); - recyclerView.addItemDecoration(dragSortRecycler); - recyclerView.addOnItemTouchListener(dragSortRecycler); - recyclerView.addOnScrollListener(dragSortRecycler.getScrollListener()); - recyclerView.setItemAnimator(null); + recyclerView.setAdapter(wrappedAdapter); + recyclerView.setItemAnimator(animator); + + recyclerViewDragDropManager.attachRecyclerView(recyclerView); } - recyclerView.setAdapter(adapter); adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override @@ -211,4 +214,32 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE ); } + + @Override + public void onPause() { + recyclerViewDragDropManager.cancelDrag(); + super.onPause(); + } + + @Override + protected void onDestroy() { + if (recyclerViewDragDropManager != null) { + recyclerViewDragDropManager.release(); + recyclerViewDragDropManager = null; + } + + if (recyclerView != null) { + recyclerView.setItemAnimator(null); + recyclerView.setAdapter(null); + recyclerView = null; + } + + if (wrappedAdapter != null) { + WrapperAdapterUtils.releaseAll(wrappedAdapter); + wrappedAdapter = null; + } + adapter = null; + + super.onDestroy(); + } }