diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java
index c94c64a879b31..e8ac2239c3fde 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> mUnfinishedRequests = new ArrayList<>();
+
/**
* Callback called when the service dies.
*
@@ -229,6 +233,8 @@ public abstract class AbstractRemoteServiceThis 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.
- *
- *
NOTE: this request is responsible for calling {@link #scheduleUnbind()}.
*/
protected void scheduleRequest(@NonNull PendingRequest 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 finshedRequest) {
+ mHandler.sendMessage(
+ obtainMessage(AbstractRemoteService::handleFinishRequest, this, finshedRequest));
+ }
+
+ private void handleFinishRequest(@NonNull PendingRequest finshedRequest) {
+ mUnfinishedRequests.remove(finshedRequest);
+
+ if (mUnfinishedRequests.isEmpty()) {
+ scheduleUnbind();
+ }
+ }
+
/**
* Schedules an async request.
*
@@ -273,7 +294,6 @@ public abstract class AbstractRemoteService request) {
- scheduleUnbind();
// TODO(b/117779333): fix generics below
@SuppressWarnings({"unchecked", "rawtypes"})
final MyAsyncPendingRequest asyncRequest = new MyAsyncPendingRequest(this, request);
@@ -341,6 +361,10 @@ public abstract class AbstractRemoteService