diff options
| author | 2024-10-18 07:58:04 +0000 | |
|---|---|---|
| committer | 2024-10-18 07:58:04 +0000 | |
| commit | c1bca5a02ee6f3c64713385437154b81ca603d5c (patch) | |
| tree | 9069f76a03023b5fb73edc98420dcbddc994cd52 | |
| parent | cf244b0831dde4d7ffd03adc7796126da4476200 (diff) | |
Clear close prepare transition token by TransitionObserver
Transition handler won't receive startAnimation nor mergeAnimation if
there is no changes in that transition. Use TransitionObserver to
track the state in case the close prepare transition is aborted.
Flag: EXEMPT bugfix
Bug: 373828944
Test: disable snapshot, click app button on edge which also trigger
predictive back animation, verify the close prepare transition can
be reset if aborted.
Change-Id: I6c927f5a7602ed3345da05564671445496d30b5a
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index fafb69cc8089..e4db7b636ed9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -164,8 +164,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont */ private BackTouchTracker mQueuedTracker = new BackTouchTracker(); - private final FocusTaskTrackerObserver mFocusTaskTrackerObserver = - new FocusTaskTrackerObserver(); + private final BackTransitionObserver mBackTransitionObserver = + new BackTransitionObserver(); private final Runnable mAnimationTimeoutRunnable = () -> { ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...", @@ -271,7 +271,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont mBackTransitionHandler = new BackTransitionHandler(); mTransitions.addHandler(mBackTransitionHandler); mHandler = handler; - mTransitions.registerObserver(mFocusTaskTrackerObserver); + mTransitions.registerObserver(mBackTransitionObserver); + mBackTransitionObserver.setBackTransitionHandler(mBackTransitionHandler); updateTouchableArea(); } @@ -736,7 +737,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont * @return Latest task id which back gesture has occurred on it. */ public int getLatestTriggerBackTask() { - return mFocusTaskTrackerObserver.mFocusedTaskId; + return mBackTransitionObserver.mFocusedTaskId; } /** @@ -804,7 +805,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont ProtoLog.d(WM_SHELL_BACK_PREVIEW, "onGestureFinished() mTriggerBack == %s", triggerBack); if (triggerBack) { - mFocusTaskTrackerObserver.update(mBackNavigationInfo != null + mBackTransitionObserver.update(mBackNavigationInfo != null ? mBackNavigationInfo.getFocusedTaskId() : INVALID_TASK_ID); } @@ -1234,6 +1235,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } if (shouldCancelAnimation(info)) { + mPrepareOpenTransition = null; return false; } @@ -1663,9 +1665,13 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } // Record the latest back gesture happen on which task. - static class FocusTaskTrackerObserver implements Transitions.TransitionObserver { + static class BackTransitionObserver implements Transitions.TransitionObserver { int mFocusedTaskId = INVALID_TASK_ID; - IBinder mMonitorBinder; + IBinder mFocusTaskMonitorToken; + private BackTransitionHandler mBackTransitionHandler; + void setBackTransitionHandler(BackTransitionHandler handler) { + mBackTransitionHandler = handler; + } void update(int focusedTaskId) { mFocusedTaskId = focusedTaskId; @@ -1681,28 +1687,34 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont for (int i = info.getChanges().size() - 1; i >= 0; --i) { final TransitionInfo.Change c = info.getChanges().get(i); if (c.getTaskInfo() != null && c.getTaskInfo().taskId == mFocusedTaskId) { - mMonitorBinder = transition; + mFocusTaskMonitorToken = transition; break; } } // Transition happen but the task isn't involved, reset. - if (mMonitorBinder == null) { + if (mFocusTaskMonitorToken == null) { mFocusedTaskId = INVALID_TASK_ID; } } @Override public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { - if (mMonitorBinder == merged) { - mMonitorBinder = playing; + if (mFocusTaskMonitorToken == merged) { + mFocusTaskMonitorToken = playing; + } + if (mBackTransitionHandler.mClosePrepareTransition == merged) { + mBackTransitionHandler.mClosePrepareTransition = null; } } @Override public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) { - if (mMonitorBinder == transition) { + if (mFocusTaskMonitorToken == transition) { mFocusedTaskId = INVALID_TASK_ID; } + if (mBackTransitionHandler.mClosePrepareTransition == transition) { + mBackTransitionHandler.mClosePrepareTransition = null; + } } } } |