Merge changes from topic "revert-17983445-hotseat_span-WQWWPUHOTD" into tm-dev

* changes:
  Revert "Fix hotseat width to span a number of columns"
  Revert "Update workspace, cell layout, shortcut and widget, and cell size calculations."
This commit is contained in:
Sunny Goyal
2022-05-09 23:14:38 +00:00
committed by Android (Google) Code Review
14 changed files with 76 additions and 426 deletions
@@ -66,9 +66,9 @@ public class OverviewState extends LauncherState {
@Override
public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) {
RecentsView recentsView = launcher.getOverviewPanel();
float workspacePageHeight = launcher.getDeviceProfile().getCellLayoutHeight();
float workspacePageWidth = launcher.getDeviceProfile().getWorkspaceWidth();
recentsView.getTaskSize(sTempRect);
float scale = (float) sTempRect.height() / workspacePageHeight;
float scale = (float) sTempRect.width() / workspacePageWidth;
float parallaxFactor = 0.5f;
return new ScaleAndTranslation(scale, 0, -getDefaultSwipeHeight(launcher) * parallaxFactor);
}
@@ -256,7 +256,7 @@ public class TaskIconCache implements DisplayInfoChangeListener {
private BaseIconFactory getIconFactory() {
if (mIconFactory == null) {
mIconFactory = new BaseIconFactory(mContext,
DisplayController.INSTANCE.get(mContext).getInfo().getDensityDpi(),
DisplayController.INSTANCE.get(mContext).getInfo().densityDpi,
mContext.getResources().getDimensionPixelSize(R.dimen.taskbar_icon_size));
}
return mIconFactory;
-11
View File
@@ -306,17 +306,6 @@
if not specified -->
<attr name="allAppsBorderSpaceTwoPanelLandscapeVertical" format="float" />
<!-- alignment of hotseat to the grid.
Not applicable for 3 button mode when taskbar is enabled -->
<!-- defaults to numColumns, if not specified -->
<attr name="hotseatColumnSpan" format="integer" />
<!-- defaults to numColumns, if not specified -->
<attr name="hotseatColumnSpanLandscape" format="integer" />
<!-- defaults to numColumns, if not specified -->
<attr name="hotseatColumnSpanTwoPanelLandscape" format="integer" />
<!-- defaults to numColumns, if not specified -->
<attr name="hotseatColumnSpanTwoPanelPortrait" format="integer" />
<!-- defaults to borderSpaceDps, if not specified -->
<attr name="hotseatBorderSpace" format="float" />
<!-- defaults to hotseatBorderSpace, if not specified -->
-1
View File
@@ -176,7 +176,6 @@
launcher:allAppsBorderSpaceHorizontal="8"
launcher:allAppsBorderSpaceVertical="16"
launcher:allAppsBorderSpaceLandscape="16"
launcher:hotseatColumnSpanLandscape="4"
launcher:hotseatBorderSpace="58"
launcher:hotseatBorderSpaceLandscape="50.4"
launcher:canBeDefault="true" />
+45 -113
View File
@@ -158,7 +158,6 @@ public class DeviceProfile {
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;
@@ -359,7 +358,7 @@ public class DeviceProfile {
// We shrink hotseat sizes regardless of orientation, if nav buttons are inline and QSB
// might be inline in either orientations, to keep hotseat size consistent across rotation.
areNavButtonsInline = isTaskbarPresent && !isGestureMode;
boolean areNavButtonsInline = isTaskbarPresent && !isGestureMode;
if (areNavButtonsInline && canQsbInline) {
numShownHotseatIcons = inv.numShrunkenHotseatIcons;
} else {
@@ -374,14 +373,15 @@ public class DeviceProfile {
res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding);
if (isQsbInline) {
hotseatBarBottomPaddingPx = res.getDimensionPixelSize(R.dimen.inline_qsb_bottom_margin);
qsbWidth = calculateQsbWidth();
} 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);
qsbWidth = 0;
}
springLoadedHotseatBarTopMarginPx = res.getDimensionPixelSize(
R.dimen.spring_loaded_hotseat_top_margin);
hotseatBarSidePaddingEndPx =
@@ -390,7 +390,9 @@ public class DeviceProfile {
hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0;
hotseatExtraVerticalSize =
res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_extra_vertical_size);
updateHotseatIconSize(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics));
hotseatBorderSpace = pxFromDp(inv.hotseatBorderSpaces[mTypeIndex], mMetrics);
updateHotseatIconSize(
pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics));
qsbBottomMarginOriginalPx = isScalableGrid
? res.getDimensionPixelSize(R.dimen.scalable_grid_qsb_bottom_margin)
@@ -481,10 +483,6 @@ public class DeviceProfile {
cellLayoutPadding);
updateWorkspacePadding();
// Hotseat and QSB width depends on updated cellSize and workspace padding
hotseatBorderSpace = calculateHotseatBorderSpace();
qsbWidth = calculateQsbWidth();
flingToDeleteThresholdVelocity = res.getDimensionPixelSize(
R.dimen.drag_flingToDeleteMinVelocity);
@@ -495,26 +493,14 @@ public class DeviceProfile {
new DotRenderer(allAppsIconSizePx, dotPath, DEFAULT_DOT_SIZE);
}
/**
* QSB width is always calculated because when in 3 button nav the width doesn't follow the
* width of the hotseat.
*/
private int calculateQsbWidth() {
if (isQsbInline) {
int columns = getPanelCount() * inv.numColumns;
return getIconToIconWidthForColumns(columns)
- iconSizePx * numShownHotseatIcons
- hotseatBorderSpace * numShownHotseatIcons;
} else {
int columns = inv.hotseatColumnSpan[mTypeIndex];
return getIconToIconWidthForColumns(columns);
}
}
int columns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
private int getIconToIconWidthForColumns(int columns) {
return columns * getCellSize().x
+ (columns - 1) * cellLayoutBorderSpacePx.x
- (getCellSize().x - iconSizePx); // left and right cell space
return cellWidthPx * columns
+ cellLayoutBorderSpacePx.x * (columns - 1)
- (cellWidthPx - iconSizePx) // left and right cell space
- iconSizePx * numShownHotseatIcons
- hotseatBorderSpace * numShownHotseatIcons;
}
private int getHorizontalMarginPx(InvariantDeviceProfile idp, Resources res) {
@@ -665,10 +651,11 @@ public class DeviceProfile {
updateIconSize(1f, res);
updateWorkspacePadding();
Point workspacePadding = getTotalWorkspacePadding();
// Check to see if the icons fit within the available height.
float usedHeight = getCellLayoutHeightSpecification();
final int maxHeight = getCellLayoutHeight();
final int maxHeight = getWorkspaceHeight(workspacePadding);
float extraHeight = Math.max(0, maxHeight - usedHeight);
float scaleY = maxHeight / usedHeight;
boolean shouldScale = scaleY < 1f;
@@ -701,7 +688,7 @@ public class DeviceProfile {
}
private int getCellLayoutWidthSpecification() {
int numColumns = getPanelCount() * inv.numColumns;
int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
return (cellWidthPx * numColumns) + (cellLayoutBorderSpacePx.x * (numColumns - 1))
+ cellLayoutPaddingPx.left + cellLayoutPaddingPx.right;
}
@@ -754,6 +741,13 @@ public class DeviceProfile {
// All apps
updateAllAppsIconSize(scale, res);
// Hotseat
hotseatBorderSpace = pxFromDp(inv.hotseatBorderSpaces[mTypeIndex], mMetrics, scale);
if (isQsbInline) {
qsbWidth = calculateQsbWidth();
} else {
qsbWidth = 0;
}
updateHotseatIconSize(iconSizePx);
// Folder icon
@@ -761,23 +755,6 @@ public class DeviceProfile {
folderIconOffsetYPx = (iconSizePx - folderIconSizePx) / 2;
}
/**
* Hotseat width spans a certain number of columns on scalable grids.
* This method calculates the space between the icons to achieve that width.
*/
private int calculateHotseatBorderSpace() {
if (!isScalableGrid) return 0;
//TODO(http://b/228998082) remove this when 3 button spaces are fixed
if (areNavButtonsInline) {
return pxFromDp(inv.hotseatBorderSpaces[mTypeIndex], mMetrics);
} else {
int columns = inv.hotseatColumnSpan[mTypeIndex];
float hotseatWidthPx = getIconToIconWidthForColumns(columns);
float hotseatIconsTotalPx = iconSizePx * numShownHotseatIcons;
return (int) (hotseatWidthPx - hotseatIconsTotalPx) / (numShownHotseatIcons - 1);
}
}
/**
* Updates the iconSize for allApps* variants.
@@ -901,18 +878,16 @@ public class DeviceProfile {
result = new Point();
}
result.x = calculateCellWidth(getShortcutAndWidgetContainerWidth(),
cellLayoutBorderSpacePx.x, inv.numColumns);
result.y = calculateCellHeight(getShortcutAndWidgetContainerHeight(),
cellLayoutBorderSpacePx.y, inv.numRows);
return result;
}
// Since we are only concerned with the overall padding, layout direction does
// not matter.
Point padding = getTotalWorkspacePadding();
/**
* Gets the number of panels within the workspace.
*/
public int getPanelCount() {
return isTwoPanels ? 2 : 1;
int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
int screenWidthPx = getWorkspaceWidth(padding);
result.x = calculateCellWidth(screenWidthPx, cellLayoutBorderSpacePx.x, numColumns);
int screenHeightPx = getWorkspaceHeight(padding);
result.y = calculateCellHeight(screenHeightPx, cellLayoutBorderSpacePx.y, inv.numRows);
return result;
}
/**
@@ -933,7 +908,7 @@ public class DeviceProfile {
/**
* Gets the scaled top of the workspace in px for the spring-loaded edit state.
*/
public float getCellLayoutSpringLoadShrunkTop() {
public float getWorkspaceSpringLoadShrunkTop() {
workspaceSpringLoadShrunkTop = mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx
+ dropTargetBarBottomMarginPx;
return workspaceSpringLoadShrunkTop;
@@ -942,7 +917,7 @@ public class DeviceProfile {
/**
* Gets the scaled bottom of the workspace in px for the spring-loaded edit state.
*/
private float getCellLayoutSpringLoadShrunkBottom() {
private float getWorkspaceSpringLoadShrunkBottom() {
int topOfHotseat = hotseatBarSizePx + springLoadedHotseatBarTopMarginPx;
workspaceSpringLoadShrunkBottom =
heightPx - (isVerticalBarLayout() ? getVerticalHotseatLastItemBottomOffset()
@@ -961,8 +936,9 @@ public class DeviceProfile {
* Gets the scale of the workspace for the spring-loaded edit state.
*/
public float getWorkspaceSpringLoadScale() {
float scale = (getCellLayoutSpringLoadShrunkBottom() - getCellLayoutSpringLoadShrunkTop())
/ getCellLayoutHeight();
float cellLayoutHeight = availableHeightPx - workspacePadding.top - workspacePadding.bottom;
float scale = (getWorkspaceSpringLoadShrunkBottom() - getWorkspaceSpringLoadShrunkTop())
/ cellLayoutHeight;
scale = Math.min(scale, 1f);
// Reduce scale if next pages would not be visible after scaling the workspace
@@ -976,55 +952,19 @@ public class DeviceProfile {
return scale;
}
/**
* Gets the width of the Workspace, aka a scrollable page of the homescreen.
*/
public int getWorkspaceWidth() {
return availableWidthPx;
return getWorkspaceWidth(getTotalWorkspacePadding());
}
/**
* Gets the height of the Workspace, aka a scrollable page of the homescreen.
*/
public int getWorkspaceHeight() {
return availableHeightPx;
public int getWorkspaceWidth(Point workspacePadding) {
int cellLayoutTotalPadding =
(isTwoPanels ? 2 : 1) * (cellLayoutPaddingPx.left + cellLayoutPaddingPx.right);
return availableWidthPx - workspacePadding.x - cellLayoutTotalPadding;
}
/**
* Gets the width of a single Cell Layout, aka a single panel within a Workspace.
*
* <p>This is the width of a Workspace, less its horizontal padding. Note that two-panel
* layouts have two Cell Layouts per workspace.
*/
public int getCellLayoutWidth() {
return (getWorkspaceWidth() - getTotalWorkspacePadding().x) / getPanelCount();
}
/**
* Gets the height of a single Cell Layout, aka a single panel within a Workspace.
*
* <p>This is the height of a Workspace, less its vertical padding.
*/
public int getCellLayoutHeight() {
return getWorkspaceHeight() - getTotalWorkspacePadding().y;
}
/**
* Gets the width of the container holding the shortcuts and widgets.
*
* <p>This is the width of one Cell Layout less its horizontal padding.
*/
public int getShortcutAndWidgetContainerWidth() {
return getCellLayoutWidth() - (cellLayoutPaddingPx.left + cellLayoutPaddingPx.right);
}
/**
* Gets the height of the container holding the shortcuts and widgets.
*
* <p>This is the height of one Cell Layout less its vertical padding.
*/
public int getShortcutAndWidgetContainerHeight() {
return getCellLayoutHeight() - (cellLayoutPaddingPx.top + cellLayoutPaddingPx.bottom);
private int getWorkspaceHeight(Point workspacePadding) {
return availableHeightPx - workspacePadding.y - (cellLayoutPaddingPx.top
+ cellLayoutPaddingPx.bottom);
}
public Point getTotalWorkspacePadding() {
@@ -1130,13 +1070,6 @@ public class DeviceProfile {
mHotseatPadding.left -= diff;
mHotseatPadding.right += diff;
}
} else if (isScalableGrid) {
int sideSpacing = (availableWidthPx - qsbWidth) / 2;
mHotseatPadding.set(sideSpacing,
hotseatBarTopPaddingPx,
sideSpacing,
hotseatBarSizePx - hotseatCellHeightPx - hotseatBarTopPaddingPx
+ mInsets.bottom);
} 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
@@ -1373,7 +1306,6 @@ public class DeviceProfile {
writer.println(prefix + pxToDpStr("allAppsLeftRightMargin", allAppsLeftRightMargin));
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));
@@ -1452,7 +1384,7 @@ public class DeviceProfile {
private static Context getContext(Context c, Info info, int orientation, WindowBounds bounds) {
Configuration config = new Configuration(c.getResources().getConfiguration());
config.orientation = orientation;
config.densityDpi = info.getDensityDpi();
config.densityDpi = info.densityDpi;
config.smallestScreenWidthDp = (int) info.smallestSizeDp(bounds);
return c.createConfigurationContext(config);
}
+10 -2
View File
@@ -173,9 +173,17 @@ public class Hotseat extends CellLayout implements Insettable {
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int qsbWidth = mActivity.getDeviceProfile().qsbWidth;
int width;
if (mActivity.getDeviceProfile().isQsbInline) {
width = mActivity.getDeviceProfile().qsbWidth;
} else {
MarginLayoutParams qsbParams = (MarginLayoutParams) mQsb.getLayoutParams();
width = getShortcutsAndWidgets().getMeasuredWidth()
- qsbParams.getMarginStart()
- qsbParams.getMarginEnd();
}
mQsb.measure(MeasureSpec.makeMeasureSpec(qsbWidth, MeasureSpec.EXACTLY),
mQsb.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mQsbHeight, MeasureSpec.EXACTLY));
}
@@ -127,7 +127,6 @@ public class InvariantDeviceProfile {
public PointF[] borderSpaces;
public float folderBorderSpace;
public float[] hotseatBorderSpaces;
public int[] hotseatColumnSpan;
public float[] horizontalMargin;
@@ -359,7 +358,6 @@ public class InvariantDeviceProfile {
numDatabaseHotseatIcons = deviceType == TYPE_MULTI_DISPLAY
? closestProfile.numDatabaseHotseatIcons : closestProfile.numHotseatIcons;
hotseatBorderSpaces = displayOption.hotseatBorderSpaces;
hotseatColumnSpan = displayOption.hotseatColumnSpan;
numAllAppsColumns = closestProfile.numAllAppsColumns;
numDatabaseAllAppsColumns = deviceType == TYPE_MULTI_DISPLAY
@@ -400,8 +398,7 @@ public class InvariantDeviceProfile {
// We need to ensure that there is enough extra space in the wallpaper
// for the intended parallax effects
float parallaxFactor =
dpiFromPx(Math.min(displayWidth, displayHeight), displayInfo.getDensityDpi())
< 720
dpiFromPx(Math.min(displayWidth, displayHeight), displayInfo.densityDpi) < 720
? 2
: wallpaperTravelToScreenWidthRatio(displayWidth, displayHeight);
defaultWallpaperSize.x =
@@ -590,8 +587,8 @@ public class InvariantDeviceProfile {
}
}
float width = dpiFromPx(minWidthPx, displayInfo.getDensityDpi());
float height = dpiFromPx(minHeightPx, displayInfo.getDensityDpi());
float width = dpiFromPx(minWidthPx, displayInfo.densityDpi);
float height = dpiFromPx(minHeightPx, displayInfo.densityDpi);
// Sort the profiles based on the closeness to the device size
Collections.sort(points, (a, b) ->
@@ -824,9 +821,7 @@ public class InvariantDeviceProfile {
private float folderBorderSpace;
private final PointF[] borderSpaces = new PointF[COUNT_SIZES];
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 int[] hotseatColumnSpan = new int[COUNT_SIZES];
private final float[] iconSizes = new float[COUNT_SIZES];
private final float[] textSizes = new float[COUNT_SIZES];
@@ -1052,17 +1047,6 @@ public class InvariantDeviceProfile {
R.styleable.ProfileDisplayOption_hotseatBorderSpaceTwoPanelPortrait,
hotseatBorderSpaces[INDEX_DEFAULT]);
hotseatColumnSpan[INDEX_DEFAULT] = a.getInt(
R.styleable.ProfileDisplayOption_hotseatColumnSpan, grid.numColumns);
hotseatColumnSpan[INDEX_LANDSCAPE] = a.getInt(
R.styleable.ProfileDisplayOption_hotseatColumnSpanLandscape, grid.numColumns);
hotseatColumnSpan[INDEX_TWO_PANEL_LANDSCAPE] = a.getInt(
R.styleable.ProfileDisplayOption_hotseatColumnSpanTwoPanelLandscape,
grid.numColumns);
hotseatColumnSpan[INDEX_TWO_PANEL_PORTRAIT] = a.getInt(
R.styleable.ProfileDisplayOption_hotseatColumnSpanTwoPanelPortrait,
grid.numColumns);
a.recycle();
}
@@ -1121,7 +1105,6 @@ public class InvariantDeviceProfile {
minCellSize[i].y += p.minCellSize[i].y;
horizontalMargin[i] += p.horizontalMargin[i];
hotseatBorderSpaces[i] += p.hotseatBorderSpaces[i];
hotseatColumnSpan[i] = p.hotseatColumnSpan[i];
allAppsCellSize[i].x += p.allAppsCellSize[i].x;
allAppsCellSize[i].y += p.allAppsCellSize[i].y;
allAppsIconSizes[i] += p.allAppsIconSizes[i];
@@ -51,7 +51,7 @@ public class SpringLoadedState extends LauncherState {
return super.getWorkspaceScaleAndTranslation(launcher);
}
float shrunkTop = grid.getCellLayoutSpringLoadShrunkTop();
float shrunkTop = grid.getWorkspaceSpringLoadShrunkTop();
float scale = grid.getWorkspaceSpringLoadScale();
float halfHeight = ws.getHeight() / 2;
@@ -290,7 +290,7 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
// Configuration property
public final float fontScale;
private final int densityDpi;
public final int densityDpi;
public final NavigationMode navigationMode;
private final PortraitSize mScreenSizeDp;
@@ -357,10 +357,6 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
public float smallestSizeDp(WindowBounds bounds) {
return dpiFromPx(Math.min(bounds.bounds.width(), bounds.bounds.height()), densityDpi);
}
public int getDensityDpi() {
return densityDpi;
}
}
/**
@@ -64,7 +64,6 @@ abstract class DeviceProfileBaseTest {
windowBounds = WindowBounds(x, y, x, y - 100, 0)
whenever(info.isTablet(any())).thenReturn(false)
whenever(info.getDensityDpi()).thenReturn(560)
inv = newScalableInvariantDeviceProfile()
}
@@ -78,7 +77,6 @@ abstract class DeviceProfileBaseTest {
windowBounds = WindowBounds(x, y, x, y - 100, 0)
whenever(info.isTablet(any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = newScalableInvariantDeviceProfile()
}
@@ -109,7 +107,6 @@ abstract class DeviceProfileBaseTest {
PointF(16f, 16f)
).toTypedArray()
hotseatBorderSpaces = FloatArray(4) { 16f }
hotseatColumnSpan = IntArray(4) { 4 }
iconSize = FloatArray(4) { 56f }
allAppsIconSize = FloatArray(4) { 56f }
iconTextSize = FloatArray(4) { 14f }
@@ -1,258 +0,0 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.launcher3
import android.graphics.PointF
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.util.WindowBounds
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
import org.mockito.Mockito.`when` as whenever
/**
* Test for [DeviceProfile] grid dimensions.
*
* This includes workspace, cell layout, shortcut and widget container, cell sizes, etc.
*/
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeviceProfileGridDimensionsTest : DeviceProfileBaseTest() {
@Test
fun getWorkspaceWidth_twoPanelLandscapeScalable4By4GridTablet_workspaceWidthIsFullPage() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceWidth = availableWidth
assertThat(dp.workspaceWidth).isEqualTo(expectedWorkspaceWidth)
}
@Test
fun getWorkspaceHeight_twoPanelLandscapeScalable4By4GridTablet_workspaceHeightIsFullPage() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceHeight = availableHeight
assertThat(dp.workspaceHeight).isEqualTo(expectedWorkspaceHeight)
}
@Test
fun getCellLayoutWidth_twoPanelLandscapeScalable4By4GridTablet_equalsSinglePanelWidth() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceWidth = availableWidth
val expectedCellLayoutWidth =
(expectedWorkspaceWidth - (dp.workspacePadding.right + dp.workspacePadding.left)) /
dp.panelCount
assertThat(dp.cellLayoutWidth).isEqualTo(expectedCellLayoutWidth)
}
@Test
fun getCellLayoutHeight_twoPanelLandscapeScalable4By4GridTablet_equalsSinglePanelHeight() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceHeight = availableHeight
val expectedCellLayoutHeight =
expectedWorkspaceHeight - (dp.workspacePadding.top + dp.workspacePadding.bottom)
assertThat(dp.cellLayoutHeight).isEqualTo(expectedCellLayoutHeight)
}
@Test
fun getShortcutAndWidgetContainerWidth_twoPanelLandscapeScalable4By4GridTablet_equalsIconsPlusBorderSpacesWidth() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceWidth = availableWidth
val expectedCellLayoutWidth =
(expectedWorkspaceWidth - (dp.workspacePadding.right + dp.workspacePadding.left)) /
dp.panelCount
val expectedShortcutAndWidgetContainerWidth = expectedCellLayoutWidth -
(dp.cellLayoutPaddingPx.left + dp.cellLayoutPaddingPx.right)
assertThat(dp.shortcutAndWidgetContainerWidth).isEqualTo(expectedShortcutAndWidgetContainerWidth)
}
@Test
fun getShortcutAndWidgetContainerHeight_twoPanelLandscapeScalable4By4GridTablet_equalsIconsPlusBorderSpacesHeight() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceHeight = availableHeight
val expectedCellLayoutHeight =
expectedWorkspaceHeight - (dp.workspacePadding.top + dp.workspacePadding.bottom)
val expectedShortcutAndWidgetContainerHeight = expectedCellLayoutHeight -
(dp.cellLayoutPaddingPx.top + dp.cellLayoutPaddingPx.bottom)
assertThat(dp.shortcutAndWidgetContainerHeight).isEqualTo(
expectedShortcutAndWidgetContainerHeight)
}
@Test
fun getCellSize_twoPanelLandscapeScalable4By4GridTablet_equalsSinglePanelWidth() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
val expectedWorkspaceWidth = availableWidth
val expectedCellLayoutWidth =
(expectedWorkspaceWidth - (dp.workspacePadding.right + dp.workspacePadding.left)) /
dp.panelCount
val expectedShortcutAndWidgetContainerWidth =
expectedCellLayoutWidth -
(dp.cellLayoutPaddingPx.left + dp.cellLayoutPaddingPx.right)
assertThat(dp.getCellSize().x).isEqualTo(
(expectedShortcutAndWidgetContainerWidth -
((inv!!.numColumns - 1) * dp.cellLayoutBorderSpacePx.x)) / inv!!.numColumns)
val expectedWorkspaceHeight = availableHeight
val expectedCellLayoutHeight =
expectedWorkspaceHeight - (dp.workspacePadding.top + dp.workspacePadding.bottom)
val expectedShortcutAndWidgetContainerHeight = expectedCellLayoutHeight -
(dp.cellLayoutPaddingPx.top + dp.cellLayoutPaddingPx.bottom)
assertThat(dp.getCellSize().y).isEqualTo(
(expectedShortcutAndWidgetContainerHeight -
((inv!!.numRows - 1) * dp.cellLayoutBorderSpacePx.y)) / inv!!.numRows)
}
@Test
fun getPanelCount_twoPanelLandscapeScalable4By4GridTablet_equalsTwoPanels() {
val tabletWidth = 2560
val tabletHeight = 1600
val availableWidth = 2560
val availableHeight = 1500
windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
useTwoPanels = true
whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
whenever(info.getDensityDpi()).thenReturn(320)
inv = getScalable4By4InvariantDeviceProfile()
val dp = newDP()
assertThat(dp.panelCount).isEqualTo(2)
}
fun getScalable4By4InvariantDeviceProfile(): InvariantDeviceProfile {
return InvariantDeviceProfile().apply {
isScalable = true
numColumns = 4
numRows = 4
numShownHotseatIcons = 4
numDatabaseHotseatIcons = 6
numShrunkenHotseatIcons = 5
horizontalMargin = FloatArray(4) { 22f }
borderSpaces = listOf(
PointF(16f, 16f),
PointF(16f, 16f),
PointF(16f, 16f),
PointF(16f, 16f)
).toTypedArray()
allAppsBorderSpaces = listOf(
PointF(16f, 16f),
PointF(16f, 16f),
PointF(16f, 16f),
PointF(16f, 16f)
).toTypedArray()
hotseatBorderSpaces = FloatArray(4) { 16f }
hotseatColumnSpan = IntArray(4) { 4 }
iconSize = FloatArray(4) { 56f }
allAppsIconSize = FloatArray(4) { 56f }
iconTextSize = FloatArray(4) { 14f }
allAppsIconTextSize = FloatArray(4) { 14f }
minCellSize = listOf(
PointF(64f, 83f),
PointF(64f, 83f),
PointF(64f, 83f),
PointF(64f, 83f)
).toTypedArray()
allAppsCellSize = listOf(
PointF(64f, 83f),
PointF(64f, 83f),
PointF(64f, 83f),
PointF(64f, 83f)
).toTypedArray()
inlineQsb = booleanArrayOf(
false,
false,
false,
false
)
}
}
}
@@ -23,13 +23,15 @@ import com.android.launcher3.InvariantDeviceProfile.TYPE_TABLET
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
import org.mockito.Mockito.`when` as whenever
/**
* Test for [DeviceProfile]
*/
@SmallTest
@RunWith(AndroidJUnit4::class)
class HotseatShownIconsTest : DeviceProfileBaseTest() {
class HotseatSizeTest : DeviceProfileBaseTest() {
@Test
fun hotseat_size_is_normal_for_handhelds() {
@@ -29,16 +29,17 @@ import org.junit.runner.RunWith
class InlineQsbTest : DeviceProfileBaseTest() {
@Test
fun qsb_is_not_inline_for_phones() {
fun qsbWidth_is_match_parent_for_phones() {
initializeVarsForPhone()
val dp = newDP()
assertThat(dp.isQsbInline).isFalse()
assertThat(dp.qsbWidth).isEqualTo(0)
}
@Test
fun qsb_is_inline_for_tablet_portrait() {
fun qsbWidth_is_match_parent_for_tablet_portrait() {
initializeVarsForTablet()
inv = newScalableInvariantDeviceProfile().apply {
inlineQsb = booleanArrayOf(
@@ -61,10 +62,11 @@ class InlineQsbTest : DeviceProfileBaseTest() {
)
assertThat(dp.isQsbInline).isFalse()
assertThat(dp.qsbWidth).isEqualTo(0)
}
@Test
fun qsb_is_inline_for_tablet_landscape() {
fun qsbWidth_has_size_for_tablet_landscape() {
initializeVarsForTablet(isLandscape = true)
inv = newScalableInvariantDeviceProfile().apply {
inlineQsb = booleanArrayOf(
@@ -73,17 +75,16 @@ class InlineQsbTest : DeviceProfileBaseTest() {
false,
false
)
numColumns = 6
numRows = 5
numShownHotseatIcons = 6
}
val dp = newDP()
if (dp.hotseatQsbHeight > 0) {
assertThat(dp.isQsbInline).isTrue()
assertThat(dp.qsbWidth).isGreaterThan(0)
} else { // Launcher3 doesn't have QSB height
assertThat(dp.isQsbInline).isFalse()
assertThat(dp.qsbWidth).isEqualTo(0)
}
}
@@ -91,13 +92,14 @@ class InlineQsbTest : DeviceProfileBaseTest() {
* This test is to make sure that a tablet doesn't inline the QSB if the layout doesn't support
*/
@Test
fun qsb_is_not_inline_for_tablet_landscape_without_inline() {
fun qsbWidth_is_match_parent_for_tablet_landscape_without_inline() {
initializeVarsForTablet(isLandscape = true)
useTwoPanels = true
val dp = newDP()
assertThat(dp.isQsbInline).isFalse()
assertThat(dp.qsbWidth).isEqualTo(0)
}
}
@@ -135,7 +135,7 @@ public class DeviceEmulationData {
resourceOverrides.put(s, getDimenByName(s, context.getResources(), 0));
}
return new DeviceEmulationData(info.currentSize.x, info.currentSize.y,
info.getDensityDpi(), info.cutout, code, grids, resourceOverrides);
info.densityDpi, info.cutout, code, grids, resourceOverrides);
}
public static DeviceEmulationData getDevice(String deviceCode) throws Exception {