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

Commit 0902cc1b authored by Todd Lee's avatar Todd Lee Committed by Android (Google) Code Review
Browse files

Merge "Ensure origin transitions use default shell apply token" into main

parents 29f2ae3c 08de8fbd
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 {