Add new hotseat bottom margin options
This changes how the hotseat height is calculated and by consequence how spaces are distributed in the workspace as well. This is the first of a series of changes that will improve and streamline workspace calculations. Bug: 228998463 Fix: 234023782 Fix: 230191631 Fix: 232914299 Fix: 236238226 Test: manual, HSV and comparing to mocks Change-Id: If021e8ba2c7c24c0bf9f27a1aa7aa946792ed04f
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -329,6 +329,24 @@
|
||||
<!-- defaults to hotseatBorderSpace, if not specified -->
|
||||
<attr name="hotseatBorderSpaceTwoPanelPortrait" format="float" />
|
||||
|
||||
<!-- defaults to res.hotseat_bar_bottom_space_default, if not specified -->
|
||||
<attr name="hotseatBarBottomSpace" format="float" />
|
||||
<!-- defaults to hotseatBarBottomSpace, if not specified -->
|
||||
<attr name="hotseatBarBottomSpaceLandscape" format="float" />
|
||||
<!-- defaults to hotseatBarBottomSpace, if not specified -->
|
||||
<attr name="hotseatBarBottomSpaceTwoPanelLandscape" format="float" />
|
||||
<!-- defaults to hotseatBarBottomSpace, if not specified -->
|
||||
<attr name="hotseatBarBottomSpaceTwoPanelPortrait" format="float" />
|
||||
|
||||
<!-- defaults to res.hotseat_qsb_space_default, if not specified -->
|
||||
<attr name="hotseatQsbSpace" format="float" />
|
||||
<!-- defaults to hotseatQsbSpace, if not specified -->
|
||||
<attr name="hotseatQsbSpaceLandscape" format="float" />
|
||||
<!-- defaults to hotseatQsbSpace, if not specified -->
|
||||
<attr name="hotseatQsbSpaceTwoPanelLandscape" format="float" />
|
||||
<!-- defaults to hotseatQsbSpace, if not specified -->
|
||||
<attr name="hotseatQsbSpaceTwoPanelPortrait" format="float" />
|
||||
|
||||
<attr name="iconImageSize" format="float" />
|
||||
<!-- defaults to iconImageSize, if not specified -->
|
||||
<attr name="iconSizeLandscape" format="float" />
|
||||
|
||||
@@ -130,6 +130,11 @@
|
||||
<item type="id" name="search_container_all_apps" />
|
||||
<item type="id" name="search_container_hotseat" />
|
||||
|
||||
<!-- Scalable Grid configuration -->
|
||||
<!-- This is a float because it is converted to dp later in DeviceProfile -->
|
||||
<dimen name="hotseat_bar_bottom_space_default">48</dimen>
|
||||
<dimen name="hotseat_qsb_space_default">0</dimen>
|
||||
|
||||
<!-- Recents -->
|
||||
<item type="id" name="overview_panel"/>
|
||||
|
||||
|
||||
@@ -32,10 +32,7 @@
|
||||
<dimen name="dynamic_grid_cell_padding_x">8dp</dimen>
|
||||
|
||||
<!-- Hotseat -->
|
||||
<dimen name="dynamic_grid_hotseat_top_padding">8dp</dimen>
|
||||
<dimen name="dynamic_grid_hotseat_bottom_padding">2dp</dimen>
|
||||
<dimen name="dynamic_grid_hotseat_bottom_tall_padding">0dp</dimen>
|
||||
<dimen name="inline_qsb_bottom_margin">0dp</dimen>
|
||||
<dimen name="spring_loaded_hotseat_top_margin">76dp</dimen>
|
||||
|
||||
<!-- Qsb -->
|
||||
@@ -44,13 +41,10 @@
|
||||
it is close to the bottom of the screen -->
|
||||
<item name="qsb_center_factor" format="float" type="dimen">0.325</item>
|
||||
|
||||
<!-- Extra bottom padding for non-tall devices. -->
|
||||
<dimen name="dynamic_grid_hotseat_bottom_non_tall_padding">0dp</dimen>
|
||||
<dimen name="dynamic_grid_hotseat_extra_vertical_size">34dp</dimen>
|
||||
<dimen name="dynamic_grid_hotseat_side_padding">0dp</dimen>
|
||||
|
||||
<!-- Scalable Grid -->
|
||||
<dimen name="scalable_grid_qsb_bottom_margin">42dp</dimen>
|
||||
<dimen name="min_qsb_margin">8dp</dimen>
|
||||
|
||||
<!-- Workspace page indicator -->
|
||||
<dimen name="workspace_page_indicator_height">24dp</dimen>
|
||||
@@ -364,6 +358,7 @@
|
||||
<dimen name="taskbar_size">0dp</dimen>
|
||||
<dimen name="taskbar_stashed_size">0dp</dimen>
|
||||
<dimen name="qsb_widget_height">0dp</dimen>
|
||||
<dimen name="qsb_shadow_height">0dp</dimen>
|
||||
<dimen name="taskbar_icon_size">44dp</dimen>
|
||||
<!-- Note that this applies to both sides of all icons, so visible space is double this. -->
|
||||
<dimen name="taskbar_icon_spacing">8dp</dimen>
|
||||
|
||||
@@ -199,6 +199,8 @@
|
||||
launcher:allAppsBorderSpaceLandscape="16"
|
||||
launcher:hotseatBorderSpace="58"
|
||||
launcher:hotseatBorderSpaceLandscape="50.4"
|
||||
launcher:hotseatBarBottomSpace="76"
|
||||
launcher:hotseatBarBottomSpaceLandscape="40"
|
||||
launcher:canBeDefault="true" />
|
||||
|
||||
</grid-option>
|
||||
|
||||
@@ -17,60 +17,29 @@
|
||||
|
||||
<device-paddings xmlns:launcher="http://schemas.android.com/apk/res-auto" >
|
||||
|
||||
<!-- Some non default screen sizes -->
|
||||
<device-padding
|
||||
launcher:maxEmptySpace="30dp">
|
||||
launcher:maxEmptySpace="100dp">
|
||||
<workspaceTopPadding
|
||||
launcher:a="0.34"
|
||||
launcher:a="0.31"
|
||||
launcher:b="0"/>
|
||||
<workspaceBottomPadding
|
||||
launcher:a="0.26"
|
||||
launcher:a="0.69"
|
||||
launcher:b="0"/>
|
||||
<hotseatBottomPadding
|
||||
launcher:a="0.4"
|
||||
launcher:b="0"/>
|
||||
</device-padding>
|
||||
|
||||
<device-padding
|
||||
launcher:maxEmptySpace="170dp">
|
||||
<workspaceTopPadding
|
||||
launcher:a="0"
|
||||
launcher:b="20dp"/>
|
||||
<workspaceBottomPadding
|
||||
launcher:a="0.4"
|
||||
launcher:b="0"
|
||||
launcher:c="20dp"/>
|
||||
<hotseatBottomPadding
|
||||
launcher:a="0.6"
|
||||
launcher:b="0"
|
||||
launcher:c="20dp"/>
|
||||
</device-padding>
|
||||
|
||||
<device-padding
|
||||
launcher:maxEmptySpace="410dp">
|
||||
<workspaceTopPadding
|
||||
launcher:a="0"
|
||||
launcher:b="112dp"/>
|
||||
<workspaceBottomPadding
|
||||
launcher:a="0.4"
|
||||
launcher:b="0"
|
||||
launcher:c="112dp"/>
|
||||
<hotseatBottomPadding
|
||||
launcher:a="0.6"
|
||||
launcher:b="0"
|
||||
launcher:c="112dp"/>
|
||||
launcher:b="0"/>
|
||||
</device-padding>
|
||||
|
||||
<device-padding
|
||||
launcher:maxEmptySpace="9999dp">
|
||||
<workspaceTopPadding
|
||||
launcher:a="0.40"
|
||||
launcher:c="36dp"/>
|
||||
launcher:a="0.48"
|
||||
launcher:b="0"/>
|
||||
<workspaceBottomPadding
|
||||
launcher:a="0.60"
|
||||
launcher:c="36dp"/>
|
||||
launcher:a="0.52"
|
||||
launcher:b="0"/>
|
||||
<hotseatBottomPadding
|
||||
launcher:a="0"
|
||||
launcher:b="36dp"/>
|
||||
launcher:b="0"/>
|
||||
</device-padding>
|
||||
</device-paddings>
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user