diff options
3 files changed, 23 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 7b92c283ddf2..c3c92d36399b 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -995,11 +995,13 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< * changes (eg. a transition animation might play out first). */ void onChildVisibilityRequested(boolean visible) { - // If we are changing visibility, then a snapshot isn't necessary and we are no-longer + // If we are losing visibility, then a snapshot isn't necessary and we are no-longer // part of a change transition. - mSurfaceFreezer.unfreeze(getSyncTransaction()); - if (mDisplayContent != null) { - mDisplayContent.mChangingContainers.remove(this); + if (!visible) { + mSurfaceFreezer.unfreeze(getSyncTransaction()); + if (mDisplayContent != null) { + mDisplayContent.mChangingContainers.remove(this); + } } WindowContainer parent = getParent(); if (parent != null) { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 10bcbeba5566..24ad85356477 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -324,12 +324,13 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub (task.isRootTask() && !task.mCreatedByOrganizer) || task.getParent().asTask().mCreatedByOrganizer; if (isNonOrganizedRootableTask) { - Task newParent = hop.getNewParent() == null ? null - : WindowContainer.fromBinder(hop.getNewParent()).asTask(); + WindowContainer newParent = hop.getNewParent() == null + ? dc.getDefaultTaskDisplayArea() + : WindowContainer.fromBinder(hop.getNewParent()); if (task.getParent() != newParent) { - if (newParent == null) { - // Re-parent task to display as a root task. - as.reparent(dc.getDefaultTaskDisplayArea(), hop.getToTop()); + if (newParent instanceof TaskDisplayArea) { + // For now, reparenting to displayarea is different from other reparents... + as.reparent((TaskDisplayArea) newParent, hop.getToTop()); } else if (newParent.inMultiWindowMode() && !task.isResizeable() && task.isLeafTask()) { Slog.w(TAG, "Can't support task that doesn't support multi-window mode in" @@ -341,8 +342,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub false /*moveParents*/, "sanitizeAndApplyHierarchyOp"); } } else { - final ActivityStack rootTask = - (ActivityStack) (newParent != null ? newParent : task.getRootTask()); + final ActivityStack rootTask = (ActivityStack) ( + (newParent != null && !(newParent instanceof TaskDisplayArea)) + ? newParent : task.getRootTask()); if (hop.getToTop()) { as.getDisplayArea().positionStackAtTop(rootTask, false /* includingParents */); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 04d52afa3874..079ed973ca68 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -669,6 +669,14 @@ public class WindowOrganizerTests extends WindowTestsBase { assertEquals(1, lastReportedTiles.size()); assertEquals(ACTIVITY_TYPE_HOME, lastReportedTiles.get(info1.token.asBinder()).topActivityType); + + // This just needs to not crash (ie. it should be possible to reparent to display twice) + wct = new WindowContainerTransaction(); + wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), null, true /* onTop */); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + wct = new WindowContainerTransaction(); + wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), null, true /* onTop */); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); } private List<Task> getTasksCreatedByOrganizer(DisplayContent dc) { |