Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +48 −29 Original line number Original line Diff line number Diff line Loading @@ -710,24 +710,16 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull SplitAttributes splitAttributes) { @NonNull SplitAttributes splitAttributes) { final Configuration taskConfiguration = taskProperties.getConfiguration(); final Configuration taskConfiguration = taskProperties.getConfiguration(); final FoldingFeature foldingFeature = getFoldingFeature(taskProperties); final FoldingFeature foldingFeature = getFoldingFeature(taskProperties); final SplitType splitType = computeSplitType(splitAttributes, taskConfiguration, if (!shouldShowSplit(splitAttributes)) { foldingFeature); final SplitAttributes computedSplitAttributes = new SplitAttributes.Builder() .setSplitType(splitType) .setLayoutDirection(splitAttributes.getLayoutDirection()) .build(); if (!shouldShowSplit(computedSplitAttributes)) { return new Rect(); return new Rect(); } } final Rect bounds; final Rect bounds; switch (position) { switch (position) { case POSITION_START: case POSITION_START: bounds = getPrimaryBounds(taskConfiguration, computedSplitAttributes, bounds = getPrimaryBounds(taskConfiguration, splitAttributes, foldingFeature); foldingFeature); break; break; case POSITION_END: case POSITION_END: bounds = getSecondaryBounds(taskConfiguration, computedSplitAttributes, bounds = getSecondaryBounds(taskConfiguration, splitAttributes, foldingFeature); foldingFeature); break; break; case POSITION_FILL: case POSITION_FILL: default: default: Loading @@ -742,63 +734,76 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull @NonNull private Rect getPrimaryBounds(@NonNull Configuration taskConfiguration, private Rect getPrimaryBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { if (!shouldShowSplit(splitAttributes)) { final SplitAttributes computedSplitAttributes = updateSplitAttributesType(splitAttributes, computeSplitType(splitAttributes, taskConfiguration, foldingFeature)); if (!shouldShowSplit(computedSplitAttributes)) { return new Rect(); return new Rect(); } } switch (splitAttributes.getLayoutDirection()) { switch (computedSplitAttributes.getLayoutDirection()) { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { return getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getLeftContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { return getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.LOCALE: { case SplitAttributes.LayoutDirection.LOCALE: { final boolean isLtr = taskConfiguration.getLayoutDirection() final boolean isLtr = taskConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR; == View.LAYOUT_DIRECTION_LTR; return isLtr return isLtr ? getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature) ? getLeftContainerBounds(taskConfiguration, computedSplitAttributes, : getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature) : getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); foldingFeature); } } case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { return getTopContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getTopContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { return getBottomContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getBottomContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } default: default: throw new IllegalArgumentException("Unknown layout direction:" throw new IllegalArgumentException("Unknown layout direction:" + splitAttributes.getLayoutDirection()); + computedSplitAttributes.getLayoutDirection()); } } } } @NonNull @NonNull private Rect getSecondaryBounds(@NonNull Configuration taskConfiguration, private Rect getSecondaryBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { if (!shouldShowSplit(splitAttributes)) { final SplitAttributes computedSplitAttributes = updateSplitAttributesType(splitAttributes, computeSplitType(splitAttributes, taskConfiguration, foldingFeature)); if (!shouldShowSplit(computedSplitAttributes)) { return new Rect(); return new Rect(); } } switch (splitAttributes.getLayoutDirection()) { switch (computedSplitAttributes.getLayoutDirection()) { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { return getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { return getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getLeftContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.LOCALE: { case SplitAttributes.LayoutDirection.LOCALE: { final boolean isLtr = taskConfiguration.getLayoutDirection() final boolean isLtr = taskConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR; == View.LAYOUT_DIRECTION_LTR; return isLtr return isLtr ? getRightContainerBounds(taskConfiguration, splitAttributes, ? getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature) foldingFeature) : getLeftContainerBounds(taskConfiguration, splitAttributes, : getLeftContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); foldingFeature); } } case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { return getBottomContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getBottomContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { return getTopContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getTopContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } default: default: throw new IllegalArgumentException("Unknown layout direction:" throw new IllegalArgumentException("Unknown layout direction:" Loading @@ -806,6 +811,19 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } } } /** * Returns the {@link SplitAttributes} that update the {@link SplitType} to * {@code splitTypeToUpdate}. */ private static SplitAttributes updateSplitAttributesType( @NonNull SplitAttributes splitAttributes, @NonNull SplitType splitTypeToUpdate) { return new SplitAttributes.Builder() .setSplitType(splitTypeToUpdate) .setLayoutDirection(splitAttributes.getLayoutDirection()) .setAnimationBackgroundColor(splitAttributes.getAnimationBackgroundColor()) .build(); } @NonNull @NonNull private Rect getLeftContainerBounds(@NonNull Configuration taskConfiguration, private Rect getLeftContainerBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { Loading Loading @@ -898,7 +916,8 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } @Nullable @Nullable private FoldingFeature getFoldingFeature(@NonNull TaskProperties taskProperties) { @VisibleForTesting FoldingFeature getFoldingFeature(@NonNull TaskProperties taskProperties) { final int displayId = taskProperties.getDisplayId(); final int displayId = taskProperties.getDisplayId(); final WindowConfiguration windowConfiguration = taskProperties.getConfiguration() final WindowConfiguration windowConfiguration = taskProperties.getConfiguration() .windowConfiguration; .windowConfiguration; Loading libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -729,6 +729,27 @@ public class SplitPresenterTest { splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); } } @Test public void testComputeSplitAttributesOnHingeSplitTypeOnDeviceWithoutFoldingFeature() { final SplitAttributes hingeSplitAttrs = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.HingeSplitType( SplitAttributes.SplitType.RatioSplitType.splitEqually())) .build(); final SplitPairRule splitPairRule = createSplitPairRuleBuilder( activityPair -> true, activityIntentPair -> true, windowMetrics -> windowMetrics.getBounds().equals(TASK_BOUNDS)) .setFinishSecondaryWithPrimary(DEFAULT_FINISH_SECONDARY_WITH_PRIMARY) .setFinishPrimaryWithSecondary(DEFAULT_FINISH_PRIMARY_WITH_SECONDARY) .setDefaultSplitAttributes(hingeSplitAttrs) .build(); final TaskContainer.TaskProperties taskProperties = getTaskProperties(); doReturn(null).when(mPresenter).getFoldingFeature(any()); assertEquals(hingeSplitAttrs, mPresenter.computeSplitAttributes(taskProperties, splitPairRule, hingeSplitAttrs, null /* minDimensionsPair */)); } @Test @Test public void testGetTaskWindowMetrics() { public void testGetTaskWindowMetrics() { final Configuration taskConfig = new Configuration(); final Configuration taskConfig = new Configuration(); Loading Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +48 −29 Original line number Original line Diff line number Diff line Loading @@ -710,24 +710,16 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull SplitAttributes splitAttributes) { @NonNull SplitAttributes splitAttributes) { final Configuration taskConfiguration = taskProperties.getConfiguration(); final Configuration taskConfiguration = taskProperties.getConfiguration(); final FoldingFeature foldingFeature = getFoldingFeature(taskProperties); final FoldingFeature foldingFeature = getFoldingFeature(taskProperties); final SplitType splitType = computeSplitType(splitAttributes, taskConfiguration, if (!shouldShowSplit(splitAttributes)) { foldingFeature); final SplitAttributes computedSplitAttributes = new SplitAttributes.Builder() .setSplitType(splitType) .setLayoutDirection(splitAttributes.getLayoutDirection()) .build(); if (!shouldShowSplit(computedSplitAttributes)) { return new Rect(); return new Rect(); } } final Rect bounds; final Rect bounds; switch (position) { switch (position) { case POSITION_START: case POSITION_START: bounds = getPrimaryBounds(taskConfiguration, computedSplitAttributes, bounds = getPrimaryBounds(taskConfiguration, splitAttributes, foldingFeature); foldingFeature); break; break; case POSITION_END: case POSITION_END: bounds = getSecondaryBounds(taskConfiguration, computedSplitAttributes, bounds = getSecondaryBounds(taskConfiguration, splitAttributes, foldingFeature); foldingFeature); break; break; case POSITION_FILL: case POSITION_FILL: default: default: Loading @@ -742,63 +734,76 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull @NonNull private Rect getPrimaryBounds(@NonNull Configuration taskConfiguration, private Rect getPrimaryBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { if (!shouldShowSplit(splitAttributes)) { final SplitAttributes computedSplitAttributes = updateSplitAttributesType(splitAttributes, computeSplitType(splitAttributes, taskConfiguration, foldingFeature)); if (!shouldShowSplit(computedSplitAttributes)) { return new Rect(); return new Rect(); } } switch (splitAttributes.getLayoutDirection()) { switch (computedSplitAttributes.getLayoutDirection()) { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { return getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getLeftContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { return getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.LOCALE: { case SplitAttributes.LayoutDirection.LOCALE: { final boolean isLtr = taskConfiguration.getLayoutDirection() final boolean isLtr = taskConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR; == View.LAYOUT_DIRECTION_LTR; return isLtr return isLtr ? getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature) ? getLeftContainerBounds(taskConfiguration, computedSplitAttributes, : getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature) : getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); foldingFeature); } } case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { return getTopContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getTopContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { return getBottomContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getBottomContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } default: default: throw new IllegalArgumentException("Unknown layout direction:" throw new IllegalArgumentException("Unknown layout direction:" + splitAttributes.getLayoutDirection()); + computedSplitAttributes.getLayoutDirection()); } } } } @NonNull @NonNull private Rect getSecondaryBounds(@NonNull Configuration taskConfiguration, private Rect getSecondaryBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { if (!shouldShowSplit(splitAttributes)) { final SplitAttributes computedSplitAttributes = updateSplitAttributesType(splitAttributes, computeSplitType(splitAttributes, taskConfiguration, foldingFeature)); if (!shouldShowSplit(computedSplitAttributes)) { return new Rect(); return new Rect(); } } switch (splitAttributes.getLayoutDirection()) { switch (computedSplitAttributes.getLayoutDirection()) { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: { return getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: { return getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getLeftContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.LOCALE: { case SplitAttributes.LayoutDirection.LOCALE: { final boolean isLtr = taskConfiguration.getLayoutDirection() final boolean isLtr = taskConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR; == View.LAYOUT_DIRECTION_LTR; return isLtr return isLtr ? getRightContainerBounds(taskConfiguration, splitAttributes, ? getRightContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature) foldingFeature) : getLeftContainerBounds(taskConfiguration, splitAttributes, : getLeftContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); foldingFeature); } } case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: { return getBottomContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getBottomContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: { return getTopContainerBounds(taskConfiguration, splitAttributes, foldingFeature); return getTopContainerBounds(taskConfiguration, computedSplitAttributes, foldingFeature); } } default: default: throw new IllegalArgumentException("Unknown layout direction:" throw new IllegalArgumentException("Unknown layout direction:" Loading @@ -806,6 +811,19 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } } } /** * Returns the {@link SplitAttributes} that update the {@link SplitType} to * {@code splitTypeToUpdate}. */ private static SplitAttributes updateSplitAttributesType( @NonNull SplitAttributes splitAttributes, @NonNull SplitType splitTypeToUpdate) { return new SplitAttributes.Builder() .setSplitType(splitTypeToUpdate) .setLayoutDirection(splitAttributes.getLayoutDirection()) .setAnimationBackgroundColor(splitAttributes.getAnimationBackgroundColor()) .build(); } @NonNull @NonNull private Rect getLeftContainerBounds(@NonNull Configuration taskConfiguration, private Rect getLeftContainerBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { Loading Loading @@ -898,7 +916,8 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } @Nullable @Nullable private FoldingFeature getFoldingFeature(@NonNull TaskProperties taskProperties) { @VisibleForTesting FoldingFeature getFoldingFeature(@NonNull TaskProperties taskProperties) { final int displayId = taskProperties.getDisplayId(); final int displayId = taskProperties.getDisplayId(); final WindowConfiguration windowConfiguration = taskProperties.getConfiguration() final WindowConfiguration windowConfiguration = taskProperties.getConfiguration() .windowConfiguration; .windowConfiguration; Loading
libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -729,6 +729,27 @@ public class SplitPresenterTest { splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); } } @Test public void testComputeSplitAttributesOnHingeSplitTypeOnDeviceWithoutFoldingFeature() { final SplitAttributes hingeSplitAttrs = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.HingeSplitType( SplitAttributes.SplitType.RatioSplitType.splitEqually())) .build(); final SplitPairRule splitPairRule = createSplitPairRuleBuilder( activityPair -> true, activityIntentPair -> true, windowMetrics -> windowMetrics.getBounds().equals(TASK_BOUNDS)) .setFinishSecondaryWithPrimary(DEFAULT_FINISH_SECONDARY_WITH_PRIMARY) .setFinishPrimaryWithSecondary(DEFAULT_FINISH_PRIMARY_WITH_SECONDARY) .setDefaultSplitAttributes(hingeSplitAttrs) .build(); final TaskContainer.TaskProperties taskProperties = getTaskProperties(); doReturn(null).when(mPresenter).getFoldingFeature(any()); assertEquals(hingeSplitAttrs, mPresenter.computeSplitAttributes(taskProperties, splitPairRule, hingeSplitAttrs, null /* minDimensionsPair */)); } @Test @Test public void testGetTaskWindowMetrics() { public void testGetTaskWindowMetrics() { final Configuration taskConfig = new Configuration(); final Configuration taskConfig = new Configuration(); Loading