content: package com.alium.orin.adapter.song;
  
  import android.os.Build;
  import android.support.annotation.NonNull;
  import android.support.annotation.Nullable;
  import android.support.v4.util.Pair;
  import android.support.v7.app.AppCompatActivity;
  import android.view.LayoutInflater;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.ArrayAdapter;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  import com.afollestad.materialcab.MaterialCab;
  import com.alium.orin.glide.SongGlideRequest;
  import com.alium.orin.helper.MusicPlayerRemote;
  import com.alium.orin.helper.menu.SongsMenuHelper;
  import com.alium.orin.interfaces.CabHolder;
  import com.alium.orin.model.Song;
  import com.alium.orin.util.NavigationUtil;
  import com.bumptech.glide.Glide;
  import com.alium.orin.R;
  import com.alium.orin.helper.menu.SongMenuHelper;
  
  import java.util.ArrayList;
  
  /**
   * @author Karim Abou Zeid (kabouzeid)
   */
  public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab.Callback {
      @Nullable
      private final CabHolder cabHolder;
      private MaterialCab cab;
      private ArrayList<Song> dataSet;
      private ArrayList<Song> checked;
  
      @NonNull
      private final AppCompatActivity activity;
  
      public ArtistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList<Song> dataSet, @Nullable CabHolder cabHolder) {
          super(activity, R.layout.item_list, dataSet);
          this.activity = activity;
          this.cabHolder = cabHolder;
          this.dataSet = dataSet;
          checked = new ArrayList<>();
      }
  
      public ArrayList<Song> getDataSet() {
          return dataSet;
      }
  
      public void swapDataSet(ArrayList<Song> dataSet) {
          this.dataSet = dataSet;
          clear();
          addAll(dataSet);
          notifyDataSetChanged();
      }
  
      @Nullable
      @Override
      public View getView(final int position, @Nullable View convertView, ViewGroup parent) {
          final Song song = getItem(position);
          if (convertView == null) {
              convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_list, parent, false);
          }
  
          final TextView songTitle = (TextView) convertView.findViewById(R.id.title);
          final TextView songInfo = (TextView) convertView.findViewById(R.id.text);
          final ImageView albumArt = (ImageView) convertView.findViewById(R.id.image);
          final View shortSeparator = convertView.findViewById(R.id.short_separator);
  
          if (position == getCount() - 1) {
              if (shortSeparator != null) {
                  shortSeparator.setVisibility(View.GONE);
              }
          } else {
              if (shortSeparator != null) {
                  shortSeparator.setVisibility(View.VISIBLE);
              }
          }
  
          songTitle.setText(song.title);
          songInfo.setText(song.albumName);
  
          SongGlideRequest.Builder.from(Glide.with(activity), song)
                  .checkIgnoreMediaStore(activity).build()
                  .into(albumArt);
  
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              albumArt.setTransitionName(activity.getString(R.string.transition_album_art));
          }
  
          final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
          overflowButton.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
              @Override
              public Song getSong() {
                  return song;
              }
  
              @Override
              public boolean onMenuItemClick(MenuItem item) {
                  if (item.getItemId() == R.id.action_go_to_album) {
                      Pair[] albumPairs = new Pair[]{
                              Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
                      };
                      NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
                      return true;
                  }
                  return super.onMenuItemClick(item);
              }
          });
  
          convertView.setActivated(isChecked(song));
          convertView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  if (isInQuickSelectMode()) {
                      toggleChecked(song);
                  } else {
                      MusicPlayerRemote.openQueue(dataSet, position, true);
                  }
              }
          });
          convertView.setOnLongClickListener(new View.OnLongClickListener() {
              @Override
              public boolean onLongClick(View view) {
                  toggleChecked(song);
                  return true;
              }
          });
  
          return convertView;
      }
  
      private void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList<Song> selection) {
          SongsMenuHelper.handleMenuClick(activity, selection, menuItem.getItemId());
      }
  
      protected void toggleChecked(Song song) {
          if (cabHolder != null) {
              openCabIfNecessary();
  
              if (!checked.remove(song)) checked.add(song);
              notifyDataSetChanged();
  
              final int size = checked.size();
              if (size <= 0) cab.finish();
              else if (size == 1) cab.setTitle(checked.get(0).title);
              else if (size > 1) cab.setTitle(String.valueOf(size));
          }
      }
  
      private void openCabIfNecessary() {
          if (cabHolder != null) {
              if (cab == null || !cab.isActive()) {
                  cab = cabHolder.openCab(R.menu.menu_media_selection, this);
              }
          }
      }
  
      private void unCheckAll() {
          checked.clear();
          notifyDataSetChanged();
      }
  
      protected boolean isChecked(Song song) {
          return checked.contains(song);
      }
  
      protected boolean isInQuickSelectMode() {
          return cab != null && cab.isActive();
      }
  
      @Override
      public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
          return true;
      }
  
      @Override
      public boolean onCabItemClicked(@NonNull MenuItem menuItem) {
          onMultipleItemAction(menuItem, new ArrayList<>(checked));
          cab.finish();
          unCheckAll();
          return true;
      }
  
      @Override
      public boolean onCabFinished(MaterialCab materialCab) {
          unCheckAll();
          return true;
      }
  }
  