diff options
| -rw-r--r-- | core/java/android/service/autofill/FillRequest.java | 24 | ||||
| -rw-r--r-- | core/java/android/view/autofill/AutofillManager.java | 10 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 10 | ||||
| -rw-r--r-- | services/autofill/java/com/android/server/autofill/Session.java | 28 |
4 files changed, 59 insertions, 13 deletions
diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java index 72e9ad047ed7..8f858d547b1f 100644 --- a/core/java/android/service/autofill/FillRequest.java +++ b/core/java/android/service/autofill/FillRequest.java @@ -77,6 +77,15 @@ public final class FillRequest implements Parcelable { */ public static final @RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST = 0x2; + /** + * Indicates the request came from a password field. + * + * (TODO: b/141703197) Temporary fix for augmented autofill showing passwords. + * + * @hide + */ + public static final @RequestFlags int FLAG_PASSWORD_INPUT_TYPE = 0x4; + /** @hide */ public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE; @@ -149,7 +158,8 @@ public final class FillRequest implements Parcelable { /** @hide */ @IntDef(flag = true, prefix = "FLAG_", value = { FLAG_MANUAL_REQUEST, - FLAG_COMPATIBILITY_MODE_REQUEST + FLAG_COMPATIBILITY_MODE_REQUEST, + FLAG_PASSWORD_INPUT_TYPE }) @Retention(RetentionPolicy.SOURCE) @DataClass.Generated.Member @@ -169,6 +179,8 @@ public final class FillRequest implements Parcelable { return "FLAG_MANUAL_REQUEST"; case FLAG_COMPATIBILITY_MODE_REQUEST: return "FLAG_COMPATIBILITY_MODE_REQUEST"; + case FLAG_PASSWORD_INPUT_TYPE: + return "FLAG_PASSWORD_INPUT_TYPE"; default: return Integer.toHexString(value); } } @@ -223,7 +235,8 @@ public final class FillRequest implements Parcelable { Preconditions.checkFlagsArgument( mFlags, FLAG_MANUAL_REQUEST - | FLAG_COMPATIBILITY_MODE_REQUEST); + | FLAG_COMPATIBILITY_MODE_REQUEST + | FLAG_PASSWORD_INPUT_TYPE); this.mInlineSuggestionsRequest = inlineSuggestionsRequest; onConstructed(); @@ -352,7 +365,8 @@ public final class FillRequest implements Parcelable { Preconditions.checkFlagsArgument( mFlags, FLAG_MANUAL_REQUEST - | FLAG_COMPATIBILITY_MODE_REQUEST); + | FLAG_COMPATIBILITY_MODE_REQUEST + | FLAG_PASSWORD_INPUT_TYPE); this.mInlineSuggestionsRequest = inlineSuggestionsRequest; onConstructed(); @@ -373,10 +387,10 @@ public final class FillRequest implements Parcelable { }; @DataClass.Generated( - time = 1575928271155L, + time = 1583196707026L, codegenVersion = "1.0.14", sourceFile = "frameworks/base/core/java/android/service/autofill/FillRequest.java", - inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)") + inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)") @Deprecated private void __metadata() {} diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index ce7cfa71e9a9..dda4e8b63a91 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -17,6 +17,7 @@ package android.view.autofill; import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; +import static android.service.autofill.FillRequest.FLAG_PASSWORD_INPUT_TYPE; import static android.view.autofill.Helper.sDebug; import static android.view.autofill.Helper.sVerbose; import static android.view.autofill.Helper.toList; @@ -63,6 +64,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeProvider; import android.view.accessibility.AccessibilityWindowInfo; import android.widget.EditText; +import android.widget.TextView; import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; @@ -983,6 +985,10 @@ public final class AutofillManager { if (!isClientDisablingEnterExitEvent()) { final AutofillValue value = view.getAutofillValue(); + if (view instanceof TextView && ((TextView) view).isAnyPasswordInputType()) { + flags |= FLAG_PASSWORD_INPUT_TYPE; + } + if (!isActiveLocked()) { // Starts new session. startSessionLocked(id, null, value, flags); @@ -1149,6 +1155,10 @@ public final class AutofillManager { } else { // don't notify entered when Activity is already in background if (!isClientDisablingEnterExitEvent()) { + if (view instanceof TextView && ((TextView) view).isAnyPasswordInputType()) { + flags |= FLAG_PASSWORD_INPUT_TYPE; + } + if (!isActiveLocked()) { // Starts new session. startSessionLocked(id, bounds, null, flags); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 0d820654377c..2168018e12be 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6607,6 +6607,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return mTransformation instanceof PasswordTransformationMethod; } + /** + * Returns true if the current inputType is any type of password. + * + * @hide + */ + public boolean isAnyPasswordInputType() { + final int inputType = getInputType(); + return isPasswordInputType(inputType) || isVisiblePasswordInputType(inputType); + } + static boolean isPasswordInputType(int inputType) { final int variation = inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION); diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 538082d2f67e..826500952e60 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -18,6 +18,7 @@ package com.android.server.autofill; import static android.service.autofill.AutofillFieldClassificationService.EXTRA_SCORES; import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; +import static android.service.autofill.FillRequest.FLAG_PASSWORD_INPUT_TYPE; import static android.service.autofill.FillRequest.INVALID_REQUEST_ID; import static android.view.autofill.AutofillManager.ACTION_RESPONSE_EXPIRED; import static android.view.autofill.AutofillManager.ACTION_START_SESSION; @@ -624,7 +625,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState + ", flags=" + flags + ")"); } mForAugmentedAutofillOnly = true; - triggerAugmentedAutofillLocked(); + triggerAugmentedAutofillLocked(flags); return; } @@ -834,7 +835,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } // Although "standard" autofill is disabled, it might still trigger augmented autofill - if (triggerAugmentedAutofillLocked() != null) { + if (triggerAugmentedAutofillLocked(requestFlags) != null) { mForAugmentedAutofillOnly = true; if (sDebug) { Slog.d(TAG, "Service disabled autofill for " + mComponentName @@ -2465,7 +2466,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // triggered augmented autofill if (!isSameViewEntered) { if (sDebug) Slog.d(TAG, "trigger augmented autofill."); - triggerAugmentedAutofillLocked(); + triggerAugmentedAutofillLocked(flags); } else { if (sDebug) Slog.d(TAG, "skip augmented autofill for same view."); } @@ -2863,8 +2864,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // The default autofill service cannot fullfill the request, let's check if the augmented // autofill service can. - mAugmentedAutofillDestroyer = triggerAugmentedAutofillLocked(); - if (mAugmentedAutofillDestroyer == null) { + mAugmentedAutofillDestroyer = triggerAugmentedAutofillLocked(flags); + if (mAugmentedAutofillDestroyer == null && ((flags & FLAG_PASSWORD_INPUT_TYPE) == 0)) { if (sVerbose) { Slog.v(TAG, "canceling session " + id + " when service returned null and it cannot " + "be augmented. AutofillableIds: " + autofillableIds); @@ -2874,8 +2875,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState removeSelf(); } else { if (sVerbose) { - Slog.v(TAG, "keeping session " + id + " when service returned null but " - + "it can be augmented. AutofillableIds: " + autofillableIds); + if ((flags & FLAG_PASSWORD_INPUT_TYPE) != 0) { + Slog.v(TAG, "keeping session " + id + " when service returned null and " + + "augmented service is disabled for password fields. " + + "AutofillableIds: " + autofillableIds); + } else { + Slog.v(TAG, "keeping session " + id + " when service returned null but " + + "it can be augmented. AutofillableIds: " + autofillableIds); + } } mAugmentedAutofillableIds = autofillableIds; try { @@ -2894,7 +2901,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // TODO(b/123099468): might need to call it in other places, like when the service returns a // non-null response but without datasets (for example, just SaveInfo) @GuardedBy("mLock") - private Runnable triggerAugmentedAutofillLocked() { + private Runnable triggerAugmentedAutofillLocked(int flags) { + // (TODO: b/141703197) Fix later by passing info to service. + if ((flags & FLAG_PASSWORD_INPUT_TYPE) != 0) { + return null; + } + // Check if Smart Suggestions is supported... final @SmartSuggestionMode int supportedModes = mService .getSupportedSmartSuggestionModesLocked(); |