Loading services/core/java/com/android/server/wm/DisplayContent.java +2 −2 Original line number Diff line number Diff line Loading @@ -4432,6 +4432,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) { Loading @@ -4443,6 +4444,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo protected void removeChild(ActivityStack stack) { super.removeChild(stack); mDisplayContent.onStackRemoved(stack); mAtmService.updateSleepIfNeededLocked(); removeStackReferenceIfNeeded(stack); } Loading Loading @@ -5648,7 +5650,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void addStack(ActivityStack stack, int position) { setStackOnDisplay(stack, position); positionStackAt(stack, position); mAtmService.updateSleepIfNeededLocked(); } void addStackReferenceIfNeeded(ActivityStack stack) { Loading @@ -5667,7 +5668,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mPreferredTopFocusableStack = null; } releaseSelfIfNeeded(); mAtmService.updateSleepIfNeededLocked(); onStackOrderChanged(stack); } Loading services/core/java/com/android/server/wm/RootWindowContainer.java +9 −1 Original line number Diff line number Diff line Loading @@ -2852,7 +2852,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); Loading @@ -2873,6 +2874,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; Loading services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +16 −0 Original line number Diff line number Diff line Loading @@ -787,6 +787,22 @@ public class RootActivityContainerTests extends ActivityTestsBase { secondaryDisplay.mDisplayId, result.getDisplayId()); } @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(); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +2 −2 Original line number Diff line number Diff line Loading @@ -4432,6 +4432,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) { Loading @@ -4443,6 +4444,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo protected void removeChild(ActivityStack stack) { super.removeChild(stack); mDisplayContent.onStackRemoved(stack); mAtmService.updateSleepIfNeededLocked(); removeStackReferenceIfNeeded(stack); } Loading Loading @@ -5648,7 +5650,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void addStack(ActivityStack stack, int position) { setStackOnDisplay(stack, position); positionStackAt(stack, position); mAtmService.updateSleepIfNeededLocked(); } void addStackReferenceIfNeeded(ActivityStack stack) { Loading @@ -5667,7 +5668,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mPreferredTopFocusableStack = null; } releaseSelfIfNeeded(); mAtmService.updateSleepIfNeededLocked(); onStackOrderChanged(stack); } Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +9 −1 Original line number Diff line number Diff line Loading @@ -2852,7 +2852,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); Loading @@ -2873,6 +2874,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; Loading
services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +16 −0 Original line number Diff line number Diff line Loading @@ -787,6 +787,22 @@ public class RootActivityContainerTests extends ActivityTestsBase { secondaryDisplay.mDisplayId, result.getDisplayId()); } @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(); Loading