diff options
| author | 2022-11-24 00:55:00 +0000 | |
|---|---|---|
| committer | 2022-11-24 00:55:00 +0000 | |
| commit | a67c16c04f5af7997e69cb2bcd4162a84c4906ad (patch) | |
| tree | 2b9e9d268e42c06d8b30b87626c23e7591828eb2 | |
| parent | 30eea67f8ac27522e6dbbb10144a6bb62dee17e3 (diff) | |
| parent | ef2bb4ffbb34271b3c896dda6dd416cead5444f3 (diff) | |
Merge "Introduce WCT#clearAdjacentRoots()"
3 files changed, 45 insertions, 2 deletions
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java index fc64eb9c35c5..1063532af44f 100644 --- a/core/java/android/window/WindowContainerTransaction.java +++ b/core/java/android/window/WindowContainerTransaction.java @@ -815,6 +815,18 @@ public final class WindowContainerTransaction implements Parcelable { } /** + * Clears container adjacent. + * @param root the root container to clear the adjacent roots for. + * @hide + */ + @NonNull + public WindowContainerTransaction clearAdjacentRoots( + @NonNull WindowContainerToken root) { + mHierarchyOps.add(HierarchyOp.createForClearAdjacentRoots(root.asBinder())); + return this; + } + + /** * Merges another WCT into this one. * @param transfer When true, this will transfer everything from other potentially leaving * other in an unusable state. When false, other is left alone, but @@ -1229,6 +1241,7 @@ public final class WindowContainerTransaction implements Parcelable { public static final int HIERARCHY_OP_TYPE_REMOVE_TASK = 20; public static final int HIERARCHY_OP_TYPE_FINISH_ACTIVITY = 21; public static final int HIERARCHY_OP_TYPE_SET_COMPANION_TASK_FRAGMENT = 22; + public static final int HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS = 23; // The following key(s) are for use with mLaunchOptions: // When launching a task (eg. from recents), this is the taskId to be launched. @@ -1365,6 +1378,13 @@ public final class WindowContainerTransaction implements Parcelable { .build(); } + /** Create a hierarchy op for clearing adjacent root tasks. */ + public static HierarchyOp createForClearAdjacentRoots(@NonNull IBinder root) { + return new HierarchyOp.Builder(HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS) + .setContainer(root) + .build(); + } + /** Only creates through {@link Builder}. */ private HierarchyOp(int type) { mType = type; @@ -1560,6 +1580,8 @@ public final class WindowContainerTransaction implements Parcelable { case HIERARCHY_OP_TYPE_SET_COMPANION_TASK_FRAGMENT: return "{setCompanionTaskFragment: container = " + mContainer + " companion = " + mReparent + "}"; + case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: + return "{ClearAdjacentRoot: container=" + mContainer + "}"; default: return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent + " mToTop=" + mToTop diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 8dc1f0b1fbfa..4c35178d1b34 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -23,6 +23,7 @@ import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS; import static android.view.Display.DEFAULT_DISPLAY; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_ADD_RECT_INSETS_PROVIDER; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT; +import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CREATE_TASK_FRAGMENT; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_DELETE_TASK_FRAGMENT; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_FINISH_ACTIVITY; @@ -850,6 +851,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub effects |= setAdjacentRootsHierarchyOp(hop); break; } + case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: { + effects |= clearAdjacentRootsHierarchyOp(hop); + break; + } case HIERARCHY_OP_TYPE_CREATE_TASK_FRAGMENT: { final TaskFragmentCreationParams taskFragmentCreationOptions = hop.getTaskFragmentCreationOptions(); @@ -1486,6 +1491,17 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub return TRANSACT_EFFECTS_LIFECYCLE; } + private int clearAdjacentRootsHierarchyOp(WindowContainerTransaction.HierarchyOp hop) { + final TaskFragment root = WindowContainer.fromBinder(hop.getContainer()).asTaskFragment(); + if (!root.mCreatedByOrganizer) { + throw new IllegalArgumentException("clearAdjacentRootsHierarchyOp: Not created by" + + " organizer root=" + root); + } + + root.resetAdjacentTaskFragment(); + return TRANSACT_EFFECTS_LIFECYCLE; + } + private void sanitizeWindowContainer(WindowContainer wc) { if (!(wc instanceof TaskFragment) && !(wc instanceof DisplayArea)) { throw new RuntimeException("Invalid token in task fragment or displayArea transaction"); @@ -1650,6 +1666,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub WindowContainer.fromBinder(hop.getAdjacentRoot()), organizer); break; + case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: + enforceTaskFragmentOrganized(func, + WindowContainer.fromBinder(hop.getContainer()), organizer); + break; case HIERARCHY_OP_TYPE_CREATE_TASK_FRAGMENT: // We are allowing organizer to create TaskFragment. We will check the // ownerToken in #createTaskFragment, and trigger error callback if that is not 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 690c2aa1fe2b..c73e2378c849 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -736,11 +736,12 @@ public class WindowOrganizerTests extends WindowTestsBase { mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); assertEquals(dc.getDefaultTaskDisplayArea().mLaunchAdjacentFlagRootTask, task1); - task1.setAdjacentTaskFragment(null); - task2.setAdjacentTaskFragment(null); wct = new WindowContainerTransaction(); + wct.clearAdjacentRoots(info1.token); wct.clearLaunchAdjacentFlagRoot(info1.token); mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertEquals(task1.getAdjacentTaskFragment(), null); + assertEquals(task2.getAdjacentTaskFragment(), null); assertEquals(dc.getDefaultTaskDisplayArea().mLaunchAdjacentFlagRootTask, null); } |