diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 76b0351fe1f6c..4ed07c351847a 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -4089,11 +4089,14 @@ class ActivityStack extends ConfigurationContainer { // The activity that we are finishing may be over the lock screen. In this case, we do not // want to consider activities that cannot be shown on the lock screen as running and should // proceed with finishing the activity if there is no valid next top running activity. + // Note that if this finishing activity is floating task, we don't need to wait the + // next activity resume and can destroy it directly. final ActivityDisplay display = getDisplay(); final ActivityRecord next = display.topRunningActivity(true /* considerKeyguardState */); + final boolean isFloating = r.getConfiguration().windowConfiguration.tasksAreFloating(); if (mode == FINISH_AFTER_VISIBLE && (r.visible || r.nowVisible) - && next != null && !next.nowVisible) { + && next != null && !next.nowVisible && !isFloating) { if (!mStackSupervisor.mStoppingActivities.contains(r)) { addToStopping(r, false /* scheduleIdle */, false /* idleDelayed */); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 8e18683d3e762..4105487c88ca6 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2861,6 +2861,13 @@ class WindowState extends WindowContainer implements WindowManagerP } mDestroying = false; destroyedSomething = true; + + // Since mDestroying will affect AppWindowToken#allDrawn, we need to perform another + // traversal in case we are waiting on this window to start the transition. + if (getDisplayContent().mAppTransition.isTransitionSet() + && getDisplayContent().mOpeningApps.contains(mAppToken)) { + mWmService.mWindowPlacerLocked.requestTraversal(); + } } return destroyedSomething;