summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2024-10-18 07:58:04 +0000
committer wilsonshih <wilsonshih@google.com> 2024-10-18 07:58:04 +0000
commitc1bca5a02ee6f3c64713385437154b81ca603d5c (patch)
tree9069f76a03023b5fb73edc98420dcbddc994cd52
parentcf244b0831dde4d7ffd03adc7796126da4476200 (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.java36
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;
+ }
}
}
}