summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/TextView.java32
1 files changed, 28 insertions, 4 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 9080f96b7dc4..d719783d075e 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -2956,6 +2956,25 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (imm != null) imm.restartInput(this);
}
+ /**
+ * It would be better to rely on the input type for everything. A password inputType should have
+ * a password transformation. We should hence use isPasswordInputType instead of this method.
+ *
+ * We should:
+ * - Call setInputType in setKeyListener instead of changing the input type directly (which
+ * would install the correct transformation).
+ * - Refuse the installation of a non-password transformation in setTransformation if the input
+ * type is password.
+ *
+ * However, this is like this for legacy reasons and we cannot break existing apps. This method
+ * is useful since it matches what the user can see (obfuscated text or not).
+ *
+ * @return true if the current transformation method is of the password type.
+ */
+ private boolean hasPasswordTransformationMethod() {
+ return mTransformation instanceof PasswordTransformationMethod;
+ }
+
private boolean isPasswordInputType(int inputType) {
final int variation = inputType & (EditorInfo.TYPE_MASK_CLASS
| EditorInfo.TYPE_MASK_VARIATION);
@@ -7135,7 +7154,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
private boolean canCut() {
- if (mTransformation instanceof PasswordTransformationMethod) {
+ if (hasPasswordTransformationMethod()) {
return false;
}
@@ -7149,7 +7168,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
private boolean canCopy() {
- if (mTransformation instanceof PasswordTransformationMethod) {
+ if (hasPasswordTransformationMethod()) {
return false;
}
@@ -7398,8 +7417,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
MenuHandler handler = new MenuHandler();
if (canSelectText()) {
- menu.add(0, ID_START_SELECTING_TEXT, 0, com.android.internal.R.string.selectText).
- setOnMenuItemClickListener(handler);
+ if (!hasPasswordTransformationMethod()) {
+ // selectCurrentWord is not available on a password field and would return an
+ // arbitrary 10-charater selection around pressed position. Discard it.
+ // SelectAll is still useful to be able to clear the field using the delete key.
+ menu.add(0, ID_START_SELECTING_TEXT, 0, com.android.internal.R.string.selectText).
+ setOnMenuItemClickListener(handler);
+ }
menu.add(0, ID_SELECT_ALL, 0, com.android.internal.R.string.selectAll).
setOnMenuItemClickListener(handler).
setAlphabeticShortcut('a');