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

Commit c00c3d93 authored by Chris Li's avatar Chris Li
Browse files

Remove CounterRotator surface in finishTransaction

Before, the surface will be removed, and the children will be reparented
to root in a separate transaction when animation is done. That would
cause a flicker because the reparented children may be above the
rotation activity.

Bug: 206094140
Test: manually test expanding PIP
Change-Id: I0f16b7590d4bd0f4c377158d555cb94f28f134cd
parent 8fe59ba8
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -155,7 +155,8 @@ public class PipTransition extends PipTransitionController {

            switch (type) {
                case TRANSIT_EXIT_PIP:
                    startExitAnimation(info, startTransaction, finishCallback, exitPipChange);
                    startExitAnimation(info, startTransaction, finishTransaction, finishCallback,
                            exitPipChange);
                    break;
                case TRANSIT_EXIT_PIP_TO_SPLIT:
                    startExitToSplitAnimation(info, startTransaction, finishTransaction,
@@ -283,6 +284,7 @@ public class PipTransition extends PipTransitionController {

    private void startExitAnimation(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback,
            @NonNull TransitionInfo.Change pipChange) {
        TransitionInfo.Change displayRotationChange = null;
@@ -298,8 +300,8 @@ public class PipTransition extends PipTransitionController {

        if (displayRotationChange != null) {
            // Exiting PIP to fullscreen with orientation change.
            startExpandAndRotationAnimation(info, startTransaction, finishCallback,
                    displayRotationChange, pipChange);
            startExpandAndRotationAnimation(info, startTransaction, finishTransaction,
                    finishCallback, displayRotationChange, pipChange);
            return;
        }

@@ -322,6 +324,7 @@ public class PipTransition extends PipTransitionController {

    private void startExpandAndRotationAnimation(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback,
            @NonNull TransitionInfo.Change displayRotationChange,
            @NonNull TransitionInfo.Change pipChange) {
@@ -335,7 +338,6 @@ public class PipTransition extends PipTransitionController {
        rotator.handleClosingChanges(info, startTransaction, rotateDelta, displayW, displayH);

        mFinishCallback = (wct, wctCB) -> {
            rotator.cleanUp();
            mPipOrganizer.onExitPipFinished(pipChange.getTaskInfo());
            finishCallback.onTransitionFinished(wct, wctCB);
        };
@@ -366,6 +368,7 @@ public class PipTransition extends PipTransitionController {
                endBounds, startBounds, new Rect(), degree, x, y, true /* isExpanding */,
                pipRotateDelta == ROTATION_270 /* clockwise */);
        startTransaction.apply();
        rotator.cleanUp(finishTransaction);

        // Expand and rotate the pip window to fullscreen.
        final PipAnimationController.PipTransitionAnimator animator =
+8 −5
Original line number Diff line number Diff line
@@ -35,13 +35,11 @@ import java.util.List;
 */
public class CounterRotatorHelper {
    private final ArrayMap<WindowContainerToken, CounterRotator> mRotatorMap = new ArrayMap<>();
    private SurfaceControl mRootLeash;

    /** Puts the surface controls of closing changes to counter-rotated surfaces. */
    public void handleClosingChanges(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            int rotateDelta, int displayW, int displayH) {
        mRootLeash = info.getRootLeash();
        final List<TransitionInfo.Change> changes = info.getChanges();
        final int numChanges = changes.size();
        for (int i = numChanges - 1; i >= 0; --i) {
@@ -71,10 +69,15 @@ public class CounterRotatorHelper {
        }
    }

    /** Restores to the original state, i.e. reparent back to transition root. */
    public void cleanUp() {
    /**
     * Removes the counter rotation surface in the finish transaction. No need to reparent the
     * children as the finish transaction should have already taken care of that.
     *
     * This can only be called after startTransaction for {@link #handleClosingChanges} is applied.
     */
    public void cleanUp(@NonNull SurfaceControl.Transaction finishTransaction) {
        for (int i = mRotatorMap.size() - 1; i >= 0; --i) {
            mRotatorMap.valueAt(i).cleanUp(mRootLeash);
            mRotatorMap.valueAt(i).cleanUp(finishTransaction);
        }
        mRotatorMap.clear();
    }
+1 −1
Original line number Diff line number Diff line
@@ -282,7 +282,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
        final Runnable onAnimFinish = () -> {
            if (!animations.isEmpty()) return;

            rotator.cleanUp();
            if (mRotationAnimation != null) {
                mRotationAnimation.kill();
                mRotationAnimation = null;
@@ -382,6 +381,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
        }

        startTransaction.apply();
        rotator.cleanUp(finishTransaction);
        TransitionMetrics.getInstance().reportAnimationStart(transition);
        // run finish now in-case there are no animations
        onAnimFinish.run();
+6 −15
Original line number Diff line number Diff line
@@ -18,14 +18,11 @@ package com.android.wm.shell.util;

import android.view.SurfaceControl;

import java.util.ArrayList;

/**
 * Utility class that takes care of counter-rotating surfaces during a transition animation.
 */
public class CounterRotator {
    SurfaceControl mSurface = null;
    ArrayList<SurfaceControl> mRotateChildren = null;
    private SurfaceControl mSurface = null;

    /** Gets the surface with the counter-rotation. */
    public SurfaceControl getSurface() {
@@ -41,7 +38,6 @@ public class CounterRotator {
    public void setup(SurfaceControl.Transaction t, SurfaceControl parent, int rotateDelta,
            float displayW, float displayH) {
        if (rotateDelta == 0) return;
        mRotateChildren = new ArrayList<>();
        // We want to counter-rotate, so subtract from 4
        rotateDelta = 4 - (rotateDelta + 4) % 4;
        mSurface = new SurfaceControl.Builder()
@@ -64,24 +60,19 @@ public class CounterRotator {
    }

    /**
     * Add a surface that needs to be counter-rotate.
     * Adds a surface that needs to be counter-rotate.
     */
    public void addChild(SurfaceControl.Transaction t, SurfaceControl child) {
        if (mSurface == null) return;
        t.reparent(child, mSurface);
        mRotateChildren.add(child);
    }

    /**
     * Clean-up. This undoes any reparenting and effectively stops the counter-rotation.
     * Clean-up. Since finishTransaction should reset all change leashes, we only need to remove the
     * counter rotation surface.
     */
    public void cleanUp(SurfaceControl rootLeash) {
    public void cleanUp(SurfaceControl.Transaction finishTransaction) {
        if (mSurface == null) return;
        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
        for (int i = mRotateChildren.size() - 1; i >= 0; --i) {
            t.reparent(mRotateChildren.get(i), rootLeash);
        }
        t.remove(mSurface);
        t.apply();
        finishTransaction.remove(mSurface);
    }
}
+5 −3
Original line number Diff line number Diff line
@@ -205,8 +205,10 @@ public class RemoteAnimationAdapterCompat {
                    @Override
                    @SuppressLint("NewApi")
                    public void run() {
                        counterLauncher.cleanUp(info.getRootLeash());
                        counterWallpaper.cleanUp(info.getRootLeash());
                        final SurfaceControl.Transaction finishTransaction =
                                new SurfaceControl.Transaction();
                        counterLauncher.cleanUp(finishTransaction);
                        counterWallpaper.cleanUp(finishTransaction);
                        // Release surface references now. This is apparently to free GPU memory
                        // while doing quick operations (eg. during CTS).
                        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
@@ -216,7 +218,7 @@ public class RemoteAnimationAdapterCompat {
                            leashMap.valueAt(i).release();
                        }
                        try {
                            finishCallback.onTransitionFinished(null /* wct */, null /* sct */);
                            finishCallback.onTransitionFinished(null /* wct */, finishTransaction);
                        } catch (RemoteException e) {
                            Log.e("ActivityOptionsCompat", "Failed to call app controlled animation"
                                    + " finished callback", e);