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

Commit 6188ec41 authored by Federico Baron's avatar Federico Baron Committed by Android (Google) Code Review
Browse files

Merge "Make hotseat column span responsive" into main

parents d2ce88d5 e4b0b71f
Loading
Loading
Loading
Loading
+37 −9
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {
        assertThat(dp.hotseatBarEndOffset).isEqualTo(510)
        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
        assertThat(dp.hotseatBorderSpace).isEqualTo(70)
        assertThat(dp.hotseatColumnSpan).isEqualTo(6)
        assertThat(dp.hotseatWidthPx).isEqualTo(1445)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(150)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(580)
@@ -64,6 +66,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {
        assertThat(dp.hotseatBarEndOffset).isEqualTo(510)
        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
        assertThat(dp.hotseatBorderSpace).isEqualTo(40)
        assertThat(dp.hotseatColumnSpan).isEqualTo(6)
        assertThat(dp.hotseatWidthPx).isEqualTo(1080)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(150)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(550)
@@ -85,6 +89,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {
        assertThat(dp.hotseatBarEndOffset).isEqualTo(705)
        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
        assertThat(dp.hotseatBorderSpace).isEqualTo(54)
        assertThat(dp.hotseatColumnSpan).isEqualTo(6)
        assertThat(dp.hotseatWidthPx).isEqualTo(1468)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(231)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(759)
@@ -100,22 +106,21 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {
    @Test
    fun nav_buttons_dont_interfere_with_required_hotseat_width() {
        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
        inv?.apply {
            hotseatColumnSpan = IntArray(4) { 4 }
            inlineQsb = BooleanArray(4) { false }
        }
        inv?.apply { inlineQsb = BooleanArray(4) { false } }
        val dp = newDP()
        dp.isTaskbarPresentInApps = true

        assertThat(dp.hotseatBarEndOffset).isEqualTo(660)
        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
        assertThat(dp.hotseatBorderSpace).isEqualTo(100)
        assertThat(dp.hotseatColumnSpan).isEqualTo(6)
        assertThat(dp.hotseatWidthPx).isEqualTo(1975)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(300)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(1040)

        assertThat(dp.isQsbInline).isFalse()
        assertThat(dp.hotseatQsbWidth).isEqualTo(1223)
        assertThat(dp.hotseatQsbWidth).isEqualTo(1965)
    }

    /** This is a case when after setting the hotseat, the QSB width needs to be changed to fit */
@@ -128,13 +133,15 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {

        assertThat(dp.hotseatBarEndOffset).isEqualTo(660)
        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
        assertThat(dp.hotseatBorderSpace).isEqualTo(36)
        assertThat(dp.hotseatBorderSpace).isEqualTo(34)
        assertThat(dp.hotseatColumnSpan).isEqualTo(4)
        assertThat(dp.hotseatWidthPx).isEqualTo(1179)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(864)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(696)
        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(876)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(694)

        assertThat(dp.isQsbInline).isTrue()
        assertThat(dp.hotseatQsbWidth).isEqualTo(528)
        assertThat(dp.hotseatQsbWidth).isEqualTo(542)
    }

    /**
@@ -151,6 +158,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {
        assertThat(dp.hotseatBarEndOffset).isEqualTo(660)
        assertThat(dp.numShownHotseatIcons).isEqualTo(5)
        assertThat(dp.hotseatBorderSpace).isEqualTo(36)
        assertThat(dp.hotseatColumnSpan).isEqualTo(4)
        assertThat(dp.hotseatWidthPx).isEqualTo(1095)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(816)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(700)
@@ -158,4 +167,23 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() {
        assertThat(dp.isQsbInline).isTrue()
        assertThat(dp.hotseatQsbWidth).isEqualTo(480)
    }

    @Test
    fun increase_span_when_space_between_icons_is_less_than_minimum() {
        initializeVarsForTwoPanel(isGestureMode = false, isLandscape = false, rows = 5, cols = 5)
        val dp = newDP()
        dp.isTaskbarPresentInApps = true

        assertThat(dp.hotseatBarEndOffset).isEqualTo(600)
        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
        assertThat(dp.hotseatBorderSpace).isEqualTo(48)
        assertThat(dp.hotseatColumnSpan).isEqualTo(8)
        assertThat(dp.hotseatWidthPx).isEqualTo(1383)

        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(126)
        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(652)

        assertThat(dp.isQsbInline).isFalse()
        assertThat(dp.hotseatQsbWidth).isEqualTo(1372)
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@
<!-- Hotseat -->
    <dimen name="dynamic_grid_hotseat_side_padding">0dp</dimen>
    <dimen name="spring_loaded_hotseat_top_margin">65dp</dimen>
    <dimen name="min_hotseat_icon_space">17dp</dimen>

<!-- Dragging -->
    <dimen name="drop_target_top_margin">64dp</dimen>
+0 −11
Original line number Diff line number Diff line
@@ -204,17 +204,6 @@
         defaults to 2 * numHotseatIcons -->
        <attr name="numExtendedHotseatIcons" format="integer" />

        <!-- alignment of hotseat to the grid.
        Not applicable for 3 button mode when taskbar is enabled -->
        <!-- defaults to numColumns, if not specified -->
        <attr name="hotseatColumnSpan" format="integer" />
        <!-- defaults to numColumns, if not specified -->
        <attr name="hotseatColumnSpanLandscape" format="integer" />
        <!-- defaults to numColumns, if not specified -->
        <attr name="hotseatColumnSpanTwoPanelLandscape" format="integer" />
        <!-- defaults to numColumns, if not specified -->
        <attr name="hotseatColumnSpanTwoPanelPortrait" format="integer" />

        <!-- Spacing to have at the end of the nav buttons in large screen 3 button nav,
             defaults to @dimen/taskbar_button_margin_default -->
        <attr name="inlineNavButtonsEndSpacing" format="reference" />
+0 −1
Original line number Diff line number Diff line
@@ -168,7 +168,6 @@
        launcher:numFolderRows="3"
        launcher:numFolderColumns="3"
        launcher:numHotseatIcons="6"
        launcher:hotseatColumnSpanLandscape="4"
        launcher:numAllAppsColumns="6"
        launcher:isScalable="true"
        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"
+47 −6
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.view.Surface;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.res.ResourcesCompat;

import com.android.launcher3.CellLayout.ContainerType;
@@ -212,6 +213,8 @@ public class DeviceProfile {
    // Hotseat
    public int numShownHotseatIcons;
    public int hotseatCellHeightPx;
    private int mHotseatColumnSpan;
    private int mHotseatWidthPx; // not used in vertical bar layout
    public final boolean areNavButtonsInline;
    // In portrait: size = height, in landscape: size = width
    public int hotseatBarSizePx;
@@ -551,6 +554,7 @@ public class DeviceProfile {
        areNavButtonsInline = isTaskbarPresent && !isGestureMode;
        numShownHotseatIcons =
                isTwoPanels ? inv.numDatabaseHotseatIcons : inv.numShownHotseatIcons;
        mHotseatColumnSpan = inv.numColumns;

        numShownAllAppsColumns =
                isTwoPanels ? inv.numDatabaseAllAppsColumns : inv.numAllAppsColumns;
@@ -818,8 +822,7 @@ public class DeviceProfile {
                    - hotseatBorderSpace * numShownHotseatIcons
                    - iconExtraSpacePx;
        } else {
            int columns = inv.hotseatColumnSpan[mTypeIndex];
            return getIconToIconWidthForColumns(columns) - iconExtraSpacePx;
            return getIconToIconWidthForColumns(mHotseatColumnSpan) - iconExtraSpacePx;
        }
    }

@@ -890,10 +893,31 @@ public class DeviceProfile {
    public void recalculateHotseatWidthAndBorderSpace() {
        if (!mIsScalableGrid) return;

        int columns = inv.hotseatColumnSpan[mTypeIndex];
        float hotseatWidthPx = getIconToIconWidthForColumns(columns);
        hotseatBorderSpace = calculateHotseatBorderSpace(hotseatWidthPx, /* numExtraBorder= */ 0);
        updateHotseatWidthAndBorderSpace(inv.numColumns);
        int numWorkspaceColumns = getPanelCount() * inv.numColumns;
        if (isTwoPanels) {
            updateHotseatWidthAndBorderSpace(inv.numDatabaseHotseatIcons);
            // If hotseat doesn't fit with current width, increase column span to fit by multiple
            // of 2.
            while (hotseatBorderSpace < mMinHotseatIconSpacePx
                    && mHotseatColumnSpan < numWorkspaceColumns) {
                updateHotseatWidthAndBorderSpace(mHotseatColumnSpan + 2);
            }
        }
        if (isQsbInline) {
            // If QSB is inline, reduce column span until it fits.
            int maxHotseatWidthAllowedPx = getIconToIconWidthForColumns(numWorkspaceColumns);
            int minHotseatWidthRequiredPx =
                    mMinHotseatQsbWidthPx + hotseatBorderSpace + mHotseatWidthPx;
            while (minHotseatWidthRequiredPx > maxHotseatWidthAllowedPx
                    && mHotseatColumnSpan > 1) {
                updateHotseatWidthAndBorderSpace(mHotseatColumnSpan - 1);
                minHotseatWidthRequiredPx =
                        mMinHotseatQsbWidthPx + hotseatBorderSpace + mHotseatWidthPx;
            }
        }
        hotseatQsbWidth = calculateQsbWidth(hotseatBorderSpace);

        // Spaces should be correct when the nav buttons are not inline
        if (!areNavButtonsInline) {
            return;
@@ -935,6 +959,12 @@ public class DeviceProfile {
        } while (hotseatBorderSpace < mMinHotseatIconSpacePx && numShownHotseatIcons > 1);
    }

    private void updateHotseatWidthAndBorderSpace(int columns) {
        mHotseatColumnSpan = columns;
        mHotseatWidthPx = getIconToIconWidthForColumns(mHotseatColumnSpan);
        hotseatBorderSpace = calculateHotseatBorderSpace(mHotseatWidthPx, /* numExtraBorder= */ 0);
    }

    private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp) {
        return getCellLayoutBorderSpace(idp, 1f);
    }
@@ -958,6 +988,16 @@ public class DeviceProfile {
        return mInfo;
    }

    @VisibleForTesting
    public int getHotseatColumnSpan() {
        return mHotseatColumnSpan;
    }

    @VisibleForTesting
    public int getHotseatWidthPx() {
        return mHotseatWidthPx;
    }

    public Builder toBuilder(Context context) {
        WindowBounds bounds = new WindowBounds(
                widthPx, heightPx, availableWidthPx, availableHeightPx, rotationHint);
@@ -2120,7 +2160,8 @@ public class DeviceProfile {
        writer.println(prefix + pxToDpStr("allAppsLeftRightMargin", allAppsLeftRightMargin));

        writer.println(prefix + pxToDpStr("hotseatBarSizePx", hotseatBarSizePx));
        writer.println(prefix + "\tinv.hotseatColumnSpan: " + inv.hotseatColumnSpan[mTypeIndex]);
        writer.println(prefix + "\tmHotseatColumnSpan: " + mHotseatColumnSpan);
        writer.println(prefix + pxToDpStr("mHotseatWidthPx", mHotseatWidthPx));
        writer.println(prefix + pxToDpStr("hotseatCellHeightPx", hotseatCellHeightPx));
        writer.println(prefix + pxToDpStr("hotseatBarBottomSpacePx", hotseatBarBottomSpacePx));
        writer.println(prefix + pxToDpStr("mHotseatBarEdgePaddingPx",
Loading