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

Commit b5555f69 authored by Felipe Leme's avatar Felipe Leme Committed by Android (Google) Code Review
Browse files

Merge "Simplified how AbstractRemoteService subclasses run an async request."

parents bb299e95 afb55b68
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -76,7 +76,6 @@ import com.android.server.autofill.AutofillManagerService.SmartSuggestionMode;
import com.android.server.autofill.RemoteAugmentedAutofillService.RemoteAugmentedAutofillServiceCallbacks;
import com.android.server.autofill.ui.AutoFillUI;
import com.android.server.infra.AbstractPerUserSystemService;
import com.android.server.infra.AbstractRemoteService;
import com.android.server.infra.FrameworkResourcesServiceNameResolver;
import com.android.server.infra.SecureSettingsServiceNameResolver;

@@ -1031,8 +1030,7 @@ final class AutofillManagerServiceImpl
                return null;
            }
            final ComponentName componentName = RemoteAugmentedAutofillService.getComponentName(
                    getContext(), serviceName, mUserId,
                    mAugmentedAutofillResolver.isTemporaryLocked());
                    serviceName, mUserId, mAugmentedAutofillResolver.isTemporaryLocked());
            if (componentName == null) return null;
            if (sVerbose) {
                Slog.v(TAG, "getRemoteAugmentedAutofillServiceLocked(): " + componentName);
@@ -1041,8 +1039,7 @@ final class AutofillManagerServiceImpl
            mRemoteAugmentedAutofillService = new RemoteAugmentedAutofillService(getContext(),
                    componentName, mUserId, new RemoteAugmentedAutofillServiceCallbacks() {
                        @Override
                        public void onServiceDied(
                                AbstractRemoteService<? extends AbstractRemoteService<?>> service) {
                        public void onServiceDied(@NonNull RemoteAugmentedAutofillService service) {
                            // TODO(b/111330312): properly implement
                            Slog.w(TAG, "remote augmented autofill service died");
                        }
+11 −47
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteException;
import android.os.SystemClock;
import android.service.autofill.augmented.AugmentedAutofillService;
@@ -43,7 +42,8 @@ import com.android.internal.os.IResultReceiver;
import com.android.server.infra.AbstractSinglePendingRequestRemoteService;

final class RemoteAugmentedAutofillService
        extends AbstractSinglePendingRequestRemoteService<RemoteAugmentedAutofillService> {
        extends AbstractSinglePendingRequestRemoteService<RemoteAugmentedAutofillService,
            IAugmentedAutofillService> {

    private static final String TAG = RemoteAugmentedAutofillService.class.getSimpleName();

@@ -51,20 +51,16 @@ final class RemoteAugmentedAutofillService
    private static final long TIMEOUT_IDLE_BIND_MILLIS = 2 * DateUtils.MINUTE_IN_MILLIS;
    private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 2 * DateUtils.SECOND_IN_MILLIS;

    private final RemoteAugmentedAutofillServiceCallbacks mCallbacks;
    private IAugmentedAutofillService mService;

    RemoteAugmentedAutofillService(Context context, ComponentName serviceName,
            int userId, RemoteAugmentedAutofillServiceCallbacks callbacks,
            boolean bindInstantServiceAllowed, boolean verbose) {
        super(context, AugmentedAutofillService.SERVICE_INTERFACE, serviceName, userId, callbacks,
                bindInstantServiceAllowed, verbose);
        mCallbacks = callbacks;
    }

    @Nullable
    public static ComponentName getComponentName(@NonNull Context context,
            @NonNull String componentName, @UserIdInt int userId, boolean isTemporary) {
    public static ComponentName getComponentName(@NonNull String componentName,
            @UserIdInt int userId, boolean isTemporary) {
        int flags = PackageManager.GET_META_DATA;
        if (!isTemporary) {
            flags |= PackageManager.MATCH_SYSTEM_ONLY;
@@ -88,9 +84,8 @@ final class RemoteAugmentedAutofillService
    }

    @Override // from AbstractRemoteService
    protected IInterface getServiceInterface(IBinder service) {
        mService = IAugmentedAutofillService.Stub.asInterface(service);
        return mService;
    protected IAugmentedAutofillService getServiceInterface(IBinder service) {
        return IAugmentedAutofillService.Stub.asInterface(service);
    }

    @Override // from AbstractRemoteService
@@ -109,7 +104,6 @@ final class RemoteAugmentedAutofillService
    public void onRequestAutofillLocked(int sessionId, @NonNull IAutoFillManagerClient client,
            int taskId, @NonNull ComponentName activityComponent, @NonNull AutofillId focusedId,
            @Nullable AutofillValue focusedValue) {
        cancelScheduledUnbind();
        scheduleRequest(new PendingAutofillRequest(this, sessionId, client, taskId,
                activityComponent, focusedId, focusedValue));
    }
@@ -118,12 +112,12 @@ final class RemoteAugmentedAutofillService
     * Called by {@link Session} when it's time to destroy all augmented autofill requests.
     */
    public void onDestroyAutofillWindowsRequest(int sessionId) {
        cancelScheduledUnbind();
        scheduleRequest(new PendingDestroyAutofillWindowsRequest(this, sessionId));
        scheduleAsyncRequest((s) -> s.onDestroyFillWindowRequest(sessionId));
    }

    // TODO(b/111330312): inline into PendingAutofillRequest if it doesn't have any other subclass
    private abstract static class MyPendingRequest
            extends PendingRequest<RemoteAugmentedAutofillService> {
            extends PendingRequest<RemoteAugmentedAutofillService, IAugmentedAutofillService> {
        protected final int mSessionId;

        private MyPendingRequest(@NonNull RemoteAugmentedAutofillService service, int sessionId) {
@@ -196,38 +190,8 @@ final class RemoteAugmentedAutofillService

    }

    private static final class PendingDestroyAutofillWindowsRequest extends MyPendingRequest {

        protected PendingDestroyAutofillWindowsRequest(
                @NonNull RemoteAugmentedAutofillService service, @NonNull int sessionId) {
            super(service, sessionId);
        }

        @Override
        public void run() {
            final RemoteAugmentedAutofillService remoteService = getService();
            if (remoteService == null) return;

            try {
                remoteService.mService.onDestroyFillWindowRequest(mSessionId);
            } catch (RemoteException e) {
                Slog.w(TAG, "exception handling onDestroyAutofillWindowsRequest() for "
                        + mSessionId + ": " + e);
            } finally {
                // Service is not calling back, so we finish right away.
                finish();
            }
        }

        @Override
        protected void onTimeout(RemoteAugmentedAutofillService remoteService) {
            // Should not happen because we called finish() on run(), although currently it might
            // be called if the service is destroyed while showing it.
            Slog.e(TAG, "timed out: " + this);
        }
    }

    public interface RemoteAugmentedAutofillServiceCallbacks extends VultureCallback {
    public interface RemoteAugmentedAutofillServiceCallbacks
            extends VultureCallback<RemoteAugmentedAutofillService> {
        // NOTE: so far we don't need to notify the callback implementation (an inner class on
        // AutofillManagerServiceImpl) of the request results (success, timeouts, etc..), so this
        // callback interface is empty.
+14 −16
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import android.content.Context;
import android.content.IntentSender;
import android.os.IBinder;
import android.os.ICancellationSignal;
import android.os.IInterface;
import android.os.RemoteException;
import android.service.autofill.AutofillService;
import android.service.autofill.FillRequest;
@@ -42,15 +41,15 @@ import android.util.Slog;

import com.android.server.infra.AbstractSinglePendingRequestRemoteService;

final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<RemoteFillService> {
final class RemoteFillService
        extends AbstractSinglePendingRequestRemoteService<RemoteFillService, IAutoFillService> {

    private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
    private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;

    private final FillServiceCallbacks mCallbacks;
    private IAutoFillService mAutoFillService;

    public interface FillServiceCallbacks extends VultureCallback {
    public interface FillServiceCallbacks extends VultureCallback<RemoteFillService> {
        void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
                @NonNull String servicePackageName, int requestFlags);
        void onFillRequestFailure(int requestId, @Nullable CharSequence message);
@@ -71,21 +70,20 @@ final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<

    @Override // from AbstractRemoteService
    protected void handleOnConnectedStateChanged(boolean state) {
        if (mAutoFillService == null) {
        if (mService == null) {
            Slog.w(mTag, "onConnectedStateChanged(): null service");
            return;
        }
        try {
            mAutoFillService.onConnectedStateChanged(state);
            mService.onConnectedStateChanged(state);
        } catch (Exception e) {
            Slog.w(mTag, "Exception calling onConnectedStateChanged(): " + e);
        }
    }

    @Override // from AbstractRemoteService
    protected IInterface getServiceInterface(IBinder service) {
        mAutoFillService = IAutoFillService.Stub.asInterface(service);
        return mAutoFillService;
    protected IAutoFillService getServiceInterface(IBinder service) {
        return IAutoFillService.Stub.asInterface(service);
    }

    @Override // from AbstractRemoteService
@@ -127,17 +125,15 @@ final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<
    }

    public void onFillRequest(@NonNull FillRequest request) {
        cancelScheduledUnbind();
        scheduleRequest(new PendingFillRequest(request, this));
    }

    public void onSaveRequest(@NonNull SaveRequest request) {
        cancelScheduledUnbind();
        scheduleRequest(new PendingSaveRequest(request, this));
    }

    private boolean handleResponseCallbackCommon(
            @NonNull PendingRequest<RemoteFillService> pendingRequest) {
            @NonNull PendingRequest<RemoteFillService, IAutoFillService> pendingRequest) {
        if (isDestroyed()) return false;

        if (mPendingRequest == pendingRequest) {
@@ -204,7 +200,8 @@ final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<
        });
    }

    private static final class PendingFillRequest extends PendingRequest<RemoteFillService> {
    private static final class PendingFillRequest
            extends PendingRequest<RemoteFillService, IAutoFillService> {
        private final FillRequest mRequest;
        private final IFillCallback mCallback;
        private ICancellationSignal mCancellation;
@@ -282,7 +279,7 @@ final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<
            if (remoteService != null) {
                if (sVerbose) Slog.v(mTag, "calling onFillRequest() for id=" + mRequest.getId());
                try {
                    remoteService.mAutoFillService.onFillRequest(mRequest, mCallback);
                    remoteService.mService.onFillRequest(mRequest, mCallback);
                } catch (RemoteException e) {
                    Slog.e(mTag, "Error calling on fill request", e);

@@ -310,7 +307,8 @@ final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<
        }
    }

    private static final class PendingSaveRequest extends PendingRequest<RemoteFillService> {
    private static final class PendingSaveRequest
            extends PendingRequest<RemoteFillService, IAutoFillService> {
        private final SaveRequest mRequest;
        private final ISaveCallback mCallback;

@@ -355,7 +353,7 @@ final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<
            if (remoteService != null) {
                if (sVerbose) Slog.v(mTag, "calling onSaveRequest()");
                try {
                    remoteService.mAutoFillService.onSaveRequest(mRequest, mCallback);
                    remoteService.mService.onSaveRequest(mRequest, mCallback);
                } catch (RemoteException e) {
                    Slog.e(mTag, "Error calling on save request", e);

+1 −2
Original line number Diff line number Diff line
@@ -98,7 +98,6 @@ import com.android.internal.util.ArrayUtils;
import com.android.server.autofill.AutofillManagerService.SmartSuggestionMode;
import com.android.server.autofill.ui.AutoFillUI;
import com.android.server.autofill.ui.PendingUi;
import com.android.server.infra.AbstractRemoteService;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -909,7 +908,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState

    // VultureCallback
    @Override
    public void onServiceDied(AbstractRemoteService<? extends AbstractRemoteService<?>> service) {
    public void onServiceDied(@NonNull RemoteFillService service) {
        Slog.w(TAG, "removing session because service died");
        forceRemoveSelfLocked();
    }
+2 −14
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.view.contentcapture.ContentCaptureEvent;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
import com.android.server.contentcapture.RemoteContentCaptureService.ContentCaptureServiceCallbacks;
import com.android.server.infra.AbstractRemoteService;

import java.io.PrintWriter;
import java.util.List;
@@ -124,8 +123,8 @@ final class ContentCaptureSession implements ContentCaptureServiceCallbacks {
        }
    }

    @Override // from RemoteScreenObservationServiceCallbacks
    public void onServiceDied(AbstractRemoteService<?> service) {
    @Override // from RemoteContentCaptureServiceCallbacks
    public void onServiceDied(@NonNull RemoteContentCaptureService service) {
        // TODO(b/111276913): implement (remove session from PerUserSession?)
        if (mService.isDebug()) {
            Slog.d(TAG, "onServiceDied() for " + mId);
@@ -135,17 +134,6 @@ final class ContentCaptureSession implements ContentCaptureServiceCallbacks {
        }
    }

    @Override // from RemoteScreenObservationServiceCallbacks
    public void onFailureOrTimeout(boolean timedOut) {
        // TODO(b/111276913): log metrics on whether timed out or not
        if (mService.isDebug()) {
            Slog.d(TAG, "onFailureOrTimeout(" + mId + "): timed out=" + timedOut);
        }
        synchronized (mLock) {
            removeSelfLocked(/* notifyRemoteService= */ false);
        }
    }

    @GuardedBy("mLock")
    public void dumpLocked(@NonNull String prefix, @NonNull PrintWriter pw) {
        pw.print(prefix); pw.print("id: ");  pw.print(mId); pw.println();
Loading