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
This commit is contained in:
wilsonshih
2022-06-10 15:43:14 +08:00
parent 0ea4431a84
commit 53baa13515

View File

@@ -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 =