diff options
4 files changed, 64 insertions, 8 deletions
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index e38038e38c25..15faef6b595e 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -850,6 +850,14 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen Log.e(TAG, "onTaskFragmentParentInfoChanged on empty Task id=" + taskId); return; } + + if (!parentInfo.isVisible()) { + // Only making the TaskContainer invisible and drops the other info, and perform the + // update when the next time the Task becomes visible. + taskContainer.setIsVisible(false); + return; + } + // Checks if container should be updated before apply new parentInfo. final boolean shouldUpdateContainer = taskContainer.shouldUpdateContainer(parentInfo); taskContainer.updateTaskFragmentParentInfo(parentInfo); diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java index 67d34c71b4d6..a68373832a14 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java @@ -151,6 +151,10 @@ class TaskContainer { return mIsVisible; } + void setIsVisible(boolean visible) { + mIsVisible = visible; + } + boolean hasDirectActivity() { return mHasDirectActivity; } @@ -185,13 +189,15 @@ class TaskContainer { boolean shouldUpdateContainer(@NonNull TaskFragmentParentInfo info) { final Configuration configuration = info.getConfiguration(); - return info.isVisible() - // No need to update presentation in PIP until the Task exit PIP. - && !isInPictureInPicture(configuration) - // If the task properties equals regardless of starting position, don't need to - // update the container. - && (mConfiguration.diffPublicOnly(configuration) != 0 - || mDisplayId != info.getDisplayId()); + if (isInPictureInPicture(configuration)) { + // No need to update presentation in PIP until the Task exit PIP. + return false; + } + + // If the task properties equals regardless of starting position, don't + // need to update the container. + return mConfiguration.diffPublicOnly(configuration) != 0 + || mDisplayId != info.getDisplayId(); } /** diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java index fab298d6d58b..049a9e2c2aca 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java @@ -580,7 +580,7 @@ public class OverlayPresentationTest { final TaskContainer.TaskProperties taskProperties = taskContainer.getTaskProperties(); final TaskFragmentParentInfo parentInfo = new TaskFragmentParentInfo( new Configuration(taskProperties.getConfiguration()), taskProperties.getDisplayId(), - false /* visible */, false /* hasDirectActivity */, null /* decorSurface */); + true /* visible */, false /* hasDirectActivity */, null /* decorSurface */); mSplitController.onTaskFragmentParentInfoChanged(mTransaction, TASK_ID, parentInfo); diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java index 8bc3a300136a..c6eb2645095c 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java @@ -1621,6 +1621,48 @@ public class SplitControllerTest { verify(mEmbeddedActivityWindowInfoCallback, never()).accept(any()); } + @Test + public void testTaskFragmentParentInfoChanged() { + // Making a split + final Activity secondaryActivity = createMockActivity(); + addSplitTaskFragments(mActivity, secondaryActivity, false /* clearTop */); + + // Updates the parent info. + final TaskContainer taskContainer = mSplitController.getTaskContainer(TASK_ID); + final Configuration configuration = new Configuration(); + final TaskFragmentParentInfo originalInfo = new TaskFragmentParentInfo(configuration, + DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */, + null /* decorSurface */); + mSplitController.onTaskFragmentParentInfoChanged(mock(WindowContainerTransaction.class), + TASK_ID, originalInfo); + assertTrue(taskContainer.isVisible()); + + // Making a public configuration change while the Task is invisible. + configuration.densityDpi += 100; + final TaskFragmentParentInfo invisibleInfo = new TaskFragmentParentInfo(configuration, + DEFAULT_DISPLAY, false /* visible */, false /* hasDirectActivity */, + null /* decorSurface */); + mSplitController.onTaskFragmentParentInfoChanged(mock(WindowContainerTransaction.class), + TASK_ID, invisibleInfo); + + // Ensure the TaskContainer is inivisible, but the configuration is not updated. + assertFalse(taskContainer.isVisible()); + assertTrue(taskContainer.getTaskFragmentParentInfo().getConfiguration().diffPublicOnly( + configuration) > 0); + + // Updates when Task to become visible + final TaskFragmentParentInfo visibleInfo = new TaskFragmentParentInfo(configuration, + DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */, + null /* decorSurface */); + mSplitController.onTaskFragmentParentInfoChanged(mock(WindowContainerTransaction.class), + TASK_ID, visibleInfo); + + // Ensure the Task is visible and configuration is updated. + assertTrue(taskContainer.isVisible()); + assertFalse(taskContainer.getTaskFragmentParentInfo().getConfiguration().diffPublicOnly( + configuration) > 0); + } + /** Creates a mock activity in the organizer process. */ private Activity createMockActivity() { return createMockActivity(TASK_ID); |