diff options
author | Thales Lima <tsuharesu@google.com> | 2023-04-14 15:04:23 +0100 |
---|---|---|
committer | Thales Lima <tsuharesu@google.com> | 2023-05-17 10:33:36 +0000 |
commit | c98b7815c66b844b8345c10c9f78fd94ad4b75db (patch) | |
tree | f3274446a9799c6a55e37a08eccc749f06179941 /src | |
parent | b9f04842b5793ebb28384d138b0ee1b0ea4915e8 (diff) | |
download | Launcher3-c98b7815c66b844b8345c10c9f78fd94ad4b75db.tar.gz |
Calculate sizes for responsive grid
This shouldn't change anything in the grids, only calculate the sizes of the grid.
Bug: 277064708
Test: CalculatedWorkspaceSpecTest
Test: WorkspaceSpecsTest
Flag: ENABLE_RESPONSIVE_WORKSPACE
Change-Id: Id1f90ef44f5b869113d063bad17589e7e88d1d20
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/DeviceProfile.java | 25 | ||||
-rw-r--r-- | src/com/android/launcher3/workspace/WorkspaceSpecs.kt | 74 |
2 files changed, 93 insertions, 6 deletions
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 0231090d7e..fb41044875 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -55,7 +55,10 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.uioverrides.ApiWrapper; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; +import com.android.launcher3.util.ResourceHelper; import com.android.launcher3.util.WindowBounds; +import com.android.launcher3.workspace.CalculatedWorkspaceSpec; +import com.android.launcher3.workspace.WorkspaceSpecs; import java.io.PrintWriter; import java.util.Locale; @@ -101,9 +104,14 @@ public class DeviceProfile { public final float aspectRatio; public final boolean isScalableGrid; - public final boolean isResponsiveGrid; private final int mTypeIndex; + // Responsive grid + private final boolean mIsResponsiveGrid; + private WorkspaceSpecs mWorkspaceSpecs; + private CalculatedWorkspaceSpec mResponsiveWidthSpec; + private CalculatedWorkspaceSpec mResponsiveHeightSpec; + /** * The maximum amount of left/right workspace padding as a percentage of the screen width. * To be clear, this means that up to 7% of the screen width can be used as left padding, and @@ -294,9 +302,8 @@ public class DeviceProfile { this.rotationHint = windowBounds.rotationHint; mInsets.set(windowBounds.insets); - // TODO(b/241386436): - // for testing that the flag works only, shouldn't change any launcher behaviour - isResponsiveGrid = inv.workspaceSpecsId != INVALID_RESOURCE_HANDLE; + // TODO(b/241386436): shouldn't change any launcher behaviour + mIsResponsiveGrid = inv.workspaceSpecsId != INVALID_RESOURCE_HANDLE; isScalableGrid = inv.isScalable && !isVerticalBarLayout() && !isMultiWindowMode; // Determine device posture. @@ -335,6 +342,14 @@ public class DeviceProfile { } } + if (mIsResponsiveGrid) { + mWorkspaceSpecs = new WorkspaceSpecs(new ResourceHelper(context, inv.workspaceSpecsId)); + mResponsiveWidthSpec = mWorkspaceSpecs.getCalculatedWidthSpec(inv.numColumns, + availableWidthPx); + mResponsiveHeightSpec = mWorkspaceSpecs.getCalculatedHeightSpec(inv.numRows, + availableHeightPx); + } + if (DisplayController.isTransientTaskbar(context)) { float invTransientIconSizeDp = inv.transientTaskbarIconSize[mTypeIndex]; taskbarIconSize = pxFromDp(invTransientIconSizeDp, mMetrics); @@ -1582,7 +1597,7 @@ public class DeviceProfile { writer.println(prefix + "\taspectRatio:" + aspectRatio); - writer.println(prefix + "\tisResponsiveGrid:" + isResponsiveGrid); + writer.println(prefix + "\tisResponsiveGrid:" + mIsResponsiveGrid); writer.println(prefix + "\tisScalableGrid:" + isScalableGrid); writer.println(prefix + "\tinv.numRows: " + inv.numRows); diff --git a/src/com/android/launcher3/workspace/WorkspaceSpecs.kt b/src/com/android/launcher3/workspace/WorkspaceSpecs.kt index 971fd9b578..ac0a166b18 100644 --- a/src/com/android/launcher3/workspace/WorkspaceSpecs.kt +++ b/src/com/android/launcher3/workspace/WorkspaceSpecs.kt @@ -25,6 +25,7 @@ import android.util.Xml import com.android.launcher3.R import com.android.launcher3.util.ResourceHelper import java.io.IOException +import kotlin.math.roundToInt import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParserException @@ -159,6 +160,77 @@ class WorkspaceSpecs(resourceHelper: ResourceHelper) { } } } + + /** + * Returns the CalculatedWorkspaceSpec for width, based on the available width and the + * WorkspaceSpecs. + */ + fun getCalculatedWidthSpec(columns: Int, availableWidth: Int): CalculatedWorkspaceSpec { + val widthSpec = workspaceWidthSpecList.first { availableWidth <= it.maxAvailableSize } + + return CalculatedWorkspaceSpec(availableWidth, columns, widthSpec) + } + + /** + * Returns the CalculatedWorkspaceSpec for height, based on the available height and the + * WorkspaceSpecs. + */ + fun getCalculatedHeightSpec(rows: Int, availableHeight: Int): CalculatedWorkspaceSpec { + val heightSpec = workspaceHeightSpecList.first { availableHeight <= it.maxAvailableSize } + + return CalculatedWorkspaceSpec(availableHeight, rows, heightSpec) + } +} + +class CalculatedWorkspaceSpec( + val availableSpace: Int, + val cells: Int, + val workspaceSpec: WorkspaceSpec +) { + var startPaddingPx: Int = 0 + private set + var endPaddingPx: Int = 0 + private set + var gutterPx: Int = 0 + private set + var cellSizePx: Int = 0 + private set + init { + // Calculate all fixed size first + if (workspaceSpec.startPadding.fixedSize > 0) + startPaddingPx = workspaceSpec.startPadding.fixedSize.roundToInt() + if (workspaceSpec.endPadding.fixedSize > 0) + endPaddingPx = workspaceSpec.endPadding.fixedSize.roundToInt() + if (workspaceSpec.gutter.fixedSize > 0) + gutterPx = workspaceSpec.gutter.fixedSize.roundToInt() + if (workspaceSpec.cellSize.fixedSize > 0) + cellSizePx = workspaceSpec.cellSize.fixedSize.roundToInt() + + // Calculate all available space next + if (workspaceSpec.startPadding.ofAvailableSpace > 0) + startPaddingPx = + (workspaceSpec.startPadding.ofAvailableSpace * availableSpace).roundToInt() + if (workspaceSpec.endPadding.ofAvailableSpace > 0) + endPaddingPx = (workspaceSpec.endPadding.ofAvailableSpace * availableSpace).roundToInt() + if (workspaceSpec.gutter.ofAvailableSpace > 0) + gutterPx = (workspaceSpec.gutter.ofAvailableSpace * availableSpace).roundToInt() + if (workspaceSpec.cellSize.ofAvailableSpace > 0) + cellSizePx = (workspaceSpec.cellSize.ofAvailableSpace * availableSpace).roundToInt() + + // Calculate remainder space last + val gutters = cells - 1 + val usedSpace = startPaddingPx + endPaddingPx + (gutterPx * gutters) + (cellSizePx * cells) + val remainderSpace = availableSpace - usedSpace + if (workspaceSpec.startPadding.ofRemainderSpace > 0) + startPaddingPx = + (workspaceSpec.startPadding.ofRemainderSpace * remainderSpace).roundToInt() + if (workspaceSpec.endPadding.ofRemainderSpace > 0) + endPaddingPx = (workspaceSpec.endPadding.ofRemainderSpace * remainderSpace).roundToInt() + if (workspaceSpec.gutter.ofRemainderSpace > 0) + gutterPx = (workspaceSpec.gutter.ofRemainderSpace * remainderSpace).roundToInt() + if (workspaceSpec.cellSize.ofRemainderSpace > 0) + cellSizePx = (workspaceSpec.cellSize.ofRemainderSpace * remainderSpace).roundToInt() + } } data class WorkspaceSpec( @@ -220,7 +292,7 @@ class SizeSpec(resourceHelper: ResourceHelper, attrs: AttributeSet) { fun isValid(): Boolean { // All attributes are empty - if (fixedSize <= 0f && ofAvailableSpace <= 0f && ofRemainderSpace <= 0f) { + if (fixedSize < 0f && ofAvailableSpace <= 0f && ofRemainderSpace <= 0f) { Log.e(TAG, "SizeSpec#isValid - all attributes are empty") return false } |