Loading src/com/android/launcher3/DeviceProfile.java +56 −43 Original line number Diff line number Diff line Loading @@ -205,9 +205,11 @@ public class DeviceProfile { public int hotseatBarEndOffset; 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; // These 2 values are only used for isVerticalBar // Padding between edge of screen and hotseat public final int mHotseatBarEdgePaddingPx; // Space between hotseat and workspace (not used in responsive) public final int mHotseatBarWorkspaceSpacePx; public int hotseatQsbWidth; // only used when isQsbInline public final int hotseatQsbHeight; public final int hotseatQsbVisualHeight; Loading Loading @@ -497,19 +499,32 @@ public class DeviceProfile { numShownAllAppsColumns = isTwoPanels ? inv.numDatabaseAllAppsColumns : inv.numAllAppsColumns; int hotseatBarBottomSpace = pxFromDp(inv.hotseatBarBottomSpace[mTypeIndex], mMetrics); int hotseatBarBottomSpace; int minQsbMargin = res.getDimensionPixelSize(R.dimen.min_qsb_margin); if (mIsResponsiveGrid) { HotseatSpecs hotseatSpecs = HotseatSpecs.create(new ResourceHelper(context, isTwoPanels ? inv.hotseatSpecsTwoPanelId : inv.hotseatSpecsId)); mResponsiveHotseatSpec = hotseatSpecs.getCalculatedHeightSpec(heightPx); mResponsiveHotseatSpec = isVerticalBarLayout() ? hotseatSpecs.getCalculatedWidthSpec(widthPx) : hotseatSpecs.getCalculatedHeightSpec(heightPx); hotseatQsbSpace = mResponsiveHotseatSpec.getHotseatQsbSpace(); hotseatBarBottomSpace = isVerticalBarLayout() ? 0 : mResponsiveHotseatSpec.getEdgePadding(); mHotseatBarEdgePaddingPx = isVerticalBarLayout() ? mResponsiveHotseatSpec.getEdgePadding() : 0; mHotseatBarWorkspaceSpacePx = 0; } else { hotseatQsbSpace = pxFromDp(inv.hotseatQsbSpace[mTypeIndex], mMetrics); hotseatBarBottomSpace = pxFromDp(inv.hotseatBarBottomSpace[mTypeIndex], mMetrics); mHotseatBarEdgePaddingPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0; mHotseatBarWorkspaceSpacePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding); } if (!isVerticalBarLayout()) { // Have a little space between the inset and the QSB if (mInsets.bottom + minQsbMargin > hotseatBarBottomSpace) { int availableSpace = hotseatQsbSpace - (mInsets.bottom - hotseatBarBottomSpace); Loading @@ -529,14 +544,11 @@ public class DeviceProfile { } else { hotseatBarBottomSpacePx = hotseatBarBottomSpace; } } springLoadedHotseatBarTopMarginPx = res.getDimensionPixelSize( R.dimen.spring_loaded_hotseat_top_margin); hotseatBarSidePaddingEndPx = 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; updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics)); updateHotseatSizes(pxFromDp(inv.iconSize[mTypeIndex], mMetrics)); if (areNavButtonsInline && !isPhone) { inlineNavButtonsEndSpacingPx = res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing); Loading @@ -562,10 +574,9 @@ public class DeviceProfile { int availableResponsiveWidth = availableWidthPx - (isVerticalBarLayout() ? hotseatBarSizePx : 0); int numColumns = getPanelCount() * inv.numColumns; // don't use availableHeightPx because it subtracts bottom padding, // but the workspace go behind it int availableResponsiveHeight = heightPx - mInsets.top - (isVerticalBarLayout() ? 0 : hotseatBarSizePx); // don't use availableHeightPx because it subtracts mInsets.bottom int availableResponsiveHeight = heightPx - mInsets.top - (isVerticalBarLayout() ? 0 : hotseatBarSizePx); mResponsiveWidthSpec = workspaceSpecs.getCalculatedWidthSpec(numColumns, availableResponsiveWidth); mResponsiveHeightSpec = workspaceSpecs.getCalculatedHeightSpec(inv.numRows, Loading Loading @@ -738,8 +749,8 @@ public class DeviceProfile { hotseatCellHeightPx = getIconSizeWithOverlap(hotseatIconSizePx); if (isVerticalBarLayout()) { hotseatBarSizePx = hotseatIconSizePx + hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx; hotseatBarSizePx = hotseatIconSizePx + mHotseatBarEdgePaddingPx + mHotseatBarWorkspaceSpacePx; } else if (isQsbInline) { hotseatBarSizePx = Math.max(hotseatIconSizePx, hotseatQsbVisualHeight) + hotseatBarBottomSpacePx; Loading Loading @@ -1007,6 +1018,7 @@ public class DeviceProfile { iconSizePx = mIconSizeSteps.getIconSmallerThan(cellWidthPx); } // TODO(b/296400197): isVerticalBar shouldn't show labels anymore iconDrawablePaddingPx = getNormalizedIconDrawablePadding(); int iconTextHeight = Utilities.calculateTextHeight(iconTextSizePx); int cellContentHeight = iconSizePx + iconDrawablePaddingPx + iconTextHeight; Loading Loading @@ -1491,7 +1503,8 @@ public class DeviceProfile { if (isVerticalBarLayout()) { if (mIsResponsiveGrid) { padding.top = mResponsiveHeightSpec.getStartPaddingPx(); padding.bottom = mResponsiveHeightSpec.getEndPaddingPx(); padding.bottom = Math.max(0, mResponsiveHeightSpec.getEndPaddingPx() - mInsets.bottom); if (isSeascape()) { padding.left = hotseatBarSizePx + mResponsiveWidthSpec.getEndPaddingPx(); padding.right = mResponsiveWidthSpec.getStartPaddingPx(); Loading @@ -1504,9 +1517,9 @@ public class DeviceProfile { padding.bottom = edgeMarginPx; if (isSeascape()) { padding.left = hotseatBarSizePx; padding.right = hotseatBarSidePaddingStartPx; padding.right = mHotseatBarEdgePaddingPx; } else { padding.left = hotseatBarSidePaddingStartPx; padding.left = mHotseatBarEdgePaddingPx; padding.right = hotseatBarSizePx; } } Loading Loading @@ -1560,11 +1573,11 @@ public class DeviceProfile { + diffOverlapFactor), 0); if (isSeascape()) { hotseatBarPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop, hotseatBarSidePaddingEndPx, paddingBottom); hotseatBarPadding.set(mInsets.left + mHotseatBarEdgePaddingPx, paddingTop, mHotseatBarWorkspaceSpacePx, paddingBottom); } else { hotseatBarPadding.set(hotseatBarSidePaddingEndPx, paddingTop, mInsets.right + hotseatBarSidePaddingStartPx, paddingBottom); hotseatBarPadding.set(mHotseatBarWorkspaceSpacePx, paddingTop, mInsets.right + mHotseatBarEdgePaddingPx, paddingBottom); } } else if (isTaskbarPresent) { // Center the QSB vertically with hotseat Loading Loading @@ -1910,10 +1923,10 @@ public class DeviceProfile { writer.println(prefix + "\tinv.hotseatColumnSpan: " + inv.hotseatColumnSpan[mTypeIndex]); writer.println(prefix + pxToDpStr("hotseatCellHeightPx", hotseatCellHeightPx)); writer.println(prefix + pxToDpStr("hotseatBarBottomSpacePx", hotseatBarBottomSpacePx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingStartPx", hotseatBarSidePaddingStartPx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx", hotseatBarSidePaddingEndPx)); writer.println(prefix + pxToDpStr("mHotseatBarEdgePaddingPx", mHotseatBarEdgePaddingPx)); writer.println(prefix + pxToDpStr("mHotseatBarWorkspaceSpacePx", mHotseatBarWorkspaceSpacePx)); writer.println(prefix + pxToDpStr("hotseatBarEndOffset", hotseatBarEndOffset)); writer.println(prefix + pxToDpStr("hotseatQsbSpace", hotseatQsbSpace)); writer.println(prefix + pxToDpStr("hotseatQsbHeight", hotseatQsbHeight)); Loading src/com/android/launcher3/responsive/HotseatSpecs.kt +26 −6 Original line number Diff line number Diff line Loading @@ -21,14 +21,20 @@ import android.util.Log import com.android.launcher3.R import com.android.launcher3.util.ResourceHelper class HotseatSpecs(val specs: List<HotseatSpec>) { class HotseatSpecs(val widthSpecs: List<HotseatSpec>, val heightSpecs: List<HotseatSpec>) { fun getCalculatedHeightSpec(availableHeight: Int): CalculatedHotseatSpec { val spec = specs.firstOrNull { availableHeight <= it.maxAvailableSize } val spec = heightSpecs.firstOrNull { availableHeight <= it.maxAvailableSize } check(spec != null) { "No available height spec found within $availableHeight." } return CalculatedHotseatSpec(availableHeight, spec) } fun getCalculatedWidthSpec(availableWidth: Int): CalculatedHotseatSpec { val spec = widthSpecs.firstOrNull { availableWidth <= it.maxAvailableSize } check(spec != null) { "No available width spec found within $availableWidth." } return CalculatedHotseatSpec(availableWidth, spec) } companion object { private const val XML_HOTSEAT_SPEC = "hotseatSpec" Loading @@ -36,7 +42,9 @@ class HotseatSpecs(val specs: List<HotseatSpec>) { fun create(resourceHelper: ResourceHelper): HotseatSpecs { val parser = ResponsiveSpecsParser(resourceHelper) val specs = parser.parseXML(XML_HOTSEAT_SPEC, ::HotseatSpec) return HotseatSpecs(specs.filter { it.specType == ResponsiveSpec.SpecType.HEIGHT }) val (widthSpecs, heightSpecs) = specs.partition { it.specType == ResponsiveSpec.SpecType.WIDTH } return HotseatSpecs(widthSpecs, heightSpecs) } } } Loading @@ -44,7 +52,8 @@ class HotseatSpecs(val specs: List<HotseatSpec>) { data class HotseatSpec( val maxAvailableSize: Int, val specType: ResponsiveSpec.SpecType, val hotseatQsbSpace: SizeSpec val hotseatQsbSpace: SizeSpec, val edgePadding: SizeSpec ) { init { Loading @@ -63,7 +72,8 @@ data class HotseatSpec( R.styleable.ResponsiveSpec_specType, ResponsiveSpec.SpecType.HEIGHT.ordinal )], hotseatQsbSpace = specs.getOrError(SizeSpec.XmlTags.HOTSEAT_QSB_SPACE) hotseatQsbSpace = specs.getOrError(SizeSpec.XmlTags.HOTSEAT_QSB_SPACE), edgePadding = specs.getOrError(SizeSpec.XmlTags.EDGE_PADDING) ) fun isValid(): Boolean { Loading @@ -82,7 +92,10 @@ data class HotseatSpec( } private fun allSpecsAreValid(): Boolean { return hotseatQsbSpace.isValid() && hotseatQsbSpace.onlyFixedSize() return hotseatQsbSpace.isValid() && hotseatQsbSpace.onlyFixedSize() && edgePadding.isValid() && edgePadding.onlyFixedSize() } companion object { Loading @@ -95,13 +108,18 @@ class CalculatedHotseatSpec(val availableSpace: Int, val spec: HotseatSpec) { var hotseatQsbSpace: Int = 0 private set var edgePadding: Int = 0 private set init { hotseatQsbSpace = spec.hotseatQsbSpace.getCalculatedValue(availableSpace) edgePadding = spec.edgePadding.getCalculatedValue(availableSpace) } override fun hashCode(): Int { var result = availableSpace.hashCode() result = 31 * result + hotseatQsbSpace.hashCode() result = 31 * result + edgePadding.hashCode() result = 31 * result + spec.hashCode() return result } Loading @@ -110,12 +128,14 @@ class CalculatedHotseatSpec(val availableSpace: Int, val spec: HotseatSpec) { return other is CalculatedHotseatSpec && availableSpace == other.availableSpace && hotseatQsbSpace == other.hotseatQsbSpace && edgePadding == other.edgePadding && spec == other.spec } override fun toString(): String { return "${this::class.simpleName}(" + "availableSpace=$availableSpace, hotseatQsbSpace=$hotseatQsbSpace, " + "edgePadding=$edgePadding, " + "${spec::class.simpleName}.maxAvailableSize=${spec.maxAvailableSize}" + ")" } Loading src/com/android/launcher3/responsive/SizeSpec.kt +1 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,7 @@ data class SizeSpec( const val GUTTER = "gutter" const val CELL_SIZE = "cellSize" const val HOTSEAT_QSB_SPACE = "hotseatQsbSpace" const val EDGE_PADDING = "edgePadding" } companion object { Loading tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt 0 → 100644 +127 −0 Original line number Diff line number Diff line DeviceProfile: 1 dp = 2.625 px isTablet:false isPhone:true transposeLayoutWithOrientation:true isGestureMode:true isLandscape:false isMultiWindowMode:false isTwoPanels:false windowX: 0.0px (0.0dp) windowY: 0.0px (0.0dp) widthPx: 1080.0px (411.42856dp) heightPx: 2400.0px (914.2857dp) availableWidthPx: 1080.0px (411.42856dp) availableHeightPx: 2219.0px (845.3333dp) mInsets.left: 0.0px (0.0dp) mInsets.top: 118.0px (44.95238dp) mInsets.right: 0.0px (0.0dp) mInsets.bottom: 63.0px (24.0dp) aspectRatio:2.2222223 isResponsiveGrid:false isScalableGrid:false inv.numRows: 5 inv.numColumns: 5 inv.numSearchContainerColumns: 5 minCellSize: PointF(0.0, 0.0)dp cellWidthPx: 159.0px (60.57143dp) cellHeightPx: 229.0px (87.2381dp) getCellSize().x: 207.0px (78.85714dp) getCellSize().y: 383.0px (145.90475dp) cellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp) cellLayoutBorderSpacePx Vertical: 0.0px (0.0dp) cellLayoutPaddingPx.left: 21.0px (8.0dp) cellLayoutPaddingPx.top: 28.0px (10.666667dp) cellLayoutPaddingPx.right: 21.0px (8.0dp) cellLayoutPaddingPx.bottom: 28.0px (10.666667dp) iconSizePx: 147.0px (56.0dp) iconTextSizePx: 38.0px (14.476191dp) iconDrawablePaddingPx: 12.0px (4.571429dp) inv.numFolderRows: 4 inv.numFolderColumns: 4 folderCellWidthPx: 195.0px (74.28571dp) folderCellHeightPx: 230.0px (87.61905dp) folderChildIconSizePx: 147.0px (56.0dp) folderChildTextSizePx: 38.0px (14.476191dp) folderChildDrawablePaddingPx: 4.0px (1.5238096dp) folderCellLayoutBorderSpacePx.x: 0.0px (0.0dp) folderCellLayoutBorderSpacePx.y: 0.0px (0.0dp) folderContentPaddingLeftRight: 21.0px (8.0dp) folderTopPadding: 63.0px (24.0dp) folderFooterHeight: 147.0px (56.0dp) bottomSheetTopPadding: 146.0px (55.61905dp) bottomSheetOpenDuration: 267 bottomSheetCloseDuration: 267 bottomSheetWorkspaceScale: 1.0 bottomSheetDepth: 0.0 allAppsShiftRange: 788.0px (300.1905dp) allAppsTopPadding: 0.0px (0.0dp) allAppsOpenDuration: 600 allAppsCloseDuration: 300 allAppsIconSizePx: 147.0px (56.0dp) allAppsIconTextSizePx: 38.0px (14.476191dp) allAppsIconDrawablePaddingPx: 21.0px (8.0dp) allAppsCellHeightPx: 315.0px (120.0dp) allAppsCellWidthPx: 189.0px (72.0dp) allAppsBorderSpacePxX: 42.0px (16.0dp) allAppsBorderSpacePxY: 42.0px (16.0dp) numShownAllAppsColumns: 5 allAppsLeftRightPadding: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 273.0px (104.0dp) inv.hotseatColumnSpan: 5 hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) mHotseatBarWorkspaceSpacePx: 0.0px (0.0dp) hotseatBarEndOffset: 0.0px (0.0dp) hotseatQsbSpace: 0.0px (0.0dp) hotseatQsbHeight: 0.0px (0.0dp) springLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp) getHotseatLayoutPadding(context).top: 0.0px (0.0dp) getHotseatLayoutPadding(context).bottom: 107.0px (40.761906dp) getHotseatLayoutPadding(context).left: 21.0px (8.0dp) getHotseatLayoutPadding(context).right: 21.0px (8.0dp) numShownHotseatIcons: 5 hotseatBorderSpace: 0.0px (0.0dp) isQsbInline: false hotseatQsbWidth: 0.0px (0.0dp) isTaskbarPresent:false isTaskbarPresentInApps:false taskbarHeight: 0.0px (0.0dp) stashedTaskbarHeight: 0.0px (0.0dp) taskbarBottomMargin: 0.0px (0.0dp) taskbarIconSize: 0.0px (0.0dp) desiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp) workspacePadding.left: 0.0px (0.0dp) workspacePadding.top: 0.0px (0.0dp) workspacePadding.right: 0.0px (0.0dp) workspacePadding.bottom: 245.0px (93.333336dp) iconScale: 1.0px (0.3809524dp) cellScaleToFit : 1.0px (0.3809524dp) extraSpace: 773.0px (294.4762dp) unscaled extraSpace: 773.0px (294.4762dp) maxEmptySpace: 0.0px (0.0dp) workspaceTopPadding: 0.0px (0.0dp) workspaceBottomPadding: 0.0px (0.0dp) overviewTaskMarginPx: 0.0px (0.0dp) overviewTaskIconSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp) overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp) overviewActionsTopMarginPx: 0.0px (0.0dp) overviewActionsHeight: 0.0px (0.0dp) overviewActionsClaimedSpaceBelow: 63.0px (24.0dp) overviewActionsButtonSpacing: 0.0px (0.0dp) overviewPageSpacing: 0.0px (0.0dp) overviewRowSpacing: 0.0px (0.0dp) overviewGridSideMargin: 0.0px (0.0dp) dropTargetBarTopMarginPx: 84.0px (32.0dp) dropTargetBarSizePx: 147.0px (56.0dp) dropTargetBarBottomMarginPx: 42.0px (16.0dp) getCellLayoutSpringLoadShrunkTop(): 391.0px (148.95238dp) getCellLayoutSpringLoadShrunkBottom(): 1927.0px (734.0952dp) workspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp) getWorkspaceSpringLoadScale(): 0.7781155px (0.29642496dp) getCellLayoutHeight(): 1974.0px (752.0dp) getCellLayoutWidth(): 1080.0px (411.42856dp) tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt 0 → 100644 +127 −0 Original line number Diff line number Diff line DeviceProfile: 1 dp = 2.625 px isTablet:false isPhone:true transposeLayoutWithOrientation:true isGestureMode:false isLandscape:false isMultiWindowMode:false isTwoPanels:false windowX: 0.0px (0.0dp) windowY: 0.0px (0.0dp) widthPx: 1080.0px (411.42856dp) heightPx: 2400.0px (914.2857dp) availableWidthPx: 1080.0px (411.42856dp) availableHeightPx: 2156.0px (821.3333dp) mInsets.left: 0.0px (0.0dp) mInsets.top: 118.0px (44.95238dp) mInsets.right: 0.0px (0.0dp) mInsets.bottom: 126.0px (48.0dp) aspectRatio:2.2222223 isResponsiveGrid:false isScalableGrid:false inv.numRows: 5 inv.numColumns: 5 inv.numSearchContainerColumns: 5 minCellSize: PointF(0.0, 0.0)dp cellWidthPx: 159.0px (60.57143dp) cellHeightPx: 229.0px (87.2381dp) getCellSize().x: 207.0px (78.85714dp) getCellSize().y: 379.0px (144.38095dp) cellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp) cellLayoutBorderSpacePx Vertical: 0.0px (0.0dp) cellLayoutPaddingPx.left: 21.0px (8.0dp) cellLayoutPaddingPx.top: 28.0px (10.666667dp) cellLayoutPaddingPx.right: 21.0px (8.0dp) cellLayoutPaddingPx.bottom: 28.0px (10.666667dp) iconSizePx: 147.0px (56.0dp) iconTextSizePx: 38.0px (14.476191dp) iconDrawablePaddingPx: 12.0px (4.571429dp) inv.numFolderRows: 4 inv.numFolderColumns: 4 folderCellWidthPx: 195.0px (74.28571dp) folderCellHeightPx: 230.0px (87.61905dp) folderChildIconSizePx: 147.0px (56.0dp) folderChildTextSizePx: 38.0px (14.476191dp) folderChildDrawablePaddingPx: 4.0px (1.5238096dp) folderCellLayoutBorderSpacePx.x: 0.0px (0.0dp) folderCellLayoutBorderSpacePx.y: 0.0px (0.0dp) folderContentPaddingLeftRight: 21.0px (8.0dp) folderTopPadding: 63.0px (24.0dp) folderFooterHeight: 147.0px (56.0dp) bottomSheetTopPadding: 146.0px (55.61905dp) bottomSheetOpenDuration: 267 bottomSheetCloseDuration: 267 bottomSheetWorkspaceScale: 1.0 bottomSheetDepth: 0.0 allAppsShiftRange: 788.0px (300.1905dp) allAppsTopPadding: 0.0px (0.0dp) allAppsOpenDuration: 600 allAppsCloseDuration: 300 allAppsIconSizePx: 147.0px (56.0dp) allAppsIconTextSizePx: 38.0px (14.476191dp) allAppsIconDrawablePaddingPx: 21.0px (8.0dp) allAppsCellHeightPx: 315.0px (120.0dp) allAppsCellWidthPx: 189.0px (72.0dp) allAppsBorderSpacePxX: 42.0px (16.0dp) allAppsBorderSpacePxY: 42.0px (16.0dp) numShownAllAppsColumns: 5 allAppsLeftRightPadding: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 294.0px (112.0dp) inv.hotseatColumnSpan: 5 hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 147.0px (56.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) mHotseatBarWorkspaceSpacePx: 0.0px (0.0dp) hotseatBarEndOffset: 0.0px (0.0dp) hotseatQsbSpace: 0.0px (0.0dp) hotseatQsbHeight: 0.0px (0.0dp) springLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp) getHotseatLayoutPadding(context).top: 0.0px (0.0dp) getHotseatLayoutPadding(context).bottom: 128.0px (48.761906dp) getHotseatLayoutPadding(context).left: 21.0px (8.0dp) getHotseatLayoutPadding(context).right: 21.0px (8.0dp) numShownHotseatIcons: 5 hotseatBorderSpace: 0.0px (0.0dp) isQsbInline: false hotseatQsbWidth: 0.0px (0.0dp) isTaskbarPresent:false isTaskbarPresentInApps:false taskbarHeight: 0.0px (0.0dp) stashedTaskbarHeight: 0.0px (0.0dp) taskbarBottomMargin: 0.0px (0.0dp) taskbarIconSize: 0.0px (0.0dp) desiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp) workspacePadding.left: 0.0px (0.0dp) workspacePadding.top: 0.0px (0.0dp) workspacePadding.right: 0.0px (0.0dp) workspacePadding.bottom: 203.0px (77.333336dp) iconScale: 1.0px (0.3809524dp) cellScaleToFit : 1.0px (0.3809524dp) extraSpace: 752.0px (286.4762dp) unscaled extraSpace: 752.0px (286.4762dp) maxEmptySpace: 0.0px (0.0dp) workspaceTopPadding: 0.0px (0.0dp) workspaceBottomPadding: 0.0px (0.0dp) overviewTaskMarginPx: 0.0px (0.0dp) overviewTaskIconSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp) overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp) overviewActionsTopMarginPx: 0.0px (0.0dp) overviewActionsHeight: 0.0px (0.0dp) overviewActionsClaimedSpaceBelow: 126.0px (48.0dp) overviewActionsButtonSpacing: 0.0px (0.0dp) overviewPageSpacing: 0.0px (0.0dp) overviewRowSpacing: 0.0px (0.0dp) overviewGridSideMargin: 0.0px (0.0dp) dropTargetBarTopMarginPx: 84.0px (32.0dp) dropTargetBarSizePx: 147.0px (56.0dp) dropTargetBarBottomMarginPx: 42.0px (16.0dp) getCellLayoutSpringLoadShrunkTop(): 391.0px (148.95238dp) getCellLayoutSpringLoadShrunkBottom(): 1906.0px (726.0952dp) workspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp) getWorkspaceSpringLoadScale(): 0.77572966px (0.29551607dp) getCellLayoutHeight(): 1953.0px (744.0dp) getCellLayoutWidth(): 1080.0px (411.42856dp) Loading
src/com/android/launcher3/DeviceProfile.java +56 −43 Original line number Diff line number Diff line Loading @@ -205,9 +205,11 @@ public class DeviceProfile { public int hotseatBarEndOffset; 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; // These 2 values are only used for isVerticalBar // Padding between edge of screen and hotseat public final int mHotseatBarEdgePaddingPx; // Space between hotseat and workspace (not used in responsive) public final int mHotseatBarWorkspaceSpacePx; public int hotseatQsbWidth; // only used when isQsbInline public final int hotseatQsbHeight; public final int hotseatQsbVisualHeight; Loading Loading @@ -497,19 +499,32 @@ public class DeviceProfile { numShownAllAppsColumns = isTwoPanels ? inv.numDatabaseAllAppsColumns : inv.numAllAppsColumns; int hotseatBarBottomSpace = pxFromDp(inv.hotseatBarBottomSpace[mTypeIndex], mMetrics); int hotseatBarBottomSpace; int minQsbMargin = res.getDimensionPixelSize(R.dimen.min_qsb_margin); if (mIsResponsiveGrid) { HotseatSpecs hotseatSpecs = HotseatSpecs.create(new ResourceHelper(context, isTwoPanels ? inv.hotseatSpecsTwoPanelId : inv.hotseatSpecsId)); mResponsiveHotseatSpec = hotseatSpecs.getCalculatedHeightSpec(heightPx); mResponsiveHotseatSpec = isVerticalBarLayout() ? hotseatSpecs.getCalculatedWidthSpec(widthPx) : hotseatSpecs.getCalculatedHeightSpec(heightPx); hotseatQsbSpace = mResponsiveHotseatSpec.getHotseatQsbSpace(); hotseatBarBottomSpace = isVerticalBarLayout() ? 0 : mResponsiveHotseatSpec.getEdgePadding(); mHotseatBarEdgePaddingPx = isVerticalBarLayout() ? mResponsiveHotseatSpec.getEdgePadding() : 0; mHotseatBarWorkspaceSpacePx = 0; } else { hotseatQsbSpace = pxFromDp(inv.hotseatQsbSpace[mTypeIndex], mMetrics); hotseatBarBottomSpace = pxFromDp(inv.hotseatBarBottomSpace[mTypeIndex], mMetrics); mHotseatBarEdgePaddingPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0; mHotseatBarWorkspaceSpacePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding); } if (!isVerticalBarLayout()) { // Have a little space between the inset and the QSB if (mInsets.bottom + minQsbMargin > hotseatBarBottomSpace) { int availableSpace = hotseatQsbSpace - (mInsets.bottom - hotseatBarBottomSpace); Loading @@ -529,14 +544,11 @@ public class DeviceProfile { } else { hotseatBarBottomSpacePx = hotseatBarBottomSpace; } } springLoadedHotseatBarTopMarginPx = res.getDimensionPixelSize( R.dimen.spring_loaded_hotseat_top_margin); hotseatBarSidePaddingEndPx = 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; updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics)); updateHotseatSizes(pxFromDp(inv.iconSize[mTypeIndex], mMetrics)); if (areNavButtonsInline && !isPhone) { inlineNavButtonsEndSpacingPx = res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing); Loading @@ -562,10 +574,9 @@ public class DeviceProfile { int availableResponsiveWidth = availableWidthPx - (isVerticalBarLayout() ? hotseatBarSizePx : 0); int numColumns = getPanelCount() * inv.numColumns; // don't use availableHeightPx because it subtracts bottom padding, // but the workspace go behind it int availableResponsiveHeight = heightPx - mInsets.top - (isVerticalBarLayout() ? 0 : hotseatBarSizePx); // don't use availableHeightPx because it subtracts mInsets.bottom int availableResponsiveHeight = heightPx - mInsets.top - (isVerticalBarLayout() ? 0 : hotseatBarSizePx); mResponsiveWidthSpec = workspaceSpecs.getCalculatedWidthSpec(numColumns, availableResponsiveWidth); mResponsiveHeightSpec = workspaceSpecs.getCalculatedHeightSpec(inv.numRows, Loading Loading @@ -738,8 +749,8 @@ public class DeviceProfile { hotseatCellHeightPx = getIconSizeWithOverlap(hotseatIconSizePx); if (isVerticalBarLayout()) { hotseatBarSizePx = hotseatIconSizePx + hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx; hotseatBarSizePx = hotseatIconSizePx + mHotseatBarEdgePaddingPx + mHotseatBarWorkspaceSpacePx; } else if (isQsbInline) { hotseatBarSizePx = Math.max(hotseatIconSizePx, hotseatQsbVisualHeight) + hotseatBarBottomSpacePx; Loading Loading @@ -1007,6 +1018,7 @@ public class DeviceProfile { iconSizePx = mIconSizeSteps.getIconSmallerThan(cellWidthPx); } // TODO(b/296400197): isVerticalBar shouldn't show labels anymore iconDrawablePaddingPx = getNormalizedIconDrawablePadding(); int iconTextHeight = Utilities.calculateTextHeight(iconTextSizePx); int cellContentHeight = iconSizePx + iconDrawablePaddingPx + iconTextHeight; Loading Loading @@ -1491,7 +1503,8 @@ public class DeviceProfile { if (isVerticalBarLayout()) { if (mIsResponsiveGrid) { padding.top = mResponsiveHeightSpec.getStartPaddingPx(); padding.bottom = mResponsiveHeightSpec.getEndPaddingPx(); padding.bottom = Math.max(0, mResponsiveHeightSpec.getEndPaddingPx() - mInsets.bottom); if (isSeascape()) { padding.left = hotseatBarSizePx + mResponsiveWidthSpec.getEndPaddingPx(); padding.right = mResponsiveWidthSpec.getStartPaddingPx(); Loading @@ -1504,9 +1517,9 @@ public class DeviceProfile { padding.bottom = edgeMarginPx; if (isSeascape()) { padding.left = hotseatBarSizePx; padding.right = hotseatBarSidePaddingStartPx; padding.right = mHotseatBarEdgePaddingPx; } else { padding.left = hotseatBarSidePaddingStartPx; padding.left = mHotseatBarEdgePaddingPx; padding.right = hotseatBarSizePx; } } Loading Loading @@ -1560,11 +1573,11 @@ public class DeviceProfile { + diffOverlapFactor), 0); if (isSeascape()) { hotseatBarPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop, hotseatBarSidePaddingEndPx, paddingBottom); hotseatBarPadding.set(mInsets.left + mHotseatBarEdgePaddingPx, paddingTop, mHotseatBarWorkspaceSpacePx, paddingBottom); } else { hotseatBarPadding.set(hotseatBarSidePaddingEndPx, paddingTop, mInsets.right + hotseatBarSidePaddingStartPx, paddingBottom); hotseatBarPadding.set(mHotseatBarWorkspaceSpacePx, paddingTop, mInsets.right + mHotseatBarEdgePaddingPx, paddingBottom); } } else if (isTaskbarPresent) { // Center the QSB vertically with hotseat Loading Loading @@ -1910,10 +1923,10 @@ public class DeviceProfile { writer.println(prefix + "\tinv.hotseatColumnSpan: " + inv.hotseatColumnSpan[mTypeIndex]); writer.println(prefix + pxToDpStr("hotseatCellHeightPx", hotseatCellHeightPx)); writer.println(prefix + pxToDpStr("hotseatBarBottomSpacePx", hotseatBarBottomSpacePx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingStartPx", hotseatBarSidePaddingStartPx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx", hotseatBarSidePaddingEndPx)); writer.println(prefix + pxToDpStr("mHotseatBarEdgePaddingPx", mHotseatBarEdgePaddingPx)); writer.println(prefix + pxToDpStr("mHotseatBarWorkspaceSpacePx", mHotseatBarWorkspaceSpacePx)); writer.println(prefix + pxToDpStr("hotseatBarEndOffset", hotseatBarEndOffset)); writer.println(prefix + pxToDpStr("hotseatQsbSpace", hotseatQsbSpace)); writer.println(prefix + pxToDpStr("hotseatQsbHeight", hotseatQsbHeight)); Loading
src/com/android/launcher3/responsive/HotseatSpecs.kt +26 −6 Original line number Diff line number Diff line Loading @@ -21,14 +21,20 @@ import android.util.Log import com.android.launcher3.R import com.android.launcher3.util.ResourceHelper class HotseatSpecs(val specs: List<HotseatSpec>) { class HotseatSpecs(val widthSpecs: List<HotseatSpec>, val heightSpecs: List<HotseatSpec>) { fun getCalculatedHeightSpec(availableHeight: Int): CalculatedHotseatSpec { val spec = specs.firstOrNull { availableHeight <= it.maxAvailableSize } val spec = heightSpecs.firstOrNull { availableHeight <= it.maxAvailableSize } check(spec != null) { "No available height spec found within $availableHeight." } return CalculatedHotseatSpec(availableHeight, spec) } fun getCalculatedWidthSpec(availableWidth: Int): CalculatedHotseatSpec { val spec = widthSpecs.firstOrNull { availableWidth <= it.maxAvailableSize } check(spec != null) { "No available width spec found within $availableWidth." } return CalculatedHotseatSpec(availableWidth, spec) } companion object { private const val XML_HOTSEAT_SPEC = "hotseatSpec" Loading @@ -36,7 +42,9 @@ class HotseatSpecs(val specs: List<HotseatSpec>) { fun create(resourceHelper: ResourceHelper): HotseatSpecs { val parser = ResponsiveSpecsParser(resourceHelper) val specs = parser.parseXML(XML_HOTSEAT_SPEC, ::HotseatSpec) return HotseatSpecs(specs.filter { it.specType == ResponsiveSpec.SpecType.HEIGHT }) val (widthSpecs, heightSpecs) = specs.partition { it.specType == ResponsiveSpec.SpecType.WIDTH } return HotseatSpecs(widthSpecs, heightSpecs) } } } Loading @@ -44,7 +52,8 @@ class HotseatSpecs(val specs: List<HotseatSpec>) { data class HotseatSpec( val maxAvailableSize: Int, val specType: ResponsiveSpec.SpecType, val hotseatQsbSpace: SizeSpec val hotseatQsbSpace: SizeSpec, val edgePadding: SizeSpec ) { init { Loading @@ -63,7 +72,8 @@ data class HotseatSpec( R.styleable.ResponsiveSpec_specType, ResponsiveSpec.SpecType.HEIGHT.ordinal )], hotseatQsbSpace = specs.getOrError(SizeSpec.XmlTags.HOTSEAT_QSB_SPACE) hotseatQsbSpace = specs.getOrError(SizeSpec.XmlTags.HOTSEAT_QSB_SPACE), edgePadding = specs.getOrError(SizeSpec.XmlTags.EDGE_PADDING) ) fun isValid(): Boolean { Loading @@ -82,7 +92,10 @@ data class HotseatSpec( } private fun allSpecsAreValid(): Boolean { return hotseatQsbSpace.isValid() && hotseatQsbSpace.onlyFixedSize() return hotseatQsbSpace.isValid() && hotseatQsbSpace.onlyFixedSize() && edgePadding.isValid() && edgePadding.onlyFixedSize() } companion object { Loading @@ -95,13 +108,18 @@ class CalculatedHotseatSpec(val availableSpace: Int, val spec: HotseatSpec) { var hotseatQsbSpace: Int = 0 private set var edgePadding: Int = 0 private set init { hotseatQsbSpace = spec.hotseatQsbSpace.getCalculatedValue(availableSpace) edgePadding = spec.edgePadding.getCalculatedValue(availableSpace) } override fun hashCode(): Int { var result = availableSpace.hashCode() result = 31 * result + hotseatQsbSpace.hashCode() result = 31 * result + edgePadding.hashCode() result = 31 * result + spec.hashCode() return result } Loading @@ -110,12 +128,14 @@ class CalculatedHotseatSpec(val availableSpace: Int, val spec: HotseatSpec) { return other is CalculatedHotseatSpec && availableSpace == other.availableSpace && hotseatQsbSpace == other.hotseatQsbSpace && edgePadding == other.edgePadding && spec == other.spec } override fun toString(): String { return "${this::class.simpleName}(" + "availableSpace=$availableSpace, hotseatQsbSpace=$hotseatQsbSpace, " + "edgePadding=$edgePadding, " + "${spec::class.simpleName}.maxAvailableSize=${spec.maxAvailableSize}" + ")" } Loading
src/com/android/launcher3/responsive/SizeSpec.kt +1 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,7 @@ data class SizeSpec( const val GUTTER = "gutter" const val CELL_SIZE = "cellSize" const val HOTSEAT_QSB_SPACE = "hotseatQsbSpace" const val EDGE_PADDING = "edgePadding" } companion object { Loading
tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt 0 → 100644 +127 −0 Original line number Diff line number Diff line DeviceProfile: 1 dp = 2.625 px isTablet:false isPhone:true transposeLayoutWithOrientation:true isGestureMode:true isLandscape:false isMultiWindowMode:false isTwoPanels:false windowX: 0.0px (0.0dp) windowY: 0.0px (0.0dp) widthPx: 1080.0px (411.42856dp) heightPx: 2400.0px (914.2857dp) availableWidthPx: 1080.0px (411.42856dp) availableHeightPx: 2219.0px (845.3333dp) mInsets.left: 0.0px (0.0dp) mInsets.top: 118.0px (44.95238dp) mInsets.right: 0.0px (0.0dp) mInsets.bottom: 63.0px (24.0dp) aspectRatio:2.2222223 isResponsiveGrid:false isScalableGrid:false inv.numRows: 5 inv.numColumns: 5 inv.numSearchContainerColumns: 5 minCellSize: PointF(0.0, 0.0)dp cellWidthPx: 159.0px (60.57143dp) cellHeightPx: 229.0px (87.2381dp) getCellSize().x: 207.0px (78.85714dp) getCellSize().y: 383.0px (145.90475dp) cellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp) cellLayoutBorderSpacePx Vertical: 0.0px (0.0dp) cellLayoutPaddingPx.left: 21.0px (8.0dp) cellLayoutPaddingPx.top: 28.0px (10.666667dp) cellLayoutPaddingPx.right: 21.0px (8.0dp) cellLayoutPaddingPx.bottom: 28.0px (10.666667dp) iconSizePx: 147.0px (56.0dp) iconTextSizePx: 38.0px (14.476191dp) iconDrawablePaddingPx: 12.0px (4.571429dp) inv.numFolderRows: 4 inv.numFolderColumns: 4 folderCellWidthPx: 195.0px (74.28571dp) folderCellHeightPx: 230.0px (87.61905dp) folderChildIconSizePx: 147.0px (56.0dp) folderChildTextSizePx: 38.0px (14.476191dp) folderChildDrawablePaddingPx: 4.0px (1.5238096dp) folderCellLayoutBorderSpacePx.x: 0.0px (0.0dp) folderCellLayoutBorderSpacePx.y: 0.0px (0.0dp) folderContentPaddingLeftRight: 21.0px (8.0dp) folderTopPadding: 63.0px (24.0dp) folderFooterHeight: 147.0px (56.0dp) bottomSheetTopPadding: 146.0px (55.61905dp) bottomSheetOpenDuration: 267 bottomSheetCloseDuration: 267 bottomSheetWorkspaceScale: 1.0 bottomSheetDepth: 0.0 allAppsShiftRange: 788.0px (300.1905dp) allAppsTopPadding: 0.0px (0.0dp) allAppsOpenDuration: 600 allAppsCloseDuration: 300 allAppsIconSizePx: 147.0px (56.0dp) allAppsIconTextSizePx: 38.0px (14.476191dp) allAppsIconDrawablePaddingPx: 21.0px (8.0dp) allAppsCellHeightPx: 315.0px (120.0dp) allAppsCellWidthPx: 189.0px (72.0dp) allAppsBorderSpacePxX: 42.0px (16.0dp) allAppsBorderSpacePxY: 42.0px (16.0dp) numShownAllAppsColumns: 5 allAppsLeftRightPadding: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 273.0px (104.0dp) inv.hotseatColumnSpan: 5 hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 126.0px (48.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) mHotseatBarWorkspaceSpacePx: 0.0px (0.0dp) hotseatBarEndOffset: 0.0px (0.0dp) hotseatQsbSpace: 0.0px (0.0dp) hotseatQsbHeight: 0.0px (0.0dp) springLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp) getHotseatLayoutPadding(context).top: 0.0px (0.0dp) getHotseatLayoutPadding(context).bottom: 107.0px (40.761906dp) getHotseatLayoutPadding(context).left: 21.0px (8.0dp) getHotseatLayoutPadding(context).right: 21.0px (8.0dp) numShownHotseatIcons: 5 hotseatBorderSpace: 0.0px (0.0dp) isQsbInline: false hotseatQsbWidth: 0.0px (0.0dp) isTaskbarPresent:false isTaskbarPresentInApps:false taskbarHeight: 0.0px (0.0dp) stashedTaskbarHeight: 0.0px (0.0dp) taskbarBottomMargin: 0.0px (0.0dp) taskbarIconSize: 0.0px (0.0dp) desiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp) workspacePadding.left: 0.0px (0.0dp) workspacePadding.top: 0.0px (0.0dp) workspacePadding.right: 0.0px (0.0dp) workspacePadding.bottom: 245.0px (93.333336dp) iconScale: 1.0px (0.3809524dp) cellScaleToFit : 1.0px (0.3809524dp) extraSpace: 773.0px (294.4762dp) unscaled extraSpace: 773.0px (294.4762dp) maxEmptySpace: 0.0px (0.0dp) workspaceTopPadding: 0.0px (0.0dp) workspaceBottomPadding: 0.0px (0.0dp) overviewTaskMarginPx: 0.0px (0.0dp) overviewTaskIconSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp) overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp) overviewActionsTopMarginPx: 0.0px (0.0dp) overviewActionsHeight: 0.0px (0.0dp) overviewActionsClaimedSpaceBelow: 63.0px (24.0dp) overviewActionsButtonSpacing: 0.0px (0.0dp) overviewPageSpacing: 0.0px (0.0dp) overviewRowSpacing: 0.0px (0.0dp) overviewGridSideMargin: 0.0px (0.0dp) dropTargetBarTopMarginPx: 84.0px (32.0dp) dropTargetBarSizePx: 147.0px (56.0dp) dropTargetBarBottomMarginPx: 42.0px (16.0dp) getCellLayoutSpringLoadShrunkTop(): 391.0px (148.95238dp) getCellLayoutSpringLoadShrunkBottom(): 1927.0px (734.0952dp) workspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp) getWorkspaceSpringLoadScale(): 0.7781155px (0.29642496dp) getCellLayoutHeight(): 1974.0px (752.0dp) getCellLayoutWidth(): 1080.0px (411.42856dp)
tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt 0 → 100644 +127 −0 Original line number Diff line number Diff line DeviceProfile: 1 dp = 2.625 px isTablet:false isPhone:true transposeLayoutWithOrientation:true isGestureMode:false isLandscape:false isMultiWindowMode:false isTwoPanels:false windowX: 0.0px (0.0dp) windowY: 0.0px (0.0dp) widthPx: 1080.0px (411.42856dp) heightPx: 2400.0px (914.2857dp) availableWidthPx: 1080.0px (411.42856dp) availableHeightPx: 2156.0px (821.3333dp) mInsets.left: 0.0px (0.0dp) mInsets.top: 118.0px (44.95238dp) mInsets.right: 0.0px (0.0dp) mInsets.bottom: 126.0px (48.0dp) aspectRatio:2.2222223 isResponsiveGrid:false isScalableGrid:false inv.numRows: 5 inv.numColumns: 5 inv.numSearchContainerColumns: 5 minCellSize: PointF(0.0, 0.0)dp cellWidthPx: 159.0px (60.57143dp) cellHeightPx: 229.0px (87.2381dp) getCellSize().x: 207.0px (78.85714dp) getCellSize().y: 379.0px (144.38095dp) cellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp) cellLayoutBorderSpacePx Vertical: 0.0px (0.0dp) cellLayoutPaddingPx.left: 21.0px (8.0dp) cellLayoutPaddingPx.top: 28.0px (10.666667dp) cellLayoutPaddingPx.right: 21.0px (8.0dp) cellLayoutPaddingPx.bottom: 28.0px (10.666667dp) iconSizePx: 147.0px (56.0dp) iconTextSizePx: 38.0px (14.476191dp) iconDrawablePaddingPx: 12.0px (4.571429dp) inv.numFolderRows: 4 inv.numFolderColumns: 4 folderCellWidthPx: 195.0px (74.28571dp) folderCellHeightPx: 230.0px (87.61905dp) folderChildIconSizePx: 147.0px (56.0dp) folderChildTextSizePx: 38.0px (14.476191dp) folderChildDrawablePaddingPx: 4.0px (1.5238096dp) folderCellLayoutBorderSpacePx.x: 0.0px (0.0dp) folderCellLayoutBorderSpacePx.y: 0.0px (0.0dp) folderContentPaddingLeftRight: 21.0px (8.0dp) folderTopPadding: 63.0px (24.0dp) folderFooterHeight: 147.0px (56.0dp) bottomSheetTopPadding: 146.0px (55.61905dp) bottomSheetOpenDuration: 267 bottomSheetCloseDuration: 267 bottomSheetWorkspaceScale: 1.0 bottomSheetDepth: 0.0 allAppsShiftRange: 788.0px (300.1905dp) allAppsTopPadding: 0.0px (0.0dp) allAppsOpenDuration: 600 allAppsCloseDuration: 300 allAppsIconSizePx: 147.0px (56.0dp) allAppsIconTextSizePx: 38.0px (14.476191dp) allAppsIconDrawablePaddingPx: 21.0px (8.0dp) allAppsCellHeightPx: 315.0px (120.0dp) allAppsCellWidthPx: 189.0px (72.0dp) allAppsBorderSpacePxX: 42.0px (16.0dp) allAppsBorderSpacePxY: 42.0px (16.0dp) numShownAllAppsColumns: 5 allAppsLeftRightPadding: 0.0px (0.0dp) allAppsLeftRightMargin: 0.0px (0.0dp) hotseatBarSizePx: 294.0px (112.0dp) inv.hotseatColumnSpan: 5 hotseatCellHeightPx: 166.0px (63.238094dp) hotseatBarBottomSpacePx: 147.0px (56.0dp) mHotseatBarEdgePaddingPx: 0.0px (0.0dp) mHotseatBarWorkspaceSpacePx: 0.0px (0.0dp) hotseatBarEndOffset: 0.0px (0.0dp) hotseatQsbSpace: 0.0px (0.0dp) hotseatQsbHeight: 0.0px (0.0dp) springLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp) getHotseatLayoutPadding(context).top: 0.0px (0.0dp) getHotseatLayoutPadding(context).bottom: 128.0px (48.761906dp) getHotseatLayoutPadding(context).left: 21.0px (8.0dp) getHotseatLayoutPadding(context).right: 21.0px (8.0dp) numShownHotseatIcons: 5 hotseatBorderSpace: 0.0px (0.0dp) isQsbInline: false hotseatQsbWidth: 0.0px (0.0dp) isTaskbarPresent:false isTaskbarPresentInApps:false taskbarHeight: 0.0px (0.0dp) stashedTaskbarHeight: 0.0px (0.0dp) taskbarBottomMargin: 0.0px (0.0dp) taskbarIconSize: 0.0px (0.0dp) desiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp) workspacePadding.left: 0.0px (0.0dp) workspacePadding.top: 0.0px (0.0dp) workspacePadding.right: 0.0px (0.0dp) workspacePadding.bottom: 203.0px (77.333336dp) iconScale: 1.0px (0.3809524dp) cellScaleToFit : 1.0px (0.3809524dp) extraSpace: 752.0px (286.4762dp) unscaled extraSpace: 752.0px (286.4762dp) maxEmptySpace: 0.0px (0.0dp) workspaceTopPadding: 0.0px (0.0dp) workspaceBottomPadding: 0.0px (0.0dp) overviewTaskMarginPx: 0.0px (0.0dp) overviewTaskIconSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizePx: 0.0px (0.0dp) overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp) overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp) overviewActionsTopMarginPx: 0.0px (0.0dp) overviewActionsHeight: 0.0px (0.0dp) overviewActionsClaimedSpaceBelow: 126.0px (48.0dp) overviewActionsButtonSpacing: 0.0px (0.0dp) overviewPageSpacing: 0.0px (0.0dp) overviewRowSpacing: 0.0px (0.0dp) overviewGridSideMargin: 0.0px (0.0dp) dropTargetBarTopMarginPx: 84.0px (32.0dp) dropTargetBarSizePx: 147.0px (56.0dp) dropTargetBarBottomMarginPx: 42.0px (16.0dp) getCellLayoutSpringLoadShrunkTop(): 391.0px (148.95238dp) getCellLayoutSpringLoadShrunkBottom(): 1906.0px (726.0952dp) workspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp) getWorkspaceSpringLoadScale(): 0.77572966px (0.29551607dp) getCellLayoutHeight(): 1953.0px (744.0dp) getCellLayoutWidth(): 1080.0px (411.42856dp)