Loading services/core/java/com/android/server/wm/DisplayContent.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -4432,6 +4432,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo position = findPositionForStack(position, stack, true /* adding */); position = findPositionForStack(position, stack, true /* adding */); super.addChild(stack, position); super.addChild(stack, position); mAtmService.updateSleepIfNeededLocked(); // The reparenting case is handled in WindowContainer. // The reparenting case is handled in WindowContainer. if (!stack.mReparenting) { if (!stack.mReparenting) { Loading @@ -4443,6 +4444,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo protected void removeChild(ActivityStack stack) { protected void removeChild(ActivityStack stack) { super.removeChild(stack); super.removeChild(stack); mDisplayContent.onStackRemoved(stack); mDisplayContent.onStackRemoved(stack); mAtmService.updateSleepIfNeededLocked(); removeStackReferenceIfNeeded(stack); removeStackReferenceIfNeeded(stack); } } Loading Loading @@ -5648,7 +5650,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void addStack(ActivityStack stack, int position) { void addStack(ActivityStack stack, int position) { setStackOnDisplay(stack, position); setStackOnDisplay(stack, position); positionStackAt(stack, position); positionStackAt(stack, position); mAtmService.updateSleepIfNeededLocked(); } } void addStackReferenceIfNeeded(ActivityStack stack) { void addStackReferenceIfNeeded(ActivityStack stack) { Loading @@ -5667,7 +5668,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mPreferredTopFocusableStack = null; mPreferredTopFocusableStack = null; } } releaseSelfIfNeeded(); releaseSelfIfNeeded(); mAtmService.updateSleepIfNeededLocked(); onStackOrderChanged(stack); onStackOrderChanged(stack); } } Loading services/core/java/com/android/server/wm/RootWindowContainer.java +9 −1 Original line number Original line 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. * @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. * @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 Task candidateTask, @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { @Nullable LaunchParamsController.LaunchParams launchParams) { final DisplayContent displayContent = getDisplayContentOrCreate(displayId); final DisplayContent displayContent = getDisplayContentOrCreate(displayId); Loading @@ -2873,6 +2874,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (attachedDisplayId == INVALID_DISPLAY || attachedDisplayId == displayId) { if (attachedDisplayId == INVALID_DISPLAY || attachedDisplayId == displayId) { return candidateTask.getStack(); 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; int windowingMode; Loading services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -787,6 +787,22 @@ public class RootActivityContainerTests extends ActivityTestsBase { secondaryDisplay.mDisplayId, result.getDisplayId()); 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 @Test public void testSwitchUser_missingHomeRootTask() { public void testSwitchUser_missingHomeRootTask() { doReturn(mFullscreenStack).when(mRootWindowContainer).getTopDisplayFocusedStack(); doReturn(mFullscreenStack).when(mRootWindowContainer).getTopDisplayFocusedStack(); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -4432,6 +4432,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo position = findPositionForStack(position, stack, true /* adding */); position = findPositionForStack(position, stack, true /* adding */); super.addChild(stack, position); super.addChild(stack, position); mAtmService.updateSleepIfNeededLocked(); // The reparenting case is handled in WindowContainer. // The reparenting case is handled in WindowContainer. if (!stack.mReparenting) { if (!stack.mReparenting) { Loading @@ -4443,6 +4444,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo protected void removeChild(ActivityStack stack) { protected void removeChild(ActivityStack stack) { super.removeChild(stack); super.removeChild(stack); mDisplayContent.onStackRemoved(stack); mDisplayContent.onStackRemoved(stack); mAtmService.updateSleepIfNeededLocked(); removeStackReferenceIfNeeded(stack); removeStackReferenceIfNeeded(stack); } } Loading Loading @@ -5648,7 +5650,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void addStack(ActivityStack stack, int position) { void addStack(ActivityStack stack, int position) { setStackOnDisplay(stack, position); setStackOnDisplay(stack, position); positionStackAt(stack, position); positionStackAt(stack, position); mAtmService.updateSleepIfNeededLocked(); } } void addStackReferenceIfNeeded(ActivityStack stack) { void addStackReferenceIfNeeded(ActivityStack stack) { Loading @@ -5667,7 +5668,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mPreferredTopFocusableStack = null; mPreferredTopFocusableStack = null; } } releaseSelfIfNeeded(); releaseSelfIfNeeded(); mAtmService.updateSleepIfNeededLocked(); onStackOrderChanged(stack); onStackOrderChanged(stack); } } Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +9 −1 Original line number Original line 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. * @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. * @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 Task candidateTask, @Nullable ActivityOptions options, @Nullable LaunchParamsController.LaunchParams launchParams) { @Nullable LaunchParamsController.LaunchParams launchParams) { final DisplayContent displayContent = getDisplayContentOrCreate(displayId); final DisplayContent displayContent = getDisplayContentOrCreate(displayId); Loading @@ -2873,6 +2874,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (attachedDisplayId == INVALID_DISPLAY || attachedDisplayId == displayId) { if (attachedDisplayId == INVALID_DISPLAY || attachedDisplayId == displayId) { return candidateTask.getStack(); 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; int windowingMode; Loading
services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -787,6 +787,22 @@ public class RootActivityContainerTests extends ActivityTestsBase { secondaryDisplay.mDisplayId, result.getDisplayId()); 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 @Test public void testSwitchUser_missingHomeRootTask() { public void testSwitchUser_missingHomeRootTask() { doReturn(mFullscreenStack).when(mRootWindowContainer).getTopDisplayFocusedStack(); doReturn(mFullscreenStack).when(mRootWindowContainer).getTopDisplayFocusedStack(); Loading