diff options
4 files changed, 188 insertions, 119 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 14a46778810c..b2e5b75cf0b5 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -42,10 +42,10 @@ import static androidx.window.extensions.embedding.SplitContainer.isStickyPlaceh import static androidx.window.extensions.embedding.SplitContainer.shouldFinishAssociatedContainerWhenAdjacent; import static androidx.window.extensions.embedding.SplitContainer.shouldFinishAssociatedContainerWhenStacked; import static androidx.window.extensions.embedding.SplitPresenter.RESULT_EXPAND_FAILED_NO_TF_INFO; -import static androidx.window.extensions.embedding.SplitPresenter.boundsSmallerThanMinDimensions; import static androidx.window.extensions.embedding.SplitPresenter.getActivitiesMinDimensionsPair; import static androidx.window.extensions.embedding.SplitPresenter.getActivityIntentMinDimensionsPair; import static androidx.window.extensions.embedding.SplitPresenter.getMinDimensions; +import static androidx.window.extensions.embedding.SplitPresenter.sanitizeBounds; import static androidx.window.extensions.embedding.SplitPresenter.shouldShowSplit; import android.annotation.CallbackExecutor; @@ -574,7 +574,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen final TransactionRecord transactionRecord = mTransactionManager.startNewTransaction(); final WindowContainerTransaction wct = transactionRecord.getTransaction(); - mPresenter.applyActivityStackAttributes(wct, container, attributes); + mPresenter.applyActivityStackAttributes(wct, container, attributes, + container.getMinDimensions()); transactionRecord.apply(false /* shouldApplyIndependently */); } } @@ -1567,7 +1568,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen private TaskFragmentContainer createEmptyExpandedContainer( @NonNull WindowContainerTransaction wct, @NonNull Intent intent, int taskId, @Nullable Activity launchingActivity) { - return createEmptyContainer(wct, intent, taskId, new Rect(), launchingActivity, + return createEmptyContainer(wct, intent, taskId, + new ActivityStackAttributes.Builder().build(), launchingActivity, null /* overlayTag */, null /* launchOptions */); } @@ -1581,8 +1583,9 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @Nullable TaskFragmentContainer createEmptyContainer( @NonNull WindowContainerTransaction wct, @NonNull Intent intent, int taskId, - @NonNull Rect bounds, @Nullable Activity launchingActivity, - @Nullable String overlayTag, @Nullable Bundle launchOptions) { + @NonNull ActivityStackAttributes activityStackAttributes, + @Nullable Activity launchingActivity, @Nullable String overlayTag, + @Nullable Bundle launchOptions) { // We need an activity in the organizer process in the same Task to use as the owner // activity, as well as to get the Task window info. final Activity activityInTask; @@ -1605,43 +1608,21 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // Note that taskContainer will not exist before calling #newContainer if the container // is the first embedded TF in the task. final TaskContainer taskContainer = container.getTaskContainer(); - final Rect taskBounds = taskContainer.getTaskProperties().getTaskMetrics().getBounds(); - final Rect sanitizedBounds = sanitizeBounds(bounds, intent, taskBounds); + // TODO(b/265271880): remove redundant logic after all TF operations take fragmentToken. + final Rect taskBounds = taskContainer.getBounds(); + final Rect sanitizedBounds = sanitizeBounds(activityStackAttributes.getRelativeBounds(), + getMinDimensions(intent), taskBounds); final int windowingMode = taskContainer .getWindowingModeForTaskFragment(sanitizedBounds); mPresenter.createTaskFragment(wct, taskFragmentToken, activityInTask.getActivityToken(), sanitizedBounds, windowingMode); - mPresenter.updateAnimationParams(wct, taskFragmentToken, - TaskFragmentAnimationParams.DEFAULT); - mPresenter.setTaskFragmentIsolatedNavigation(wct, taskFragmentToken, - overlayTag != null && !sanitizedBounds.isEmpty()); + mPresenter.applyActivityStackAttributes(wct, container, activityStackAttributes, + getMinDimensions(intent)); return container; } /** - * Returns the expanded bounds if the {@code bounds} violate minimum dimension or are not fully - * covered by the task bounds. Otherwise, returns {@code bounds}. - */ - @NonNull - private static Rect sanitizeBounds(@NonNull Rect bounds, @NonNull Intent intent, - @NonNull Rect taskBounds) { - if (bounds.isEmpty()) { - // Don't need to check if the bounds follows the task bounds. - return bounds; - } - if (boundsSmallerThanMinDimensions(bounds, getMinDimensions(intent))) { - // Expand the bounds if the bounds are smaller than minimum dimensions. - return new Rect(); - } - if (!taskBounds.contains(bounds)) { - // Expand the bounds if the bounds exceed the task bounds. - return new Rect(); - } - return bounds; - } - - /** * Returns a container for the new activity intent to launch into as splitting with the primary * activity. */ @@ -1958,6 +1939,12 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return; } + if (mActivityStackAttributesCalculator == null) { + Log.e(TAG, "ActivityStackAttributesCalculator is not set. Thus the overlay container" + + " can not be updated."); + return; + } + if (mActivityStackAttributesCalculator != null) { final ActivityStackAttributesCalculatorParams params = new ActivityStackAttributesCalculatorParams( @@ -1967,7 +1954,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen container.getLaunchOptions()); final ActivityStackAttributes attributes = mActivityStackAttributesCalculator .apply(params); - mPresenter.applyActivityStackAttributes(wct, container, attributes); + mPresenter.applyActivityStackAttributes(wct, container, attributes, + container.getMinDimensions()); } } @@ -2603,15 +2591,15 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen mPresenter.createParentContainerInfoFromTaskProperties( mPresenter.getTaskProperties(launchActivity)), overlayTag, options); // Fallback to expand the bounds if there's no activityStackAttributes calculator. - final Rect relativeBounds = mActivityStackAttributesCalculator != null - ? new Rect(mActivityStackAttributesCalculator.apply(params).getRelativeBounds()) - : new Rect(); - final boolean shouldExpandContainer = boundsSmallerThanMinDimensions(relativeBounds, - getMinDimensions(intent)); - // Expand the bounds if the requested bounds are smaller than minimum dimensions. - if (shouldExpandContainer) { - relativeBounds.setEmpty(); + final ActivityStackAttributes attrs; + if (mActivityStackAttributesCalculator != null) { + attrs = mActivityStackAttributesCalculator.apply(params); + } else { + attrs = new ActivityStackAttributes.Builder().build(); + Log.e(TAG, "ActivityStackAttributesCalculator isn't set. Fallback to set overlay " + + "container as expected."); } + final int taskId = getTaskId(launchActivity); if (!overlayContainers.isEmpty()) { for (final TaskFragmentContainer overlayContainer : overlayContainers) { @@ -2631,20 +2619,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } if (overlayTag.equals(overlayContainer.getOverlayTag()) && taskId == overlayContainer.getTaskId()) { - // If there's an overlay container with the same tag and task ID, we treat - // the OverlayCreateParams as the update to the container. - final IBinder overlayToken = overlayContainer.getTaskFragmentToken(); - final TaskContainer taskContainer = overlayContainer.getTaskContainer(); - final Rect taskBounds = taskContainer.getTaskProperties().getTaskMetrics() - .getBounds(); - final Rect sanitizedBounds = sanitizeBounds(relativeBounds, intent, taskBounds); - - mPresenter.resizeTaskFragment(wct, overlayToken, sanitizedBounds); - final int windowingMode = taskContainer - .getWindowingModeForTaskFragment(sanitizedBounds); - mPresenter.updateWindowingMode(wct, overlayToken, windowingMode); - mPresenter.setTaskFragmentIsolatedNavigation(wct, overlayContainer, - !sanitizedBounds.isEmpty()); + mPresenter.applyActivityStackAttributes(wct, overlayContainer, attrs, + getMinDimensions(intent)); // We can just return the updated overlay container and don't need to // check other condition since we only have one OverlayCreateParams, and // if the tag and task are matched, it's impossible to match another task @@ -2654,7 +2630,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } } // Launch the overlay container to the task with taskId. - return createEmptyContainer(wct, intent, taskId, relativeBounds, launchActivity, overlayTag, + return createEmptyContainer(wct, intent, taskId, attrs, launchActivity, overlayTag, options); } diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java index 8b7fd108f031..2f2da8c53db0 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java @@ -16,8 +16,6 @@ package androidx.window.extensions.embedding; -import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; -import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.content.pm.PackageManager.MATCH_ALL; import static androidx.window.extensions.embedding.WindowAttributes.DIM_AREA_ON_TASK; @@ -426,7 +424,8 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { * creation has not been reported from the server yet. */ // TODO(b/190433398): Handle resize if the fragment hasn't appeared yet. - private void resizeTaskFragmentIfRegistered(@NonNull WindowContainerTransaction wct, + @VisibleForTesting + void resizeTaskFragmentIfRegistered(@NonNull WindowContainerTransaction wct, @NonNull TaskFragmentContainer container, @Nullable Rect relBounds) { if (container.getInfo() == null) { @@ -435,7 +434,8 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { resizeTaskFragment(wct, container.getTaskFragmentToken(), relBounds); } - private void updateTaskFragmentWindowingModeIfRegistered( + @VisibleForTesting + void updateTaskFragmentWindowingModeIfRegistered( @NonNull WindowContainerTransaction wct, @NonNull TaskFragmentContainer container, @WindowingMode int windowingMode) { @@ -579,13 +579,53 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { super.setCompanionTaskFragment(wct, primary, secondary); } - void applyActivityStackAttributes(@NonNull WindowContainerTransaction wct, - @NonNull TaskFragmentContainer container, @NonNull ActivityStackAttributes attributes) { - final Rect bounds = attributes.getRelativeBounds(); + void applyActivityStackAttributes( + @NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentContainer container, + @NonNull ActivityStackAttributes attributes, + @Nullable Size minDimensions) { + final Rect taskBounds = container.getTaskContainer().getBounds(); + final Rect relativeBounds = sanitizeBounds(attributes.getRelativeBounds(), minDimensions, + taskBounds); + final boolean isFillParent = relativeBounds.isEmpty(); + final boolean isIsolatedNavigated = !isFillParent && container.isOverlay(); + final boolean dimOnTask = !isFillParent + && attributes.getWindowAttributes().getDimArea() == DIM_AREA_ON_TASK + && Flags.fullscreenDimFlag(); + final IBinder fragmentToken = container.getTaskFragmentToken(); + + // TODO(b/243518738): Update to resizeTaskFragment after we migrate WCT#setRelativeBounds + // and WCT#setWindowingMode to take fragmentToken. + resizeTaskFragmentIfRegistered(wct, container, relativeBounds); + int windowingMode = container.getTaskContainer().getWindowingModeForTaskFragment( + relativeBounds); + updateTaskFragmentWindowingModeIfRegistered(wct, container, windowingMode); + // Always use default animation for standalone ActivityStack. + updateAnimationParams(wct, fragmentToken, TaskFragmentAnimationParams.DEFAULT); + setTaskFragmentIsolatedNavigation(wct, container, isIsolatedNavigated); + setTaskFragmentDimOnTask(wct, fragmentToken, dimOnTask); + } - resizeTaskFragment(wct, container.getTaskFragmentToken(), bounds); - updateWindowingMode(wct, container.getTaskFragmentToken(), - bounds.isEmpty() ? WINDOWING_MODE_FULLSCREEN : WINDOWING_MODE_MULTI_WINDOW); + /** + * Returns the expanded bounds if the {@code bounds} violate minimum dimension or are not fully + * covered by the task bounds. Otherwise, returns {@code bounds}. + */ + @NonNull + static Rect sanitizeBounds(@NonNull Rect bounds, @Nullable Size minDimension, + @NonNull Rect taskBounds) { + if (bounds.isEmpty()) { + // Don't need to check if the bounds follows the task bounds. + return bounds; + } + if (boundsSmallerThanMinDimensions(bounds, minDimension)) { + // Expand the bounds if the bounds are smaller than minimum dimensions. + return new Rect(); + } + if (!taskBounds.contains(bounds)) { + // Expand the bounds if the bounds exceed the task bounds. + return new Rect(); + } + return bounds; } @Override 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 71195b6df97e..73109e266905 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java @@ -126,6 +126,11 @@ class TaskContainer { } @NonNull + Rect getBounds() { + return mConfiguration.windowConfiguration.getBounds(); + } + + @NonNull TaskProperties getTaskProperties() { return new TaskProperties(mDisplayId, mConfiguration); } 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 4e7b76057b5d..34d43ad56bb4 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 @@ -16,14 +16,17 @@ package androidx.window.extensions.embedding; +import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; import static androidx.window.extensions.embedding.ActivityEmbeddingOptionsProperties.KEY_OVERLAY_TAG; import static androidx.window.extensions.embedding.EmbeddingTestUtils.TASK_BOUNDS; import static androidx.window.extensions.embedding.EmbeddingTestUtils.TASK_ID; +import static androidx.window.extensions.embedding.EmbeddingTestUtils.TEST_TAG; import static androidx.window.extensions.embedding.EmbeddingTestUtils.createMockTaskFragmentInfo; import static androidx.window.extensions.embedding.EmbeddingTestUtils.createSplitPairRuleBuilder; +import static androidx.window.extensions.embedding.WindowAttributes.DIM_AREA_ON_TASK; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; @@ -36,7 +39,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -56,6 +58,8 @@ import android.os.Handler; import android.os.IBinder; import android.platform.test.annotations.Presubmit; import android.platform.test.flag.junit.SetFlagsRule; +import android.util.Size; +import android.window.TaskFragmentAnimationParams; import android.window.TaskFragmentInfo; import android.window.TaskFragmentParentInfo; import android.window.WindowContainerTransaction; @@ -266,62 +270,21 @@ public class OverlayPresentationTest { } @Test - public void testCreateOrUpdateOverlayTaskFragmentIfNeeded_smallerThanMinDimens_expandOverlay() { + public void testSanitizeBounds_smallerThanMinDimens_expandOverlay() { mIntent.setComponent(new ComponentName(ApplicationProvider.getApplicationContext(), MinimumDimensionActivity.class)); - final Rect bounds = new Rect(0, 0, 100, 100); - mSplitController.setActivityStackAttributesCalculator(params -> - new ActivityStackAttributes.Builder().setRelativeBounds(bounds).build()); - final TaskFragmentContainer overlayContainer = - createOrUpdateOverlayTaskFragmentIfNeeded("test"); - final IBinder overlayToken = overlayContainer.getTaskFragmentToken(); - assertThat(mSplitController.getAllOverlayTaskFragmentContainers()) - .containsExactly(overlayContainer); - assertThat(overlayContainer.areLastRequestedBoundsEqual(new Rect())).isTrue(); - verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, overlayToken, - false); - - // Call createOrUpdateOverlayTaskFragmentIfNeeded again to check the update case. - clearInvocations(mSplitPresenter); - createOrUpdateOverlayTaskFragmentIfNeeded("test"); - - verify(mSplitPresenter).resizeTaskFragment(mTransaction, overlayToken, new Rect()); - verify(mSplitPresenter).updateWindowingMode(mTransaction, overlayToken, - WINDOWING_MODE_UNDEFINED); - verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, overlayContainer, - false); + SplitPresenter.sanitizeBounds(bounds, SplitPresenter.getMinDimensions(mIntent), + TASK_BOUNDS); } @Test - public void testCreateOrUpdateOverlayTaskFragmentIfNeeded_notInTaskBounds_expandOverlay() { + public void testSanitizeBounds_notInTaskBounds_expandOverlay() { final Rect bounds = new Rect(TASK_BOUNDS); bounds.offset(10, 10); - mSplitController.setActivityStackAttributesCalculator(params -> - new ActivityStackAttributes.Builder().setRelativeBounds(bounds).build()); - - final TaskFragmentContainer overlayContainer = - createOrUpdateOverlayTaskFragmentIfNeeded("test"); - final IBinder overlayToken = overlayContainer.getTaskFragmentToken(); - assertThat(mSplitController.getAllOverlayTaskFragmentContainers()) - .containsExactly(overlayContainer); - assertThat(overlayContainer.areLastRequestedBoundsEqual(new Rect())).isTrue(); - verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, overlayToken, - false); - - // Call createOrUpdateOverlayTaskFragmentIfNeeded again to check the update case. - clearInvocations(mSplitPresenter); - createOrUpdateOverlayTaskFragmentIfNeeded("test"); - - verify(mSplitPresenter).resizeTaskFragment(mTransaction, overlayToken, new Rect()); - verify(mSplitPresenter).updateWindowingMode(mTransaction, - overlayToken, WINDOWING_MODE_UNDEFINED); - verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, - overlayContainer, false); - assertThat(mSplitController.getAllOverlayTaskFragmentContainers()) - .containsExactly(overlayContainer); + SplitPresenter.sanitizeBounds(bounds, null, TASK_BOUNDS); } @Test @@ -331,6 +294,7 @@ public class OverlayPresentationTest { new ActivityStackAttributes.Builder().setRelativeBounds(bounds).build()); final TaskFragmentContainer overlayContainer = createOrUpdateOverlayTaskFragmentIfNeeded("test"); + setupTaskFragmentInfo(overlayContainer, mActivity); assertThat(mSplitController.getAllOverlayTaskFragmentContainers()) .containsExactly(overlayContainer); @@ -437,7 +401,7 @@ public class OverlayPresentationTest { assertThrows(NullPointerException.class, () -> mSplitController.updateActivityStackAttributes(new Binder(), null)); - verify(mSplitPresenter, never()).applyActivityStackAttributes(any(), any(), any()); + verify(mSplitPresenter, never()).applyActivityStackAttributes(any(), any(), any(), any()); } @Test @@ -447,7 +411,7 @@ public class OverlayPresentationTest { mSplitController.updateActivityStackAttributes(container.getTaskFragmentToken(), new ActivityStackAttributes.Builder().build()); - verify(mSplitPresenter, never()).applyActivityStackAttributes(any(), any(), any()); + verify(mSplitPresenter, never()).applyActivityStackAttributes(any(), any(), any(), any()); } @Test @@ -457,19 +421,20 @@ public class OverlayPresentationTest { mSplitController.updateActivityStackAttributes(container.getTaskFragmentToken(), new ActivityStackAttributes.Builder().build()); - verify(mSplitPresenter, never()).applyActivityStackAttributes(any(), any(), any()); + verify(mSplitPresenter, never()).applyActivityStackAttributes(any(), any(), any(), any()); } @Test public void testUpdateActivityStackAttributes() { final TaskFragmentContainer container = createTestOverlayContainer(TASK_ID, "test"); - doNothing().when(mSplitPresenter).applyActivityStackAttributes(any(), any(), any()); + doNothing().when(mSplitPresenter).applyActivityStackAttributes(any(), any(), any(), any()); final ActivityStackAttributes attrs = new ActivityStackAttributes.Builder().build(); final IBinder token = container.getTaskFragmentToken(); mSplitController.updateActivityStackAttributes(token, attrs); - verify(mSplitPresenter).applyActivityStackAttributes(any(), eq(container), eq(attrs)); + verify(mSplitPresenter).applyActivityStackAttributes(any(), eq(container), eq(attrs), + any()); } @Test @@ -521,6 +486,89 @@ public class OverlayPresentationTest { .that(taskContainer.getOverlayContainer()).isNull(); } + @Test + public void testApplyActivityStackAttributesForExpandedContainer() { + final TaskFragmentContainer container = createMockTaskFragmentContainer(mActivity); + final IBinder token = container.getTaskFragmentToken(); + final ActivityStackAttributes attributes = new ActivityStackAttributes.Builder().build(); + + mSplitPresenter.applyActivityStackAttributes(mTransaction, container, attributes, + null /* minDimensions */); + + verify(mSplitPresenter).resizeTaskFragmentIfRegistered(mTransaction, container, + attributes.getRelativeBounds()); + verify(mSplitPresenter).updateTaskFragmentWindowingModeIfRegistered(mTransaction, container, + WINDOWING_MODE_UNDEFINED); + verify(mSplitPresenter).updateAnimationParams(mTransaction, token, + TaskFragmentAnimationParams.DEFAULT); + verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, container, false); + verify(mSplitPresenter).setTaskFragmentDimOnTask(mTransaction, token, false); + } + + @Test + public void testApplyActivityStackAttributesForOverlayContainer() { + final TaskFragmentContainer container = createTestOverlayContainer(TASK_ID, TEST_TAG); + final IBinder token = container.getTaskFragmentToken(); + final ActivityStackAttributes attributes = new ActivityStackAttributes.Builder() + .setRelativeBounds(new Rect(0, 0, 200, 200)) + .setWindowAttributes(new WindowAttributes(DIM_AREA_ON_TASK)) + .build(); + + mSplitPresenter.applyActivityStackAttributes(mTransaction, container, attributes, + null /* minDimensions */); + + verify(mSplitPresenter).resizeTaskFragmentIfRegistered(mTransaction, container, + attributes.getRelativeBounds()); + verify(mSplitPresenter).updateTaskFragmentWindowingModeIfRegistered(mTransaction, container, + WINDOWING_MODE_MULTI_WINDOW); + verify(mSplitPresenter).updateAnimationParams(mTransaction, token, + TaskFragmentAnimationParams.DEFAULT); + verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, container, true); + verify(mSplitPresenter).setTaskFragmentDimOnTask(mTransaction, token, true); + } + + @Test + public void testApplyActivityStackAttributesForExpandedOverlayContainer() { + final TaskFragmentContainer container = createTestOverlayContainer(TASK_ID, TEST_TAG); + final IBinder token = container.getTaskFragmentToken(); + final ActivityStackAttributes attributes = new ActivityStackAttributes.Builder().build(); + + mSplitPresenter.applyActivityStackAttributes(mTransaction, container, attributes, + null /* minDimensions */); + + verify(mSplitPresenter).resizeTaskFragmentIfRegistered(mTransaction, container, + attributes.getRelativeBounds()); + verify(mSplitPresenter).updateTaskFragmentWindowingModeIfRegistered(mTransaction, container, + WINDOWING_MODE_UNDEFINED); + verify(mSplitPresenter).updateAnimationParams(mTransaction, token, + TaskFragmentAnimationParams.DEFAULT); + verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, container, false); + verify(mSplitPresenter).setTaskFragmentDimOnTask(mTransaction, token, false); + } + + @Test + public void testApplyActivityStackAttributesForOverlayContainer_exceedsMinDimensions() { + final TaskFragmentContainer container = createTestOverlayContainer(TASK_ID, TEST_TAG); + final IBinder token = container.getTaskFragmentToken(); + final Rect relativeBounds = new Rect(0, 0, 200, 200); + final ActivityStackAttributes attributes = new ActivityStackAttributes.Builder() + .setRelativeBounds(relativeBounds) + .setWindowAttributes(new WindowAttributes(DIM_AREA_ON_TASK)) + .build(); + + mSplitPresenter.applyActivityStackAttributes(mTransaction, container, attributes, + new Size(relativeBounds.width() + 1, relativeBounds.height())); + + verify(mSplitPresenter).resizeTaskFragmentIfRegistered(mTransaction, container, + new Rect()); + verify(mSplitPresenter).updateTaskFragmentWindowingModeIfRegistered(mTransaction, container, + WINDOWING_MODE_UNDEFINED); + verify(mSplitPresenter).updateAnimationParams(mTransaction, token, + TaskFragmentAnimationParams.DEFAULT); + verify(mSplitPresenter).setTaskFragmentIsolatedNavigation(mTransaction, container, false); + verify(mSplitPresenter).setTaskFragmentDimOnTask(mTransaction, token, false); + } + /** * A simplified version of {@link SplitController.ActivityStartMonitor * #createOrUpdateOverlayTaskFragmentIfNeeded} |