diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 23a03341d3..db7dc78f7b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -298,9 +298,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar isRtl ? -halfQsbIconWidthDiff : halfQsbIconWidthDiff, hotseatIconCenter - childCenter, LINEAR); - int qsbContentHeight = child.getHeight() - child.getPaddingTop() - - child.getPaddingBottom(); - float scale = ((float) taskbarDp.iconSizePx) / qsbContentHeight; + float scale = ((float) taskbarDp.iconSizePx) / launcherDp.hotseatQsbVisualHeight; setter.addFloat(child, SCALE_PROPERTY, scale, 1f, LINEAR); setter.addFloat(child, VIEW_ALPHA, 0f, 1f, diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt index 368dc2ac0c..20b5a64e50 100644 --- a/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt +++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt @@ -48,8 +48,8 @@ class DeviceProfileQuickstepTest : DeviceProfileBaseTest() { val dp = newDP() - assertThat(dp.cellLayoutWidth).isEqualTo(1235) - assertThat(dp.cellLayoutHeight).isEqualTo(1235) + assertThat(dp.cellLayoutWidth).isEqualTo(1237) + assertThat(dp.cellLayoutHeight).isEqualTo(1215) } @Test @@ -67,8 +67,8 @@ class DeviceProfileQuickstepTest : DeviceProfileBaseTest() { val dp = newDP() - assertThat(dp.getCellSize().y).isEqualTo(264) - assertThat(dp.getCellSize().x).isEqualTo(258) + assertThat(dp.getCellSize().y).isEqualTo(260) + assertThat(dp.getCellSize().x).isEqualTo(259) } @Test @@ -117,6 +117,6 @@ class DeviceProfileQuickstepTest : DeviceProfileBaseTest() { assertThat(dp.isVerticalBarLayout).isEqualTo(false) assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(364) - assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2199) + assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2185) } } \ No newline at end of file diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 9f25905514..af8d8eb86a 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -329,6 +329,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/res/values/config.xml b/res/values/config.xml index 9aa1f03734..3f94c34ad8 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -130,6 +130,11 @@ + + + 48 + 0 + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 39f0a2bc00..5e33de8012 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -32,10 +32,7 @@ 8dp - 8dp - 2dp 0dp - 0dp 76dp @@ -44,13 +41,10 @@ it is close to the bottom of the screen --> 0.325 - - 0dp - 34dp 0dp - 42dp + 8dp 24dp @@ -364,6 +358,7 @@ 0dp 0dp 0dp + 0dp 44dp 8dp diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml index 08025528ce..5ee291b08e 100644 --- a/res/xml/device_profiles.xml +++ b/res/xml/device_profiles.xml @@ -199,6 +199,8 @@ launcher:allAppsBorderSpaceLandscape="16" launcher:hotseatBorderSpace="58" launcher:hotseatBorderSpaceLandscape="50.4" + launcher:hotseatBarBottomSpace="76" + launcher:hotseatBarBottomSpaceLandscape="40" launcher:canBeDefault="true" /> diff --git a/res/xml/paddings_6x5.xml b/res/xml/paddings_6x5.xml index a72f55412c..2f421b78e3 100644 --- a/res/xml/paddings_6x5.xml +++ b/res/xml/paddings_6x5.xml @@ -17,60 +17,29 @@ - + launcher:maxEmptySpace="100dp"> - - - - - - - - - - - - + launcher:b="0"/> + launcher:a="0.48" + launcher:b="0"/> + launcher:a="0.52" + launcher:b="0"/> + launcher:b="0"/> \ No newline at end of file diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 60af347585..1bc269d9c3 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -115,7 +115,6 @@ public class DeviceProfile { private final int extraSpace; public int workspaceTopPadding; public int workspaceBottomPadding; - public int extraHotseatBottomPadding; // Workspace page indicator public final int workspacePageIndicatorHeight; @@ -157,24 +156,22 @@ public class DeviceProfile { public int folderChildDrawablePaddingPx; // Hotseat - public int hotseatBarSizeExtraSpacePx; public final int numShownHotseatIcons; public int hotseatCellHeightPx; - private final int hotseatExtraVerticalSize; private final boolean areNavButtonsInline; // In portrait: size = height, in landscape: size = width public int hotseatBarSizePx; - public int hotseatBarTopPaddingPx; - public final int hotseatBarBottomPaddingPx; + public int hotseatBarBottomSpacePx; + public int hotseatQsbSpace; public int springLoadedHotseatBarTopMarginPx; // Start is the side next to the nav bar, end is the side next to the workspace public final int hotseatBarSidePaddingStartPx; public final int hotseatBarSidePaddingEndPx; public final int hotseatQsbHeight; + public final int hotseatQsbVisualHeight; + private final int hotseatQsbShadowHeight; public int hotseatBorderSpace; - public final float qsbBottomMarginOriginalPx; - public int qsbBottomMarginPx; public int qsbWidth; // only used when isQsbInline // All apps @@ -222,7 +219,7 @@ public class DeviceProfile { // Insets private final Rect mInsets = new Rect(); public final Rect workspacePadding = new Rect(); - private final Rect mHotseatPadding = new Rect(); + private final Rect mHotseatBarPadding = new Rect(); // When true, nav bar is on the left side of the screen. private boolean mIsSeascape; @@ -275,7 +272,7 @@ public class DeviceProfile { widthPx = windowBounds.bounds.width(); heightPx = windowBounds.bounds.height(); availableWidthPx = windowBounds.availableSize.x; - availableHeightPx = windowBounds.availableSize.y; + availableHeightPx = windowBounds.availableSize.y; aspectRatio = ((float) Math.max(widthPx, heightPx)) / Math.min(widthPx, heightPx); boolean isTallDevice = Float.compare(aspectRatio, TALL_DEVICE_ASPECT_RATIO_THRESHOLD) >= 0; @@ -360,6 +357,9 @@ public class DeviceProfile { workspaceCellPaddingXPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_padding_x); hotseatQsbHeight = res.getDimensionPixelSize(R.dimen.qsb_widget_height); + hotseatQsbShadowHeight = res.getDimensionPixelSize(R.dimen.qsb_shadow_height); + hotseatQsbVisualHeight = hotseatQsbHeight - 2 * hotseatQsbShadowHeight; + // Whether QSB might be inline in appropriate orientation (e.g. landscape). boolean canQsbInline = (isTwoPanels ? inv.inlineQsb[INDEX_TWO_PANEL_PORTRAIT] || inv.inlineQsb[INDEX_TWO_PANEL_LANDSCAPE] @@ -379,17 +379,28 @@ public class DeviceProfile { numShownAllAppsColumns = isTwoPanels ? inv.numDatabaseAllAppsColumns : inv.numAllAppsColumns; - hotseatBarSizeExtraSpacePx = 0; - hotseatBarTopPaddingPx = - res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding); - if (isQsbInline) { - hotseatBarBottomPaddingPx = res.getDimensionPixelSize(R.dimen.inline_qsb_bottom_margin); + + int hotseatBarBottomSpace = pxFromDp(inv.hotseatBarBottomSpace[mTypeIndex], mMetrics); + int minQsbMargin = res.getDimensionPixelSize(R.dimen.min_qsb_margin); + hotseatQsbSpace = pxFromDp(inv.hotseatQsbSpace[mTypeIndex], mMetrics); + // Have a little space between the inset and the QSB + if (mInsets.bottom + minQsbMargin > hotseatBarBottomSpace) { + int availableSpace = hotseatQsbSpace - (mInsets.bottom - hotseatBarBottomSpace); + + // Only change the spaces if there is space + if (availableSpace > 0) { + // Make sure there is enough space between hotseat/QSB and QSB/navBar + if (availableSpace < minQsbMargin * 2) { + minQsbMargin = availableSpace / 2; + hotseatQsbSpace = minQsbMargin; + } else { + hotseatQsbSpace -= minQsbMargin; + } + } + hotseatBarBottomSpacePx = mInsets.bottom + minQsbMargin; + } else { - hotseatBarBottomPaddingPx = (isTallDevice ? res.getDimensionPixelSize( - R.dimen.dynamic_grid_hotseat_bottom_tall_padding) - : res.getDimensionPixelSize( - R.dimen.dynamic_grid_hotseat_bottom_non_tall_padding)) - + res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_padding); + hotseatBarBottomSpacePx = hotseatBarBottomSpace; } springLoadedHotseatBarTopMarginPx = res.getDimensionPixelSize( @@ -398,13 +409,7 @@ public class DeviceProfile { res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding); // Add a bit of space between nav bar and hotseat in vertical bar layout. hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0; - hotseatExtraVerticalSize = - res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_extra_vertical_size); - updateHotseatIconSize(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics)); - - qsbBottomMarginOriginalPx = isScalableGrid - ? res.getDimensionPixelSize(R.dimen.scalable_grid_qsb_bottom_margin) - : 0; + updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics)); overviewTaskMarginPx = res.getDimensionPixelSize(R.dimen.overview_task_margin); overviewTaskMarginGridPx = res.getDimensionPixelSize(R.dimen.overview_task_margin_grid); @@ -443,42 +448,6 @@ public class DeviceProfile { workspaceTopPadding = Math.round(paddingWorkspaceTop * cellScaleToFit); workspaceBottomPadding = Math.round(paddingWorkspaceBottom * cellScaleToFit); - extraHotseatBottomPadding = Math.round(paddingHotseatBottom * cellScaleToFit); - - hotseatBarSizePx += extraHotseatBottomPadding; - - qsbBottomMarginPx = Math.round(qsbBottomMarginOriginalPx * cellScaleToFit); - } else if (!isVerticalBarLayout() && isPhone && isTallDevice) { - // We increase the hotseat size when there is extra space. - - if (Float.compare(aspectRatio, TALLER_DEVICE_ASPECT_RATIO_THRESHOLD) >= 0 - && extraSpace >= Utilities.dpToPx(TALL_DEVICE_EXTRA_SPACE_THRESHOLD_DP)) { - // For taller devices, we will take a piece of the extra space from each row, - // and add it to the space above and below the hotseat. - - // For devices with more extra space, we take a larger piece from each cell. - int piece = extraSpace < Utilities.dpToPx(TALL_DEVICE_MORE_EXTRA_SPACE_THRESHOLD_DP) - ? 7 : 5; - - int extraSpace = ((getCellSize().y - iconSizePx - iconDrawablePaddingPx * 2) - * inv.numRows) / piece; - - workspaceTopPadding = extraSpace / 8; - int halfLeftOver = (extraSpace - workspaceTopPadding) / 2; - hotseatBarTopPaddingPx += halfLeftOver; - hotseatBarSizeExtraSpacePx = halfLeftOver; - } else { - // ie. For a display with a large aspect ratio, we can keep the icons on the - // workspace in portrait mode closer together by adding more height to the hotseat. - // Note: This calculation was created after noticing a pattern in the design spec. - hotseatBarSizeExtraSpacePx = getCellSize().y - iconSizePx - - iconDrawablePaddingPx * 2 - workspacePageIndicatorHeight; - } - - updateHotseatIconSize(iconSizePx); - - // Recalculate the available dimensions using the new hotseat size. - updateAvailableDimensions(res); } int cellLayoutPadding = @@ -534,22 +503,27 @@ public class DeviceProfile { : res.getDimensionPixelSize(R.dimen.dynamic_grid_left_right_margin); } - private void updateHotseatIconSize(int hotseatIconSizePx) { + /** Updates hotseatCellHeightPx and hotseatBarSizePx */ + private void updateHotseatSizes(int hotseatIconSizePx) { // Ensure there is enough space for folder icons, which have a slightly larger radius. hotseatCellHeightPx = (int) Math.ceil(hotseatIconSizePx * ICON_OVERLAP_FACTOR); + if (isVerticalBarLayout()) { hotseatBarSizePx = hotseatIconSizePx + hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx; + } else if (isQsbInline) { + hotseatBarSizePx = Math.max(hotseatIconSizePx, hotseatQsbVisualHeight) + + hotseatBarBottomSpacePx; } else { - hotseatBarSizePx = hotseatIconSizePx + hotseatBarTopPaddingPx - + hotseatBarBottomPaddingPx + (isScalableGrid ? 0 : hotseatExtraVerticalSize) - + hotseatBarSizeExtraSpacePx; + hotseatBarSizePx = hotseatIconSizePx + + hotseatQsbSpace + + hotseatQsbVisualHeight + + hotseatBarBottomSpacePx; } } private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp) { return getCellLayoutBorderSpace(idp, 1f); - } private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp, float scale) { @@ -761,7 +735,7 @@ public class DeviceProfile { // All apps updateAllAppsIconSize(scale, res); - updateHotseatIconSize(iconSizePx); + updateHotseatSizes(iconSizePx); // Folder icon folderIconSizePx = IconNormalizer.getNormalizedCircleSize(iconSizePx); @@ -932,10 +906,10 @@ public class DeviceProfile { */ private int getVerticalHotseatLastItemBottomOffset() { int cellHeight = calculateCellHeight( - heightPx - mHotseatPadding.top - mHotseatPadding.bottom, hotseatBorderSpace, + heightPx - mHotseatBarPadding.top - mHotseatBarPadding.bottom, hotseatBorderSpace, numShownHotseatIcons); int extraIconEndSpacing = (cellHeight - iconSizePx) / 2; - return extraIconEndSpacing + mHotseatPadding.bottom; + return extraIconEndSpacing + mHotseatBarPadding.bottom; } /** @@ -1017,10 +991,11 @@ public class DeviceProfile { padding.right = hotseatBarSizePx; } } else { - // Pad the bottom of the workspace with search/hotseat bar sizes - int hotseatTop = hotseatBarSizePx; - int paddingBottom = hotseatTop + workspacePageIndicatorHeight - + workspaceBottomPadding - mWorkspacePageIndicatorOverlapWorkspace; + // Pad the bottom of the workspace with hotseat bar + // and leave a bit of space in case a widget go all the way down + int paddingBottom = hotseatBarSizePx + workspaceBottomPadding + + workspacePageIndicatorHeight - mWorkspacePageIndicatorOverlapWorkspace + - mInsets.bottom; int paddingTop = workspaceTopPadding + (isScalableGrid ? 0 : edgeMarginPx); int paddingSide = desiredWorkspaceHorizontalMarginPx; @@ -1060,17 +1035,17 @@ public class DeviceProfile { + diffOverlapFactor), 0); if (isSeascape()) { - mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop, + mHotseatBarPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop, hotseatBarSidePaddingEndPx, paddingBottom); } else { - mHotseatPadding.set(hotseatBarSidePaddingEndPx, paddingTop, + mHotseatBarPadding.set(hotseatBarSidePaddingEndPx, paddingTop, mInsets.right + hotseatBarSidePaddingStartPx, paddingBottom); } } else if (isTaskbarPresent) { // Center the QSB vertically with hotseat - int hotseatBottomPadding = getHotseatBottomPadding(); - int hotseatTopPadding = - workspacePadding.bottom - hotseatBottomPadding - hotseatCellHeightPx; + int hotseatBarBottomPadding = getHotseatBarBottomPadding(); + int hotseatBarTopPadding = + hotseatBarSizePx - hotseatBarBottomPadding - hotseatCellHeightPx; // Push icons to the side int additionalQsbSpace = isQsbInline ? qsbWidth + hotseatBorderSpace : 0; @@ -1081,29 +1056,29 @@ public class DeviceProfile { int hotseatWidth = Math.min(requiredWidth, availableWidthPx - endOffset); int sideSpacing = (availableWidthPx - hotseatWidth) / 2; - mHotseatPadding.set(sideSpacing, hotseatTopPadding, sideSpacing, hotseatBottomPadding); + mHotseatBarPadding.set(sideSpacing, hotseatBarTopPadding, sideSpacing, + hotseatBarBottomPadding); boolean isRtl = Utilities.isRtl(context.getResources()); if (isRtl) { - mHotseatPadding.right += additionalQsbSpace; + mHotseatBarPadding.right += additionalQsbSpace; } else { - mHotseatPadding.left += additionalQsbSpace; + mHotseatBarPadding.left += additionalQsbSpace; } if (endOffset > sideSpacing) { int diff = isRtl ? sideSpacing - endOffset : endOffset - sideSpacing; - mHotseatPadding.left -= diff; - mHotseatPadding.right += diff; + mHotseatBarPadding.left -= diff; + mHotseatBarPadding.right += diff; } } else if (isScalableGrid) { int sideSpacing = (availableWidthPx - qsbWidth) / 2; - mHotseatPadding.set(sideSpacing, - hotseatBarTopPaddingPx, + mHotseatBarPadding.set(sideSpacing, + 0, sideSpacing, - hotseatBarSizePx - hotseatCellHeightPx - hotseatBarTopPaddingPx - + mInsets.bottom); + getHotseatBarBottomPadding()); } else { // We want the edges of the hotseat to line up with the edges of the workspace, but the // icons in the hotseat are a different size, and so don't line up perfectly. To account @@ -1112,14 +1087,15 @@ public class DeviceProfile { float workspaceCellWidth = (float) widthPx / inv.numColumns; float hotseatCellWidth = (float) widthPx / numShownHotseatIcons; int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2); - mHotseatPadding.set(hotseatAdjustment + workspacePadding.left + cellLayoutPaddingPx.left - + mInsets.left, hotseatBarTopPaddingPx, + mHotseatBarPadding.set( + hotseatAdjustment + workspacePadding.left + cellLayoutPaddingPx.left + + mInsets.left, + 0, hotseatAdjustment + workspacePadding.right + cellLayoutPaddingPx.right + mInsets.right, - hotseatBarSizePx - hotseatCellHeightPx - hotseatBarTopPaddingPx - + mInsets.bottom); + getHotseatBarBottomPadding()); } - return mHotseatPadding; + return mHotseatBarPadding; } /** @@ -1127,27 +1103,22 @@ public class DeviceProfile { */ public int getQsbOffsetY() { if (isQsbInline) { - return hotseatBarBottomPaddingPx; - } - - int freeSpace = isTaskbarPresent - ? workspacePadding.bottom - : hotseatBarSizePx - hotseatCellHeightPx - hotseatQsbHeight; - - if (isScalableGrid && qsbBottomMarginPx > mInsets.bottom) { - // Note that taskbarSize = 0 unless isTaskbarPresent. - return Math.min(qsbBottomMarginPx + taskbarSize, freeSpace); + return getHotseatBarBottomPadding() - ((hotseatQsbHeight - hotseatCellHeightPx) / 2); + } else if (isTaskbarPresent) { // QSB on top + return hotseatBarSizePx - hotseatQsbHeight + hotseatQsbShadowHeight; } else { - return (int) (freeSpace * mQsbCenterFactor) - + (isTaskbarPresent ? taskbarSize : mInsets.bottom); + return hotseatBarBottomSpacePx - hotseatQsbShadowHeight; } } - private int getHotseatBottomPadding() { - if (isQsbInline) { - return getQsbOffsetY() + ((hotseatQsbHeight - hotseatCellHeightPx) / 2); + /** + * Returns the number of pixels the hotseat is translated from the bottom of the screen. + */ + private int getHotseatBarBottomPadding() { + if (isTaskbarPresent) { // QSB on top or inline + return hotseatBarBottomSpacePx - (Math.abs(hotseatCellHeightPx - iconSizePx) / 2); } else { - return (getQsbOffsetY() - taskbarSize) / 2; + return hotseatBarSizePx - hotseatCellHeightPx; } } @@ -1158,7 +1129,7 @@ public class DeviceProfile { int taskbarIconBottomSpace = (taskbarSize - iconSizePx) / 2; int launcherIconBottomSpace = Math.min((hotseatCellHeightPx - iconSizePx) / 2, gridVisualizationPaddingY); - return getHotseatBottomPadding() + launcherIconBottomSpace - taskbarIconBottomSpace; + return getHotseatBarBottomPadding() + launcherIconBottomSpace - taskbarIconBottomSpace; } /** @@ -1167,7 +1138,7 @@ public class DeviceProfile { public int getOverviewActionsClaimedSpaceBelow() { if (isTaskbarPresent && !isGestureMode) { // Align vertically to where nav buttons are. - return ((taskbarSize - overviewActionsHeight) / 2) + getTaskbarOffsetY(); + return ((taskbarSize - overviewActionsHeight) / 2) + getTaskbarOffsetY(); } return isTaskbarPresent ? stashedTaskbarSize : mInsets.bottom; @@ -1349,18 +1320,19 @@ public class DeviceProfile { writer.println(prefix + pxToDpStr("hotseatBarSizePx", hotseatBarSizePx)); writer.println(prefix + "\tinv.hotseatColumnSpan: " + inv.hotseatColumnSpan[mTypeIndex]); writer.println(prefix + pxToDpStr("hotseatCellHeightPx", hotseatCellHeightPx)); - writer.println(prefix + pxToDpStr("hotseatBarTopPaddingPx", hotseatBarTopPaddingPx)); - writer.println(prefix + pxToDpStr("hotseatBarBottomPaddingPx", hotseatBarBottomPaddingPx)); + writer.println(prefix + pxToDpStr("hotseatBarBottomPaddingPx", hotseatBarBottomSpacePx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingStartPx", hotseatBarSidePaddingStartPx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx", hotseatBarSidePaddingEndPx)); + writer.println(prefix + pxToDpStr("hotseatQsbSpace", hotseatQsbSpace)); + writer.println(prefix + pxToDpStr("hotseatQsbHeight", hotseatQsbHeight)); writer.println(prefix + pxToDpStr("springLoadedHotseatBarTopMarginPx", springLoadedHotseatBarTopMarginPx)); - writer.println(prefix + pxToDpStr("mHotseatPadding.top", mHotseatPadding.top)); - writer.println(prefix + pxToDpStr("mHotseatPadding.bottom", mHotseatPadding.bottom)); - writer.println(prefix + pxToDpStr("mHotseatPadding.left", mHotseatPadding.left)); - writer.println(prefix + pxToDpStr("mHotseatPadding.right", mHotseatPadding.right)); + writer.println(prefix + pxToDpStr("mHotseatBarPadding.top", mHotseatBarPadding.top)); + writer.println(prefix + pxToDpStr("mHotseatBarPadding.bottom", mHotseatBarPadding.bottom)); + writer.println(prefix + pxToDpStr("mHotseatBarPadding.left", mHotseatBarPadding.left)); + writer.println(prefix + pxToDpStr("mHotseatBarPadding.right", mHotseatBarPadding.right)); writer.println(prefix + "\tnumShownHotseatIcons: " + numShownHotseatIcons); writer.println(prefix + pxToDpStr("hotseatBorderSpace", hotseatBorderSpace)); writer.println(prefix + "\tisQsbInline: " + isQsbInline); @@ -1389,7 +1361,6 @@ public class DeviceProfile { } writer.println(prefix + pxToDpStr("workspaceTopPadding", workspaceTopPadding)); writer.println(prefix + pxToDpStr("workspaceBottomPadding", workspaceBottomPadding)); - writer.println(prefix + pxToDpStr("extraHotseatBottomPadding", extraHotseatBottomPadding)); writer.println(prefix + pxToDpStr("overviewTaskMarginPx", overviewTaskMarginPx)); writer.println(prefix + pxToDpStr("overviewTaskMarginGridPx", overviewTaskMarginGridPx)); @@ -1425,6 +1396,8 @@ public class DeviceProfile { workspaceSpringLoadedMinNextPageVisiblePx)); writer.println( prefix + pxToDpStr("getWorkspaceSpringLoadScale()", getWorkspaceSpringLoadScale())); + writer.println(prefix + pxToDpStr("getCellLayoutHeight()", getCellLayoutHeight())); + writer.println(prefix + pxToDpStr("getCellLayoutWidth()", getCellLayoutWidth())); } private static Context getContext(Context c, Info info, int orientation, WindowBounds bounds) { diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 8c4c66277c..05ed3198cb 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -111,9 +111,7 @@ public class Hotseat extends CellLayout implements Insettable { mQsb.setVisibility(View.VISIBLE); lp.gravity = Gravity.BOTTOM; lp.width = ViewGroup.LayoutParams.MATCH_PARENT; - lp.height = grid.isTaskbarPresent - ? grid.workspacePadding.bottom - : grid.hotseatBarSizePx + insets.bottom; + lp.height = grid.hotseatBarSizePx; } Rect padding = grid.getHotseatLayoutPadding(getContext()); diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index dacbe9254a..2085b84ac5 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -46,6 +46,7 @@ import android.view.Display; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import androidx.core.content.res.ResourcesCompat; import com.android.launcher3.model.DeviceGridState; import com.android.launcher3.provider.RestoreDbTask; @@ -77,7 +78,8 @@ public class InvariantDeviceProfile { @Retention(RetentionPolicy.SOURCE) @IntDef({TYPE_PHONE, TYPE_MULTI_DISPLAY, TYPE_TABLET}) - public @interface DeviceType{} + public @interface DeviceType {} + public static final int TYPE_PHONE = 0; public static final int TYPE_MULTI_DISPLAY = 1; public static final int TYPE_TABLET = 2; @@ -153,6 +155,8 @@ public class InvariantDeviceProfile { public int numDatabaseHotseatIcons; public int[] hotseatColumnSpan; + public float[] hotseatBarBottomSpace; + public float[] hotseatQsbSpace; /** * Number of columns in the all apps list. @@ -360,6 +364,8 @@ public class InvariantDeviceProfile { ? closestProfile.numDatabaseHotseatIcons : closestProfile.numHotseatIcons; hotseatColumnSpan = closestProfile.hotseatColumnSpan; hotseatBorderSpaces = displayOption.hotseatBorderSpaces; + hotseatBarBottomSpace = displayOption.hotseatBarBottomSpace; + hotseatQsbSpace = displayOption.hotseatQsbSpace; numAllAppsColumns = closestProfile.numAllAppsColumns; numDatabaseAllAppsColumns = deviceType == TYPE_MULTI_DISPLAY @@ -726,6 +732,7 @@ public class InvariantDeviceProfile { private final int numHotseatIcons; private final int numShrunkenHotseatIcons; private final int numDatabaseHotseatIcons; + private final int[] hotseatColumnSpan = new int[COUNT_SIZES]; private final String dbFile; @@ -766,6 +773,7 @@ public class InvariantDeviceProfile { R.styleable.GridDisplayOption_numShrunkenHotseatIcons, numHotseatIcons / 2); numDatabaseHotseatIcons = a.getInt( R.styleable.GridDisplayOption_numExtendedHotseatIcons, 2 * numHotseatIcons); + hotseatColumnSpan[INDEX_DEFAULT] = a.getInt( R.styleable.GridDisplayOption_hotseatColumnSpan, numColumns); hotseatColumnSpan[INDEX_LANDSCAPE] = a.getInt( @@ -825,6 +833,8 @@ public class InvariantDeviceProfile { private final float[] horizontalMargin = new float[COUNT_SIZES]; //TODO(http://b/228998082) remove this when 3 button spaces are fixed private final float[] hotseatBorderSpaces = new float[COUNT_SIZES]; + private final float[] hotseatBarBottomSpace = new float[COUNT_SIZES]; + private final float[] hotseatQsbSpace = new float[COUNT_SIZES]; private final float[] iconSizes = new float[COUNT_SIZES]; private final float[] textSizes = new float[COUNT_SIZES]; @@ -1050,6 +1060,34 @@ public class InvariantDeviceProfile { R.styleable.ProfileDisplayOption_hotseatBorderSpaceTwoPanelPortrait, hotseatBorderSpaces[INDEX_DEFAULT]); + hotseatBarBottomSpace[INDEX_DEFAULT] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatBarBottomSpace, + ResourcesCompat.getFloat(context.getResources(), + R.dimen.hotseat_bar_bottom_space_default)); + hotseatBarBottomSpace[INDEX_LANDSCAPE] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatBarBottomSpaceLandscape, + hotseatBarBottomSpace[INDEX_DEFAULT]); + hotseatBarBottomSpace[INDEX_TWO_PANEL_LANDSCAPE] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatBarBottomSpaceTwoPanelLandscape, + hotseatBarBottomSpace[INDEX_DEFAULT]); + hotseatBarBottomSpace[INDEX_TWO_PANEL_PORTRAIT] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatBarBottomSpaceTwoPanelPortrait, + hotseatBarBottomSpace[INDEX_DEFAULT]); + + hotseatQsbSpace[INDEX_DEFAULT] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatQsbSpace, + ResourcesCompat.getFloat(context.getResources(), + R.dimen.hotseat_qsb_space_default)); + hotseatQsbSpace[INDEX_LANDSCAPE] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatQsbSpaceLandscape, + hotseatQsbSpace[INDEX_DEFAULT]); + hotseatQsbSpace[INDEX_TWO_PANEL_LANDSCAPE] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatQsbSpaceTwoPanelLandscape, + hotseatQsbSpace[INDEX_DEFAULT]); + hotseatQsbSpace[INDEX_TWO_PANEL_PORTRAIT] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatQsbSpaceTwoPanelPortrait, + hotseatQsbSpace[INDEX_DEFAULT]); + a.recycle(); } @@ -1085,6 +1123,8 @@ public class InvariantDeviceProfile { minCellSize[i].y *= w; horizontalMargin[i] *= w; hotseatBorderSpaces[i] *= w; + hotseatBarBottomSpace[i] *= w; + hotseatQsbSpace[i] *= w; allAppsCellSize[i].x *= w; allAppsCellSize[i].y *= w; allAppsIconSizes[i] *= w; @@ -1108,6 +1148,8 @@ public class InvariantDeviceProfile { minCellSize[i].y += p.minCellSize[i].y; horizontalMargin[i] += p.horizontalMargin[i]; hotseatBorderSpaces[i] += p.hotseatBorderSpaces[i]; + hotseatBarBottomSpace[i] += p.hotseatBarBottomSpace[i]; + hotseatQsbSpace[i] += p.hotseatQsbSpace[i]; allAppsCellSize[i].x += p.allAppsCellSize[i].x; allAppsCellSize[i].y += p.allAppsCellSize[i].y; allAppsIconSizes[i] += p.allAppsIconSizes[i]; diff --git a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java index 1681ea5758..87ae890894 100644 --- a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java +++ b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java @@ -271,7 +271,7 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi } else { lp.leftMargin = lp.rightMargin = 0; lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom; + lp.bottomMargin = grid.hotseatBarSizePx; } setLayoutParams(lp); } diff --git a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt index 6a6c40f24a..0635d84ca5 100644 --- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt +++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt @@ -112,6 +112,8 @@ abstract class DeviceProfileBaseTest { ).toTypedArray() hotseatBorderSpaces = FloatArray(4) { 16f } hotseatColumnSpan = IntArray(4) { 4 } + hotseatBarBottomSpace = FloatArray(4) { 48f } + hotseatQsbSpace = FloatArray(4) { 36f } iconSize = FloatArray(4) { 56f } allAppsIconSize = FloatArray(4) { 56f } iconTextSize = FloatArray(4) { 14f }