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

Commit 08de8fbd authored by Todd Lee's avatar Todd Lee
Browse files

Ensure origin transitions use default shell apply token

This provides better synchronization between shell/remote
processes.

Bug: b/409124904
Test: atest PlatformAnimationLibCoreTests
      atest ClockworkSystemUiRoboTests
Flag: NONE exempt trivial change for Wear OT
Change-Id: Ica6a78ffd76b0c825e948ae3f7b4fa54adad8656
parent 9f13b8d5
Loading
Loading
Loading
Loading
+57 −5
Original line number Diff line number Diff line
@@ -65,6 +65,9 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements
    @Nullable private UIComponent.Transaction mOriginTransaction;
    @Nullable private TransitionAnimationController mAnimationController;
    @Nullable private SurfaceControl mOriginLeash;
    @Nullable private IBinder mLocalTransactionToken;
    @Nullable private IBinder mShellTransactionToken;


    OriginRemoteTransition(
            Context context,
@@ -131,6 +134,10 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements

    private void startAnimationInternal(
            TransitionInfo info, @Nullable WindowAnimationState[] states) {

        // setup shared transaction queue
        shareTransactionQueue();

        if (!prepareUIs(info)) {
            logE("Unable to prepare UI!");
            finishAnimation(/* finished= */ false);
@@ -343,6 +350,7 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements
        mStartTransaction = null;
        mOriginTransaction = null;
        mFinishCallback = null;
        unshareTransactionQueue();
    }

    public void cancel() {
@@ -355,6 +363,50 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements
                });
    }

    /**
     * Provide server side (shell) token for use in applying transactions.
     * @hide
     */
    public void setShellTransactionToken(IBinder shellApplyToken) {
        mShellTransactionToken = shellApplyToken;
    }

    /**
     * Use server side (shell) transaction-queue instead of local/independent one. This is necessary
     * if client/server need to coordinate transactions (eg. for shell transitions).
     */
    private void shareTransactionQueue() {
        if (mLocalTransactionToken == null) {
            mLocalTransactionToken = SurfaceControl.Transaction.getDefaultApplyToken();
        }
        setupTransactionQueue();
    }

    /**
     * Switch back to using local processes independent transaction queue.
     */
    private void unshareTransactionQueue() {
        if (mLocalTransactionToken == null) {
            return;
        }
        SurfaceControl.Transaction.setDefaultApplyToken(mLocalTransactionToken);
        mLocalTransactionToken = null;
        mShellTransactionToken = null;
    }

    private void setupTransactionQueue() {
        if (mLocalTransactionToken == null) {
            return;
        }

        if (mShellTransactionToken == null) {
            Log.e(TAG, "Didn't receive apply token from server side (shell)");
            return;
        }

        SurfaceControl.Transaction.setDefaultApplyToken(mShellTransactionToken);
    }

    private static void logD(String msg) {
        if (OriginTransitionSession.DEBUG) {
            Log.d(TAG, msg);
+20 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
@@ -64,7 +65,6 @@ public class OriginTransitionSession {
    @Nullable private final IRemoteTransition mEntryTransition;
    @Nullable private final IRemoteTransition mExitTransition;
    private final AtomicInteger mState = new AtomicInteger(NOT_STARTED);

    @Nullable private RemoteTransition mOriginTransition;

    private OriginTransitionSession(
@@ -82,6 +82,7 @@ public class OriginTransitionSession {
            throw new IllegalArgumentException(
                    "Entry transition must be supplied if you want to play an exit transition!");
        }

    }

    /**
@@ -96,6 +97,8 @@ public class OriginTransitionSession {
            return false;
        }

        setupTransactionQueues();

        RemoteTransition remoteTransition = null;
        if (hasEntryTransition() && hasExitTransition()) {
            logD("start: starting with entry and exit transition.");
@@ -160,6 +163,22 @@ public class OriginTransitionSession {
        return mOriginTransitions != null && mExitTransition != null;
    }

    private void setupTransactionQueues() {
        final IBinder shellApplyToken;
        try {
            shellApplyToken = mOriginTransitions.getDefaultTransactionApplyToken();
        } catch (RemoteException e) {
            Log.e(TAG, "Error getting server side (shell) apply token", e);
            return;
        }
        if (mEntryTransition != null && mEntryTransition instanceof OriginRemoteTransition) {
            ((OriginRemoteTransition) mEntryTransition).setShellTransactionToken(shellApplyToken);
        }
        if (mExitTransition != null && mExitTransition instanceof OriginRemoteTransition) {
            ((OriginRemoteTransition) mExitTransition).setShellTransactionToken(shellApplyToken);
        }
    }

    private void logD(String msg) {
        if (DEBUG) {
            Log.d(TAG, "Session[" + mName + "] - " + msg);
+6 −0
Original line number Diff line number Diff line
@@ -101,6 +101,12 @@ public class IOriginTransitionsImpl extends IOriginTransitions.Stub {
        }
    }

    @Override
    public IBinder getDefaultTransactionApplyToken() {
        enforceRemoteTransitionPermission();
        return SurfaceControl.Transaction.getDefaultApplyToken();
    }

    private void enforceRemoteTransitionPermission() {
        mContext.enforceCallingPermission(
                Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
+5 −0
Original line number Diff line number Diff line
@@ -41,4 +41,9 @@ interface IOriginTransitions {
     * origin transition object will reset to a single frame animation.
     */
    void cancelOriginTransition(in RemoteTransition originTransition) = 2;

    /**
     * Returns the token to be used as the default `apply` token with SurfaceControl.Transaction.
     */
    IBinder getDefaultTransactionApplyToken() = 3;
}
+5 −0
Original line number Diff line number Diff line
@@ -336,6 +336,11 @@ public final class OriginTransitionSessionTest {
            mRecords.remove(originTransition);
        }

        @Override
        public IBinder getDefaultTransactionApplyToken() throws RemoteException {
            return null;
        }

        public void runReturnTransition(RemoteTransition originTransition, TransitionInfo info) {
            RemoteTransition transition = mRecords.remove(originTransition);
            try {