diff options
| author | 2023-12-12 23:21:21 +0000 | |
|---|---|---|
| committer | 2023-12-15 22:56:18 +0000 | |
| commit | bc35fd3f7bdee63c5a4f7fe047efd4be1d16e95f (patch) | |
| tree | 2e7797d3f07c1b7418e0cf563d521cb1965b6b51 | |
| parent | fbc5e550c4fdee76a8d1105b965f3adfe0c3bc21 (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
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); } |