diff options
4 files changed, 88 insertions, 2 deletions
diff --git a/core/java/android/view/WindowContainerTransaction.java b/core/java/android/view/WindowContainerTransaction.java index e05c3743565c..9c16e1334e00 100644 --- a/core/java/android/view/WindowContainerTransaction.java +++ b/core/java/android/view/WindowContainerTransaction.java @@ -131,6 +131,31 @@ public class WindowContainerTransaction implements Parcelable { } /** + * Set the windowing mode of children of a given root task, without changing + * the windowing mode of the Task itself. This can be used during transitions + * for example to make the activity render it's fullscreen configuration + * while the Task is still in PIP, so you can complete the animation. + * + * TODO(b/134365562): Can be removed once TaskOrg drives full-screen + */ + public WindowContainerTransaction setActivityWindowingMode(IWindowContainer container, + int windowingMode) { + Change chg = getOrCreateChange(container.asBinder()); + chg.mActivityWindowingMode = windowingMode; + return this; + } + + /** + * Sets the windowing mode of the given container. + */ + public WindowContainerTransaction setWindowingMode(IWindowContainer container, + int windowingMode) { + Change chg = getOrCreateChange(container.asBinder()); + chg.mWindowingMode = windowingMode; + return this; + } + + /** * Sets whether a container or any of its children can be focusable. When {@code false}, no * child can be focused; however, when {@code true}, it is still possible for children to be * non-focusable due to WM policy. @@ -235,6 +260,9 @@ public class WindowContainerTransaction implements Parcelable { private Rect mPinnedBounds = null; private SurfaceControl.Transaction mBoundsChangeTransaction = null; + private int mActivityWindowingMode = -1; + private int mWindowingMode = -1; + public Change() {} protected Change(Parcel in) { @@ -251,6 +279,17 @@ public class WindowContainerTransaction implements Parcelable { mBoundsChangeTransaction = SurfaceControl.Transaction.CREATOR.createFromParcel(in); } + + mWindowingMode = in.readInt(); + mActivityWindowingMode = in.readInt(); + } + + public int getWindowingMode() { + return mWindowingMode; + } + + public int getActivityWindowingMode() { + return mActivityWindowingMode; } public Configuration getConfiguration() { @@ -340,6 +379,9 @@ public class WindowContainerTransaction implements Parcelable { if (mBoundsChangeTransaction != null) { mBoundsChangeTransaction.writeToParcel(dest, flags); } + + dest.writeInt(mWindowingMode); + dest.writeInt(mActivityWindowingMode); } @Override diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index b2db99b06cde..5ed903e875c2 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4123,8 +4123,16 @@ class Task extends WindowContainer<WindowContainer> { return mMainWindowSizeChangeTransaction; } + void setActivityWindowingMode(int windowingMode) { + PooledConsumer c = PooledLambda.obtainConsumer(ActivityRecord::setWindowingMode, + PooledLambda.__(ActivityRecord.class), windowingMode); + forAllActivities(c); + c.recycle(); + } + @Override long getProtoFieldId() { return TASK; } + } diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 4093fe5cb288..cfb570678e5b 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -553,18 +553,28 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub WindowContainerTransaction.Change c) { int effects = sanitizeAndApplyChange(wc, c); + final Task tr = wc.asTask(); + final SurfaceControl.Transaction t = c.getBoundsChangeTransaction(); if (t != null) { - Task tr = (Task) wc; tr.setMainWindowSizeChangeTransaction(t); } Rect enterPipBounds = c.getEnterPipBounds(); if (enterPipBounds != null) { - Task tr = (Task) wc; mService.mStackSupervisor.updatePictureInPictureMode(tr, enterPipBounds, true); } + + final int windowingMode = c.getWindowingMode(); + if (windowingMode > -1) { + tr.setWindowingMode(windowingMode); + } + final int childWindowingMode = c.getActivityWindowingMode(); + if (childWindowingMode > -1) { + tr.setActivityWindowingMode(childWindowingMode); + } + return effects; } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java index 53a3682a1efa..251886ac309c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java @@ -241,6 +241,32 @@ public class TaskOrganizerTests extends WindowTestsBase { } @Test + public void testSetWindowingMode() { + final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot) + .setWindowingMode(WINDOWING_MODE_FREEFORM).build(); + final WindowContainerTransaction t = new WindowContainerTransaction(); + + t.setWindowingMode(stack.mRemoteToken, WINDOWING_MODE_FULLSCREEN); + mWm.mAtmService.mTaskOrganizerController.applyContainerTransaction(t, null); + + assertEquals(WINDOWING_MODE_FULLSCREEN, stack.getWindowingMode()); + } + + @Test + public void testSetActivityWindowingMode() { + final ActivityRecord record = makePipableActivity(); + final ActivityStack stack = record.getStack(); + final WindowContainerTransaction t = new WindowContainerTransaction(); + + t.setWindowingMode(stack.mRemoteToken, WINDOWING_MODE_PINNED); + t.setActivityWindowingMode(stack.mRemoteToken, WINDOWING_MODE_FULLSCREEN); + mWm.mAtmService.mTaskOrganizerController.applyContainerTransaction(t, null); + + assertEquals(WINDOWING_MODE_FULLSCREEN, record.getWindowingMode()); + assertEquals(WINDOWING_MODE_PINNED, stack.getWindowingMode()); + } + + @Test public void testContainerChanges() { removeGlobalMinSizeRestriction(); final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot) |