summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java4
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java10
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java16
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();