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

Commit d41f82a4 authored by Evan Rosky's avatar Evan Rosky Committed by Android Build Coastguard Worker
Browse files

Add pre-deprecated "after-merge-finish" transaction

* This should not be used except in the rare case where
it needs to "overwrite" an ordered finishT due to the
use of finishWCT (as is the case currently w/ recents).
* We now always move tasks that are opening to the closing
queue if we detect it's a swipe to home

Bug: 320403561
Test: perform quickswitch + swipe-up rapidly
Flag: EXEMPT bugfix
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:9af944f95f02dc189afc5b3d1702ef1c9781b0cc)
Merged-In: I901736891d1e3e5df481d6a47d43fc34b600d981
Change-Id: I901736891d1e3e5df481d6a47d43fc34b600d981
parent 41612609
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.Handler;
import android.os.UserManager;
import android.view.Choreographer;
import android.view.IWindowManager;
import android.view.SurfaceControl;
import android.view.WindowManager;

import com.android.internal.jank.InteractionJankMonitor;
@@ -400,7 +401,8 @@ public abstract class WMShellModule {
            Optional<RecentTasksController> recentTasksController,
            HomeTransitionObserver homeTransitionObserver) {
        return new RecentsTransitionHandler(shellInit, transitions,
                recentTasksController.orElse(null), homeTransitionObserver);
                recentTasksController.orElse(null), homeTransitionObserver,
                SurfaceControl.Transaction::new);
    }

    //
+20 −2
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import com.android.wm.shell.transition.Transitions;

import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * Handles the Recents (overview) animation. Only one of these can run at a time. A recents
@@ -84,6 +85,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {

    private final Transitions mTransitions;
    private final ShellExecutor mExecutor;
    private final Supplier<SurfaceControl.Transaction> mTransactionSupplier;
    @Nullable
    private final RecentTasksController mRecentTasksController;
    private IApplicationThread mAnimApp = null;
@@ -101,11 +103,13 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {

    public RecentsTransitionHandler(ShellInit shellInit, Transitions transitions,
            @Nullable RecentTasksController recentTasksController,
            HomeTransitionObserver homeTransitionObserver) {
            HomeTransitionObserver homeTransitionObserver,
            Supplier<SurfaceControl.Transaction> transactionSupplier) {
        mTransitions = transitions;
        mExecutor = transitions.getMainExecutor();
        mRecentTasksController = recentTasksController;
        mHomeTransitionObserver = homeTransitionObserver;
        mTransactionSupplier = transactionSupplier;
        if (!Transitions.ENABLE_SHELL_TRANSITIONS) return;
        if (recentTasksController == null) return;
        shellInit.addInitCallback(() -> {
@@ -1056,7 +1060,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
            final Transitions.TransitionFinishCallback finishCB = mFinishCB;
            mFinishCB = null;

            final SurfaceControl.Transaction t = mFinishTransaction;
            SurfaceControl.Transaction t = mFinishTransaction;
            final WindowContainerTransaction wct = new WindowContainerTransaction();

            if (mKeyguardLocked && mRecentsTask != null) {
@@ -1106,6 +1110,16 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
                    }
                }
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, "  normal finish");
                if (toHome && !mOpeningTasks.isEmpty()) {
                    // Attempting to start a task after swipe to home, don't show it,
                    // move recents to top
                    ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
                            "  attempting to start a task after swipe to home");
                    t = mTransactionSupplier.get();
                    wct.reorder(mRecentsTask, true /*onTop*/);
                    mClosingTasks.addAll(mOpeningTasks);
                    mOpeningTasks.clear();
                }
                // The general case: committing to recents, going home, or switching tasks.
                for (int i = 0; i < mOpeningTasks.size(); ++i) {
                    t.show(mOpeningTasks.get(i).mTaskSurface);
@@ -1174,6 +1188,10 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
                    mPipTransaction = null;
                }
            }
            if (t != mFinishTransaction) {
                // apply after merges because these changes are accounting for finishWCT changes.
                mTransitions.setAfterMergeFinishTransaction(mTransition, t);
            }
            cleanUp();
            finishCB.onTransitionFinished(wct.isEmpty() ? null : wct);
            if (runnerFinishCb != null) {
+37 −0
Original line number Diff line number Diff line
@@ -238,6 +238,13 @@ public class Transitions implements RemoteCallable<Transitions>,
        /** Ordered list of transitions which have been merged into this one. */
        private ArrayList<ActiveTransition> mMerged;

        /**
         * @deprecated DO NOT USE THIS unless absolutely necessary. It will be removed once
         * everything migrates off finishWCT.
         */
        @java.lang.Deprecated
        SurfaceControl.Transaction mAfterMergeFinishT;

        ActiveTransition(IBinder token) {
            mToken = token;
        }
@@ -1018,6 +1025,20 @@ public class Transitions implements RemoteCallable<Transitions>,
        return null;
    }

    /** @deprecated */
    @java.lang.Deprecated
    public void setAfterMergeFinishTransaction(IBinder transition,
            SurfaceControl.Transaction afterMergeFinishT) {
        final ActiveTransition at = mKnownTransitions.get(transition);
        if (at == null) return;
        if (at.mAfterMergeFinishT != null) {
            Log.e(TAG, "Setting after-merge-t >1 time on transition: " + at.mInfo.getDebugId());
            at.mAfterMergeFinishT.merge(afterMergeFinishT);
            return;
        }
        at.mAfterMergeFinishT = afterMergeFinishT;
    }

    /** Aborts a transition. This will still queue it up to maintain order. */
    private void onAbort(ActiveTransition transition) {
        final Track track = mTracks.get(transition.getTrack());
@@ -1078,6 +1099,7 @@ public class Transitions implements RemoteCallable<Transitions>,
        }
        // Merge all associated transactions together
        SurfaceControl.Transaction fullFinish = active.mFinishT;
        SurfaceControl.Transaction afterMergeFinish = active.mAfterMergeFinishT;
        if (active.mMerged != null) {
            for (int iM = 0; iM < active.mMerged.size(); ++iM) {
                final ActiveTransition toMerge = active.mMerged.get(iM);
@@ -1097,6 +1119,21 @@ public class Transitions implements RemoteCallable<Transitions>,
                        fullFinish.merge(toMerge.mFinishT);
                    }
                }
                if (toMerge.mAfterMergeFinishT != null) {
                    if (afterMergeFinish == null) {
                        afterMergeFinish = toMerge.mAfterMergeFinishT;
                    } else {
                        afterMergeFinish.merge(toMerge.mAfterMergeFinishT);
                    }
                    toMerge.mAfterMergeFinishT = null;
                }
            }
        }
        if (afterMergeFinish != null) {
            if (fullFinish == null) {
                fullFinish = afterMergeFinish;
            } else {
                fullFinish.merge(afterMergeFinish);
            }
        }
        if (fullFinish != null) {
+2 −1
Original line number Diff line number Diff line
@@ -1192,7 +1192,8 @@ public class ShellTransitionTests extends ShellTestCase {
                        mMainHandler, mAnimExecutor, mock(HomeTransitionObserver.class));
        final RecentsTransitionHandler recentsHandler =
                new RecentsTransitionHandler(shellInit, transitions,
                        mock(RecentTasksController.class), mock(HomeTransitionObserver.class));
                        mock(RecentTasksController.class), mock(HomeTransitionObserver.class),
                        () -> mock(SurfaceControl.Transaction.class));
        transitions.replaceDefaultHandlerForTest(mDefaultHandler);
        shellInit.init();