summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2022-06-10 15:43:14 +0800
committer wilsonshih <wilsonshih@google.com> 2022-06-10 18:51:40 +0800
commit53baa13515cc00fb8a65282878950ebfe6755a3a (patch)
tree84af783b54e66e62d82c030a542099151e7c7959
parent0ea4431a84563cc07479fbbadb5eef33ebc5c8e5 (diff)
Fixes a race condition when merge animation transition
When merge a TO_FRONT transition to the recents animation, onTasksAppeared will finish the recents animation, so there can be a race that the open transition for recents animation might be finish before the merge transition, which leave the merge transition become a standalone transition. To make the sequence correct, register a transition commit callback to know the merge transition has done in Shell, then goes to finish the recents animation. Bug: 235433368 Test: enable shell transitin, quick switch back/forward and verify no flicker. Change-Id: I39fc898a8922f900e1e1808f92a471749664e194
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java13
1 files changed, 12 insertions, 1 deletions
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
index e9ac26182c7e..db416013c453 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
@@ -186,6 +186,8 @@ public class RemoteTransitionCompat implements Parcelable {
} catch (RemoteException e) {
Log.e(TAG, "Error merging transition.", e);
}
+ // commit taskAppeared after merge transition finished.
+ mRecentsSession.commitTasksAppearedIfNeeded(recents);
}
};
mTransition = new RemoteTransition(remote, appThread);
@@ -226,6 +228,7 @@ public class RemoteTransitionCompat implements Parcelable {
private PictureInPictureSurfaceTransaction mPipTransaction = null;
private IBinder mTransition = null;
private boolean mKeyguardLocked = false;
+ private RemoteAnimationTargetCompat[] mAppearedTargets;
void setup(RecentsAnimationControllerCompat wrapped, TransitionInfo info,
IRemoteTransitionFinishedCallback finishCB,
@@ -251,6 +254,7 @@ public class RemoteTransitionCompat implements Parcelable {
boolean merge(TransitionInfo info, SurfaceControl.Transaction t,
RecentsAnimationListener recents) {
SparseArray<TransitionInfo.Change> openingTasks = null;
+ mAppearedTargets = null;
boolean cancelRecents = false;
boolean homeGoingAway = false;
boolean hasChangingApp = false;
@@ -331,10 +335,17 @@ public class RemoteTransitionCompat implements Parcelable {
targets[i] = target;
}
t.apply();
- recents.onTasksAppeared(targets);
+ mAppearedTargets = targets;
return true;
}
+ private void commitTasksAppearedIfNeeded(RecentsAnimationListener recents) {
+ if (mAppearedTargets != null) {
+ recents.onTasksAppeared(mAppearedTargets);
+ mAppearedTargets = null;
+ }
+ }
+
@Override public ThumbnailData screenshotTask(int taskId) {
try {
final TaskSnapshot snapshot =