diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 8f0de7312ee5a..b65ca2b6ef3ac 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -2440,7 +2440,7 @@ class ActivityStack extends Task { forAllActivities(ActivityRecord::removeLaunchTickRunnable); } - private void updateTransitLocked(int transit, ActivityOptions options) { + private void updateTransitLocked(int transit, ActivityOptions options, boolean forceOverride) { if (options != null) { ActivityRecord r = topRunningActivity(); if (r != null && !r.isState(RESUMED)) { @@ -2449,7 +2449,8 @@ class ActivityStack extends Task { ActivityOptions.abort(options); } } - getDisplay().mDisplayContent.prepareAppTransition(transit, false); + getDisplay().mDisplayContent.prepareAppTransition(transit, false, + 0 /* flags */, forceOverride); } final void moveTaskToFront(Task tr, boolean noAnimation, ActivityOptions options, @@ -2469,8 +2470,17 @@ class ActivityStack extends Task { // nothing to do! if (noAnimation) { ActivityOptions.abort(options); + } else if (isSingleTaskInstance()) { + // When a task is moved front on the display which can only contain one task, start + // a special transition. + // {@link AppTransitionController#handleAppTransitionReady} later picks up the + // transition, and schedules + // {@link ITaskStackListener#onSingleTaskDisplayDrawn} callback which is triggered + // after contents are drawn on the display. + updateTransitLocked(TRANSIT_SHOW_SINGLE_TASK_DISPLAY, options, + true /* forceOverride */); } else { - updateTransitLocked(TRANSIT_TASK_TO_FRONT, options); + updateTransitLocked(TRANSIT_TASK_TO_FRONT, options, false /* forceOverride */); } return; } @@ -2516,9 +2526,13 @@ class ActivityStack extends Task { mStackSupervisor.mNoAnimActivities.add(r); } ActivityOptions.abort(options); + } else if (isSingleTaskInstance()) { + updateTransitLocked(TRANSIT_SHOW_SINGLE_TASK_DISPLAY, options, + true /* forceOverride */); } else { - updateTransitLocked(TRANSIT_TASK_TO_FRONT, options); + updateTransitLocked(TRANSIT_TASK_TO_FRONT, options, false /* forceOverride */); } + // If a new task is moved to the front, then mark the existing top activity as // supporting diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 119b188dfa00c..19aec5aebdccb 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2375,7 +2375,8 @@ class RootWindowContainer extends WindowContainer // triggered after contents are drawn on the display. if (display.isSingleTaskInstance()) { display.mDisplayContent.prepareAppTransition( - TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false); + TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false, + 0 /* flags */, true /* forceOverride*/); } stack.awakeFromSleepingLocked(); if (display.isSingleTaskInstance()) {