/**
  * Get the list of all the chips in this view
  *
  * @return All the chips in this view
  */
 public ArrayList<Chip> getChips() {
   ArrayList<Chip> ret = new ArrayList<Chip>();
   for (ChipSpan chipSpans :
       Arrays.asList(getText().getSpans(0, getText().length(), ChipSpan.class))) {
     ret.add(chipSpans.getChip());
   }
   return ret;
 }
 /**
  * Get a chip for certain text
  *
  * @param text The text to find in a chip
  * @return The chip that matches, or null
  */
 @Nullable
 public Chip getChip(String text) {
   for (ChipSpan chipSpan : getChipSpans()) {
     if (chipSpan.getChip().getText().equals(text)) {
       return chipSpan.getChip();
     }
   }
   return null;
 }
 @Override
 public final void beforeTextChanged(CharSequence s, int start, int count, int after) {
   if (after < count) {
     if (s instanceof Spanned) {
       ChipSpan[] removed = ((Spanned) s).getSpans(start, start + count, ChipSpan.class);
       for (ChipSpan removedSpan : removed) {
         onChipRemoved(removedSpan.getChip());
       }
     }
   }
 }
 /**
  * Remove the chip from this view
  *
  * @param chip The chip to remove
  * @return Whether or not a chip was removed
  */
 public boolean removeChip(Chip chip) {
   for (ChipSpan chipSpan : getChipSpans()) {
     if (chipSpan.getChip().equals(chip)) {
       int start = getText().getSpanStart(chipSpan);
       Editable editText = getText().replace(start, start + 1, "");
       setText(editText);
       if (mChipChangedListener != null) {
         mChipChangedListener.onChipRemoved(chipSpan.getChip());
       }
       return true;
     }
   }
   return false;
 }