Added better drag and drop support for the playing queue.
This commit is contained in:
parent
de31396b67
commit
a5c6ff1d1d
4 changed files with 89 additions and 22 deletions
|
|
@ -94,6 +94,10 @@ dependencies {
|
||||||
transitive = true;
|
transitive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compile('com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.8.5@aar') {
|
||||||
|
transitive = true
|
||||||
|
}
|
||||||
|
|
||||||
compile('com.afollestad.material-dialogs:core:0.8.5.1@aar') {
|
compile('com.afollestad.material-dialogs:core:0.8.5.1@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,22 @@ import android.support.v7.app.AppCompatActivity;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
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.R;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class PlayingQueueAdapter extends SongAdapter {
|
public class PlayingQueueAdapter extends SongAdapter implements DraggableItemAdapter<PlayingQueueAdapter.ViewHolder> {
|
||||||
|
|
||||||
private static final int HISTORY = 0;
|
private static final int HISTORY = 0;
|
||||||
private static final int CURRENT = 1;
|
private static final int CURRENT = 1;
|
||||||
|
|
@ -83,7 +88,24 @@ public class PlayingQueueAdapter extends SongAdapter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ViewHolder extends SongAdapter.ViewHolder {
|
@Override
|
||||||
|
public boolean onCheckCanStartDrag(ViewHolder holder, int position, int x, int y) {
|
||||||
|
return ViewUtil.hitTest(holder.image, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDraggableRange onGetItemDraggableRange(ViewHolder holder, int position) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMoveItem(int fromPosition, int toPosition) {
|
||||||
|
MusicPlayerRemote.moveSong(fromPosition, toPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends SongAdapter.ViewHolder implements DraggableItemViewHolder {
|
||||||
|
@DraggableItemStateFlags
|
||||||
|
private int mDragStateFlags;
|
||||||
|
|
||||||
public ViewHolder(@NonNull View itemView) {
|
public ViewHolder(@NonNull View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
|
|
@ -103,5 +125,16 @@ public class PlayingQueueAdapter extends SongAdapter {
|
||||||
}
|
}
|
||||||
return super.onSongMenuItemClick(item);
|
return super.onSongMenuItemClick(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDragStateFlags(@DraggableItemStateFlags int flags) {
|
||||||
|
mDragStateFlags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@DraggableItemStateFlags
|
||||||
|
public int getDragStateFlags() {
|
||||||
|
return mDragStateFlags;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,15 @@ import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.internal.ThemeSingleton;
|
import com.afollestad.materialdialogs.internal.ThemeSingleton;
|
||||||
|
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.R;
|
||||||
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
||||||
import com.kabouzeid.gramophone.adapter.song.PlayingQueueAdapter;
|
import com.kabouzeid.gramophone.adapter.song.PlayingQueueAdapter;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.loader.ArtistLoader;
|
import com.kabouzeid.gramophone.loader.ArtistLoader;
|
||||||
import com.kabouzeid.gramophone.misc.DragSortRecycler;
|
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||||
|
|
@ -70,6 +73,9 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
|
||||||
|
|
||||||
private PlayingQueueAdapter playingQueueAdapter;
|
private PlayingQueueAdapter playingQueueAdapter;
|
||||||
|
|
||||||
|
private RecyclerView.Adapter wrappedAdapter;
|
||||||
|
private RecyclerViewDragDropManager recyclerViewDragDropManager;
|
||||||
|
|
||||||
private Impl impl;
|
private Impl impl;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -115,10 +121,33 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
playingQueueAdapter = null;
|
||||||
|
layoutManager = null;
|
||||||
super.onDestroyView();
|
super.onDestroyView();
|
||||||
ButterKnife.unbind(this);
|
ButterKnife.unbind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
recyclerViewDragDropManager.cancelDrag();
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayingMetaChanged() {
|
public void onPlayingMetaChanged() {
|
||||||
updateIsFavorite();
|
updateIsFavorite();
|
||||||
|
|
@ -170,19 +199,25 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpRecyclerView() {
|
private void setUpRecyclerView() {
|
||||||
|
recyclerViewDragDropManager = new RecyclerViewDragDropManager();
|
||||||
|
final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();
|
||||||
|
|
||||||
playingQueueAdapter = new PlayingQueueAdapter(
|
playingQueueAdapter = new PlayingQueueAdapter(
|
||||||
((AppCompatActivity) getActivity()),
|
((AppCompatActivity) getActivity()),
|
||||||
MusicPlayerRemote.getPlayingQueue(),
|
MusicPlayerRemote.getPlayingQueue(),
|
||||||
R.layout.item_list,
|
R.layout.item_list,
|
||||||
false,
|
false,
|
||||||
null);
|
null);
|
||||||
recyclerView.setAdapter(playingQueueAdapter);
|
wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(playingQueueAdapter);
|
||||||
|
|
||||||
layoutManager = new LinearLayoutManager(getActivity());
|
layoutManager = new LinearLayoutManager(getActivity());
|
||||||
layoutManager.setChildSize((int) (getResources().getDisplayMetrics().density * 72));
|
layoutManager.setChildSize((int) (getResources().getDisplayMetrics().density * 72));
|
||||||
recyclerView.setLayoutManager(layoutManager);
|
|
||||||
|
|
||||||
setUpDragSort();
|
recyclerView.setLayoutManager(layoutManager);
|
||||||
|
recyclerView.setAdapter(wrappedAdapter);
|
||||||
|
recyclerView.setItemAnimator(animator);
|
||||||
|
|
||||||
|
recyclerViewDragDropManager.attachRecyclerView(recyclerView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -194,23 +229,6 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
|
||||||
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
|
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpDragSort() {
|
|
||||||
DragSortRecycler dragSortRecycler = new DragSortRecycler();
|
|
||||||
dragSortRecycler.setViewHandleId(R.id.image_container);
|
|
||||||
dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() {
|
|
||||||
@Override
|
|
||||||
public void onItemMoved(int from, int to) {
|
|
||||||
if (from == to) return;
|
|
||||||
MusicPlayerRemote.moveSong(from, to);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
recyclerView.addItemDecoration(dragSortRecycler);
|
|
||||||
recyclerView.addOnItemTouchListener(dragSortRecycler);
|
|
||||||
recyclerView.addOnScrollListener(dragSortRecycler.getScrollListener());
|
|
||||||
recyclerView.setItemAnimator(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public int getPaletteColor() {
|
public int getPaletteColor() {
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import android.os.Build;
|
||||||
import android.support.annotation.ColorInt;
|
import android.support.annotation.ColorInt;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v4.view.ViewCompat;
|
||||||
import android.support.v7.view.menu.ListMenuItemView;
|
import android.support.v7.view.menu.ListMenuItemView;
|
||||||
import android.support.v7.view.menu.MenuPopupHelper;
|
import android.support.v7.view.menu.MenuPopupHelper;
|
||||||
import android.support.v7.widget.ActionMenuView;
|
import android.support.v7.widget.ActionMenuView;
|
||||||
|
|
@ -206,4 +207,15 @@ public class ViewUtil {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean hitTest(View v, int x, int y) {
|
||||||
|
final int tx = (int) (ViewCompat.getTranslationX(v) + 0.5f);
|
||||||
|
final int ty = (int) (ViewCompat.getTranslationY(v) + 0.5f);
|
||||||
|
final int left = v.getLeft() + tx;
|
||||||
|
final int right = v.getRight() + tx;
|
||||||
|
final int top = v.getTop() + ty;
|
||||||
|
final int bottom = v.getBottom() + ty;
|
||||||
|
|
||||||
|
return (x >= left) && (x <= right) && (y >= top) && (y <= bottom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue