diff --git a/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java b/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java index 2ebf2fd820d8d..aacf63a112b1d 100644 --- a/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java @@ -60,10 +60,16 @@ public abstract class AbstractSinglePendingRequestRemoteService handleCancelPendingRequest() { + BasePendingRequest pendingRequest = mPendingRequest; + if (pendingRequest != null) { + pendingRequest.cancel(); mPendingRequest = null; } + return pendingRequest; } @Override // from AbstractRemoteService diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index 0ce6c87f1f28b..3143bcb23c3a5 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -41,6 +41,8 @@ import android.util.Slog; import com.android.internal.infra.AbstractSinglePendingRequestRemoteService; +import java.util.concurrent.CompletableFuture; + final class RemoteFillService extends AbstractSinglePendingRequestRemoteService { @@ -103,26 +105,21 @@ final class RemoteFillService *

This can be used when the request is unnecessary or will be superceeded by a request that * will soon be queued. * - * @return the id of the canceled request, or {@link FillRequest#INVALID_REQUEST_ID} if no - * {@link PendingFillRequest} was canceled. + * @return the future id of the canceled request, or {@link FillRequest#INVALID_REQUEST_ID} if + * no {@link PendingFillRequest} was canceled. */ - // TODO(b/117779333): move this logic to super class (and make mPendingRequest private) - public int cancelCurrentRequest() { - if (isDestroyed()) { - return INVALID_REQUEST_ID; - } - - int requestId = INVALID_REQUEST_ID; - if (mPendingRequest != null) { - if (mPendingRequest instanceof PendingFillRequest) { - requestId = ((PendingFillRequest) mPendingRequest).mRequest.getId(); + public CompletableFuture cancelCurrentRequest() { + return CompletableFuture.supplyAsync(() -> { + if (isDestroyed()) { + return INVALID_REQUEST_ID; } - mPendingRequest.cancel(); - mPendingRequest = null; - } - - return requestId; + BasePendingRequest canceledRequest = + handleCancelPendingRequest(); + return canceledRequest instanceof PendingFillRequest + ? ((PendingFillRequest) canceledRequest).mRequest.getId() + : INVALID_REQUEST_ID; + }, mHandler::post); } public void onFillRequest(@NonNull FillRequest request) { diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 3764ca4b7906c..895a2ae497585 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -546,21 +546,26 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState + "mForAugmentedAutofillOnly: %s", mForAugmentedAutofillOnly); return; } - final int canceledRequest = mRemoteFillService.cancelCurrentRequest(); + mRemoteFillService.cancelCurrentRequest().whenComplete((canceledRequest, err) -> { + if (err != null) { + Slog.e(TAG, "cancelCurrentRequest(): unexpected exception", err); + return; + } - // Remove the FillContext as there will never be a response for the service - if (canceledRequest != INVALID_REQUEST_ID && mContexts != null) { - final int numContexts = mContexts.size(); + // Remove the FillContext as there will never be a response for the service + if (canceledRequest != INVALID_REQUEST_ID && mContexts != null) { + final int numContexts = mContexts.size(); - // It is most likely the last context, hence search backwards - for (int i = numContexts - 1; i >= 0; i--) { - if (mContexts.get(i).getRequestId() == canceledRequest) { - if (sDebug) Slog.d(TAG, "cancelCurrentRequest(): id = " + canceledRequest); - mContexts.remove(i); - break; + // It is most likely the last context, hence search backwards + for (int i = numContexts - 1; i >= 0; i--) { + if (mContexts.get(i).getRequestId() == canceledRequest) { + if (sDebug) Slog.d(TAG, "cancelCurrentRequest(): id = " + canceledRequest); + mContexts.remove(i); + break; + } } } - } + }); } /** @@ -2090,8 +2095,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState updateValuesForSaveLocked(); // Remove pending fill requests as the session is finished. - cancelCurrentRequestLocked(); + cancelCurrentRequestLocked(); final ArrayList contexts = mergePreviousSessionLocked( /* forSave= */ true); final SaveRequest saveRequest =