@Override
 public void addTextChangedListener(TextWatcher watcher) {
   // Some flavors of Android call addTextChangedListener in the constructor, so add a
   // null check to mTextWatchers
   if (watcher.equals(mTextWatcher) || mTextWatchers == null) {
     super.addTextChangedListener(watcher);
   } else {
     mTextWatchers.add(watcher);
   }
 }
 @Override
 public void setText(CharSequence text, BufferType type) {
   if (mTextWatchersEnabled) {
     for (TextWatcher textWatcher : mTextWatchers) {
       textWatcher.beforeTextChanged(getCleanText(), 0, 0, 0);
     }
   }
   super.setText(text, type);
   if (text != null && !mIsInserting) {
     setSelection(getText().length());
   }
   invalidateTextSize();
   if (mTextWatchersEnabled) {
     for (TextWatcher textWatcher : mTextWatchers) {
       textWatcher.afterTextChanged(getEditableFactory().newEditable(getCleanText()));
       textWatcher.onTextChanged(getCleanText(), 0, 0, 0);
     }
   }
 }
 @Override
 public void setSelection(int index) {
   super.setSelection(Math.max(0, Math.min(getText().length(), index)));
 }