package com.kabouzeid.gramophone.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.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.interfaces.CabHolder; 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); }