diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 1530040316578..116927936bccd 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -290,6 +290,22 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub return effects; } + private int applyDisplayAreaChanges(WindowContainer container, + WindowContainerTransaction.Change c) { + final int[] effects = new int[1]; + + container.forAllTasks(task -> { + Task tr = (Task) task; + if ((c.getChangeMask() & WindowContainerTransaction.Change.CHANGE_HIDDEN) != 0) { + if (tr.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, c.getHidden())) { + effects[0] |= TRANSACT_EFFECTS_LIFECYCLE; + } + } + }); + + return effects[0]; + } + private int sanitizeAndApplyHierarchyOp(WindowContainer container, WindowContainerTransaction.HierarchyOp hop) { final Task task = container.asTask(); @@ -366,7 +382,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub int effects = applyChanges(wc, c); - if (wc instanceof Task) { + if (wc instanceof DisplayArea) { + effects |= applyDisplayAreaChanges(wc, c); + } else if (wc instanceof Task) { effects |= applyTaskChanges(wc.asTask(), c); } 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 341e20946c300..5f40b6d96b220 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -1013,4 +1013,27 @@ public class WindowOrganizerTests extends WindowTestsBase { assertFalse(w1.useBLASTSync()); assertFalse(w2.useBLASTSync()); } + + @Test + public void testDisplayAreaHiddenTransaction() { + removeGlobalMinSizeRestriction(); + + WindowContainerTransaction trx = new WindowContainerTransaction(); + + TaskDisplayArea taskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea(); + + trx.setHidden(taskDisplayArea.mRemoteToken.toWindowContainerToken(), true); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(trx); + + taskDisplayArea.forAllTasks(daTask -> { + assertTrue(daTask.isForceHidden()); + }); + + trx.setHidden(taskDisplayArea.mRemoteToken.toWindowContainerToken(), false); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(trx); + + taskDisplayArea.forAllTasks(daTask -> { + assertFalse(daTask.isForceHidden()); + }); + } }