Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8e50bea authored by Yi Jiang's avatar Yi Jiang Committed by Android (Google) Code Review
Browse files

Merge "A few fixes for RotationResolver" into sc-dev

parents 5a939299 8a1f0bc8
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;
    }

+2 −5
Original line number Diff line number Diff line
@@ -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);
        }
    }

    @MainThread
+36 −21
Original line number Diff line number Diff line
@@ -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<IRotationResolverService> {
@@ -128,13 +130,20 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
            mProposedRotation = proposedRotation;
            mCurrentRotation = currentRotation;
            mPackageName = packageName;
            mIRotationResolverCallback = new RotationResolverCallback();
            mIRotationResolverCallback = new RotationResolverCallback(this);
            mCancellationSignalInternal = cancellationSignal;
            mRequestStartTimeMillis = SystemClock.elapsedRealtime();
        }


        void cancelInternal() {
            synchronized (mLock) {
                if (mIsFulfilled) {
                    Slog.v(TAG, "Trying to cancel the request that has been already fulfilled.");
                    return;
                }
                mIsFulfilled = true;
            }
            Handler.getMain().post(() -> {
                synchronized (mLock) {
                    try {
@@ -147,9 +156,6 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
                    }
                }
            });
            synchronized (mLock) {
                mIsFulfilled = true;
            }
            mCallbackInternal.onFailure(ROTATION_RESULT_FAILURE_CANCELLED);
        }

@@ -160,44 +166,53 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
            ipw.decreaseIndent();
        }

        private class RotationResolverCallback extends IRotationResolverCallback.Stub {
        private static class RotationResolverCallback extends IRotationResolverCallback.Stub {
            private WeakReference<RotationRequest> 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();
+3 −17
Original line number Diff line number Diff line
@@ -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();
        }
    }

    @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;
    }
+1 −1
Original line number Diff line number Diff line
@@ -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);
        }
    }
Loading