summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorYi Jiang <eejiang@google.com>2021-04-29 15:47:02 -0700
committerYi Jiang <eejiang@google.com>2021-04-29 18:05:04 -0700
commitbd4a6002256b5644e1c57f7d42dac37775c8fc2e (patch)
tree4ba7c491adcc90861062429c33d1706d55ff7755 /core/java/android
parent5b0e5143b3dd4294da3cdd45f132d49f5bd25240 (diff)
Adds expirations for remote callbacks
Right now there is no timeout/expiration in the remote service. In cases that the implementer of Rotation Resolver Service doesn't call back and the pending callback blocks the following requests, we should add an expiration of the pending callback in the remote service. Bug: 186674250 Test: Manually tested the feature Change-Id: I82f08155243e2205a2c95ae39c71c3118e9249ec
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/service/rotationresolver/RotationResolverService.java14
1 files changed, 11 insertions, 3 deletions
diff --git a/core/java/android/service/rotationresolver/RotationResolverService.java b/core/java/android/service/rotationresolver/RotationResolverService.java
index 0932901edf50..8278ded4b18b 100644
--- a/core/java/android/service/rotationresolver/RotationResolverService.java
+++ b/core/java/android/service/rotationresolver/RotationResolverService.java
@@ -31,6 +31,7 @@ import android.os.IBinder;
import android.os.ICancellationSignal;
import android.os.Looper;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.view.Surface;
import java.lang.annotation.Retention;
@@ -136,12 +137,16 @@ public abstract class RotationResolverService extends Service {
@MainThread
private void resolveRotation(IRotationResolverCallback callback,
RotationResolutionRequest request, ICancellationSignal transport) {
+ // If there is a valid, uncancelled pending callback running in process, the new rotation
+ // resolution request will be rejected immediately with a failure result.
if (mPendingCallback != null
- && (mCancellationSignal == null || !mCancellationSignal.isCanceled())) {
+ && (mCancellationSignal == null || !mCancellationSignal.isCanceled())
+ && (SystemClock.uptimeMillis() < mPendingCallback.mExpirationTime)) {
reportFailures(callback, ROTATION_RESULT_FAILURE_PREEMPTED);
return;
}
- mPendingCallback = new RotationResolverCallbackWrapper(callback, this);
+ mPendingCallback = new RotationResolverCallbackWrapper(callback, this,
+ SystemClock.uptimeMillis() + request.getTimeoutMillis());
mCancellationSignal = CancellationSignal.fromTransport(transport);
onResolveRotation(request, mCancellationSignal, mPendingCallback);
@@ -224,12 +229,15 @@ public abstract class RotationResolverService extends Service {
@NonNull
private final Handler mHandler;
+ private final long mExpirationTime;
+
private RotationResolverCallbackWrapper(
@NonNull android.service.rotationresolver.IRotationResolverCallback callback,
- RotationResolverService service) {
+ RotationResolverService service, long expirationTime) {
mCallback = callback;
mService = service;
mHandler = service.mMainThreadHandler;
+ mExpirationTime = expirationTime;
Objects.requireNonNull(mHandler);
}