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

Commit 6fba6cdb authored by fbaron's avatar fbaron Committed by Federico Baron
Browse files

Make hotseat column span responsive

Flag: NONE
Test: DeviceProfileDumpTest, DeviceProfileAlternativeDumpTest, HomeScreenImageTest
Bug: 325084912
Change-Id: Ifa9e8066662a1ab053f66b8800b739d813d2dab8
(cherry picked from commit e4b0b71f)
parent 4a01d58d
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
@@ -201,17 +201,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
@@ -46,6 +46,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;
@@ -210,6 +211,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;
@@ -544,6 +547,7 @@ public class DeviceProfile {
        areNavButtonsInline = isTaskbarPresent && !isGestureMode;
        numShownHotseatIcons =
                isTwoPanels ? inv.numDatabaseHotseatIcons : inv.numShownHotseatIcons;
        mHotseatColumnSpan = inv.numColumns;

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

@@ -883,10 +886,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;
@@ -928,6 +952,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);
    }
@@ -951,6 +981,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);
@@ -2113,7 +2153,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