diff options
| author | 2019-04-10 16:16:26 -0700 | |
|---|---|---|
| committer | 2019-04-12 16:19:08 +0000 | |
| commit | 06f0519a01b2c43fcd599168e5d112a3afcecf05 (patch) | |
| tree | b34559b9879f7ccd0802dfdb86cbc9cd704f0cb1 | |
| parent | dd07ae579c291a2b6ffe09bd576fd908eb9e5ddd (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
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=") |