code: private boolean onCursorChanged(final int index) {
          Editable text = getText();
          if (text == null) {
              return false;
          }
  
          MentionSpan[] allSpans = text.getSpans(0, text.length(), MentionSpan.class);
          for (MentionSpan span : allSpans) {
              // Deselect span if the cursor is not on the span.
              if (span.isSelected() && (index < text.getSpanStart(span) || index > text.getSpanEnd(span))) {
                  span.setSelected(false);
                  updateSpan(span);
              }
          }
  
          // Do not allow the user to set the cursor within a span. If the user tries to do so, select
          // move the cursor to the end of it.
          MentionSpan[] currentSpans = text.getSpans(index, index, MentionSpan.class);
          if (currentSpans.length != 0) {
              MentionSpan span = currentSpans[0];
              int start = text.getSpanStart(span);
              int end = text.getSpanEnd(span);
              if (index > start && index < end) {
                  super.setSelection(end);
                  return true;
              }
          }
  
          return false;
      }
docs: Method to handle the cursor changing positions. Returns true if handled, false if it should
  be passed to the super method.
  
  @param index int position of cursor within the text
  
  @return true if handled