diff options
| -rw-r--r-- | core/java/android/widget/TextView.java | 32 |
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'); |