summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java10
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java16
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java8
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) {