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

Commit 208711a1 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Ensure remote calls to a fill service timeout." into oc-dev

parents e35e223a 8bf4c8e2
Loading
Loading
Loading
Loading
+64 −0
Original line number Diff line number Diff line
@@ -27,11 +27,13 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.ICancellationSignal;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.service.autofill.AutofillService;
import android.service.autofill.FillRequest;
@@ -43,6 +45,7 @@ import android.service.autofill.SaveRequest;
import android.text.format.DateUtils;
import android.util.Slog;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.HandlerCaller;
import com.android.server.FgThread;

@@ -63,6 +66,9 @@ final class RemoteFillService implements DeathRecipient {
    // How long after the last interaction with the service we would unbind
    private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;

    // How long after we make a remote request to a fill service we timeout
    private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;

    private final Context mContext;

    private final ComponentName mComponentName;
@@ -413,12 +419,18 @@ final class RemoteFillService implements DeathRecipient {

    private static final class PendingFillRequest extends PendingRequest {
        private final Object mLock = new Object();

        private final WeakReference<RemoteFillService> mWeakService;
        private final FillRequest mRequest;
        private final IFillCallback mCallback;
        private ICancellationSignal mCancellation;

        @GuardedBy("mLock")
        private boolean mCancelled;

        @GuardedBy("mLock")
        private boolean mCompleted;

        public PendingFillRequest(FillRequest request, RemoteFillService service) {
            mRequest = request;
            mWeakService = new WeakReference<>(service);
@@ -443,8 +455,15 @@ final class RemoteFillService implements DeathRecipient {

                @Override
                public void onSuccess(FillResponse response) {
                    synchronized (mLock) {
                        if (mCompleted) {
                            return;
                        }
                        mCompleted = true;
                    }
                    RemoteFillService remoteService = mWeakService.get();
                    if (remoteService != null) {
                        service.mHandler.getHandler().removeCallbacks(PendingFillRequest.this);
                        remoteService.dispatchOnFillRequestSuccess(PendingFillRequest.this,
                                getCallingUid(), request.getFlags(), response);
                    }
@@ -452,13 +471,29 @@ final class RemoteFillService implements DeathRecipient {

                @Override
                public void onFailure(CharSequence message) {
                    synchronized (mLock) {
                        if (mCompleted) {
                            return;
                        }
                        mCompleted = true;
                    }
                    RemoteFillService remoteService = mWeakService.get();
                    if (remoteService != null) {
                        service.mHandler.getHandler().removeCallbacks(PendingFillRequest.this);
                        remoteService.dispatchOnFillRequestFailure(
                                PendingFillRequest.this, message);
                    }
                }
            };
            service.mHandler.getHandler().postAtTime(() -> {
                cancel();
                try {
                    mCallback.onFailure(null);
                } catch (RemoteException e) {
                    /* ignore */
                }
            }, PendingFillRequest.this,
                    SystemClock.uptimeMillis() + TIMEOUT_REMOTE_REQUEST_MILLIS);
        }

        @Override
@@ -496,10 +531,15 @@ final class RemoteFillService implements DeathRecipient {
    }

    private static final class PendingSaveRequest extends PendingRequest {
        private final Object mLock = new Object();

        private final WeakReference<RemoteFillService> mWeakService;
        private final SaveRequest mRequest;
        private final ISaveCallback mCallback;

        @GuardedBy("mLock")
        private boolean mCompleted;

        public PendingSaveRequest(@NonNull SaveRequest request,
                @NonNull RemoteFillService service) {
            mRequest = request;
@@ -507,8 +547,16 @@ final class RemoteFillService implements DeathRecipient {
            mCallback = new ISaveCallback.Stub() {
                @Override
                public void onSuccess() {
                    synchronized (mLock) {
                        if (mCompleted) {
                            return;
                        }
                        mCompleted = true;
                    }
                    cancel();
                    RemoteFillService service = mWeakService.get();
                    if (service != null) {
                        service.mHandler.getHandler().removeCallbacks(PendingSaveRequest.this);
                        service.dispatchOnSaveRequestSuccess(
                                PendingSaveRequest.this);
                    }
@@ -516,13 +564,29 @@ final class RemoteFillService implements DeathRecipient {

                @Override
                public void onFailure(CharSequence message) {
                    synchronized (mLock) {
                        if (mCompleted) {
                            return;
                        }
                        mCompleted = true;
                    }
                    RemoteFillService service = mWeakService.get();
                    if (service != null) {
                        service.mHandler.getHandler().removeCallbacks(PendingSaveRequest.this);
                        service.dispatchOnSaveRequestFailure(
                                PendingSaveRequest.this, message);
                    }
                }
            };
            service.mHandler.getHandler().postAtTime(() -> {
                cancel();
                try {
                    mCallback.onFailure(null);
                } catch (RemoteException e) {
                    /* ignore */
                }
            }, PendingSaveRequest.this,
                    SystemClock.uptimeMillis() + TIMEOUT_REMOTE_REQUEST_MILLIS);
        }

        @Override