diff options
3 files changed, 21 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 50200a7cf7bc..7ee210edf1a8 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -839,11 +839,12 @@ class ActivityStack extends ConfigurationContainer { // so that the divider matches and remove this logic. // TODO: This is currently only called when entering split-screen while in another // task, and from the tests - // TODO (b/78247419): Check if launcher and overview are same then move home stack - // instead of recents stack. Then fix the rotation animation from fullscreen to - // minimized mode + // TODO (b/78247419): Fix the rotation animation from fullscreen to minimized mode + final boolean isRecentsComponentHome = + mService.getRecentTasks().isRecentsComponentHomeActivity(mCurrentUser); final ActivityStack recentStack = display.getOrCreateStack( - WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_RECENTS, + WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, + isRecentsComponentHome ? ACTIVITY_TYPE_HOME : ACTIVITY_TYPE_RECENTS, true /* onTop */); recentStack.moveToFront("setWindowingMode"); // If task moved to docked stack - show recents if needed. diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index c933ece4b334..47be792802a0 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2342,7 +2342,12 @@ class ActivityStarter { REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME, "reparentingHome"); mMovedToFront = true; + } else if (launchStack.topTask() == null) { + // The task does not need to be reparented to the launch stack. Remove the + // launch stack if there is no activity in it. + launchStack.remove(); } + mOptions = null; // We are moving a task to the front, use starting window to hide initial drawn diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 4b2d4ce3d799..6d46716dfd8f 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -193,6 +193,9 @@ class RootActivityContainer extends ConfigurationContainer /** Set when a power hint has started, but not ended. */ private boolean mPowerHintSent; + /** Used to keep ensureActivitiesVisible() from being entered recursively. */ + private boolean mInEnsureActivitiesVisible = false; + // The default minimal size that will be used if the activity doesn't specify its minimal size. // It will be calculated when the default display gets added. int mDefaultMinSizeOfResizeableTaskDp = -1; @@ -805,8 +808,14 @@ class RootActivityContainer extends ConfigurationContainer */ void ensureActivitiesVisible(ActivityRecord starting, int configChanges, boolean preserveWindows, boolean notifyClients) { - mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); + if (mInEnsureActivitiesVisible) { + // Don't do recursive work. + return; + } + mInEnsureActivitiesVisible = true; + try { + mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); // First the front stacks. In case any are not fullscreen and are in front of home. for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ActivityDisplay display = mActivityDisplays.get(displayNdx); @@ -815,6 +824,7 @@ class RootActivityContainer extends ConfigurationContainer } } finally { mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); + mInEnsureActivitiesVisible = false; } } |