diff options
| -rw-r--r-- | core/java/com/android/internal/infra/AbstractRemoteService.java | 38 | ||||
| -rw-r--r-- | services/autofill/java/com/android/server/autofill/RemoteFillService.java | 3 |
2 files changed, 34 insertions, 7 deletions
diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java index c94c64a879b3..e8ac2239c3fd 100644 --- a/core/java/com/android/internal/infra/AbstractRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractRemoteService.java @@ -39,6 +39,7 @@ import com.android.internal.annotations.GuardedBy; import java.io.PrintWriter; import java.lang.ref.WeakReference; +import java.util.ArrayList; /** * Base class representing a remote service. @@ -93,6 +94,9 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I // Used just for debugging purposes (on dump) private long mNextUnbind; + /** Requests that have been scheduled, but that are not finished yet */ + private final ArrayList<PendingRequest<S, I>> mUnfinishedRequests = new ArrayList<>(); + /** * Callback called when the service dies. * @@ -229,6 +233,8 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I .append(mComponentName.flattenToString()).println(); pw.append(prefix).append(tab).append("destroyed=") .append(String.valueOf(mDestroyed)).println(); + pw.append(prefix).append(tab).append("numUnfinishedRequests=") + .append(String.valueOf(mUnfinishedRequests.size())); final boolean bound = handleIsBound(); pw.append(prefix).append(tab).append("bound=") .append(String.valueOf(bound)); @@ -257,23 +263,37 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I * <p>This request must be responded by the service somehow (typically using a callback), * othewise it will trigger a {@link PendingRequest#onTimeout(AbstractRemoteService)} if the * service doesn't respond. - * - * <p><b>NOTE: </b>this request is responsible for calling {@link #scheduleUnbind()}. */ protected void scheduleRequest(@NonNull PendingRequest<S, I> pendingRequest) { - cancelScheduledUnbind(); mHandler.sendMessage(obtainMessage( AbstractRemoteService::handlePendingRequest, this, pendingRequest)); } /** + * Marks a pendingRequest as finished. + * + * @param finshedRequest The request that is finished + */ + void finishRequest(@NonNull PendingRequest<S, I> finshedRequest) { + mHandler.sendMessage( + obtainMessage(AbstractRemoteService::handleFinishRequest, this, finshedRequest)); + } + + private void handleFinishRequest(@NonNull PendingRequest<S, I> finshedRequest) { + mUnfinishedRequests.remove(finshedRequest); + + if (mUnfinishedRequests.isEmpty()) { + scheduleUnbind(); + } + } + + /** * Schedules an async request. * * <p>This request is not expecting a callback from the service, hence it's represented by * a simple {@link Runnable}. */ protected void scheduleAsyncRequest(@NonNull AsyncRequest<I> request) { - scheduleUnbind(); // TODO(b/117779333): fix generics below @SuppressWarnings({"unchecked", "rawtypes"}) final MyAsyncPendingRequest<S, I> asyncRequest = new MyAsyncPendingRequest(this, request); @@ -341,6 +361,10 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I handleEnsureBound(); } else { if (mVerbose) Slog.v(mTag, "handlePendingRequest(): " + pendingRequest); + + mUnfinishedRequests.add(pendingRequest); + cancelScheduledUnbind(); + pendingRequest.run(); if (pendingRequest.isFinal()) { mCompleted = true; @@ -504,6 +528,12 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I } mCompleted = true; } + + S service = mWeakService.get(); + if (service != null) { + service.finishRequest(this); + } + mServiceHandler.removeCallbacks(mTimeoutTrigger); return true; } diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index 34fe5d916356..e8a52b4a12a9 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -139,9 +139,6 @@ final class RemoteFillService if (mPendingRequest == pendingRequest) { mPendingRequest = null; } - if (mPendingRequest == null) { - scheduleUnbind(); - } return true; } |