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

Commit 0ac47083 authored by Jeremy Sim's avatar Jeremy Sim
Browse files

Prevent doubling up on split placeholder insets

This patch makes it so that the split placeholder uses only one inset for buffering the top of the icon: either the default split placeholder inset, or the device's built-in screen inset.

Currently, when we determine the size of the split placeholder, we add the placeholder's default inset to the device's built-in screen inset (camera cutouts, etc.). On some devices, this causes a very large combined inset, and it doesn't leave enough room for all the other UI elements, especially when 3-button mode is active. This patch cuts out one of the insets by selecting only one of the insets to respect (the larger one).

Fixes: 241164191
Test: Manual, checked all emulated inset types on a variety of screen sizes
Change-Id: Ica0e791bf4b8b757ad3fb87ab1cf3105b97a61dc
parent 1874371a
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -218,6 +218,9 @@ public class DeviceProfile {
    public int overviewRowSpacing;
    public int overviewGridSideMargin;

    // Split staging
    public int splitPlaceholderInset;

    // Widgets
    private final ViewScaleProvider mViewScaleProvider;

@@ -459,6 +462,8 @@ public class DeviceProfile {
        overviewRowSpacing = res.getDimensionPixelSize(R.dimen.overview_grid_row_spacing);
        overviewGridSideMargin = res.getDimensionPixelSize(R.dimen.overview_grid_side_margin);

        splitPlaceholderInset = res.getDimensionPixelSize(R.dimen.split_placeholder_inset);

        // Calculate all of the remaining variables.
        extraSpace = updateAvailableDimensions(res);

+12 −4
Original line number Diff line number Diff line
@@ -424,8 +424,8 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
        // In fake land/seascape, the placeholder always needs to go to the "top" of the device,
        // which is the same bounds as 0 rotation.
        int width = dp.widthPx;
        int insetThickness = dp.getInsets().top;
        out.set(0, 0, width, placeholderHeight + insetThickness);
        int insetSizeAdjustment = getPlaceholderSizeAdjustment(dp);
        out.set(0, 0, width, placeholderHeight + insetSizeAdjustment);
        out.inset(placeholderInset, 0);

        // Adjust the top to account for content off screen. This will help to animate the view in
@@ -442,13 +442,21 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
            float onScreenRectCenterY, float fullscreenScaleX, float fullscreenScaleY,
            int drawableWidth, int drawableHeight, DeviceProfile dp,
            @StagePosition int stagePosition) {
        float inset = dp.getInsets().top;
        float insetAdjustment = getPlaceholderSizeAdjustment(dp) / 2f;
        out.setX(Math.round(onScreenRectCenterX / fullscreenScaleX
                - 1.0f * drawableWidth / 2));
        out.setY(Math.round((onScreenRectCenterY + (inset / 2f)) / fullscreenScaleY
        out.setY(Math.round((onScreenRectCenterY + insetAdjustment) / fullscreenScaleY
                - 1.0f * drawableHeight / 2));
    }

    /**
     * The split placeholder comes with a default inset to buffer the icon from the top of the
     * screen. But if the device already has a large inset (from cutouts etc), use that instead.
     */
    private int getPlaceholderSizeAdjustment(DeviceProfile dp) {
        return Math.max(dp.getInsets().top - dp.splitPlaceholderInset, 0);
    }

    @Override
    public void setSplitInstructionsParams(View out, DeviceProfile dp, int splitInstructionsHeight,
            int splitInstructionsWidth, int threeButtonNavShift) {
+21 −13
Original line number Diff line number Diff line
@@ -444,13 +444,9 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
        int screenWidth = dp.widthPx;
        int screenHeight = dp.heightPx;
        boolean pinToRight = stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
        int insetThickness;
        if (!dp.isLandscape) {
            insetThickness = dp.getInsets().top;
        } else {
            insetThickness = pinToRight ? dp.getInsets().right : dp.getInsets().left;
        }
        out.set(0, 0, screenWidth, placeholderHeight + insetThickness);
        int insetSizeAdjustment = getPlaceholderSizeAdjustment(dp, pinToRight);

        out.set(0, 0, screenWidth, placeholderHeight + insetSizeAdjustment);
        if (!dp.isLandscape) {
            // portrait, phone or tablet - spans width of screen, nothing else to do
            out.inset(placeholderInset, 0);
@@ -495,20 +491,18 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
            int drawableWidth, int drawableHeight, DeviceProfile dp,
            @StagePosition int stagePosition) {
        boolean pinToRight = stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
        float insetAdjustment = getPlaceholderSizeAdjustment(dp, pinToRight) / 2f;
        if (!dp.isLandscape) {
            float inset = dp.getInsets().top;
            out.setX(Math.round(onScreenRectCenterX / fullscreenScaleX
                    - 1.0f * drawableWidth / 2));
            out.setY(Math.round((onScreenRectCenterY + (inset / 2f)) / fullscreenScaleY
            out.setY(Math.round((onScreenRectCenterY + insetAdjustment) / fullscreenScaleY
                    - 1.0f * drawableHeight / 2));
        } else {
            if (pinToRight) {
                float inset = dp.getInsets().right;
                out.setX(Math.round((onScreenRectCenterX - (inset / 2f)) / fullscreenScaleX
                out.setX(Math.round((onScreenRectCenterX - insetAdjustment) / fullscreenScaleX
                        - 1.0f * drawableWidth / 2));
            } else {
                float inset = dp.getInsets().left;
                out.setX(Math.round((onScreenRectCenterX + (inset / 2f)) / fullscreenScaleX
                out.setX(Math.round((onScreenRectCenterX + insetAdjustment) / fullscreenScaleX
                        - 1.0f * drawableWidth / 2));
            }
            out.setY(Math.round(onScreenRectCenterY / fullscreenScaleY
@@ -516,6 +510,20 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
        }
    }

    /**
     * The split placeholder comes with a default inset to buffer the icon from the top of the
     * screen. But if the device already has a large inset (from cutouts etc), use that instead.
     */
    private int getPlaceholderSizeAdjustment(DeviceProfile dp, boolean pinToRight) {
        int insetThickness;
        if (!dp.isLandscape) {
            insetThickness = dp.getInsets().top;
        } else {
            insetThickness = pinToRight ? dp.getInsets().right : dp.getInsets().left;
        }
        return Math.max(insetThickness - dp.splitPlaceholderInset, 0);
    }

    @Override
    public void setSplitInstructionsParams(View out, DeviceProfile dp, int splitInstructionsHeight,
            int splitInstructionsWidth, int threeButtonNavShift) {