Move display order of focused stack to top when updating focus
Now focused stack depends on the order of display, so if a stack
is expected to be focused, its display should also move to top.
Bug: 111818977
Test: atest CtsActivityManagerDeviceTestCases:ActivityManagerMultiDisplayTests
Test: atest FrameworksServicesTests:ActivityStackSupervisorTests
Change-Id: I38e0aa4a78712561ab796b6522b733421286b7d9
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index acdc738..f166e64 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -153,15 +153,19 @@
onStackOrderChanged();
}
- void positionChildAtTop(ActivityStack stack) {
- positionChildAt(stack, mStacks.size());
+ void positionChildAtTop(ActivityStack stack, boolean includingParents) {
+ positionChildAt(stack, mStacks.size(), includingParents);
}
void positionChildAtBottom(ActivityStack stack) {
- positionChildAt(stack, 0);
+ positionChildAt(stack, 0, false /* includingParents */);
}
private void positionChildAt(ActivityStack stack, int position) {
+ positionChildAt(stack, position, false /* includingParents */);
+ }
+
+ private void positionChildAt(ActivityStack stack, int position, boolean includingParents) {
// TODO: Keep in sync with WindowContainer.positionChildAt(), once we change that to adjust
// the position internally, also update the logic here
mStacks.remove(stack);
@@ -173,7 +177,7 @@
// we don't have to call WindowContainerController#positionChildAt() here.
if (stack.getWindowContainerController() != null) {
mWindowContainerController.positionChildAt(stack.getWindowContainerController(),
- insertPosition);
+ insertPosition, includingParents);
}
onStackOrderChanged();
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index accb61f..68a6b5a 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -516,7 +516,7 @@
// Since always on top is only on when the stack is freeform or pinned, the state
// can be toggled when the windowing mode changes. We must make sure the stack is
// placed properly when always on top state changes.
- display.positionChildAtTop(this);
+ display.positionChildAtTop(this, false /* includingParents */);
}
}
@@ -1056,7 +1056,7 @@
mStackSupervisor.moveHomeStackToFront(reason + " returnToHome");
}
- display.positionChildAtTop(this);
+ display.positionChildAtTop(this, true /* includingParents */);
mStackSupervisor.setFocusStackUnchecked(reason, this);
if (task != null) {
// This also moves the entire hierarchy branch to top, including parents
@@ -5319,7 +5319,7 @@
// always on top windows. Since the position the stack should be inserted into is calculated
// properly in {@link ActivityDisplay#getTopInsertPosition()} in both cases, we can just
// request that the stack is put at top here.
- display.positionChildAtTop(this);
+ display.positionChildAtTop(this, false /* includingParents */);
}
void moveToFrontAndResumeStateIfNeeded(ActivityRecord r, boolean moveToFront, boolean setResume,
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index cea5f4c6..218fcb7 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1931,8 +1931,8 @@
getParent().positionChildAt(position, this, includingParents);
}
- void positionStackAt(int position, TaskStack child) {
- mTaskStackContainers.positionChildAt(position, child, false /* includingParents */);
+ void positionStackAt(int position, TaskStack child, boolean includingParents) {
+ mTaskStackContainers.positionChildAt(position, child, includingParents);
layoutAndAssignWindowLayersIfNeeded();
}
diff --git a/services/core/java/com/android/server/wm/DisplayWindowController.java b/services/core/java/com/android/server/wm/DisplayWindowController.java
index a1639c2..74a8a35 100644
--- a/services/core/java/com/android/server/wm/DisplayWindowController.java
+++ b/services/core/java/com/android/server/wm/DisplayWindowController.java
@@ -76,7 +76,8 @@
/**
* Positions the task stack at the given position in the task stack container.
*/
- public void positionChildAt(StackWindowController child, int position) {
+ public void positionChildAt(StackWindowController child, int position,
+ boolean includingParents) {
synchronized (mWindowMap) {
if (DEBUG_STACK) Slog.i(TAG_WM, "positionTaskStackAt: positioning stack=" + child
+ " at " + position);
@@ -90,7 +91,7 @@
"positionTaskStackAt: could not find stack=" + this);
return;
}
- mContainer.positionStackAt(position, child.mContainer);
+ mContainer.positionStackAt(position, child.mContainer, includingParents);
}
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 9075b6c..2b84937 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -751,7 +751,7 @@
// be inserted into is calculated properly in
// {@link DisplayContent#findPositionForStack()} in both cases, we can just request that
// the stack is put at top here.
- mDisplayContent.positionStackAt(POSITION_TOP, this);
+ mDisplayContent.positionStackAt(POSITION_TOP, this, false /* includingParents */);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index d51c99b..5669819 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -551,7 +551,7 @@
// Home stack and activity are created in ActivityTestsBase#setupActivityManagerService
stack = mDefaultDisplay.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);
if (onTop) {
- mDefaultDisplay.positionChildAtTop(stack);
+ mDefaultDisplay.positionChildAtTop(stack, false /* includingParents */);
} else {
mDefaultDisplay.positionChildAtBottom(stack);
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index 4e9894b..ef0e27b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -394,7 +394,8 @@
WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
final Task task = createTaskInStack(alwaysOnTopStack, 0 /* userId */);
alwaysOnTopStack.setAlwaysOnTop(true);
- mDisplayContent.positionStackAt(POSITION_TOP, alwaysOnTopStack);
+ mDisplayContent.positionStackAt(POSITION_TOP, alwaysOnTopStack,
+ false /* includingParents */);
assertTrue(alwaysOnTopStack.isAlwaysOnTop());
// Ensure always on top state is synced to the children of the stack.
assertTrue(alwaysOnTopStack.getTopChild().isAlwaysOnTop());
@@ -408,7 +409,8 @@
final TaskStack anotherAlwaysOnTopStack = createStackControllerOnStackOnDisplay(
WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
anotherAlwaysOnTopStack.setAlwaysOnTop(true);
- mDisplayContent.positionStackAt(POSITION_TOP, anotherAlwaysOnTopStack);
+ mDisplayContent.positionStackAt(POSITION_TOP, anotherAlwaysOnTopStack,
+ false /* includingParents */);
assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop());
int topPosition = mDisplayContent.getStacks().size() - 1;
// Ensure the new alwaysOnTop stack is put below the pinned stack, but on top of the
@@ -424,7 +426,8 @@
assertEquals(nonAlwaysOnTopStack, mDisplayContent.getStacks().get(topPosition - 3));
anotherAlwaysOnTopStack.setAlwaysOnTop(false);
- mDisplayContent.positionStackAt(POSITION_TOP, anotherAlwaysOnTopStack);
+ mDisplayContent.positionStackAt(POSITION_TOP, anotherAlwaysOnTopStack,
+ false /* includingParents */);
assertFalse(anotherAlwaysOnTopStack.isAlwaysOnTop());
// Ensure, when always on top is turned off for a stack, the stack is put just below all
// other always on top stacks.