package com.kabouzeid.gramophone.adapter.song; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; 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.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.ViewUtil; import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) */ public class PlayingQueueAdapter extends SongAdapter implements DraggableItemAdapter<PlayingQueueAdapter.ViewHolder> { private static final int HISTORY = 0; private static final int CURRENT = 1; private static final int UP_NEXT = 2; private int current; public PlayingQueueAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, int current, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { super(activity, dataSet, itemLayoutRes, usePalette, cabHolder); this.current = current; } @Override protected SongAdapter.ViewHolder createViewHolder(View view) { return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull SongAdapter.ViewHolder holder, int position) { super.onBindViewHolder(holder, position); if (holder.imageText != null) { holder.imageText.setText(String.valueOf(position - current)); } if (holder.getItemViewType() == HISTORY || holder.getItemViewType() == CURRENT) { setAlpha(holder, 0.5f); } } @Override public int getItemViewType(int position) { if (position < current) { return HISTORY; } else if (position > current) { return UP_NEXT; } return CURRENT; } @Override protected void loadAlbumCover(Song song, SongAdapter.ViewHolder holder) { // We don't want to load it in this adapter } public void swapDataSet(ArrayList<Song> dataSet, int position) { this.dataSet = dataSet; current = position; notifyDataSetChanged(); } public void setCurrent(int current) { this.current = current; notifyDataSetChanged(); } protected void setAlpha(SongAdapter.ViewHolder holder, float alpha) { if (holder.image != null) { holder.image.setAlpha(alpha); } if (holder.title != null) { holder.title.setAlpha(alpha); } if (holder.text != null) { holder.text.setAlpha(alpha); } if (holder.imageText != null) { holder.imageText.setAlpha(alpha); } if (holder.paletteColorContainer != null) { holder.paletteColorContainer.setAlpha(alpha); } } @Override public boolean onCheckCanStartDrag(ViewHolder holder, int position, int x, int y) { return ViewUtil.hitTest(holder.imageText, x, y); } @Override public ItemDraggableRange onGetItemDraggableRange(ViewHolder holder, int position) { return null; } @Override public void onMoveItem(int fromPosition, int toPosition) { MusicPlayerRemote.moveSong(fromPosition, toPosition); } @Override public boolean onCheckCanDrop(int draggingPosition, int dropPosition) { return true; } public class ViewHolder extends SongAdapter.ViewHolder implements DraggableItemViewHolder { @DraggableItemStateFlags private int mDragStateFlags; public ViewHolder(@NonNull View itemView) { super(itemView); if (imageText != null) { imageText.setVisibility(View.VISIBLE); } if (image != null) { image.setVisibility(View.GONE); } } @Override protected int getSongMenuRes() { return R.menu.menu_item_playing_queue_song; } @Override protected boolean onSongMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_remove_from_playing_queue: MusicPlayerRemote.removeFromQueue(getAdapterPosition()); return true; } return super.onSongMenuItemClick(item); } @Override public void setDragStateFlags(@DraggableItemStateFlags int flags) { mDragStateFlags = flags; } @Override @DraggableItemStateFlags public int getDragStateFlags() { return mDragStateFlags; } } }