Include all not occluded leaf tasks while wrapping animation target

There might be other leaf tasks beside the top leaf task are not
occluded. Like the case when split screen is activated, both top leaf
tasks in each side are not occluded. This makes sure to include them
into remote animation target.

Fix: 227307495
Test: pass existing tests
Test: enter split, quick switch back and forth won't crash

Change-Id: Ic8af56b1a9e029dc4f1c2c57ab59071aab2924b4
This commit is contained in:
Jerry Chang
2022-03-29 07:29:43 +00:00
parent 953115987f
commit b9438a8dce
2 changed files with 27 additions and 28 deletions

View File

@@ -1945,12 +1945,6 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/ScreenRotationAnimation.java"
},
"-172900257": {
"message": "addTaskToTargets, target: %s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimationController.java"
},
"-172326720": {
"message": "Saving icicle of %s: %s",
"level": "INFO",
@@ -2779,12 +2773,6 @@
"group": "WM_DEBUG_APP_TRANSITIONS",
"at": "com\/android\/server\/wm\/WindowState.java"
},
"599897753": {
"message": "Previous Activity is %s. Back type is %s",
"level": "DEBUG",
"group": "WM_DEBUG_BACK_PREVIEW",
"at": "com\/android\/server\/wm\/BackNavigationController.java"
},
"600140673": {
"message": "checkBootAnimationComplete: Waiting for anim complete",
"level": "INFO",
@@ -3319,6 +3307,12 @@
"group": "WM_DEBUG_WINDOW_ORGANIZER",
"at": "com\/android\/server\/wm\/DisplayAreaOrganizerController.java"
},
"1151072840": {
"message": "collectTaskRemoteAnimations, target: %s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimationController.java"
},
"1164325516": {
"message": "onExitAnimationDone in %s: exiting=%b remove=%b selfAnimating=%b anim=%s",
"level": "VERBOSE",

View File

@@ -707,13 +707,7 @@ public class RecentsAnimationController implements DeathRecipient {
if (isAnimatingTask(task) || skipAnimation(task)) {
return;
}
final RemoteAnimationTarget target = createTaskRemoteAnimation(task, MODE_OPENING,
finishedCallback);
if (target == null) {
return;
}
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "addTaskToTargets, target: %s", target);
mPendingTaskAppears.add(target);
collectTaskRemoteAnimations(task, MODE_OPENING, finishedCallback);
}
}
@@ -729,19 +723,30 @@ public class RecentsAnimationController implements DeathRecipient {
}
}
private RemoteAnimationTarget createTaskRemoteAnimation(Task task, int mode,
private void collectTaskRemoteAnimations(Task task, int mode,
OnAnimationFinishedCallback finishedCallback) {
final SparseBooleanArray recentTaskIds =
mService.mAtmService.getRecentTasks().getRecentTaskIds();
// The target must be built off the root task (the leaf task surface would be cropped
// within the root surface). However, recents only tracks leaf task ids, so we'll replace
// the task-id with the leaf id.
final Task leafTask = task.getTopLeafTask();
int taskId = leafTask.mTaskId;
TaskAnimationAdapter adapter = addAnimation(task,
!recentTaskIds.get(taskId), true /* hidden */, finishedCallback);
mPendingNewTaskTargets.add(taskId);
return adapter.createRemoteAnimationTarget(taskId, mode);
// within the root surface). However, recents only tracks leaf task ids, so we'll traverse
// and create animation target for all visible leaf tasks.
task.forAllLeafTasks(leafTask -> {
if (!leafTask.shouldBeVisible(null /* starting */)) {
return;
}
final int taskId = leafTask.mTaskId;
TaskAnimationAdapter adapter = addAnimation(leafTask,
!recentTaskIds.get(taskId), true /* hidden */, finishedCallback);
mPendingNewTaskTargets.add(taskId);
final RemoteAnimationTarget target =
adapter.createRemoteAnimationTarget(taskId, mode);
if (target != null) {
mPendingTaskAppears.add(target);
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
"collectTaskRemoteAnimations, target: %s", target);
}
}, true);
}
void logRecentsAnimationStartTime(int durationMs) {