Loading core/java/android/text/LoginFilter.java +19 −22 Original line number Diff line number Diff line Loading @@ -49,10 +49,6 @@ public abstract class LoginFilter implements InputFilter { */ public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { char[] out = new char[end - start]; // reserve enough space for whole string int outidx = 0; boolean changed = false; onStart(); // Scan through beginning characters in dest, calling onInvalidCharacter() Loading @@ -63,14 +59,26 @@ public abstract class LoginFilter implements InputFilter { } // Scan through changed characters rejecting disallowed chars SpannableStringBuilder modification = null; int modoff = 0; for (int i = start; i < end; i++) { char c = source.charAt(i); if (isAllowed(c)) { // Character allowed. Add it to the sequence. out[outidx++] = c; // Character allowed. modoff++; } else { if (mAppendInvalid) { modoff++; } else { if (mAppendInvalid) out[outidx++] = c; else changed = true; // we changed the original string if (modification == null) { modification = new SpannableStringBuilder(source, start, end); modoff = i - start; } modification.delete(modoff, modoff + 1); } onInvalidCharacter(c); } } Loading @@ -84,20 +92,9 @@ public abstract class LoginFilter implements InputFilter { onStop(); if (!changed) { return null; } String s = new String(out, 0, outidx); if (source instanceof Spanned) { SpannableString sp = new SpannableString(s); TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0); return sp; } else { return s; } // Either returns null if we made no changes, // or what we wanted to change it to if there were changes. return modification; } /** Loading core/java/android/text/TextUtils.java +11 −0 Original line number Diff line number Diff line Loading @@ -916,6 +916,17 @@ public class TextUtils { sp.setSpan(o, p.readInt(), p.readInt(), p.readInt()); } /** * Copies the spans from the region <code>start...end</code> in * <code>source</code> to the region * <code>destoff...destoff+end-start</code> in <code>dest</code>. * Spans in <code>source</code> that begin before <code>start</code> * or end after <code>end</code> but overlap this range are trimmed * as if they began at <code>start</code> or ended at <code>end</code>. * * @throws IndexOutOfBoundsException if any of the copied spans * are out of range in <code>dest</code>. */ public static void copySpansFrom(Spanned source, int start, int end, Class kind, Spannable dest, int destoff) { Loading core/java/android/widget/AutoCompleteTextView.java +2 −0 Original line number Diff line number Diff line Loading @@ -950,6 +950,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe * @param text the selected suggestion in the drop down list */ protected void replaceText(CharSequence text) { clearComposingText(); setText(text); // make sure we keep the caret at the end of the text view Editable spannable = getText(); Loading core/java/android/widget/MultiAutoCompleteTextView.java +2 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,8 @@ public class MultiAutoCompleteTextView extends AutoCompleteTextView { */ @Override protected void replaceText(CharSequence text) { clearComposingText(); int end = getSelectionEnd(); int start = mTokenizer.findTokenStart(getText(), end); Loading Loading
core/java/android/text/LoginFilter.java +19 −22 Original line number Diff line number Diff line Loading @@ -49,10 +49,6 @@ public abstract class LoginFilter implements InputFilter { */ public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { char[] out = new char[end - start]; // reserve enough space for whole string int outidx = 0; boolean changed = false; onStart(); // Scan through beginning characters in dest, calling onInvalidCharacter() Loading @@ -63,14 +59,26 @@ public abstract class LoginFilter implements InputFilter { } // Scan through changed characters rejecting disallowed chars SpannableStringBuilder modification = null; int modoff = 0; for (int i = start; i < end; i++) { char c = source.charAt(i); if (isAllowed(c)) { // Character allowed. Add it to the sequence. out[outidx++] = c; // Character allowed. modoff++; } else { if (mAppendInvalid) { modoff++; } else { if (mAppendInvalid) out[outidx++] = c; else changed = true; // we changed the original string if (modification == null) { modification = new SpannableStringBuilder(source, start, end); modoff = i - start; } modification.delete(modoff, modoff + 1); } onInvalidCharacter(c); } } Loading @@ -84,20 +92,9 @@ public abstract class LoginFilter implements InputFilter { onStop(); if (!changed) { return null; } String s = new String(out, 0, outidx); if (source instanceof Spanned) { SpannableString sp = new SpannableString(s); TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0); return sp; } else { return s; } // Either returns null if we made no changes, // or what we wanted to change it to if there were changes. return modification; } /** Loading
core/java/android/text/TextUtils.java +11 −0 Original line number Diff line number Diff line Loading @@ -916,6 +916,17 @@ public class TextUtils { sp.setSpan(o, p.readInt(), p.readInt(), p.readInt()); } /** * Copies the spans from the region <code>start...end</code> in * <code>source</code> to the region * <code>destoff...destoff+end-start</code> in <code>dest</code>. * Spans in <code>source</code> that begin before <code>start</code> * or end after <code>end</code> but overlap this range are trimmed * as if they began at <code>start</code> or ended at <code>end</code>. * * @throws IndexOutOfBoundsException if any of the copied spans * are out of range in <code>dest</code>. */ public static void copySpansFrom(Spanned source, int start, int end, Class kind, Spannable dest, int destoff) { Loading
core/java/android/widget/AutoCompleteTextView.java +2 −0 Original line number Diff line number Diff line Loading @@ -950,6 +950,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe * @param text the selected suggestion in the drop down list */ protected void replaceText(CharSequence text) { clearComposingText(); setText(text); // make sure we keep the caret at the end of the text view Editable spannable = getText(); Loading
core/java/android/widget/MultiAutoCompleteTextView.java +2 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,8 @@ public class MultiAutoCompleteTextView extends AutoCompleteTextView { */ @Override protected void replaceText(CharSequence text) { clearComposingText(); int end = getSelectionEnd(); int start = mTokenizer.findTokenStart(getText(), end); Loading