Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 11b6d469 authored by Kevin Chyn's avatar Kevin Chyn Committed by Android (Google) Code Review
Browse files

Merge "Fix NPE when using hinge split type without FoldingFeature" into udc-dev

parents 52a0a4db a296b769
Loading
Loading
Loading
Loading
+48 −29
Original line number Original line Diff line number Diff line
@@ -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:
@@ -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:"
@@ -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) {
@@ -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;
+21 −0
Original line number Original line Diff line number Diff line
@@ -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();