From 8a1f0bc86e1a03b55a84b56127acf822aa1ef730 Mon Sep 17 00:00:00 2001 From: Yi Jiang Date: Thu, 4 Feb 2021 11:56:40 -0800 Subject: [PATCH] A few fixes for RotationResolver This is a follow-up change of ag/13056186 to resolve some of the comments. Bug: 178405054 Test: unit tests Change-Id: I04015b432b9bac96561e779cc4aa76155e6168e9 --- .../RotationResolutionRequest.java | 3 +- .../RotationResolverService.java | 7 +-- .../RemoteRotationResolverService.java | 57 ++++++++++++------- ...RotationResolverManagerPerUserService.java | 20 +------ .../RotationResolverManagerService.java | 2 +- ...java => RotationResolverShellCommand.java} | 4 +- 6 files changed, 46 insertions(+), 47 deletions(-) rename services/core/java/com/android/server/rotationresolver/{RotationResolverShellCommend.java => RotationResolverShellCommand.java} (96%) diff --git a/core/java/android/service/rotationresolver/RotationResolutionRequest.java b/core/java/android/service/rotationresolver/RotationResolutionRequest.java index 94a6052c246dc..8e76e2fc92026 100644 --- a/core/java/android/service/rotationresolver/RotationResolutionRequest.java +++ b/core/java/android/service/rotationresolver/RotationResolutionRequest.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.view.Surface; /** * This class represents a request to an {@link RotationResolverService}. The request contains @@ -54,7 +55,7 @@ public final class RotationResolutionRequest implements Parcelable { mTimeoutMillis = timeoutMillis; } - public int getProposedRotation() { + @Surface.Rotation public int getProposedRotation() { return mProposedRotation; } diff --git a/core/java/android/service/rotationresolver/RotationResolverService.java b/core/java/android/service/rotationresolver/RotationResolverService.java index 593a642b4a383..604dd0ac82989 100644 --- a/core/java/android/service/rotationresolver/RotationResolverService.java +++ b/core/java/android/service/rotationresolver/RotationResolverService.java @@ -146,11 +146,8 @@ public abstract class RotationResolverService extends Service { } mPendingCallback = new RotationResolverCallbackWrapper(callback, this); mCancellationSignal = CancellationSignal.fromTransport(transport); - try { - onResolveRotation(request, mCancellationSignal, mPendingCallback); - } catch (UnsupportedOperationException e) { - reportFailures(callback, ROTATION_RESULT_FAILURE_CANCELLED); - } + + onResolveRotation(request, mCancellationSignal, mPendingCallback); } @MainThread diff --git a/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java b/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java index 57e39b6c68298..b995b19c58419 100644 --- a/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java +++ b/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java @@ -45,6 +45,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.infra.ServiceConnector; +import java.lang.ref.WeakReference; + /** Manages the connection to the remote rotation resolver service. */ class RemoteRotationResolverService extends ServiceConnector.Impl { @@ -128,13 +130,20 @@ class RemoteRotationResolverService extends ServiceConnector.Impl { synchronized (mLock) { try { @@ -147,9 +156,6 @@ class RemoteRotationResolverService extends ServiceConnector.Impl mRequestWeakReference; + + RotationResolverCallback(RotationRequest request) { + this.mRequestWeakReference = new WeakReference<>(request); + } + @Override public void onSuccess(int rotation) { - synchronized (mLock) { - if (mIsFulfilled) { + final RotationRequest request = mRequestWeakReference.get(); + synchronized (request.mLock) { + if (request.mIsFulfilled) { Slog.w(TAG, "Callback received after the rotation request is fulfilled."); return; } - mIsFulfilled = true; - mCallbackInternal.onSuccess(rotation); + request.mIsFulfilled = true; + request.mCallbackInternal.onSuccess(rotation); final long timeToCalculate = - SystemClock.elapsedRealtime() - mRequestStartTimeMillis; - logRotationStats(mProposedRotation, mCurrentRotation, rotation, + SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis; + logRotationStats(request.mProposedRotation, request.mCurrentRotation, rotation, timeToCalculate); } } @Override public void onFailure(int error) { - synchronized (mLock) { - if (mIsFulfilled) { + final RotationRequest request = mRequestWeakReference.get(); + synchronized (request.mLock) { + if (request.mIsFulfilled) { Slog.w(TAG, "Callback received after the rotation request is fulfilled."); return; } - mIsFulfilled = true; - mCallbackInternal.onFailure(error); + request.mIsFulfilled = true; + request.mCallbackInternal.onFailure(error); final long timeToCalculate = - SystemClock.elapsedRealtime() - mRequestStartTimeMillis; - logRotationStats(mProposedRotation, mCurrentRotation, RESOLUTION_FAILURE, - timeToCalculate); + SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis; + logRotationStats(request.mProposedRotation, request.mCurrentRotation, + RESOLUTION_FAILURE, timeToCalculate); } } @Override public void onCancellable(@NonNull ICancellationSignal cancellation) { - synchronized (mLock) { - mCancellation = cancellation; - if (mCancellationSignalInternal.isCanceled()) { + final RotationRequest request = mRequestWeakReference.get(); + synchronized (request.mLock) { + request.mCancellation = cancellation; + if (request.mCancellationSignalInternal.isCanceled()) { // Dispatch the cancellation signal if the client has cancelled the request. try { cancellation.cancel(); diff --git a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java index 3dbc32ad54d82..6f7c016cb3f6a 100644 --- a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java +++ b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java @@ -122,14 +122,9 @@ final class RotationResolverManagerPerUserService extends } }); - if (mRemoteService != null) { - mRemoteService.resolveRotationLocked(mCurrentRequest); - mCurrentRequest.mIsDispatched = true; - } else { - Slog.w(TAG, "Remote service is not available at this moment."); - callbackInternal.onFailure(ROTATION_RESULT_FAILURE_CANCELLED); - cancelLocked(); - } + + mRemoteService.resolveRotationLocked(mCurrentRequest); + mCurrentRequest.mIsDispatched = true; } @GuardedBy("mLock") @@ -198,15 +193,6 @@ final class RotationResolverManagerPerUserService extends if (mCurrentRequest == null) { return; } - - if (mCurrentRequest.mIsFulfilled) { - if (isVerbose()) { - Slog.d(TAG, "Trying to cancel the request that has been already fulfilled."); - } - mCurrentRequest = null; - return; - } - mCurrentRequest.cancelInternal(); mCurrentRequest = null; } diff --git a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java index 4a37e79609125..03d76649e7ee5 100644 --- a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java +++ b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java @@ -191,7 +191,7 @@ public class RotationResolverManagerService extends TAG); final RotationResolverManagerPerUserService service = getServiceForUserLocked( UserHandle.getCallingUserId()); - new RotationResolverShellCommend(service).exec(this, in, out, err, args, callback, + new RotationResolverShellCommand(service).exec(this, in, out, err, args, callback, resultReceiver); } } diff --git a/services/core/java/com/android/server/rotationresolver/RotationResolverShellCommend.java b/services/core/java/com/android/server/rotationresolver/RotationResolverShellCommand.java similarity index 96% rename from services/core/java/com/android/server/rotationresolver/RotationResolverShellCommend.java rename to services/core/java/com/android/server/rotationresolver/RotationResolverShellCommand.java index 0a873892b5bfb..54a9edba4e033 100644 --- a/services/core/java/com/android/server/rotationresolver/RotationResolverShellCommend.java +++ b/services/core/java/com/android/server/rotationresolver/RotationResolverShellCommand.java @@ -26,13 +26,13 @@ import android.view.Surface; import java.io.PrintWriter; -final class RotationResolverShellCommend extends ShellCommand { +final class RotationResolverShellCommand extends ShellCommand { private static final int INITIAL_RESULT_CODE = -1; @NonNull private final RotationResolverManagerPerUserService mService; - RotationResolverShellCommend(@NonNull RotationResolverManagerPerUserService service) { + RotationResolverShellCommand(@NonNull RotationResolverManagerPerUserService service) { mService = service; }