Merge "DO NOT MERGE - Temporary fix to disable augmented autofill requests coming from password fields." into qt-dev
This commit is contained in:
@@ -71,12 +71,21 @@ public final class FillRequest implements Parcelable {
|
|||||||
*/
|
*/
|
||||||
public static final int FLAG_COMPATIBILITY_MODE_REQUEST = 0x2;
|
public static final 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 */
|
/** @hide */
|
||||||
public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
|
public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
|
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
|
||||||
FLAG_MANUAL_REQUEST, FLAG_COMPATIBILITY_MODE_REQUEST
|
FLAG_MANUAL_REQUEST, FLAG_COMPATIBILITY_MODE_REQUEST, FLAG_PASSWORD_INPUT_TYPE
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@interface RequestFlags{}
|
@interface RequestFlags{}
|
||||||
@@ -100,7 +109,7 @@ public final class FillRequest implements Parcelable {
|
|||||||
@Nullable Bundle clientState, @RequestFlags int flags) {
|
@Nullable Bundle clientState, @RequestFlags int flags) {
|
||||||
mId = id;
|
mId = id;
|
||||||
mFlags = Preconditions.checkFlagsArgument(flags,
|
mFlags = Preconditions.checkFlagsArgument(flags,
|
||||||
FLAG_MANUAL_REQUEST | FLAG_COMPATIBILITY_MODE_REQUEST);
|
FLAG_MANUAL_REQUEST | FLAG_COMPATIBILITY_MODE_REQUEST | FLAG_PASSWORD_INPUT_TYPE);
|
||||||
mContexts = Preconditions.checkCollectionElementsNotNull(contexts, "contexts");
|
mContexts = Preconditions.checkCollectionElementsNotNull(contexts, "contexts");
|
||||||
mClientState = clientState;
|
mClientState = clientState;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package android.view.autofill;
|
package android.view.autofill;
|
||||||
|
|
||||||
import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
|
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.sDebug;
|
||||||
import static android.view.autofill.Helper.sVerbose;
|
import static android.view.autofill.Helper.sVerbose;
|
||||||
import static android.view.autofill.Helper.toList;
|
import static android.view.autofill.Helper.toList;
|
||||||
@@ -60,6 +61,7 @@ import android.view.accessibility.AccessibilityManager;
|
|||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
import android.view.accessibility.AccessibilityNodeProvider;
|
import android.view.accessibility.AccessibilityNodeProvider;
|
||||||
import android.view.accessibility.AccessibilityWindowInfo;
|
import android.view.accessibility.AccessibilityWindowInfo;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.logging.MetricsLogger;
|
import com.android.internal.logging.MetricsLogger;
|
||||||
@@ -966,6 +968,10 @@ public final class AutofillManager {
|
|||||||
if (!isClientDisablingEnterExitEvent()) {
|
if (!isClientDisablingEnterExitEvent()) {
|
||||||
final AutofillValue value = view.getAutofillValue();
|
final AutofillValue value = view.getAutofillValue();
|
||||||
|
|
||||||
|
if (view instanceof TextView && ((TextView) view).isAnyPasswordInputType()) {
|
||||||
|
flags |= FLAG_PASSWORD_INPUT_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isActiveLocked()) {
|
if (!isActiveLocked()) {
|
||||||
// Starts new session.
|
// Starts new session.
|
||||||
startSessionLocked(id, null, value, flags);
|
startSessionLocked(id, null, value, flags);
|
||||||
@@ -1130,6 +1136,10 @@ public final class AutofillManager {
|
|||||||
} else {
|
} else {
|
||||||
// don't notify entered when Activity is already in background
|
// don't notify entered when Activity is already in background
|
||||||
if (!isClientDisablingEnterExitEvent()) {
|
if (!isClientDisablingEnterExitEvent()) {
|
||||||
|
if (view instanceof TextView && ((TextView) view).isAnyPasswordInputType()) {
|
||||||
|
flags |= FLAG_PASSWORD_INPUT_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isActiveLocked()) {
|
if (!isActiveLocked()) {
|
||||||
// Starts new session.
|
// Starts new session.
|
||||||
startSessionLocked(id, bounds, null, flags);
|
startSessionLocked(id, bounds, null, flags);
|
||||||
|
|||||||
@@ -6577,6 +6577,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
return mTransformation instanceof PasswordTransformationMethod;
|
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) {
|
static boolean isPasswordInputType(int inputType) {
|
||||||
final int variation =
|
final int variation =
|
||||||
inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
|
inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.android.server.autofill;
|
|||||||
|
|
||||||
import static android.service.autofill.AutofillFieldClassificationService.EXTRA_SCORES;
|
import static android.service.autofill.AutofillFieldClassificationService.EXTRA_SCORES;
|
||||||
import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
|
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.service.autofill.FillRequest.INVALID_REQUEST_ID;
|
||||||
import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
|
import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
|
||||||
import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED;
|
import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED;
|
||||||
@@ -581,7 +582,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
+ ", flags=" + flags + ")");
|
+ ", flags=" + flags + ")");
|
||||||
}
|
}
|
||||||
mForAugmentedAutofillOnly = true;
|
mForAugmentedAutofillOnly = true;
|
||||||
triggerAugmentedAutofillLocked();
|
triggerAugmentedAutofillLocked(flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
viewState.setState(newState);
|
viewState.setState(newState);
|
||||||
@@ -780,7 +781,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
id, mCompatMode);
|
id, mCompatMode);
|
||||||
}
|
}
|
||||||
// Although "standard" autofill is disabled, it might still trigger augmented autofill
|
// Although "standard" autofill is disabled, it might still trigger augmented autofill
|
||||||
if (triggerAugmentedAutofillLocked() != null) {
|
if (triggerAugmentedAutofillLocked(requestFlags) != null) {
|
||||||
mForAugmentedAutofillOnly = true;
|
mForAugmentedAutofillOnly = true;
|
||||||
if (sDebug) {
|
if (sDebug) {
|
||||||
Slog.d(TAG, "Service disabled autofill for " + mComponentName
|
Slog.d(TAG, "Service disabled autofill for " + mComponentName
|
||||||
@@ -2422,7 +2423,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
if (sDebug) Slog.d(TAG, "updateLocked(" + id + "): augmented-autofillable");
|
if (sDebug) Slog.d(TAG, "updateLocked(" + id + "): augmented-autofillable");
|
||||||
|
|
||||||
// ...then trigger the augmented autofill UI
|
// ...then trigger the augmented autofill UI
|
||||||
triggerAugmentedAutofillLocked();
|
triggerAugmentedAutofillLocked(flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2686,8 +2687,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
|
|
||||||
// The default autofill service cannot fullfill the request, let's check if the augmented
|
// The default autofill service cannot fullfill the request, let's check if the augmented
|
||||||
// autofill service can.
|
// autofill service can.
|
||||||
mAugmentedAutofillDestroyer = triggerAugmentedAutofillLocked();
|
mAugmentedAutofillDestroyer = triggerAugmentedAutofillLocked(flags);
|
||||||
if (mAugmentedAutofillDestroyer == null) {
|
if (mAugmentedAutofillDestroyer == null && ((flags & FLAG_PASSWORD_INPUT_TYPE) == 0)) {
|
||||||
if (sVerbose) {
|
if (sVerbose) {
|
||||||
Slog.v(TAG, "canceling session " + id + " when service returned null and it cannot "
|
Slog.v(TAG, "canceling session " + id + " when service returned null and it cannot "
|
||||||
+ "be augmented. AutofillableIds: " + autofillableIds);
|
+ "be augmented. AutofillableIds: " + autofillableIds);
|
||||||
@@ -2697,9 +2698,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
removeSelf();
|
removeSelf();
|
||||||
} else {
|
} else {
|
||||||
if (sVerbose) {
|
if (sVerbose) {
|
||||||
|
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 "
|
Slog.v(TAG, "keeping session " + id + " when service returned null but "
|
||||||
+ "it can be augmented. AutofillableIds: " + autofillableIds);
|
+ "it can be augmented. AutofillableIds: " + autofillableIds);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
mAugmentedAutofillableIds = autofillableIds;
|
mAugmentedAutofillableIds = autofillableIds;
|
||||||
try {
|
try {
|
||||||
mClient.setState(AutofillManager.SET_STATE_FLAG_FOR_AUTOFILL_ONLY);
|
mClient.setState(AutofillManager.SET_STATE_FLAG_FOR_AUTOFILL_ONLY);
|
||||||
@@ -2717,7 +2724,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
|
// 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)
|
// non-null response but without datasets (for example, just SaveInfo)
|
||||||
@GuardedBy("mLock")
|
@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...
|
// Check if Smart Suggestions is supported...
|
||||||
final @SmartSuggestionMode int supportedModes = mService
|
final @SmartSuggestionMode int supportedModes = mService
|
||||||
.getSupportedSmartSuggestionModesLocked();
|
.getSupportedSmartSuggestionModesLocked();
|
||||||
|
|||||||
Reference in New Issue
Block a user