content: package com.alium.orin.adapter.base;
  
  import android.content.Context;
  import android.support.annotation.MenuRes;
  import android.support.annotation.Nullable;
  import android.support.v7.widget.RecyclerView;
  import android.view.Menu;
  import android.view.MenuItem;
  
  import com.afollestad.materialcab.MaterialCab;
  import com.alium.orin.interfaces.CabHolder;
  import com.alium.orin.R;
  
  import java.util.ArrayList;
  
  /**
   * @author Karim Abou Zeid (kabouzeid)
   */
  public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder, I> extends RecyclerView.Adapter<VH> implements MaterialCab.Callback {
      @Nullable
      private final CabHolder cabHolder;
      private MaterialCab cab;
      private ArrayList<I> checked;
      private int menuRes;
      private final Context context;
  
      public AbsMultiSelectAdapter(Context context, @Nullable CabHolder cabHolder, @MenuRes int menuRes) {
          this.cabHolder = cabHolder;
          checked = new ArrayList<>();
          this.menuRes = menuRes;
          this.context = context;
      }
  
      protected void overrideMultiSelectMenuRes(@MenuRes int menuRes) {
          this.menuRes = menuRes;
      }
  
      protected boolean toggleChecked(final int position) {
          if (cabHolder != null) {
              openCabIfNecessary();
  
              I identifier = getIdentifier(position);
              if (!checked.remove(identifier)) checked.add(identifier);
              notifyItemChanged(position);
  
              final int size = checked.size();
              if (size <= 0) cab.finish();
              else if (size == 1) cab.setTitle(getName(checked.get(0)));
              else if (size > 1) cab.setTitle(context.getString(R.string.x_selected, size));
  
              return true;
          }
          return false;
      }
  
      private void openCabIfNecessary() {
          if (cabHolder != null) {
              if (cab == null || !cab.isActive()) {
                  cab = cabHolder.openCab(menuRes, this);
              }
          }
      }
  
      private void unCheckAll() {
          checked.clear();
          notifyDataSetChanged();
      }
  
      protected boolean isChecked(I identifier) {
          return checked.contains(identifier);
      }
  
      protected boolean isInQuickSelectMode() {
          return cab != null && cab.isActive();
      }
  
      @Override
      public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
          return true;
      }
  
      @Override
      public boolean onCabItemClicked(MenuItem menuItem) {
          onMultipleItemAction(menuItem, new ArrayList<>(checked));
          cab.finish();
          unCheckAll();
          return true;
      }
  
      @Override
      public boolean onCabFinished(MaterialCab materialCab) {
          unCheckAll();
          return true;
      }
  
      protected String getName(I object) {
          return object.toString();
      }
  
      protected abstract I getIdentifier(int position);
  
      protected abstract void onMultipleItemAction(MenuItem menuItem, ArrayList<I> selection);
  }
  