diff --git a/res/drawable/drop_target_frame.xml b/res/drawable/drop_target_frame.xml index 9f04103510..666a96e940 100644 --- a/res/drawable/drop_target_frame.xml +++ b/res/drawable/drop_target_frame.xml @@ -17,6 +17,6 @@ - + \ No newline at end of file diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml index 422240c939..662b86ebbe 100644 --- a/res/values-land/dimens.xml +++ b/res/values-land/dimens.xml @@ -22,22 +22,8 @@ 24dp - 15.28dp 4dp - 36dp - 20dp 16dp - 45dp - - - 28dp - 16dp - 2dp - 6dp - 6dp - - - 24dp diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml deleted file mode 100644 index daca048878..0000000000 --- a/res/values-sw600dp-land/dimens.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - 44dp - - - 11.33dp - 11.33dp - - - 0dp - 16dp - - - 52dp - diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml index 73edc6f8bd..4a10e5689a 100644 --- a/res/values-sw600dp/dimens.xml +++ b/res/values-sw600dp/dimens.xml @@ -32,22 +32,8 @@ 32dp - 9dp 7dp - 9dp - 0dp - 97dp - - - 34dp - 16dp - 16dp - 16dp - 56dp - - - 6dp diff --git a/res/values-sw720dp-land/dimens.xml b/res/values-sw720dp-land/dimens.xml index eb5c751588..9821526d4d 100644 --- a/res/values-sw720dp-land/dimens.xml +++ b/res/values-sw720dp-land/dimens.xml @@ -15,23 +15,9 @@ --> - - 0dp - 32dp - - - 21.93dp - 29.33dp - - - 64dp - - - 32dp - - + 49dp - + 0dp diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml index 3ec211a142..7ebc3f886b 100644 --- a/res/values-sw720dp/dimens.xml +++ b/res/values-sw720dp/dimens.xml @@ -16,23 +16,7 @@ - 28dp - - - 27.59dp - 36dp - - - 20sp - 72dp - 24dp - 20dp - 32dp - 32dp - 32dp - - - 164dp + 65dp 30dp diff --git a/res/values/config.xml b/res/values/config.xml index 5e90bea98a..e2fd0e3bc8 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -22,6 +22,9 @@ + + 85 + 50 diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 0615053de8..537e0e3d3c 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -19,14 +19,14 @@ 4dp - 10.77dp + 8dp 8dp 7dp 8dp 16dp - 10.77dp + 5.5dp 8dp @@ -34,7 +34,6 @@ 2dp 0dp 0dp - 76dp - 56dp + 52dp 20dp - 36dp - 16dp 13dp @@ -209,9 +206,6 @@ 2dp 4dp 8dp - 16dp - 8dp - 22dp 30dp @@ -366,9 +360,8 @@ - 28dp - 6dp - 6dp + 22dp + 6dp 48dp diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index f7133c49dd..d235180314 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -148,8 +148,7 @@ public class CellLayout extends ViewGroup { private boolean mVisualizeDropLocation = true; private RectF mVisualizeGridRect = new RectF(); private Paint mVisualizeGridPaint = new Paint(); - private int mGridVisualizationPaddingX; - private int mGridVisualizationPaddingY; + private int mGridVisualizationPadding; private int mGridVisualizationRoundingRadius; private float mGridAlpha = 0f; private int mGridColor = 0; @@ -261,10 +260,8 @@ public class CellLayout extends ViewGroup { mBackground.setAlpha(0); mGridColor = Themes.getAttrColor(getContext(), R.attr.workspaceAccentColor); - mGridVisualizationPaddingX = res.getDimensionPixelSize( - R.dimen.grid_visualization_horizontal_cell_spacing); - mGridVisualizationPaddingY = res.getDimensionPixelSize( - R.dimen.grid_visualization_vertical_cell_spacing); + mGridVisualizationPadding = + res.getDimensionPixelSize(R.dimen.grid_visualization_cell_spacing); mGridVisualizationRoundingRadius = res.getDimensionPixelSize(R.dimen.grid_visualization_rounding_radius); mReorderPreviewAnimationMagnitude = (REORDER_PREVIEW_MAGNITUDE * deviceProfile.iconSizePx); @@ -594,8 +591,8 @@ public class CellLayout extends ViewGroup { protected void visualizeGrid(Canvas canvas) { DeviceProfile dp = mActivity.getDeviceProfile(); - int paddingX = Math.min((mCellWidth - dp.iconSizePx) / 2, mGridVisualizationPaddingX); - int paddingY = Math.min((mCellHeight - dp.iconSizePx) / 2, mGridVisualizationPaddingY); + int paddingX = (int) Math.min((mCellWidth - dp.iconSizePx) / 2, mGridVisualizationPadding); + int paddingY = (int) Math.min((mCellHeight - dp.iconSizePx) / 2, mGridVisualizationPadding); mVisualizeGridRect.set(paddingX, paddingY, mCellWidth - paddingX, mCellHeight - paddingY); diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 0c33bce5e0..6a3ce2be20 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -94,16 +94,18 @@ public class DeviceProfile { private static final float TALL_DEVICE_EXTRA_SPACE_THRESHOLD_DP = 252; private static final float TALL_DEVICE_MORE_EXTRA_SPACE_THRESHOLD_DP = 268; + // To evenly space the icons, increase the left/right margins for tablets in portrait mode. + private static final int PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER = 4; + // Workspace public final int desiredWorkspaceHorizontalMarginOriginalPx; public int desiredWorkspaceHorizontalMarginPx; public Point cellLayoutBorderSpaceOriginalPx; public Point cellLayoutBorderSpacePx; - public Rect cellLayoutPaddingPx = new Rect(); - + public final int cellLayoutPaddingLeftRightPx; + public final int cellLayoutBottomPaddingPx; public final int edgeMarginPx; - public float workspaceSpringLoadShrunkTop; - public float workspaceSpringLoadShrunkBottom; + public float workspaceSpringLoadShrinkFactor; public final int workspaceSpringLoadedBottomSpace; private final int extraSpace; @@ -159,7 +161,6 @@ public class DeviceProfile { public int hotseatBarSizePx; public int hotseatBarTopPaddingPx; public final int hotseatBarBottomPaddingPx; - 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; @@ -205,13 +206,8 @@ public class DeviceProfile { // Drop Target public int dropTargetBarSizePx; - public int dropTargetBarTopMarginPx; - public int dropTargetBarBottomMarginPx; public int dropTargetDragPaddingPx; public int dropTargetTextSizePx; - public int dropTargetHorizontalPaddingPx; - public int dropTargetVerticalPaddingPx; - public int dropTargetGapPx; // Insets private final Rect mInsets = new Rect(); @@ -323,6 +319,23 @@ public class DeviceProfile { folderCellLayoutBorderSpacePx = new Point(folderCellLayoutBorderSpaceOriginalPx, folderCellLayoutBorderSpaceOriginalPx); + int cellLayoutPaddingLeftRightMultiplier = !isVerticalBarLayout() && isTablet + ? PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER : 1; + int cellLayoutPadding = isScalableGrid + ? 0 + : res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding); + + if (isTwoPanels) { + cellLayoutPaddingLeftRightPx = 0; + cellLayoutBottomPaddingPx = 0; + } else if (isLandscape) { + cellLayoutPaddingLeftRightPx = 0; + cellLayoutBottomPaddingPx = cellLayoutPadding; + } else { + cellLayoutPaddingLeftRightPx = cellLayoutPaddingLeftRightMultiplier * cellLayoutPadding; + cellLayoutBottomPaddingPx = 0; + } + workspacePageIndicatorHeight = res.getDimensionPixelSize( R.dimen.workspace_page_indicator_height); mWorkspacePageIndicatorOverlapWorkspace = @@ -332,15 +345,8 @@ public class DeviceProfile { res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding); dropTargetBarSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_drop_target_size); - dropTargetBarTopMarginPx = res.getDimensionPixelSize(R.dimen.drop_target_top_margin); - dropTargetBarBottomMarginPx = res.getDimensionPixelSize(R.dimen.drop_target_bottom_margin); dropTargetDragPaddingPx = res.getDimensionPixelSize(R.dimen.drop_target_drag_padding); dropTargetTextSizePx = res.getDimensionPixelSize(R.dimen.drop_target_text_size); - dropTargetHorizontalPaddingPx = res.getDimensionPixelSize( - R.dimen.drop_target_button_drawable_horizontal_padding); - dropTargetVerticalPaddingPx = res.getDimensionPixelSize( - R.dimen.drop_target_button_drawable_vertical_padding); - dropTargetGapPx = res.getDimensionPixelSize(R.dimen.drop_target_button_gap); workspaceSpringLoadedBottomSpace = res.getDimensionPixelSize(R.dimen.dynamic_grid_min_spring_loaded_space); @@ -378,8 +384,6 @@ public class DeviceProfile { + res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_padding); qsbWidth = 0; } - 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. @@ -473,12 +477,6 @@ public class DeviceProfile { // Recalculate the available dimensions using the new hotseat size. updateAvailableDimensions(res); } - - int cellLayoutPadding = - isTwoPanels ? cellLayoutBorderSpacePx.x / 2 : res.getDimensionPixelSize( - R.dimen.cell_layout_padding); - cellLayoutPaddingPx = new Rect(cellLayoutPadding, cellLayoutPadding, cellLayoutPadding, - cellLayoutPadding); updateWorkspacePadding(); flingToDeleteThresholdVelocity = res.getDimensionPixelSize( @@ -591,6 +589,7 @@ public class DeviceProfile { float appWidgetScaleX = (float) profile.getCellSize().x / getCellSize().x; float appWidgetScaleY = (float) profile.getCellSize().y / getCellSize().y; profile.appWidgetScale.set(appWidgetScaleX, appWidgetScaleY); + profile.updateWorkspacePadding(); return profile; } @@ -625,19 +624,18 @@ public class DeviceProfile { } private void updateAllAppsContainerWidth(Resources res) { - int cellLayoutHorizontalPadding = - (cellLayoutPaddingPx.left + cellLayoutPaddingPx.right) / 2; + if (isTablet) { allAppsLeftRightPadding = - res.getDimensionPixelSize(R.dimen.all_apps_bottom_sheet_horizontal_padding); - + res.getDimensionPixelSize(R.dimen.all_apps_bottom_sheet_horizontal_padding) + + cellLayoutPaddingLeftRightPx; int usedWidth = (allAppsCellWidthPx * numShownAllAppsColumns) + (allAppsBorderSpacePx.x * (numShownAllAppsColumns - 1)) + allAppsLeftRightPadding * 2; allAppsLeftRightMargin = Math.max(1, (availableWidthPx - usedWidth) / 2); } else { allAppsLeftRightPadding = - desiredWorkspaceHorizontalMarginPx + cellLayoutHorizontalPadding; + desiredWorkspaceHorizontalMarginPx + cellLayoutPaddingLeftRightPx; } } @@ -647,12 +645,11 @@ public class DeviceProfile { private int updateAvailableDimensions(Resources res) { updateIconSize(1f, res); - updateWorkspacePadding(); Point workspacePadding = getTotalWorkspacePadding(); // Check to see if the icons fit within the available height. float usedHeight = getCellLayoutHeight(); - final int maxHeight = getWorkspaceHeight(workspacePadding); + final int maxHeight = availableHeightPx - workspacePadding.y; float extraHeight = Math.max(0, maxHeight - usedHeight); float scaleY = maxHeight / usedHeight; boolean shouldScale = scaleY < 1f; @@ -662,7 +659,10 @@ public class DeviceProfile { // We scale to fit the cellWidth and cellHeight in the available space. // The benefit of scalable grids is that we can get consistent aspect ratios between // devices. - float usedWidth = getCellLayoutWidth() + (desiredWorkspaceHorizontalMarginPx * 2); + int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns; + float usedWidth = (cellWidthPx * numColumns) + + (cellLayoutBorderSpacePx.x * (numColumns - 1)) + + (desiredWorkspaceHorizontalMarginPx * 2); // We do not subtract padding here, as we also scale the workspace padding if needed. scaleX = availableWidthPx / usedWidth; shouldScale = true; @@ -679,14 +679,7 @@ public class DeviceProfile { } private int getCellLayoutHeight() { - return (cellHeightPx * inv.numRows) + (cellLayoutBorderSpacePx.y * (inv.numRows - 1)) - + cellLayoutPaddingPx.top + cellLayoutPaddingPx.bottom; - } - - private int getCellLayoutWidth() { - int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns; - return (cellWidthPx * numColumns) + (cellLayoutBorderSpacePx.x * (numColumns - 1)) - + cellLayoutPaddingPx.left + cellLayoutPaddingPx.right; + return (cellHeightPx * inv.numRows) + (cellLayoutBorderSpacePx.y * (inv.numRows - 1)); } /** @@ -746,6 +739,18 @@ public class DeviceProfile { } updateHotseatIconSize(iconSizePx); + if (!isVerticalLayout) { + int expectedWorkspaceHeight = availableHeightPx - hotseatBarSizePx + - workspacePageIndicatorHeight - edgeMarginPx; + float minRequiredHeight = dropTargetBarSizePx + workspaceSpringLoadedBottomSpace; + workspaceSpringLoadShrinkFactor = Math.min( + res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f, + 1 - (minRequiredHeight / expectedWorkspaceHeight)); + } else { + workspaceSpringLoadShrinkFactor = + res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f; + } + // Folder icon folderIconSizePx = IconNormalizer.getNormalizedCircleSize(iconSizePx); folderIconOffsetYPx = (iconSizePx - folderIconSizePx) / 2; @@ -848,6 +853,7 @@ public class DeviceProfile { public void updateInsets(Rect insets) { mInsets.set(insets); + updateWorkspacePadding(); } /** @@ -874,62 +880,23 @@ public class DeviceProfile { 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); + result.y = calculateCellHeight(availableHeightPx - padding.y + - cellLayoutBottomPaddingPx, cellLayoutBorderSpacePx.y, inv.numRows); return result; } - /** - * Gets the space in px from the bottom of last item in the vertical-bar hotseat to the - * bottom of the screen. - */ - public int getVerticalHotseatLastItemBottomOffset() { - int cellHeight = calculateCellHeight( - heightPx - mHotseatPadding.top - mHotseatPadding.bottom, hotseatBorderSpace, - numShownHotseatIcons); - int hotseatSize = (cellHeight * numShownHotseatIcons) - + (hotseatBorderSpace * (numShownHotseatIcons - 1)); - int extraHotseatEndSpacing = (heightPx - hotseatSize) / 2; - int extraIconEndSpacing = (cellHeight - iconSizePx) / 2; - return extraHotseatEndSpacing + extraIconEndSpacing + mHotseatPadding.bottom; - } - - /** - * Gets the scaled top of the workspace in px for the spring-loaded edit state. - */ - public float getWorkspaceSpringLoadShrunkTop() { - workspaceSpringLoadShrunkTop = mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx - + dropTargetBarBottomMarginPx; - return workspaceSpringLoadShrunkTop; - } - - /** - * Gets the scaled bottom of the workspace in px for the spring-loaded edit state. - */ - public float getWorkspaceSpringLoadShrunkBottom() { - int topOfHotseat = hotseatBarSizePx + springLoadedHotseatBarTopMarginPx; - workspaceSpringLoadShrunkBottom = - heightPx - (isVerticalBarLayout() ? getVerticalHotseatLastItemBottomOffset() - : topOfHotseat); - return workspaceSpringLoadShrunkBottom; - } - public int getWorkspaceWidth() { return getWorkspaceWidth(getTotalWorkspacePadding()); } public int getWorkspaceWidth(Point workspacePadding) { int cellLayoutTotalPadding = - (isTwoPanels ? 2 : 1) * (cellLayoutPaddingPx.left + cellLayoutPaddingPx.right); + isTwoPanels ? 4 * cellLayoutPaddingLeftRightPx : 2 * cellLayoutPaddingLeftRightPx; return availableWidthPx - workspacePadding.x - cellLayoutTotalPadding; } - private int getWorkspaceHeight(Point workspacePadding) { - return availableHeightPx - workspacePadding.y - (cellLayoutPaddingPx.top - + cellLayoutPaddingPx.bottom); - } - public Point getTotalWorkspacePadding() { + updateWorkspacePadding(); return new Point(workspacePadding.left + workspacePadding.right, workspacePadding.top + workspacePadding.bottom); } @@ -955,26 +922,12 @@ public class DeviceProfile { int hotseatTop = hotseatBarSizePx; int paddingBottom = hotseatTop + workspacePageIndicatorHeight + workspaceBottomPadding - mWorkspacePageIndicatorOverlapWorkspace; - int paddingTop = workspaceTopPadding + (isScalableGrid ? 0 : edgeMarginPx); - int paddingSide = desiredWorkspaceHorizontalMarginPx; - padding.set(paddingSide, paddingTop, paddingSide, paddingBottom); + padding.set(desiredWorkspaceHorizontalMarginPx, + workspaceTopPadding + (isScalableGrid ? 0 : edgeMarginPx), + desiredWorkspaceHorizontalMarginPx, + paddingBottom); } - insetPadding(workspacePadding, cellLayoutPaddingPx); - } - - private void insetPadding(Rect paddings, Rect insets) { - insets.left = Math.min(insets.left, paddings.left); - paddings.left -= insets.left; - - insets.top = Math.min(insets.top, paddings.top); - paddings.top -= insets.top; - - insets.right = Math.min(insets.right, paddings.right); - paddings.right -= insets.right; - - insets.bottom = Math.min(insets.bottom, paddings.bottom); - paddings.bottom -= insets.bottom; } /** @@ -988,17 +941,16 @@ public class DeviceProfile { // Workspace icons are moved up by a small factor. The variable diffOverlapFactor // is set to account for that difference. float diffOverlapFactor = iconSizePx * (ICON_OVERLAP_FACTOR - 1) / 2; - int paddingTop = Math.max((int) (mInsets.top + cellLayoutPaddingPx.top - - diffOverlapFactor), 0); - int paddingBottom = Math.max((int) (mInsets.bottom + cellLayoutPaddingPx.bottom + int paddingTop = Math.max((int) (mInsets.top - diffOverlapFactor), 0); + int paddingBottom = Math.max((int) (mInsets.bottom + cellLayoutBottomPaddingPx + diffOverlapFactor), 0); if (isSeascape()) { - mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop, - hotseatBarSidePaddingEndPx, paddingBottom); + mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, + mInsets.top, hotseatBarSidePaddingEndPx, mInsets.bottom); } else { - mHotseatPadding.set(hotseatBarSidePaddingEndPx, paddingTop, - mInsets.right + hotseatBarSidePaddingStartPx, paddingBottom); + mHotseatPadding.set(hotseatBarSidePaddingEndPx, mInsets.top, + mInsets.right + hotseatBarSidePaddingStartPx, mInsets.bottom); } } else if (isTaskbarPresent) { int hotseatHeight = workspacePadding.bottom; @@ -1037,12 +989,14 @@ 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, - hotseatAdjustment + workspacePadding.right + cellLayoutPaddingPx.right + mHotseatPadding.set( + hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx + + mInsets.left, + hotseatBarTopPaddingPx, + hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx + mInsets.right, hotseatBarSizePx - hotseatCellHeightPx - hotseatBarTopPaddingPx - + mInsets.bottom); + + cellLayoutBottomPaddingPx + mInsets.bottom); } return mHotseatPadding; } @@ -1126,8 +1080,6 @@ public class DeviceProfile { .getInfo().rotation == Surface.ROTATION_270; if (mIsSeascape != isSeascape) { mIsSeascape = isSeascape; - // Hotseat changing sides requires updating workspace left/right paddings - updateWorkspacePadding(); return true; } } @@ -1206,11 +1158,6 @@ public class DeviceProfile { cellLayoutBorderSpacePx.x)); writer.println(prefix + pxToDpStr("cellLayoutBorderSpacePx Vertical", cellLayoutBorderSpacePx.y)); - writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.left", cellLayoutPaddingPx.left)); - writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.top", cellLayoutPaddingPx.top)); - writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.right", cellLayoutPaddingPx.right)); - writer.println( - prefix + pxToDpStr("cellLayoutPaddingPx.bottom", cellLayoutPaddingPx.bottom)); writer.println(prefix + pxToDpStr("iconSizePx", iconSizePx)); writer.println(prefix + pxToDpStr("iconTextSizePx", iconTextSizePx)); @@ -1248,12 +1195,6 @@ public class DeviceProfile { hotseatBarSidePaddingStartPx)); writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx", hotseatBarSidePaddingEndPx)); - 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 + "\tnumShownHotseatIcons: " + numShownHotseatIcons); writer.println(prefix + pxToDpStr("hotseatBorderSpace", hotseatBorderSpace)); writer.println(prefix + "\tisQsbInline: " + isQsbInline); @@ -1304,16 +1245,6 @@ public class DeviceProfile { writer.println(prefix + pxToDpStr("overviewPageSpacing", overviewPageSpacing)); writer.println(prefix + pxToDpStr("overviewRowSpacing", overviewRowSpacing)); writer.println(prefix + pxToDpStr("overviewGridSideMargin", overviewGridSideMargin)); - - writer.println(prefix + pxToDpStr("dropTargetBarTopMarginPx", dropTargetBarTopMarginPx)); - writer.println(prefix + pxToDpStr("dropTargetBarSizePx", dropTargetBarSizePx)); - writer.println( - prefix + pxToDpStr("dropTargetBarBottomMarginPx", dropTargetBarBottomMarginPx)); - - writer.println( - prefix + pxToDpStr("workspaceSpringLoadShrunkTop", workspaceSpringLoadShrunkTop)); - writer.println(prefix + pxToDpStr("workspaceSpringLoadShrunkBottom", - workspaceSpringLoadShrunkBottom)); } private static Context getContext(Context c, Info info, int orientation, WindowBounds bounds) { diff --git a/src/com/android/launcher3/DropTargetBar.java b/src/com/android/launcher3/DropTargetBar.java index 73289fb878..9fb14f68cb 100644 --- a/src/com/android/launcher3/DropTargetBar.java +++ b/src/com/android/launcher3/DropTargetBar.java @@ -17,6 +17,8 @@ package com.android.launcher3; import static com.android.launcher3.ButtonDropTarget.TOOLTIP_DEFAULT; +import static com.android.launcher3.ButtonDropTarget.TOOLTIP_LEFT; +import static com.android.launcher3.ButtonDropTarget.TOOLTIP_RIGHT; import static com.android.launcher3.anim.AlphaUpdateListener.updateVisibility; import android.animation.TimeInterpolator; @@ -39,8 +41,6 @@ import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.testing.TestProtocol; -import java.util.Arrays; - /* * The top bar containing various drop targets: Delete/App Info/Uninstall. */ @@ -94,28 +94,30 @@ public class DropTargetBar extends FrameLayout lp.rightMargin = insets.right; int tooltipLocation = TOOLTIP_DEFAULT; - int horizontalMargin; - if (grid.isTablet) { - // XXX: If the icon size changes across orientations, we will have to take - // that into account here too. - horizontalMargin = ((grid.widthPx - 2 * grid.edgeMarginPx - - (grid.inv.numColumns * grid.cellWidthPx)) - / (2 * (grid.inv.numColumns + 1))) - + grid.edgeMarginPx; + if (grid.isVerticalBarLayout()) { + lp.width = grid.dropTargetBarSizePx; + lp.height = grid.availableHeightPx - 2 * grid.edgeMarginPx; + lp.gravity = grid.isSeascape() ? Gravity.RIGHT : Gravity.LEFT; + tooltipLocation = grid.isSeascape() ? TOOLTIP_LEFT : TOOLTIP_RIGHT; } else { - horizontalMargin = getContext().getResources() - .getDimensionPixelSize(R.dimen.drop_target_bar_margin_horizontal); - } - lp.topMargin += grid.dropTargetBarTopMarginPx; - lp.bottomMargin += grid.dropTargetBarBottomMarginPx; - lp.width = grid.availableWidthPx - 2 * horizontalMargin; - if (mIsVertical) { - lp.leftMargin = (grid.widthPx - lp.width) / 2; - lp.rightMargin = (grid.widthPx - lp.width) / 2; - } - lp.height = grid.dropTargetBarSizePx; - lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP; + int gap; + if (grid.isTablet) { + // XXX: If the icon size changes across orientations, we will have to take + // that into account here too. + gap = ((grid.widthPx - 2 * grid.edgeMarginPx + - (grid.inv.numColumns * grid.cellWidthPx)) + / (2 * (grid.inv.numColumns + 1))) + + grid.edgeMarginPx; + } else { + gap = getContext().getResources() + .getDimensionPixelSize(R.dimen.drop_target_bar_margin_horizontal); + } + lp.width = grid.availableWidthPx - 2 * gap; + lp.topMargin += grid.edgeMarginPx; + lp.height = grid.dropTargetBarSizePx; + lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP; + } setLayoutParams(lp); for (ButtonDropTarget button : mDropTargets) { button.setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.dropTargetTextSizePx); @@ -137,7 +139,19 @@ public class DropTargetBar extends FrameLayout int height = MeasureSpec.getSize(heightMeasureSpec); int visibleCount = getVisibleButtonsCount(); - if (visibleCount > 0) { + if (visibleCount == 0) { + // do nothing + } else if (mIsVertical) { + int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); + int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); + + for (ButtonDropTarget button : mDropTargets) { + if (button.getVisibility() != GONE) { + button.setTextVisible(false); + button.measure(widthSpec, heightSpec); + } + } + } else { int availableWidth = width / visibleCount; boolean textVisible = true; for (ButtonDropTarget buttons : mDropTargets) { @@ -162,91 +176,31 @@ public class DropTargetBar extends FrameLayout protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int visibleCount = getVisibleButtonsCount(); if (visibleCount == 0) { - return; - } + // do nothing + } else if (mIsVertical) { + int gap = getResources().getDimensionPixelSize(R.dimen.drop_target_vertical_gap); + int start = gap; + int end; - Launcher launcher = Launcher.getLauncher(getContext()); - Workspace workspace = launcher.getWorkspace(); - DeviceProfile dp = launcher.getDeviceProfile(); - int buttonHorizontalPadding = dp.dropTargetHorizontalPaddingPx; - int buttonVerticalPadding = dp.dropTargetVerticalPaddingPx; - int barCenter = (right - left) / 2; - - ButtonDropTarget[] visibleButtons = Arrays.stream(mDropTargets) - .filter(b -> b.getVisibility() != GONE) - .toArray(ButtonDropTarget[]::new); - Arrays.stream(visibleButtons).forEach( - b -> b.setPadding(buttonHorizontalPadding, buttonVerticalPadding, - buttonHorizontalPadding, buttonVerticalPadding)); - - if (visibleCount == 1) { - ButtonDropTarget button = visibleButtons[0]; - button.layout(barCenter - (button.getMeasuredWidth() / 2), 0, - barCenter + (button.getMeasuredWidth() / 2), button.getMeasuredHeight()); - } else if (visibleCount == 2) { - int buttonGap = dp.dropTargetGapPx; - - if (dp.isTwoPanels) { - ButtonDropTarget leftButton = visibleButtons[0]; - leftButton.layout(barCenter - leftButton.getMeasuredWidth() - (buttonGap / 2), 0, - barCenter - (buttonGap / 2), leftButton.getMeasuredHeight()); - - ButtonDropTarget rightButton = visibleButtons[1]; - rightButton.layout(barCenter + (buttonGap / 2), 0, - barCenter + rightButton.getMeasuredWidth() + (buttonGap / 2), - rightButton.getMeasuredHeight()); - } else if (dp.isTablet) { - int numberOfMargins = visibleCount - 1; - int buttonWidths = Arrays.stream(mDropTargets) - .filter(b -> b.getVisibility() != GONE) - .mapToInt(ButtonDropTarget::getMeasuredWidth) - .sum(); - int totalWidth = buttonWidths + (numberOfMargins * buttonGap); - int buttonsStartMargin = barCenter - (totalWidth / 2); - - int start = buttonsStartMargin; - for (ButtonDropTarget button : visibleButtons) { - int margin = (start != buttonsStartMargin) ? buttonGap : 0; - button.layout(start + margin, 0, start + margin + button.getMeasuredWidth(), - button.getMeasuredHeight()); - start += button.getMeasuredWidth() + margin; + for (ButtonDropTarget button : mDropTargets) { + if (button.getVisibility() != GONE) { + end = start + button.getMeasuredHeight(); + button.layout(0, start, button.getMeasuredWidth(), end); + start = end + gap; } - } else if (mIsVertical) { - // Center buttons over workspace, not screen. - int verticalCenter = (workspace.getRight() - workspace.getLeft()) / 2; - ButtonDropTarget leftButton = visibleButtons[0]; - leftButton.layout(verticalCenter - leftButton.getMeasuredWidth() - (buttonGap / 2), - 0, verticalCenter - (buttonGap / 2), leftButton.getMeasuredHeight()); + } + } else { + int frameSize = (right - left) / visibleCount; - ButtonDropTarget rightButton = visibleButtons[1]; - rightButton.layout(verticalCenter + (buttonGap / 2), 0, - verticalCenter + rightButton.getMeasuredWidth() + (buttonGap / 2), - rightButton.getMeasuredHeight()); - } else if (dp.isPhone) { - // Buttons aligned to outer edges of scaled workspace. - float shrunkTop = dp.getWorkspaceSpringLoadShrunkTop(); - float shrunkBottom = dp.getWorkspaceSpringLoadShrunkBottom(); - float scale = - (shrunkBottom - shrunkTop) / launcher.getWorkspace().getNormalChildHeight(); - int workspaceWidth = (int) (launcher.getWorkspace().getNormalChildWidth() * scale); - int start = barCenter - (workspaceWidth / 2); - int end = barCenter + (workspaceWidth / 2); - - ButtonDropTarget leftButton = visibleButtons[0]; - ButtonDropTarget rightButton = visibleButtons[1]; - - // If the text within the buttons is too long, the buttons can overlap - int overlap = start + leftButton.getMeasuredWidth() + rightButton.getMeasuredWidth() - - end; - if (overlap > 0) { - start -= overlap / 2; - end += overlap / 2; + int start = frameSize / 2; + int halfWidth; + for (ButtonDropTarget button : mDropTargets) { + if (button.getVisibility() != GONE) { + halfWidth = button.getMeasuredWidth() / 2; + button.layout(start - halfWidth, 0, + start + halfWidth, button.getMeasuredHeight()); + start = start + frameSize; } - - leftButton.layout(start, 0, start + leftButton.getMeasuredWidth(), - leftButton.getMeasuredHeight()); - rightButton.layout(end - rightButton.getMeasuredWidth(), 0, end, - rightButton.getMeasuredHeight()); } } } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index a7fc2f52ba..8b19a19c02 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -324,14 +324,37 @@ public class Workspace extends PagedView setPageSpacing(Math.max(maxInsets, maxPadding)); } - updateCellLayoutPadding(); + updateWorkspaceScreensPadding(); updateWorkspaceWidgetsSizes(); } - private void updateCellLayoutPadding() { - Rect padding = mLauncher.getDeviceProfile().cellLayoutPaddingPx; - mWorkspaceScreens.forEach( - s -> s.setPadding(padding.left, padding.top, padding.right, padding.bottom)); + private void updateWorkspaceScreensPadding() { + DeviceProfile grid = mLauncher.getDeviceProfile(); + int paddingLeftRight = grid.cellLayoutPaddingLeftRightPx; + int paddingBottom = grid.cellLayoutBottomPaddingPx; + + int panelCount = getPanelCount(); + int rightPanelModulus = mIsRtl ? 0 : panelCount - 1; + int leftPanelModulus = mIsRtl ? panelCount - 1 : 0; + int numberOfScreens = mScreenOrder.size(); + for (int i = 0; i < numberOfScreens; i++) { + int paddingLeft = paddingLeftRight; + int paddingRight = paddingLeftRight; + // Add missing cellLayout border in-between panels. + if (panelCount > 1) { + if (i % panelCount == leftPanelModulus) { + paddingRight += grid.cellLayoutBorderSpacePx.x / 2; + } else if (i % panelCount == rightPanelModulus) { // right side panel + paddingLeft += grid.cellLayoutBorderSpacePx.x / 2; + } else { // middle panel + paddingLeft += grid.cellLayoutBorderSpacePx.x / 2; + paddingRight += grid.cellLayoutBorderSpacePx.x / 2; + } + } + // SparseArrayMap doesn't keep the order + mWorkspaceScreens.get(mScreenOrder.get(i)) + .setPadding(paddingLeft, 0, paddingRight, paddingBottom); + } } private void updateWorkspaceWidgetsSizes() { @@ -629,7 +652,7 @@ public class Workspace extends PagedView mLauncher.getStateManager().getState(), newScreen, insertIndex); updatePageScrollValues(); - updateCellLayoutPadding(); + updateWorkspaceScreensPadding(); return newScreen; } diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index 3dfece7660..cc170643c9 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -225,21 +225,21 @@ public class LauncherPreviewRenderer extends ContextWrapper mHotseat.resetLayout(false); CellLayout firstScreen = mRootView.findViewById(R.id.workspace); - firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingPx.left, - mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top, + firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingLeftRightPx, + mDp.workspacePadding.top, (mDp.isTwoPanels ? mDp.cellLayoutBorderSpacePx.x / 2 - : mDp.workspacePadding.right) + mDp.cellLayoutPaddingPx.right, - mDp.workspacePadding.bottom + mDp.cellLayoutPaddingPx.bottom + : mDp.workspacePadding.right) + mDp.cellLayoutPaddingLeftRightPx, + mDp.workspacePadding.bottom ); mWorkspaceScreens.put(FIRST_SCREEN_ID, firstScreen); if (mDp.isTwoPanels) { CellLayout rightPanel = mRootView.findViewById(R.id.workspace_right); rightPanel.setPadding( - mDp.cellLayoutBorderSpacePx.x / 2 + mDp.cellLayoutPaddingPx.left, - mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top, - mDp.workspacePadding.right + mDp.cellLayoutPaddingPx.right, - mDp.workspacePadding.bottom + mDp.cellLayoutPaddingPx.bottom + mDp.cellLayoutBorderSpacePx.x / 2 + mDp.cellLayoutPaddingLeftRightPx, + mDp.workspacePadding.top, + mDp.workspacePadding.right + mDp.cellLayoutPaddingLeftRightPx, + mDp.workspacePadding.bottom ); mWorkspaceScreens.put(Workspace.SECOND_SCREEN_ID, rightPanel); } diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java b/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java index 9201006cd7..967f2c8400 100644 --- a/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java +++ b/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java @@ -113,17 +113,13 @@ public class SecondaryDragLayer extends BaseDragLayer for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child == mAppsView) { - int horizontalPadding = (2 * grid.desiredWorkspaceHorizontalMarginPx) - + grid.cellLayoutPaddingPx.left + grid.cellLayoutPaddingPx.right; - int verticalPadding = - grid.cellLayoutPaddingPx.top + grid.cellLayoutPaddingPx.bottom; + int padding = 2 * (grid.desiredWorkspaceHorizontalMarginPx + + grid.cellLayoutPaddingLeftRightPx); - int maxWidth = - grid.allAppsCellWidthPx * grid.numShownAllAppsColumns + horizontalPadding; + int maxWidth = grid.allAppsCellWidthPx * grid.numShownAllAppsColumns + padding; int appsWidth = Math.min(width, maxWidth); - int maxHeight = - grid.allAppsCellHeightPx * grid.numShownAllAppsColumns + verticalPadding; + int maxHeight = grid.allAppsCellHeightPx * grid.numShownAllAppsColumns + padding; int appsHeight = Math.min(height, maxHeight); mAppsView.measure( diff --git a/src/com/android/launcher3/states/SpringLoadedState.java b/src/com/android/launcher3/states/SpringLoadedState.java index 9be3cc5539..d52594e409 100644 --- a/src/com/android/launcher3/states/SpringLoadedState.java +++ b/src/com/android/launcher3/states/SpringLoadedState.java @@ -18,6 +18,7 @@ package com.android.launcher3.states; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; import android.content.Context; +import android.graphics.Rect; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; @@ -51,15 +52,28 @@ public class SpringLoadedState extends LauncherState { return super.getWorkspaceScaleAndTranslation(launcher); } - float shrunkTop = grid.getWorkspaceSpringLoadShrunkTop(); - float shrunkBottom = grid.getWorkspaceSpringLoadShrunkBottom(); - float scale = (shrunkBottom - shrunkTop) / ws.getNormalChildHeight(); + if (grid.isVerticalBarLayout()) { + float scale = grid.workspaceSpringLoadShrinkFactor; + return new ScaleAndTranslation(scale, 0, 0); + } + + float scale = grid.workspaceSpringLoadShrinkFactor; + Rect insets = launcher.getDragLayer().getInsets(); + + float scaledHeight = scale * ws.getNormalChildHeight(); + float shrunkTop = insets.top + grid.dropTargetBarSizePx; + float shrunkBottom = ws.getMeasuredHeight() - insets.bottom + - grid.workspacePadding.bottom + - grid.workspaceSpringLoadedBottomSpace; + float totalShrunkSpace = shrunkBottom - shrunkTop; + + float desiredCellTop = shrunkTop + (totalShrunkSpace - scaledHeight) / 2; float halfHeight = ws.getHeight() / 2; float myCenter = ws.getTop() + halfHeight; float cellTopFromCenter = halfHeight - ws.getChildAt(0).getTop(); float actualCellTop = myCenter - cellTopFromCenter * scale; - return new ScaleAndTranslation(scale, 0, (shrunkTop - actualCellTop) / scale); + return new ScaleAndTranslation(scale, 0, (desiredCellTop - actualCellTop) / scale); } @Override