diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java
index d94160c2b40ca..62becc5074042 100644
--- a/core/java/android/service/autofill/FillRequest.java
+++ b/core/java/android/service/autofill/FillRequest.java
@@ -86,6 +86,16 @@ public final class FillRequest implements Parcelable {
*/
public static final @RequestFlags int FLAG_PASSWORD_INPUT_TYPE = 0x4;
+ /**
+ * Indicates the view was not focused.
+ *
+ *
Note: Defines the flag value to 0x10, because the flag value 0x08 has been defined
+ * in {@link AutofillManager}.
+ *
+ * @hide
+ */
+ public static final @RequestFlags int FLAG_VIEW_NOT_FOCUSED = 0x10;
+
/** @hide */
public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
@@ -165,7 +175,8 @@ public final class FillRequest implements Parcelable {
@IntDef(flag = true, prefix = "FLAG_", value = {
FLAG_MANUAL_REQUEST,
FLAG_COMPATIBILITY_MODE_REQUEST,
- FLAG_PASSWORD_INPUT_TYPE
+ FLAG_PASSWORD_INPUT_TYPE,
+ FLAG_VIEW_NOT_FOCUSED
})
@Retention(RetentionPolicy.SOURCE)
@DataClass.Generated.Member
@@ -187,6 +198,8 @@ public final class FillRequest implements Parcelable {
return "FLAG_COMPATIBILITY_MODE_REQUEST";
case FLAG_PASSWORD_INPUT_TYPE:
return "FLAG_PASSWORD_INPUT_TYPE";
+ case FLAG_VIEW_NOT_FOCUSED:
+ return "FLAG_VIEW_NOT_FOCUSED";
default: return Integer.toHexString(value);
}
}
@@ -248,7 +261,8 @@ public final class FillRequest implements Parcelable {
mFlags,
FLAG_MANUAL_REQUEST
| FLAG_COMPATIBILITY_MODE_REQUEST
- | FLAG_PASSWORD_INPUT_TYPE);
+ | FLAG_PASSWORD_INPUT_TYPE
+ | FLAG_VIEW_NOT_FOCUSED);
this.mInlineSuggestionsRequest = inlineSuggestionsRequest;
onConstructed();
@@ -384,7 +398,8 @@ public final class FillRequest implements Parcelable {
mFlags,
FLAG_MANUAL_REQUEST
| FLAG_COMPATIBILITY_MODE_REQUEST
- | FLAG_PASSWORD_INPUT_TYPE);
+ | FLAG_PASSWORD_INPUT_TYPE
+ | FLAG_VIEW_NOT_FOCUSED);
this.mInlineSuggestionsRequest = inlineSuggestionsRequest;
onConstructed();
@@ -405,10 +420,10 @@ public final class FillRequest implements Parcelable {
};
@DataClass.Generated(
- time = 1588119440090L,
+ time = 1589280816805L,
codegenVersion = "1.0.15",
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 @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 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 @android.service.autofill.FillRequest.RequestFlags int FLAG_VIEW_NOT_FOCUSED\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List 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 76fe6b5f666d9..553e3c8c2d1b5 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -18,6 +18,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.service.autofill.FillRequest.FLAG_VIEW_NOT_FOCUSED;
import static android.view.autofill.Helper.sDebug;
import static android.view.autofill.Helper.sVerbose;
import static android.view.autofill.Helper.toList;
@@ -879,7 +880,11 @@ public final class AutofillManager {
* @param view view requesting the new autofill context.
*/
public void requestAutofill(@NonNull View view) {
- notifyViewEntered(view, FLAG_MANUAL_REQUEST);
+ int flags = FLAG_MANUAL_REQUEST;
+ if (!view.isFocused()) {
+ flags |= FLAG_VIEW_NOT_FOCUSED;
+ }
+ notifyViewEntered(view, flags);
}
/**
@@ -926,7 +931,11 @@ public final class AutofillManager {
* @param absBounds absolute boundaries of the virtual view in the screen.
*/
public void requestAutofill(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
- notifyViewEntered(view, virtualId, absBounds, FLAG_MANUAL_REQUEST);
+ int flags = FLAG_MANUAL_REQUEST;
+ if (!view.isFocused()) {
+ flags |= FLAG_VIEW_NOT_FOCUSED;
+ }
+ notifyViewEntered(view, virtualId, absBounds, flags);
}
/**
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 086a8be6d6cf2..ef17d1331a1e1 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -19,6 +19,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.FLAG_VIEW_NOT_FOCUSED;
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;
@@ -653,6 +654,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return mService.isInlineSuggestionsEnabled();
}
+ private boolean isViewFocusedLocked(int flags) {
+ return (flags & FLAG_VIEW_NOT_FOCUSED) == 0;
+ }
+
/**
* Clears the existing response for the partition, reads a new structure, and then requests a
* new fill response from the fill service.
@@ -711,10 +716,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
cancelCurrentRequestLocked();
// Only ask IME to create inline suggestions request if Autofill provider supports it and
- // the render service is available.
+ // the render service is available except the autofill is triggered manually and the view
+ // is also not focused.
final RemoteInlineSuggestionRenderService remoteRenderService =
mService.getRemoteInlineSuggestionRenderServiceLocked();
- if (isInlineSuggestionsEnabledByAutofillProviderLocked() && remoteRenderService != null) {
+ if (isInlineSuggestionsEnabledByAutofillProviderLocked()
+ && remoteRenderService != null
+ && isViewFocusedLocked(flags)) {
Consumer inlineSuggestionsRequestConsumer =
mAssistReceiver.newAutofillRequestLocked(viewState,
/*isInlineRequest=*/ true);
@@ -3139,9 +3147,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
};
- // When the inline suggestion render service is available, there are 2 cases when
- // augmented autofill should ask IME for inline suggestion request, because standard
- // autofill flow didn't:
+ // When the inline suggestion render service is available and the view is focused, there
+ // are 2 cases when augmented autofill should ask IME for inline suggestion request,
+ // because standard autofill flow didn't:
// 1. the field is augmented autofill only (when standard autofill provider is None or
// when it returns null response)
// 2. standard autofill provider doesn't support inline suggestion
@@ -3149,7 +3157,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mService.getRemoteInlineSuggestionRenderServiceLocked();
if (remoteRenderService != null
&& (mForAugmentedAutofillOnly
- || !isInlineSuggestionsEnabledByAutofillProviderLocked())) {
+ || !isInlineSuggestionsEnabledByAutofillProviderLocked())
+ && isViewFocusedLocked(flags)) {
if (sDebug) Slog.d(TAG, "Create inline request for augmented autofill");
remoteRenderService.getInlineSuggestionsRendererInfo(new RemoteCallback(
(extras) -> {