summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daniel <danieljkim@google.com> 2023-12-12 23:21:21 +0000
committer Daniel <danieljkim@google.com> 2023-12-15 22:56:18 +0000
commitbc35fd3f7bdee63c5a4f7fe047efd4be1d16e95f (patch)
tree2e7797d3f07c1b7418e0cf563d521cb1965b6b51
parentfbc5e550c4fdee76a8d1105b965f3adfe0c3bc21 (diff)
Generate a new assistStructure for secondary fill request
When the user changes focus from a view to a secondary view type, then generate a new assistStructure. When the user changes focus, the user could have moved on to a different fragment and require a new assistStructure. Create a new fill request with the new assistStructure and request to the secondary provider handler. And when the updateLocked is called for the secondary view, handle the secondary provider logic and return early. The session should process logic for one provider at a time. Bug: 315343520 Test: atest CtsAutoFillServiceTestCases Change-Id: Ie825668ecdc3e250d81789354cc63abb51940bfe
-rw-r--r--services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java12
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java54
-rw-r--r--services/autofill/java/com/android/server/autofill/ViewState.java5
3 files changed, 47 insertions, 24 deletions
diff --git a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
index d9741c8e867d..4a6d5c9bc65e 100644
--- a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
+++ b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
@@ -25,9 +25,6 @@ import android.service.autofill.FillRequest;
import android.service.autofill.FillResponse;
import android.util.Slog;
-import java.util.Objects;
-
-
/**
* Requests autofill response from a Remote Autofill Service. This autofill service can be
* either a Credential Autofill Service or the user-opted autofill service.
@@ -51,7 +48,6 @@ final class SecondaryProviderHandler implements RemoteFillService.FillServiceCal
private final RemoteFillService mRemoteFillService;
private final SecondaryProviderCallback mCallback;
- private FillRequest mLastFillRequest;
private int mLastFlag;
SecondaryProviderHandler(
@@ -97,17 +93,11 @@ final class SecondaryProviderHandler implements RemoteFillService.FillServiceCal
}
/**
- * Requests a new fill response. If the fill request is same as the last requested fill request,
- * then the request is duped.
+ * Requests a new fill response.
*/
public void onFillRequest(FillRequest pendingFillRequest, int flag) {
- if (Objects.equals(pendingFillRequest, mLastFillRequest)) {
- Slog.v(TAG, "Deduping fill request to secondary provider.");
- return;
- }
Slog.v(TAG, "Requesting fill response to secondary provider.");
mLastFlag = flag;
- mLastFillRequest = pendingFillRequest;
mRemoteFillService.onFillRequest(pendingFillRequest);
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index d527ce0e1b2a..c4e8f12b72f5 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -367,6 +367,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private SparseArray<FillResponse> mResponses;
+ @GuardedBy("mLock")
+ private SparseArray<FillResponse> mSecondaryResponses;
+
/**
* Contexts read from the app; they will be updated (sanitized, change values for save) before
* sent to {@link AutofillService}. Ordered by the time they were read.
@@ -713,7 +716,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mPendingFillRequest.getDelayedFillIntentSender());
}
mLastFillRequest = mPendingFillRequest;
- mRemoteFillService.onFillRequest(mPendingFillRequest);
+ if (shouldRequestSecondaryProvider(mPendingFillRequest.getFlags())
+ && mSecondaryProviderHandler != null) {
+ Slog.v(TAG, "Requesting fill response to secondary provider.");
+ mSecondaryProviderHandler.onFillRequest(mPendingFillRequest,
+ mPendingFillRequest.getFlags());
+ } else if (mRemoteFillService != null) {
+ mRemoteFillService.onFillRequest(mPendingFillRequest);
+ }
mPendingInlineSuggestionsRequest = null;
mWaitForInlineRequest = false;
mPendingFillRequest = null;
@@ -1196,7 +1206,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private void requestNewFillResponseLocked(@NonNull ViewState viewState, int newState,
int flags) {
- final FillResponse existingResponse = viewState.getResponse();
+ final FillResponse existingResponse = shouldRequestSecondaryProvider(flags)
+ ? viewState.getSecondaryResponse() : viewState.getResponse();
mFillRequestEventLogger.startLogForNewRequest();
mRequestCount++;
mFillRequestEventLogger.maybeSetAppPackageUid(uid);
@@ -1804,6 +1815,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return;
}
synchronized (mLock) {
+ if (mSecondaryResponses == null) {
+ mSecondaryResponses = new SparseArray<>(2);
+ }
+ mSecondaryResponses.put(fillResponse.getRequestId(), fillResponse);
setViewStatesLocked(fillResponse, ViewState.STATE_FILLABLE, /* clearResponse= */ false,
/* isPrimary= */ false);
@@ -3980,7 +3995,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
// If it's not, then check if it should start a partition.
- if (shouldStartNewPartitionLocked(id)) {
+ if (shouldStartNewPartitionLocked(id, flags)) {
if (sDebug) {
Slog.d(TAG, "Starting partition or augmented request for view id " + id + ": "
+ viewState.getStateAsString());
@@ -4008,9 +4023,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* @return {@code true} if a new partition should be started
*/
@GuardedBy("mLock")
- private boolean shouldStartNewPartitionLocked(@NonNull AutofillId id) {
+ private boolean shouldStartNewPartitionLocked(@NonNull AutofillId id, int flags) {
final ViewState currentView = mViewStates.get(id);
- if (mResponses == null) {
+ SparseArray<FillResponse> responses = shouldRequestSecondaryProvider(flags)
+ ? mSecondaryResponses : mResponses;
+ if (responses == null) {
return currentView != null && (currentView.getState()
& ViewState.STATE_PENDING_CREATE_INLINE_REQUEST) == 0;
}
@@ -4022,7 +4039,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return true;
}
- final int numResponses = mResponses.size();
+ final int numResponses = responses.size();
if (numResponses >= AutofillManagerService.getPartitionMaxCount()) {
Slog.e(TAG, "Not starting a new partition on " + id + " because session " + this.id
+ " reached maximum of " + AutofillManagerService.getPartitionMaxCount());
@@ -4030,7 +4047,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
for (int responseNum = 0; responseNum < numResponses; responseNum++) {
- final FillResponse response = mResponses.valueAt(responseNum);
+ final FillResponse response = responses.valueAt(responseNum);
if (ArrayUtils.contains(response.getIgnoredIds(), id)) {
return false;
@@ -4066,6 +4083,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
boolean shouldRequestSecondaryProvider(int flags) {
+ if (!mService.isAutofillCredmanIntegrationEnabled()
+ || mSecondaryProviderHandler == null) {
+ return false;
+ }
if (mIsPrimaryCredential) {
return (flags & FLAG_VIEW_REQUESTS_CREDMAN_SERVICE) == 0;
} else {
@@ -4205,12 +4226,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
break;
case ACTION_VIEW_ENTERED:
- if (shouldRequestSecondaryProvider(flags)
- && mSecondaryProviderHandler != null
- && mAssistReceiver.mLastFillRequest != null) {
- mSecondaryProviderHandler.onFillRequest(mAssistReceiver.mLastFillRequest,
- flags);
- }
mLatencyBaseTime = SystemClock.elapsedRealtime();
boolean wasPreviouslyFillDialog = mPreviouslyFillDialogPotentiallyStarted;
mPreviouslyFillDialogPotentiallyStarted = false;
@@ -4225,6 +4240,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
viewState.setCurrentValue(value);
}
+ if (shouldRequestSecondaryProvider(flags)) {
+ if (requestNewFillResponseOnViewEnteredIfNecessaryLocked(
+ id, viewState, flags)) {
+ Slog.v(TAG, "Started a new fill request for secondary provider.");
+ return;
+ }
+ // If the ViewState is ready to be displayed, onReady() will be called.
+ viewState.update(value, virtualBounds, flags);
+
+ // return here because primary provider logic is not applicable.
+ return;
+ }
+
if (mCompatMode && (viewState.getState() & ViewState.STATE_URL_BAR) != 0) {
if (sDebug) Slog.d(TAG, "Ignoring VIEW_ENTERED on URL BAR (id=" + id + ")");
return;
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index b0bb9ec66f46..fec5aa531cdd 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -162,6 +162,11 @@ final class ViewState {
return mPrimaryFillResponse;
}
+ @Nullable
+ FillResponse getSecondaryResponse() {
+ return mSecondaryFillResponse;
+ }
+
void setResponse(FillResponse response) {
setResponse(response, /* isPrimary= */ true);
}