summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eugene Susla <eugenesusla@google.com> 2019-04-10 16:16:26 -0700
committer Eugene Susla <eugenesusla@google.com> 2019-04-12 16:19:08 +0000
commit06f0519a01b2c43fcd599168e5d112a3afcecf05 (patch)
treeb34559b9879f7ccd0802dfdb86cbc9cd704f0cb1
parentdd07ae579c291a2b6ffe09bd576fd908eb9e5ddd (diff)
Make RemoteService propagate Context#bindService failure to PendingRequests
...and fix the attached bug which was caused by infinite wait due to lack of said signal Fixes: 129549258 Bug: 126266412 Test: - atest CtsContentCaptureServiceTestCases - Ensure b/129549258#comment5 no longer reproduces Change-Id: Id434ce268ca4ae6aa09140a3e17b6d8f476f3d9f
-rw-r--r--core/java/android/app/role/RoleControllerManager.java5
-rw-r--r--core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java14
-rw-r--r--core/java/com/android/internal/infra/AbstractRemoteService.java13
-rw-r--r--core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java9
4 files changed, 41 insertions, 0 deletions
diff --git a/core/java/android/app/role/RoleControllerManager.java b/core/java/android/app/role/RoleControllerManager.java
index bd981179e2ff..76b219981c59 100644
--- a/core/java/android/app/role/RoleControllerManager.java
+++ b/core/java/android/app/role/RoleControllerManager.java
@@ -252,6 +252,11 @@ public class RoleControllerManager {
Log.e(LOG_TAG, "Error calling grantDefaultRoles()", e);
}
}
+
+ @Override
+ protected void onFailed() {
+ mRemoteCallback.sendResult(null);
+ }
}
/**
diff --git a/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java b/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java
index 206efa94b7f6..5efa94a09cdf 100644
--- a/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java
+++ b/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java
@@ -76,6 +76,20 @@ public abstract class AbstractMultiplePendingRequestsRemoteService<S
}
@Override // from AbstractRemoteService
+ final void handleBindFailure() {
+ if (mPendingRequests != null) {
+ final int size = mPendingRequests.size();
+ if (mVerbose) Slog.v(mTag, "Sending failure to " + size + " pending requests");
+ for (int i = 0; i < size; i++) {
+ final BasePendingRequest<S, I> request = mPendingRequests.get(i);
+ request.onFailed();
+ request.finish();
+ }
+ mPendingRequests = null;
+ }
+ }
+
+ @Override // from AbstractRemoteService
public void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
super.dump(prefix, pw);
diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java
index 1155854efd55..a09013ce816e 100644
--- a/core/java/com/android/internal/infra/AbstractRemoteService.java
+++ b/core/java/com/android/internal/infra/AbstractRemoteService.java
@@ -397,6 +397,11 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
abstract void handlePendingRequestWhileUnBound(
@NonNull BasePendingRequest<S, I> pendingRequest);
+ /**
+ * Called if {@link Context#bindServiceAsUser} returns {@code false}.
+ */
+ abstract void handleBindFailure();
+
private boolean handleIsBound() {
return mService != null;
}
@@ -418,6 +423,8 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
mBinding = false;
if (!mServiceDied) {
+ // TODO(b/126266412): merge these 2 calls?
+ handleBindFailure();
handleBinderDied();
}
}
@@ -547,6 +554,12 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I
void onFinished() { }
/**
+ * Called when request fails due to reasons internal to {@link AbstractRemoteService},
+ * e.g. failure to bind to service.
+ */
+ protected void onFailed() { }
+
+ /**
* Checks whether this request was cancelled.
*/
@GuardedBy("mLock")
diff --git a/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java b/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java
index 66bee95b0302..2ebf2fd820d8 100644
--- a/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java
+++ b/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java
@@ -67,6 +67,15 @@ public abstract class AbstractSinglePendingRequestRemoteService<S
}
@Override // from AbstractRemoteService
+ void handleBindFailure() {
+ if (mPendingRequest != null) {
+ if (mVerbose) Slog.v(mTag, "Sending failure to " + mPendingRequest);
+ mPendingRequest.onFailed();
+ mPendingRequest = null;
+ }
+ }
+
+ @Override // from AbstractRemoteService
public void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
super.dump(prefix, pw);
pw.append(prefix).append("hasPendingRequest=")