diff options
author | 2018-07-27 00:31:48 +0800 | |
---|---|---|
committer | 2018-07-27 18:52:00 +0800 | |
commit | 57831b51cd07bc21fc50be381695df5d90911c25 (patch) | |
tree | 5b65750f66b46abdba82a6aaf6dd04d5252d0bec | |
parent | 125633276910b2815804bdd4610d62017240eb4c (diff) |
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
7 files changed, 24 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index acdc73886357..f166e64fd881 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 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> 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 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> // 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 accb61f287ea..68a6b5afe71d 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 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // 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 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai 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 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // 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 cea5f4c61ab7..218fcb7a998c 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 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo 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 a1639c2dd892..74a8a353a5c9 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 @@ public class DisplayWindowController /** * 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 @@ public class DisplayWindowController "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 9075b6c7fa49..2b8493749c79 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 @@ public class TaskStack extends WindowContainer<Task> implements // 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 d51c99b2697c..5669819091ff 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 @@ public class ActivityStackTests extends ActivityTestsBase { // 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 4e9894b66d3a..ef0e27b9cc1e 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 @@ public class DisplayContentTests extends WindowTestsBase { 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 @@ public class DisplayContentTests extends WindowTestsBase { 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 @@ public class DisplayContentTests extends WindowTestsBase { 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. |