Add new hotseat bottom margin options am: b8c0595d42
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/18605485 Change-Id: I9f981862969fb50dab551efdfaeebd7d4aa9ac95 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
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