From 6fba6cdb85bc1522aa026fed65377d835ad84cae Mon Sep 17 00:00:00 2001 From: fbaron Date: Fri, 29 Mar 2024 14:31:17 -0700 Subject: [PATCH] Make hotseat column span responsive Flag: NONE Test: DeviceProfileDumpTest, DeviceProfileAlternativeDumpTest, HomeScreenImageTest Bug: 325084912 Change-Id: Ifa9e8066662a1ab053f66b8800b739d813d2dab8 (cherry picked from commit e4b0b71faac89f773bd7b8d094fe0331661ff916) --- .../quickstep/HotseatWidthCalculationTest.kt | 46 +++++++++++--- res/values-sw600dp/dimens.xml | 1 + res/values/attrs.xml | 11 ---- res/xml/device_profiles.xml | 1 - src/com/android/launcher3/DeviceProfile.java | 53 ++++++++++++++-- .../launcher3/InvariantDeviceProfile.java | 15 ----- .../DeviceProfileDumpTest/phonePortrait.txt | 3 +- .../phonePortrait3Button.txt | 3 +- .../phoneVerticalBar.txt | 3 +- .../phoneVerticalBar3Button.txt | 3 +- .../DeviceProfileDumpTest/tabletLandscape.txt | 11 ++-- .../tabletLandscape3Button.txt | 11 ++-- .../DeviceProfileDumpTest/tabletPortrait.txt | 3 +- .../tabletPortrait3Button.txt | 3 +- .../twoPanelLandscape.txt | 3 +- .../twoPanelLandscape3Button.txt | 3 +- .../twoPanelPortrait.txt | 3 +- .../twoPanelPortrait3Button.txt | 3 +- .../FakeInvariantDeviceProfileTest.kt | 15 +++-- .../HotseatWidthCalculationTest.kt | 60 ++++++++++++++----- 20 files changed, 168 insertions(+), 86 deletions(-) diff --git a/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt b/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt index b1ba4c697f..a38851098e 100644 --- a/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt +++ b/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt @@ -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) + } } diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml index cc1f09e27a..eda9b2d3f2 100644 --- a/res/values-sw600dp/dimens.xml +++ b/res/values-sw600dp/dimens.xml @@ -40,6 +40,7 @@ 0dp 65dp + 17dp 64dp diff --git a/res/values/attrs.xml b/res/values/attrs.xml index b09903d6fa..b0f15b8f79 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -201,17 +201,6 @@ defaults to 2 * numHotseatIcons --> - - - - - - - - - - diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml index c9a44a1be0..1d0dbffc21 100644 --- a/res/xml/device_profiles.xml +++ b/res/xml/device_profiles.xml @@ -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" diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index f96d59ebba..35caf3485b 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -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", diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 42d4d50218..6a7c3a3a49 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -162,7 +162,6 @@ public class InvariantDeviceProfile { */ public int numDatabaseHotseatIcons; - public int[] hotseatColumnSpan; public float[] hotseatBarBottomSpace; public float[] hotseatQsbSpace; @@ -419,7 +418,6 @@ public class InvariantDeviceProfile { numShownHotseatIcons = closestProfile.numHotseatIcons; numDatabaseHotseatIcons = deviceType == TYPE_MULTI_DISPLAY ? closestProfile.numDatabaseHotseatIcons : closestProfile.numHotseatIcons; - hotseatColumnSpan = closestProfile.hotseatColumnSpan; hotseatBarBottomSpace = displayOption.hotseatBarBottomSpace; hotseatQsbSpace = displayOption.hotseatQsbSpace; @@ -830,8 +828,6 @@ public class InvariantDeviceProfile { private final int numHotseatIcons; private final int numDatabaseHotseatIcons; - private final int[] hotseatColumnSpan = new int[COUNT_SIZES]; - private final boolean[] inlineQsb = new boolean[COUNT_SIZES]; private @DimenRes int inlineNavButtonsEndSpacing; @@ -882,17 +878,6 @@ public class InvariantDeviceProfile { numDatabaseHotseatIcons = a.getInt( R.styleable.GridDisplayOption_numExtendedHotseatIcons, 2 * numHotseatIcons); - hotseatColumnSpan[INDEX_DEFAULT] = a.getInt( - R.styleable.GridDisplayOption_hotseatColumnSpan, numColumns); - hotseatColumnSpan[INDEX_LANDSCAPE] = a.getInt( - R.styleable.GridDisplayOption_hotseatColumnSpanLandscape, numColumns); - hotseatColumnSpan[INDEX_TWO_PANEL_LANDSCAPE] = a.getInt( - R.styleable.GridDisplayOption_hotseatColumnSpanTwoPanelLandscape, - numColumns); - hotseatColumnSpan[INDEX_TWO_PANEL_PORTRAIT] = a.getInt( - R.styleable.GridDisplayOption_hotseatColumnSpanTwoPanelPortrait, - numColumns); - inlineNavButtonsEndSpacing = a.getResourceId(R.styleable.GridDisplayOption_inlineNavButtonsEndSpacing, R.dimen.taskbar_button_margin_default); diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt index af8f67f06d..eb09975e4f 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 273.0px (104.0dp) - inv.hotseatColumnSpan: 5 + mHotseatColumnSpan: 5 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt index 5b83dd7286..fded5627fa 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 294.0px (112.0dp) - inv.hotseatColumnSpan: 5 + mHotseatColumnSpan: 5 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 147.0px (56.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt index 03a0048e7d..406fa4379f 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 252.0px (96.0dp) - inv.hotseatColumnSpan: 5 + mHotseatColumnSpan: 5 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 0.0px (0.0dp) mHotseatBarEdgePaddingPx: 63.0px (24.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt index 84258b35f3..735b54a45a 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 252.0px (96.0dp) - inv.hotseatColumnSpan: 5 + mHotseatColumnSpan: 5 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 0.0px (0.0dp) mHotseatBarEdgePaddingPx: 63.0px (24.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt index 87a970089e..dc8d47e803 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 32.0px (16.0dp) allAppsLeftRightMargin: 412.0px (206.0dp) hotseatBarSizePx: 200.0px (100.0dp) - inv.hotseatColumnSpan: 4 + mHotseatColumnSpan: 6 + mHotseatWidthPx: 1960.0px (980.0dp) hotseatCellHeightPx: 135.0px (67.5dp) hotseatBarBottomSpacePx: 80.0px (40.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) @@ -82,12 +83,12 @@ DeviceProfile: springLoadedHotseatBarTopMarginPx: 128.0px (64.0dp) getHotseatLayoutPadding(context).top: 0.0px (0.0dp) getHotseatLayoutPadding(context).bottom: 65.0px (32.5dp) - getHotseatLayoutPadding(context).left: 668.0px (334.0dp) - getHotseatLayoutPadding(context).right: 668.0px (334.0dp) + getHotseatLayoutPadding(context).left: 300.0px (150.0dp) + getHotseatLayoutPadding(context).right: 300.0px (150.0dp) numShownHotseatIcons: 6 - hotseatBorderSpace: 100.0px (50.0dp) + hotseatBorderSpace: 248.0px (124.0dp) isQsbInline: false - hotseatQsbWidth: 1214.0px (607.0dp) + hotseatQsbWidth: 1950.0px (975.0dp) isTaskbarPresent:false isTaskbarPresentInApps:true taskbarHeight: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt index 169256d192..611da6c60d 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 32.0px (16.0dp) allAppsLeftRightMargin: 412.0px (206.0dp) hotseatBarSizePx: 200.0px (100.0dp) - inv.hotseatColumnSpan: 4 + mHotseatColumnSpan: 6 + mHotseatWidthPx: 1960.0px (980.0dp) hotseatCellHeightPx: 135.0px (67.5dp) hotseatBarBottomSpacePx: 80.0px (40.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) @@ -82,12 +83,12 @@ DeviceProfile: springLoadedHotseatBarTopMarginPx: 128.0px (64.0dp) getHotseatLayoutPadding(context).top: 0.0px (0.0dp) getHotseatLayoutPadding(context).bottom: 65.0px (32.5dp) - getHotseatLayoutPadding(context).left: 668.0px (334.0dp) - getHotseatLayoutPadding(context).right: 668.0px (334.0dp) + getHotseatLayoutPadding(context).left: 300.0px (150.0dp) + getHotseatLayoutPadding(context).right: 300.0px (150.0dp) numShownHotseatIcons: 6 - hotseatBorderSpace: 100.0px (50.0dp) + hotseatBorderSpace: 248.0px (124.0dp) isQsbInline: false - hotseatQsbWidth: 1214.0px (607.0dp) + hotseatQsbWidth: 1950.0px (975.0dp) isTaskbarPresent:false isTaskbarPresentInApps:true taskbarHeight: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt index 59da1beaa5..1354be40c6 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 32.0px (16.0dp) allAppsLeftRightMargin: 152.0px (76.0dp) hotseatBarSizePx: 272.0px (136.0dp) - inv.hotseatColumnSpan: 6 + mHotseatColumnSpan: 6 + mHotseatWidthPx: 1300.0px (650.0dp) hotseatCellHeightPx: 135.0px (67.5dp) hotseatBarBottomSpacePx: 152.0px (76.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt index ad1f095363..b448160276 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 32.0px (16.0dp) allAppsLeftRightMargin: 152.0px (76.0dp) hotseatBarSizePx: 272.0px (136.0dp) - inv.hotseatColumnSpan: 6 + mHotseatColumnSpan: 6 + mHotseatWidthPx: 1300.0px (650.0dp) hotseatCellHeightPx: 135.0px (67.5dp) hotseatBarBottomSpacePx: 152.0px (76.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt index 61d5ee605b..f111c8dae6 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 42.0px (16.0dp) allAppsLeftRightMargin: 183.0px (69.71429dp) hotseatBarSizePx: 267.0px (101.71429dp) - inv.hotseatColumnSpan: 4 + mHotseatColumnSpan: 4 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 159.0px (60.57143dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt index ac73e2fd2d..4ccb4f3e57 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 42.0px (16.0dp) allAppsLeftRightMargin: 183.0px (69.71429dp) hotseatBarSizePx: 267.0px (101.71429dp) - inv.hotseatColumnSpan: 4 + mHotseatColumnSpan: 4 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 159.0px (60.57143dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt index 3169f41b22..87798da9bd 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 42.0px (16.0dp) allAppsLeftRightMargin: 1.0px (0.3809524dp) hotseatBarSizePx: 267.0px (101.71429dp) - inv.hotseatColumnSpan: 4 + mHotseatColumnSpan: 4 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 159.0px (60.57143dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt index 9d3d7bc0d6..ae52f0602b 100644 --- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt +++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt @@ -71,7 +71,8 @@ DeviceProfile: allAppsPadding.right: 42.0px (16.0dp) allAppsLeftRightMargin: 1.0px (0.3809524dp) hotseatBarSizePx: 267.0px (101.71429dp) - inv.hotseatColumnSpan: 4 + mHotseatColumnSpan: 4 + mHotseatWidthPx: 0.0px (0.0dp) hotseatCellHeightPx: 159.0px (60.57143dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) diff --git a/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt b/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt index 251a4016e3..13d749931a 100644 --- a/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt +++ b/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt @@ -157,7 +157,6 @@ abstract class FakeInvariantDeviceProfileTest { numDatabaseHotseatIcons = 4 - hotseatColumnSpan = IntArray(4) { 4 } hotseatBarBottomSpace = FloatArray(4) { 48f } hotseatQsbSpace = FloatArray(4) { 36f } @@ -240,7 +239,6 @@ abstract class FakeInvariantDeviceProfileTest { numDatabaseHotseatIcons = 6 - hotseatColumnSpan = intArrayOf(6, 4, 6, 6) hotseatBarBottomSpace = floatArrayOf(36f, 40f, 36f, 36f) hotseatQsbSpace = FloatArray(4) { 32f } @@ -259,8 +257,10 @@ abstract class FakeInvariantDeviceProfileTest { } protected fun initializeVarsForTwoPanel( - isLandscape: Boolean = false, - isGestureMode: Boolean = true + isLandscape: Boolean = false, + isGestureMode: Boolean = true, + rows: Int = 4, + cols: Int = 4, ) { val (x, y) = if (isLandscape) Pair(2208, 1840) else Pair(1840, 2208) @@ -276,9 +276,9 @@ abstract class FakeInvariantDeviceProfileTest { inv = InvariantDeviceProfile().apply { - numRows = 4 - numColumns = 4 - numSearchContainerColumns = 4 + numRows = rows + numColumns = cols + numSearchContainerColumns = cols iconSize = floatArrayOf(60f, 52f, 52f, 60f) iconTextSize = floatArrayOf(14f, 14f, 12f, 14f) @@ -319,7 +319,6 @@ abstract class FakeInvariantDeviceProfileTest { numDatabaseHotseatIcons = 6 - hotseatColumnSpan = IntArray(4) { 6 } hotseatBarBottomSpace = floatArrayOf(48f, 48f, 36f, 20f) hotseatQsbSpace = floatArrayOf(36f, 36f, 36f, 28f) diff --git a/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt b/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt index 9912a34a08..408691cb79 100644 --- a/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt +++ b/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt @@ -42,6 +42,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { assertThat(dp.hotseatBarEndOffset).isEqualTo(0) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(145) + assertThat(dp.hotseatColumnSpan).isEqualTo(6) + assertThat(dp.hotseatWidthPx).isEqualTo(1445) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(177) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(177) @@ -64,6 +66,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { assertThat(dp.hotseatBarEndOffset).isEqualTo(0) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(72) + assertThat(dp.hotseatColumnSpan).isEqualTo(6) + assertThat(dp.hotseatWidthPx).isEqualTo(1080) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(110) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(110) @@ -85,6 +89,8 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { assertThat(dp.hotseatBarEndOffset).isEqualTo(0) assertThat(dp.numShownHotseatIcons).isEqualTo(6) assertThat(dp.hotseatBorderSpace).isEqualTo(104) + assertThat(dp.hotseatColumnSpan).isEqualTo(6) + assertThat(dp.hotseatWidthPx).isEqualTo(1468) assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(370) assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(370) @@ -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(0) assertThat(dp.numShownHotseatIcons).isEqualTo(6) - assertThat(dp.hotseatBorderSpace).isEqualTo(100) + assertThat(dp.hotseatBorderSpace).isEqualTo(248) + assertThat(dp.hotseatColumnSpan).isEqualTo(6) + assertThat(dp.hotseatWidthPx).isEqualTo(1960) - assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(668) - assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(668) + assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(300) + assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(300) assertThat(dp.isQsbInline).isFalse() - assertThat(dp.hotseatQsbWidth).isEqualTo(1214) + assertThat(dp.hotseatQsbWidth).isEqualTo(1950) } /** 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(0) assertThat(dp.numShownHotseatIcons).isEqualTo(6) - assertThat(dp.hotseatBorderSpace).isEqualTo(91) + assertThat(dp.hotseatBorderSpace).isEqualTo(233) + assertThat(dp.hotseatColumnSpan).isEqualTo(6) + assertThat(dp.hotseatWidthPx).isEqualTo(1885) - assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(640) - assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(640) + assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(287) + assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(287) assertThat(dp.isQsbInline).isFalse() - assertThat(dp.hotseatQsbWidth).isEqualTo(1169) + assertThat(dp.hotseatQsbWidth).isEqualTo(1875) } /** @@ -150,13 +157,15 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { assertThat(dp.hotseatBarEndOffset).isEqualTo(0) assertThat(dp.numShownHotseatIcons).isEqualTo(6) - assertThat(dp.hotseatBorderSpace).isEqualTo(75) + assertThat(dp.hotseatBorderSpace).isEqualTo(205) + assertThat(dp.hotseatColumnSpan).isEqualTo(6) + assertThat(dp.hotseatWidthPx).isEqualTo(1745) - assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(582) - assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(582) + assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(257) + assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(257) assertThat(dp.isQsbInline).isFalse() - assertThat(dp.hotseatQsbWidth).isEqualTo(1085) + assertThat(dp.hotseatQsbWidth).isEqualTo(1735) } @Test @@ -179,4 +188,23 @@ class HotseatWidthCalculationTest : FakeInvariantDeviceProfileTest() { assertThat(dp.hotseatQsbWidth).isEqualTo(1435) } } + + @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(0) + assertThat(dp.numShownHotseatIcons).isEqualTo(6) + assertThat(dp.hotseatBorderSpace).isEqualTo(112) + assertThat(dp.hotseatColumnSpan).isEqualTo(8) + assertThat(dp.hotseatWidthPx).isEqualTo(1383) + + assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(228) + assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(228) + + assertThat(dp.isQsbInline).isFalse() + assertThat(dp.hotseatQsbWidth).isEqualTo(1372) + } }