summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilles Debunne <debunne@google.com>2010-11-30 12:05:55 -0800
committerGilles Debunne <debunne@google.com>2010-11-30 12:51:24 -0800
commit8e06a63099ffe55f49c5a81aa13113c5c24f78cf (patch)
tree62197abfb0858c7ce6099525a4a4c20490e08221
parent399ac12c1133fcad34965160c14a2a4b206fc491 (diff)
downloadframeworks_base-8e06a63099ffe55f49c5a81aa13113c5c24f78cf.zip
frameworks_base-8e06a63099ffe55f49c5a81aa13113c5c24f78cf.tar.gz
frameworks_base-8e06a63099ffe55f49c5a81aa13113c5c24f78cf.tar.bz2
Selection in URL, email, phone, date, numbers selects all
Change-Id: Ide3603404f356564e294b7698b52c2d55e314db9
-rw-r--r--core/java/android/widget/TextView.java81
1 files changed, 33 insertions, 48 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 39a2d94..57af643 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -7450,6 +7450,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
hasPrimaryClip());
}
+ private boolean isWordCharacter(int position) {
+ final char c = mTransformed.charAt(position);
+ final int type = Character.getType(c);
+ return (c == '\'' || c == '"' ||
+ type == Character.UPPERCASE_LETTER ||
+ type == Character.LOWERCASE_LETTER ||
+ type == Character.TITLECASE_LETTER ||
+ type == Character.MODIFIER_LETTER ||
+ type == Character.DECIMAL_DIGIT_NUMBER);
+ }
+
/**
* Returns the offsets delimiting the 'word' located at position offset.
*
@@ -7459,77 +7470,51 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* Returns a negative value if no valid word was found.
*/
private long getWordLimitsAt(int offset) {
- /*
- * Quick return if the input type is one where adding words
- * to the dictionary doesn't make any sense.
- */
int klass = mInputType & InputType.TYPE_MASK_CLASS;
- if (klass == InputType.TYPE_CLASS_NUMBER ||
- klass == InputType.TYPE_CLASS_PHONE ||
- klass == InputType.TYPE_CLASS_DATETIME) {
+ int variation = mInputType & InputType.TYPE_MASK_VARIATION;
+
+ // Text selection is not permitted in password fields
+ if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
+ variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD ||
+ variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
return -1;
}
- int variation = mInputType & InputType.TYPE_MASK_VARIATION;
- if (variation == InputType.TYPE_TEXT_VARIATION_URI ||
- variation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
- variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD ||
- variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ||
- variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS ||
- variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS ||
- variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
- return -1;
+ final int len = mText.length();
+
+ // Specific text fields: always select the entire text
+ if (klass == InputType.TYPE_CLASS_NUMBER ||
+ klass == InputType.TYPE_CLASS_PHONE ||
+ klass == InputType.TYPE_CLASS_DATETIME ||
+ variation == InputType.TYPE_TEXT_VARIATION_URI ||
+ variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS ||
+ variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS ||
+ variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
+ return len > 0 ? packRangeInLong(0, len) : -1;
}
- int len = mText.length();
int end = Math.min(offset, len);
-
if (end < 0) {
return -1;
}
+ final int MAX_LENGTH = 48;
int start = end;
for (; start > 0; start--) {
- char c = mTransformed.charAt(start - 1);
- int type = Character.getType(c);
-
- // Cases where the text ends with a '.' and we select from the end of the line (right
- // after the dot), or when we select from the space character in "aaaa, bbbb".
- if (start == end && type == Character.OTHER_PUNCTUATION) continue;
-
- if (c != '\'' &&
- type != Character.UPPERCASE_LETTER &&
- type != Character.LOWERCASE_LETTER &&
- type != Character.TITLECASE_LETTER &&
- type != Character.MODIFIER_LETTER &&
- type != Character.DECIMAL_DIGIT_NUMBER) {
- break;
- }
+ if (!isWordCharacter(start - 1)) break;
+ if ((end - start) > MAX_LENGTH) return -1;
}
for (; end < len; end++) {
- char c = mTransformed.charAt(end);
- int type = Character.getType(c);
-
- if (c != '\'' &&
- type != Character.UPPERCASE_LETTER &&
- type != Character.LOWERCASE_LETTER &&
- type != Character.TITLECASE_LETTER &&
- type != Character.MODIFIER_LETTER &&
- type != Character.DECIMAL_DIGIT_NUMBER) {
- break;
- }
+ if (!isWordCharacter(end)) break;
+ if ((end - start) > MAX_LENGTH) return -1;
}
if (start == end) {
return -1;
}
- if (end - start > 48) {
- return -1;
- }
-
boolean hasLetter = false;
for (int i = start; i < end; i++) {
if (Character.isLetter(mTransformed.charAt(i))) {