diff options
| author | 2024-06-20 14:32:08 -0700 | |
|---|---|---|
| committer | 2024-06-21 15:28:04 -0700 | |
| commit | 9af944f95f02dc189afc5b3d1702ef1c9781b0cc (patch) | |
| tree | 8f742262b5b29cf555dbdbc62bf0eb456af402aa | |
| parent | e8c2428c975fb16edfcccc40ee2b9d3ae7ae8bb9 (diff) | |
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
Change-Id: I901736891d1e3e5df481d6a47d43fc34b600d981
4 files changed, 62 insertions, 4 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 87bd84017dee..1fcfa7fcf350 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -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); } // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java index 3a266d9bb3ef..c67cf1d85918 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java @@ -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) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index f257e207673d..d2760ff88ece 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -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) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index 964d86e8bd35..69a61eadf61d 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -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(); |