content: package com.alium.orin.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.alium.orin.helper.MusicPlayerRemote;
  import com.alium.orin.interfaces.CabHolder;
  import com.alium.orin.model.Song;
  import com.alium.orin.util.ViewUtil;
  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.alium.orin.R;
  
  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;
          }
      }
  }
  