Refactoring Responsive Grid XML specs for more flexibility
It merges portrait and landscape XML specs for responsive grid. This update allows the responsive grid to rely on other properties like aspect ratio and not solely the orientation from resource qualifiers.
Bug: 299889733
Flag: ACONFIG com.android.launcher3.enable_responsive_workspace TEAMFOOD
Test: CalculatedAllAppsSpecTest
Test: CalculatedFolderSpecTest
Test: CalculatedHotseatSpecTest
Test: CalculatedWorkspaceSpecTest
Test: AllAppsSpecsTest
Test: FolderSpecTest
Test: HotseatSpecsTest
Test: WorkspaceSpecsTest
Change-Id: I39ee54d49c9d2a54fcbe91c8a1327a21a8126032
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 73cd8c4..2ed33ec 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -17,6 +17,7 @@
package com.android.launcher3;
import static com.android.app.animation.Interpolators.LINEAR;
+import static com.android.launcher3.Flags.enableOverviewIconMenu;
import static com.android.launcher3.InvariantDeviceProfile.INDEX_DEFAULT;
import static com.android.launcher3.InvariantDeviceProfile.INDEX_LANDSCAPE;
import static com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_LANDSCAPE;
@@ -24,7 +25,6 @@
import static com.android.launcher3.Utilities.dpiFromPx;
import static com.android.launcher3.Utilities.pxFromSp;
import static com.android.launcher3.config.FeatureFlags.ENABLE_MULTI_DISPLAY_PARTIAL_DEPTH;
-import static com.android.launcher3.Flags.enableOverviewIconMenu;
import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ICON_OVERLAP_FACTOR;
import static com.android.launcher3.icons.GraphicsUtils.getShapePath;
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
@@ -54,14 +54,12 @@
import com.android.launcher3.icons.DotRenderer;
import com.android.launcher3.icons.IconNormalizer;
import com.android.launcher3.model.data.ItemInfo;
-import com.android.launcher3.responsive.AllAppsSpecs;
-import com.android.launcher3.responsive.CalculatedAllAppsSpec;
-import com.android.launcher3.responsive.CalculatedFolderSpec;
import com.android.launcher3.responsive.CalculatedHotseatSpec;
-import com.android.launcher3.responsive.CalculatedWorkspaceSpec;
-import com.android.launcher3.responsive.FolderSpecs;
-import com.android.launcher3.responsive.HotseatSpecs;
-import com.android.launcher3.responsive.WorkspaceSpecs;
+import com.android.launcher3.responsive.CalculatedResponsiveSpec;
+import com.android.launcher3.responsive.HotseatSpecsProvider;
+import com.android.launcher3.responsive.ResponsiveSpec.Companion.ResponsiveSpecType;
+import com.android.launcher3.responsive.ResponsiveSpec.DimensionType;
+import com.android.launcher3.responsive.ResponsiveSpecsProvider;
import com.android.launcher3.uioverrides.ApiWrapper;
import com.android.launcher3.util.CellContentDimensions;
import com.android.launcher3.util.DisplayController;
@@ -84,7 +82,8 @@
public static final PointF DEFAULT_SCALE = new PointF(1.0f, 1.0f);
public static final ViewScaleProvider DEFAULT_PROVIDER = itemInfo -> DEFAULT_SCALE;
- public static final Consumer<DeviceProfile> DEFAULT_DIMENSION_PROVIDER = dp -> {};
+ public static final Consumer<DeviceProfile> DEFAULT_DIMENSION_PROVIDER = dp -> {
+ };
public final InvariantDeviceProfile inv;
private final Info mInfo;
@@ -119,12 +118,12 @@
// Responsive grid
private final boolean mIsResponsiveGrid;
- private CalculatedWorkspaceSpec mResponsiveWidthSpec;
- private CalculatedWorkspaceSpec mResponsiveHeightSpec;
- private CalculatedAllAppsSpec mAllAppsResponsiveWidthSpec;
- private CalculatedAllAppsSpec mAllAppsResponsiveHeightSpec;
- private CalculatedFolderSpec mResponsiveFolderWidthSpec;
- private CalculatedFolderSpec mResponsiveFolderHeightSpec;
+ private CalculatedResponsiveSpec mResponsiveWidthSpec;
+ private CalculatedResponsiveSpec mResponsiveHeightSpec;
+ private CalculatedResponsiveSpec mAllAppsResponsiveWidthSpec;
+ private CalculatedResponsiveSpec mAllAppsResponsiveHeightSpec;
+ private CalculatedResponsiveSpec mResponsiveFolderWidthSpec;
+ private CalculatedResponsiveSpec mResponsiveFolderHeightSpec;
private CalculatedHotseatSpec mResponsiveHotseatSpec;
/**
@@ -376,7 +375,7 @@
res.getDimensionPixelSize(R.dimen.transient_taskbar_bottom_margin);
int transientTaskbarHeight =
Math.round((transientTaskbarIconSize * ICON_VISIBLE_AREA_FACTOR)
- + (2 * res.getDimensionPixelSize(R.dimen.transient_taskbar_padding)));
+ + (2 * res.getDimensionPixelSize(R.dimen.transient_taskbar_padding)));
mTransientTaskbarClaimedSpace = transientTaskbarHeight + 2 * transientTaskbarBottomMargin;
if (!isTaskbarPresent) {
@@ -519,12 +518,15 @@
int minQsbMargin = res.getDimensionPixelSize(R.dimen.min_qsb_margin);
if (mIsResponsiveGrid) {
- HotseatSpecs hotseatSpecs =
- HotseatSpecs.create(new ResourceHelper(context,
+ float responsiveAspectRatio = (float) widthPx / heightPx;
+ HotseatSpecsProvider hotseatSpecsProvider =
+ HotseatSpecsProvider.create(new ResourceHelper(context,
isTwoPanels ? inv.hotseatSpecsTwoPanelId : inv.hotseatSpecsId));
mResponsiveHotseatSpec =
- isVerticalBarLayout() ? hotseatSpecs.getCalculatedWidthSpec(widthPx)
- : hotseatSpecs.getCalculatedHeightSpec(heightPx);
+ isVerticalBarLayout() ? hotseatSpecsProvider.getCalculatedSpec(
+ responsiveAspectRatio, DimensionType.WIDTH, widthPx)
+ : hotseatSpecsProvider.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.HEIGHT, heightPx);
hotseatQsbSpace = mResponsiveHotseatSpec.getHotseatQsbSpace();
hotseatBarBottomSpace =
isVerticalBarLayout() ? 0 : mResponsiveHotseatSpec.getEdgePadding();
@@ -587,35 +589,46 @@
// Needs to be calculated after hotseatBarSizePx is correct,
// for the available height to be correct
if (mIsResponsiveGrid) {
- WorkspaceSpecs workspaceSpecs = WorkspaceSpecs.create(
- new ResourceHelper(context,
- isTwoPanels ? inv.workspaceSpecsTwoPanelId : inv.workspaceSpecsId));
int availableResponsiveWidth =
availableWidthPx - (isVerticalBarLayout() ? hotseatBarSizePx : 0);
int numColumns = getPanelCount() * inv.numColumns;
// 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,
- availableResponsiveHeight);
+ - (isVerticalBarLayout() ? 0 : hotseatBarSizePx);
+ float responsiveAspectRatio = (float) widthPx / heightPx;
- AllAppsSpecs allAppsSpecs = AllAppsSpecs.create(
+ ResponsiveSpecsProvider workspaceSpecs = ResponsiveSpecsProvider.create(
new ResourceHelper(context,
- isTwoPanels ? inv.allAppsSpecsTwoPanelId : inv.allAppsSpecsId));
- mAllAppsResponsiveWidthSpec = allAppsSpecs.getCalculatedWidthSpec(numColumns,
- mResponsiveWidthSpec.getAvailableSpace(), mResponsiveWidthSpec);
- mAllAppsResponsiveHeightSpec = allAppsSpecs.getCalculatedHeightSpec(inv.numRows,
- mResponsiveHeightSpec.getAvailableSpace(), mResponsiveHeightSpec);
+ isTwoPanels ? inv.workspaceSpecsTwoPanelId : inv.workspaceSpecsId),
+ ResponsiveSpecType.Workspace);
+ mResponsiveWidthSpec = workspaceSpecs.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.WIDTH, numColumns, availableResponsiveWidth);
+ mResponsiveHeightSpec = workspaceSpecs.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.HEIGHT, inv.numRows, availableResponsiveHeight);
- FolderSpecs folderSpecs = FolderSpecs.create(
+ ResponsiveSpecsProvider allAppsSpecs = ResponsiveSpecsProvider.create(
new ResourceHelper(context,
- isTwoPanels ? inv.folderSpecsTwoPanelId : inv.folderSpecsId));
- mResponsiveFolderWidthSpec = folderSpecs.getCalculatedWidthSpec(inv.numFolderColumns,
- mResponsiveWidthSpec.getAvailableSpace(), mResponsiveWidthSpec);
- mResponsiveFolderHeightSpec = folderSpecs.getCalculatedHeightSpec(inv.numFolderRows,
- mResponsiveHeightSpec.getAvailableSpace(), mResponsiveHeightSpec);
+ isTwoPanels ? inv.allAppsSpecsTwoPanelId : inv.allAppsSpecsId),
+ ResponsiveSpecType.AllApps);
+ mAllAppsResponsiveWidthSpec = allAppsSpecs.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.WIDTH, numColumns, mResponsiveWidthSpec.getAvailableSpace(),
+ mResponsiveWidthSpec);
+ mAllAppsResponsiveHeightSpec = allAppsSpecs.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.HEIGHT, inv.numRows, mResponsiveHeightSpec.getAvailableSpace(),
+ mResponsiveHeightSpec);
+
+ ResponsiveSpecsProvider folderSpecs = ResponsiveSpecsProvider.create(
+ new ResourceHelper(context,
+ isTwoPanels ? inv.folderSpecsTwoPanelId : inv.folderSpecsId),
+ ResponsiveSpecType.Folder);
+ mResponsiveFolderWidthSpec = folderSpecs.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.WIDTH, inv.numFolderColumns,
+ mResponsiveWidthSpec.getAvailableSpace(),
+ mResponsiveWidthSpec);
+ mResponsiveFolderHeightSpec = folderSpecs.getCalculatedSpec(responsiveAspectRatio,
+ DimensionType.HEIGHT, inv.numFolderRows,
+ mResponsiveHeightSpec.getAvailableSpace(),
+ mResponsiveHeightSpec);
}
desiredWorkspaceHorizontalMarginPx = getHorizontalMarginPx(inv, res);