Fix black screen during Quick switch

When quick switch a delayed task, before onTaskAppeared called,
if the user holds gesture on nav bar, TRANSIT_WALLPAPER_OPEN from closing
app happens will cancel recents animation when
WC#applyAnimationUnchecked, and that will cause the black screen if the
delayed task not yet drawn and there is no recents task snapshot on top.

Since cancelling recents animation during quick switching doesn't make
sense, to fix that, we should check the animation task target if is
still controlled by recents animation, if so, we should not cancel it.

Also, make sure if the appeared task has already been in task target list,
(i.e. task A appreared, quick switch to task B, before task B appeared,
quick switch back to task A) if so, we don't need to callback task
appeared again.

Fix: 156670249
Test: manual as issue test steps.
Change-Id: I303403d63c91c08fabcb8c5b1b1aac42c4ec65db
This commit is contained in:
Ming-Shin Lu
2020-05-17 22:23:13 +08:00
parent c45de5abfa
commit aa9376bc4f
4 changed files with 20 additions and 40 deletions

View File

@@ -85,12 +85,6 @@
"group": "WM_DEBUG_ADD_REMOVE",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
"-1953668890": {
"message": "Can't start recents animation, nextAppTransition=%s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimation.java"
},
"-1949279037": {
"message": "Attempted to add input method window with bad token %s. Aborting.",
"level": "WARN",
@@ -889,12 +883,6 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
"-242787066": {
"message": "addTaskToRecentsAnimationIfNeeded, control: %s, task: %s, transit: %s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/WindowContainer.java"
},
"-198463978": {
"message": "updateRotationUnchecked: alwaysSendConfiguration=%b forceRelayout=%b",
"level": "VERBOSE",
@@ -1135,6 +1123,12 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/DisplayRotation.java"
},
"210750281": {
"message": "applyAnimationUnchecked, control: %s, task: %s, transit: %s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/Task.java"
},
"221540118": {
"message": "mUserActivityTimeout set to %d",
"level": "DEBUG",
@@ -1543,24 +1537,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowToken.java"
},
"845234215": {
"message": "App is requesting an orientation, return %d for display id=%d",
"level": "VERBOSE",
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/DisplayContent.java"
},
"853091290": {
"message": "Moved stack=%s behind stack=%s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimation.java"
},
"854237232": {
"message": "addTaskToRecentsAnimationIfNeeded, control: %s, task: %s, transit: %s",
"level": "DEBUG",
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/Task.java"
},
"873914452": {
"message": "goodToGo()",
"level": "DEBUG",

View File

@@ -407,14 +407,6 @@ public class AppTransition implements Dump {
return mNextAppTransitionType == NEXT_TRANSIT_TYPE_OPEN_CROSS_PROFILE_APPS;
}
boolean isNextAppTransitionCustomFromRecents() {
final RecentTasks recentTasks = mService.mAtmService.getRecentTasks();
final String recentsPackageName =
(recentTasks != null) ? recentTasks.getRecentsComponent().getPackageName() : null;
return mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM
&& mNextAppTransitionPackage.equals(recentsPackageName);
}
/**
* @return true if and only if we are currently fetching app transition specs from the future
* passed into {@link #overridePendingAppTransitionMultiThumbFuture}

View File

@@ -515,9 +515,14 @@ public class RecentsAnimationController implements DeathRecipient {
void addTaskToTargets(Task task, OnAnimationFinishedCallback finishedCallback) {
if (mRunner != null) {
// No need to send task appeared when the task target already exists.
if (isAnimatingTask(task)) {
return;
}
final RemoteAnimationTarget target = createTaskRemoteAnimation(task, finishedCallback);
if (target == null) return;
if (target == null) {
return;
}
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "addTaskToTargets, target: %s", target);
try {
mRunner.onTaskAppeared(target);

View File

@@ -3511,14 +3511,15 @@ class Task extends WindowContainer<WindowContainer> {
int transit, boolean isVoiceInteraction,
@Nullable OnAnimationFinishedCallback finishedCallback) {
final RecentsAnimationController control = mWmService.getRecentsAnimationController();
if (control != null && enter
&& getDisplayContent().mAppTransition.isNextAppTransitionCustomFromRecents()) {
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
"addTaskToRecentsAnimationIfNeeded, control: %s, task: %s, transit: %s",
control, asTask(), AppTransition.appTransitionToString(transit));
if (control != null) {
// We let the transition to be controlled by RecentsAnimation, and callback task's
// RemoteAnimationTarget for remote runner to animate.
control.addTaskToTargets(getRootTask(), finishedCallback);
if (enter) {
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
"applyAnimationUnchecked, control: %s, task: %s, transit: %s",
control, asTask(), AppTransition.appTransitionToString(transit));
control.addTaskToTargets(getRootTask(), finishedCallback);
}
} else {
super.applyAnimationUnchecked(lp, enter, transit, isVoiceInteraction, finishedCallback);
}