diff options
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); } |