diff options
| author | 2017-04-14 09:45:27 -0700 | |
|---|---|---|
| committer | 2017-04-14 09:45:27 -0700 | |
| commit | 2719cc134e68e4c8f0def68fdc1d68dc3de9c1d8 (patch) | |
| tree | c47b271ed8d23a52c9b4153606e34686db546bf3 | |
| parent | a622b24d3a28a59b67475e06b782c72ebb17c7dc (diff) | |
Move stack to front in-sync with task reparenting
When reparenting a task to another stack have window manager move the
destination stack to the front at the same time it is reparenting the
task if REPARENT_MOVE_STACK_TO_FRONT is set to avoid jank.
Test: manual
Bug: 37299899
Change-Id: I45678e742188a4871f93a11178f7ab2b60c7bcc3
4 files changed, 10 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index c7f20b9ff904..f8a4d4b21414 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -658,7 +658,8 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta // Must reparent first in window manager to avoid a situation where AM can delete the // we are coming from in WM before we reparent because it became empty. - mWindowContainerController.reparent(toStack.getWindowContainerController(), position); + mWindowContainerController.reparent(toStack.getWindowContainerController(), position, + moveStackMode == REPARENT_MOVE_STACK_TO_FRONT); // Move the task sourceStack.removeTask(this, reason, REMOVE_TASK_MODE_MOVING); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 5c46ca9aa443..4262d124ed0a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -184,7 +184,7 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU super.removeImmediately(); } - void reparent(TaskStack stack, int position) { + void reparent(TaskStack stack, int position, boolean moveParents) { if (stack == mStack) { throw new IllegalArgumentException( "task=" + this + " already child of stack=" + mStack); @@ -195,7 +195,7 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU final DisplayContent prevDisplayContent = getDisplayContent(); getParent().removeChild(this); - stack.addTask(this, position, showForAllUsers(), false /* moveParents */); + stack.addTask(this, position, showForAllUsers(), moveParents); // Relayout display(s). final DisplayContent displayContent = stack.getDisplayContent(); diff --git a/services/core/java/com/android/server/wm/TaskWindowContainerController.java b/services/core/java/com/android/server/wm/TaskWindowContainerController.java index efc2e117b02d..9f0248517e88 100644 --- a/services/core/java/com/android/server/wm/TaskWindowContainerController.java +++ b/services/core/java/com/android/server/wm/TaskWindowContainerController.java @@ -121,7 +121,7 @@ public class TaskWindowContainerController } } - public void reparent(StackWindowController stackController, int position) { + public void reparent(StackWindowController stackController, int position, boolean moveParents) { synchronized (mWindowMap) { if (DEBUG_STACK) Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId + " to stack=" + stackController + " at " + position); @@ -135,7 +135,7 @@ public class TaskWindowContainerController throw new IllegalArgumentException("reparent: could not find stack=" + stackController); } - mContainer.reparent(stack, position); + mContainer.reparent(stack, position, moveParents); mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); } } diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java index 1819c56735eb..98d20a2634ac 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java @@ -89,7 +89,7 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase { boolean gotException = false; try { - taskController.reparent(stackController1, 0); + taskController.reparent(stackController1, 0, false/* moveParents */); } catch (IllegalArgumentException e) { gotException = true; } @@ -100,14 +100,14 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase { stackController3.setContainer(null); gotException = false; try { - taskController.reparent(stackController3, 0); + taskController.reparent(stackController3, 0, false/* moveParents */); } catch (IllegalArgumentException e) { gotException = true; } assertTrue("Should not be able to reparent to a stack that doesn't have a container", gotException); - taskController.reparent(stackController2, 0); + taskController.reparent(stackController2, 0, false/* moveParents */); assertEquals(stackController2.mContainer, taskController.mContainer.getParent()); assertEquals(0, ((WindowTestUtils.TestTask) taskController.mContainer).positionInParent()); assertEquals(1, ((WindowTestUtils.TestTask) taskController2.mContainer).positionInParent()); @@ -135,7 +135,7 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase { (WindowTestUtils.TestTask) taskController2.mContainer; // Reparent and check state - taskController.reparent(stack2Controller, 0); + taskController.reparent(stack2Controller, 0, false /* moveParents */); assertEquals(stack2, task1.getParent()); assertEquals(0, task1.positionInParent()); assertEquals(1, task2.positionInParent()); |