From aa9376bc4f9bdd25fd329f96638fa3701d71f805 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Sun, 17 May 2020 22:23:13 +0800 Subject: [PATCH] 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 --- data/etc/services.core.protolog.json | 30 ++++--------------- .../com/android/server/wm/AppTransition.java | 8 ----- .../server/wm/RecentsAnimationController.java | 9 ++++-- .../core/java/com/android/server/wm/Task.java | 13 ++++---- 4 files changed, 20 insertions(+), 40 deletions(-) diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index c5ac451a95391..b5c19a8954137 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -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", diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index c8ea7ceee57e1..3ad11af4d587d 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -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} diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index f1b322ed24ba0..a2b295a609cd2 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -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); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index cc72dcfb0be21..1dc0939948ca2 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3511,14 +3511,15 @@ class Task extends 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); }