Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aae1c818 authored by Eugene Susla's avatar Eugene Susla Committed by android-build-merger
Browse files

[DO NOT MERGE] Fix race in AbstractSinglePendingRequestRemoteService

am: 45fcf147

Change-Id: I8283708a92b86721426bf35888f486883189319a
parents 383a69c0 45fcf147
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -60,10 +60,16 @@ public abstract class AbstractSinglePendingRequestRemoteService<S

    @Override // from AbstractRemoteService
    protected void handleOnDestroy() {
        if (mPendingRequest != null) {
            mPendingRequest.cancel();
        handleCancelPendingRequest();
    }

    protected BasePendingRequest<S, I> handleCancelPendingRequest() {
        BasePendingRequest<S, I> pendingRequest = mPendingRequest;
        if (pendingRequest != null) {
            pendingRequest.cancel();
            mPendingRequest = null;
        }
        return pendingRequest;
    }

    @Override // from AbstractRemoteService
+14 −17
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ import android.util.Slog;

import com.android.internal.infra.AbstractSinglePendingRequestRemoteService;

import java.util.concurrent.CompletableFuture;

final class RemoteFillService
        extends AbstractSinglePendingRequestRemoteService<RemoteFillService, IAutoFillService> {

@@ -103,26 +105,21 @@ final class RemoteFillService
     * <p>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() {
    public CompletableFuture<Integer> cancelCurrentRequest() {
        return CompletableFuture.supplyAsync(() -> {
            if (isDestroyed()) {
                return INVALID_REQUEST_ID;
            }

        int requestId = INVALID_REQUEST_ID;
        if (mPendingRequest != null) {
            if (mPendingRequest instanceof PendingFillRequest) {
                requestId = ((PendingFillRequest) mPendingRequest).mRequest.getId();
            }

            mPendingRequest.cancel();
            mPendingRequest = null;
        }

        return requestId;
            BasePendingRequest<RemoteFillService, IAutoFillService> canceledRequest =
                    handleCancelPendingRequest();
            return canceledRequest instanceof PendingFillRequest
                    ? ((PendingFillRequest) canceledRequest).mRequest.getId()
                    : INVALID_REQUEST_ID;
        }, mHandler::post);
    }

    public void onFillRequest(@NonNull FillRequest request) {
+17 −12
Original line number Diff line number Diff line
@@ -546,7 +546,11 @@ 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) {
@@ -561,6 +565,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
                    }
                }
            }
        });
    }

    /**
@@ -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<FillContext> contexts = mergePreviousSessionLocked( /* forSave= */ true);

        final SaveRequest saveRequest =