From a8e3dbf124059bf0ea9ca0cde1b05d523f19d06f Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Fri, 14 Apr 2023 16:57:35 +0200 Subject: [PATCH] Fix non tailcall onTransitionFinished According to current design, RecentsTransitionHandler's finish methods are not re-entrant, so onTransitionFinished *must* be tail called from RecentsTransitionHandler to avoid broken state when we come back. Test: atest 'ShellTransitionTests#testTransitSleep_squashesRecents' # see follow-up commit Bug: 277212616 Change-Id: I97fd08f16e096588e2c838b181ff0287410f8326 --- .../wm/shell/recents/RecentsTransitionHandler.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) 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 44d7e6de8ec4d..a8b209fc7da64 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 @@ -213,12 +213,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { RecentsController(IRecentsAnimationRunner listener) { mListener = listener; - mDeathHandler = () -> mExecutor.execute(() -> { - if (mListener == null) return; - if (mFinishCB != null) { - finish(mWillFinishToHome, false /* leaveHint */); - } - }); + mDeathHandler = () -> finish(mWillFinishToHome, false /* leaveHint */); try { mListener.asBinder().linkToDeath(mDeathHandler, 0 /* flags */); } catch (RemoteException e) { @@ -245,7 +240,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { } } if (mFinishCB != null) { - finish(toHome, false /* userLeave */); + finishInner(toHome, false /* userLeave */); } else { cleanUp(); } @@ -552,13 +547,13 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { t.apply(); // not using the incoming anim-only surfaces info.releaseAnimSurfaces(); - finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */); if (appearedTargets == null) return; try { mListener.onTasksAppeared(appearedTargets); } catch (RemoteException e) { Slog.e(TAG, "Error sending appeared tasks to recents animation", e); } + finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */); } /** For now, just set-up a jump-cut to the new activity. */