diff options
3 files changed, 27 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index a20318dcd990..40c32127d4a9 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4429,6 +4429,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo position = findPositionForStack(position, stack, true /* adding */); super.addChild(stack, position); + mAtmService.updateSleepIfNeededLocked(); // The reparenting case is handled in WindowContainer. if (!stack.mReparenting) { @@ -4440,6 +4441,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo protected void removeChild(ActivityStack stack) { super.removeChild(stack); mDisplayContent.onStackRemoved(stack); + mAtmService.updateSleepIfNeededLocked(); removeStackReferenceIfNeeded(stack); } @@ -5653,7 +5655,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void addStack(ActivityStack stack, int position) { setStackOnDisplay(stack, position); positionStackAt(stack, position); - mAtmService.updateSleepIfNeededLocked(); } void onStackRemoved(ActivityStack stack) { @@ -5664,7 +5665,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mPreferredTopFocusableStack = null; } releaseSelfIfNeeded(); - mAtmService.updateSleepIfNeededLocked(); onStackOrderChanged(stack); } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index ebf1bc988b91..cea0ad22762e 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2847,7 +2847,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> * @param candidateTask The possible task the activity might be put in. * @return Existing stack if there is a valid one, new dynamic stack if it is valid or null. */ - private ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, + @VisibleForTesting + ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r, @Nullable Task candidateTask, @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { final DisplayContent displayContent = getDisplayContentOrCreate(displayId); @@ -2868,6 +2869,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (attachedDisplayId == INVALID_DISPLAY || attachedDisplayId == displayId) { return candidateTask.getStack(); } + // Or the candidate task is already a root task that can be reused by reparenting + // it to the target display. + if (candidateTask.isRootTask()) { + final ActivityStack stack = candidateTask.getStack(); + displayContent.moveStackToDisplay(stack, true /* onTop */); + return stack; + } } int windowingMode; diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index 0ef25824df2a..e841e434ea82 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -788,6 +788,22 @@ public class RootActivityContainerTests extends ActivityTestsBase { } @Test + public void testGetValidLaunchStackOnDisplayWithCandidateRootTask() { + // Create a root task with an activity on secondary display. + final TestDisplayContent secondaryDisplay = new TestDisplayContent.Builder(mService, 300, + 600).build(); + final Task task = new ActivityTestsBase.StackBuilder(mRootWindowContainer).setDisplay( + secondaryDisplay).build(); + final ActivityRecord activity = new ActivityTestsBase.ActivityBuilder(mService) + .setTask(task).build(); + + // Make sure the root task is valid and can be reused on default display. + final ActivityStack stack = mRootWindowContainer.getValidLaunchStackOnDisplay( + DEFAULT_DISPLAY, activity, task, null, null); + assertEquals(task, stack); + } + + @Test public void testSwitchUser_missingHomeRootTask() { doReturn(mFullscreenStack).when(mRootWindowContainer).getTopDisplayFocusedStack(); |