summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/CellLayout.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/CellLayout.java')
-rw-r--r--src/com/android/launcher3/CellLayout.java185
1 files changed, 70 insertions, 115 deletions
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 86bc1b047..abc057c8d 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -191,11 +191,11 @@ public class CellLayout extends ViewGroup {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0);
- mCellWidth = a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10);
- mCellHeight = a.getDimensionPixelSize(R.styleable.CellLayout_cellHeight, 10);
- mWidthGap = mOriginalWidthGap = a.getDimensionPixelSize(R.styleable.CellLayout_widthGap, 0);
- mHeightGap = mOriginalHeightGap = a.getDimensionPixelSize(R.styleable.CellLayout_heightGap, 0);
- mMaxGap = a.getDimensionPixelSize(R.styleable.CellLayout_maxGap, 0);
+ mCellWidth = -1;
+ mCellHeight = -1;
+ mWidthGap = mOriginalWidthGap = 0;
+ mHeightGap = mOriginalHeightGap = 0;
+ mMaxGap = Integer.MAX_VALUE;
mCountX = LauncherModel.getCellCountX();
mCountY = LauncherModel.getCellCountY();
mOccupied = new boolean[mCountX][mCountY];
@@ -208,7 +208,9 @@ public class CellLayout extends ViewGroup {
setAlwaysDrawnWithCacheEnabled(false);
final Resources res = getResources();
- mHotseatScale = (res.getInteger(R.integer.hotseat_item_scale_percentage) / 100f);
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ mHotseatScale = (float) grid.hotseatIconSize / grid.iconSize;
mNormalBackground = res.getDrawable(R.drawable.homescreen_blue_normal_holo);
mActiveGlowBackground = res.getDrawable(R.drawable.homescreen_blue_strong_holo);
@@ -219,16 +221,13 @@ public class CellLayout extends ViewGroup {
res.getDimensionPixelSize(R.dimen.workspace_overscroll_drawable_padding);
mReorderHintAnimationMagnitude = (REORDER_HINT_MAGNITUDE *
- res.getDimensionPixelSize(R.dimen.app_icon_size));
+ grid.iconSizePx);
mNormalBackground.setFilterBitmap(true);
mActiveGlowBackground.setFilterBitmap(true);
// Initialize the data structures used for the drag visualization.
-
mEaseOutInterpolator = new DecelerateInterpolator(2.5f); // Quint ease out
-
-
mDragCell[0] = mDragCell[1] = -1;
for (int i = 0; i < mDragOutlines.length; i++) {
mDragOutlines[i] = new Rect(-1, -1, -1, -1);
@@ -289,33 +288,11 @@ public class CellLayout extends ViewGroup {
mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context);
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
- mCountX);
+ mCountX, mCountY);
addView(mShortcutsAndWidgets);
}
- static int widthInPortrait(Resources r, int numCells) {
- // We use this method from Workspace to figure out how many rows/columns Launcher should
- // have. We ignore the left/right padding on CellLayout because it turns out in our design
- // the padding extends outside the visible screen size, but it looked fine anyway.
- int cellWidth = r.getDimensionPixelSize(R.dimen.workspace_cell_width);
- int minGap = Math.min(r.getDimensionPixelSize(R.dimen.workspace_width_gap),
- r.getDimensionPixelSize(R.dimen.workspace_height_gap));
-
- return minGap * (numCells - 1) + cellWidth * numCells;
- }
-
- static int heightInLandscape(Resources r, int numCells) {
- // We use this method from Workspace to figure out how many rows/columns Launcher should
- // have. We ignore the left/right padding on CellLayout because it turns out in our design
- // the padding extends outside the visible screen size, but it looked fine anyway.
- int cellHeight = r.getDimensionPixelSize(R.dimen.workspace_cell_height);
- int minGap = Math.min(r.getDimensionPixelSize(R.dimen.workspace_width_gap),
- r.getDimensionPixelSize(R.dimen.workspace_height_gap));
-
- return minGap * (numCells - 1) + cellHeight * numCells;
- }
-
public void enableHardwareLayers() {
mShortcutsAndWidgets.setLayerType(LAYER_TYPE_HARDWARE, sPaint);
}
@@ -332,6 +309,13 @@ public class CellLayout extends ViewGroup {
return mIsHotseat ? mHotseatScale : 1.0f;
}
+ public void setCellDimensions(int width, int height) {
+ mCellWidth = width;
+ mCellHeight = height;
+ mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
+ mCountX, mCountY);
+ }
+
public void setGridSize(int x, int y) {
mCountX = x;
mCountY = y;
@@ -339,7 +323,7 @@ public class CellLayout extends ViewGroup {
mTmpOccupied = new boolean[mCountX][mCountY];
mTempRectStack.clear();
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
- mCountX);
+ mCountX, mCountY);
requestLayout();
}
@@ -500,17 +484,21 @@ public class CellLayout extends ViewGroup {
int previewOffset = FolderRingAnimator.sPreviewSize;
// The folder outer / inner ring image(s)
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
for (int i = 0; i < mFolderOuterRings.size(); i++) {
FolderRingAnimator fra = mFolderOuterRings.get(i);
// Draw outer ring
Drawable d = FolderRingAnimator.sSharedOuterRingDrawable;
- int width = (int) fra.getOuterRingSize();
+ int width = (int) (fra.getOuterRingSize() * getChildrenScale());
int height = width;
cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
+ View child = getChildAt(fra.mCellX, fra.mCellY);
int centerX = mTempLocation[0] + mCellWidth / 2;
- int centerY = mTempLocation[1] + previewOffset / 2;
+ int centerY = mTempLocation[1] + previewOffset / 2 +
+ child.getPaddingTop() + grid.folderBackgroundOffset;
canvas.save();
canvas.translate(centerX - width / 2, centerY - height / 2);
@@ -520,12 +508,14 @@ public class CellLayout extends ViewGroup {
// Draw inner ring
d = FolderRingAnimator.sSharedInnerRingDrawable;
- width = (int) fra.getInnerRingSize();
+ width = (int) (fra.getInnerRingSize() * getChildrenScale());
height = width;
cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
+ child = getChildAt(fra.mCellX, fra.mCellY);
centerX = mTempLocation[0] + mCellWidth / 2;
- centerY = mTempLocation[1] + previewOffset / 2;
+ centerY = mTempLocation[1] + previewOffset / 2 +
+ child.getPaddingTop() + grid.folderBackgroundOffset;
canvas.save();
canvas.translate(centerX - width / 2, centerY - width / 2);
d.setBounds(0, 0, width, height);
@@ -539,8 +529,10 @@ public class CellLayout extends ViewGroup {
int height = d.getIntrinsicHeight();
cellToPoint(mFolderLeaveBehindCell[0], mFolderLeaveBehindCell[1], mTempLocation);
+ View child = getChildAt(mFolderLeaveBehindCell[0], mFolderLeaveBehindCell[1]);
int centerX = mTempLocation[0] + mCellWidth / 2;
- int centerY = mTempLocation[1] + previewOffset / 2;
+ int centerY = mTempLocation[1] + previewOffset / 2 +
+ child.getPaddingTop() + grid.folderBackgroundOffset;
canvas.save();
canvas.translate(centerX - width / 2, centerY - width / 2);
@@ -620,6 +612,7 @@ public class CellLayout extends ViewGroup {
public void setIsHotseat(boolean isHotseat) {
mIsHotseat = isHotseat;
+ mShortcutsAndWidgets.setIsHotseat(isHotseat);
}
public boolean addViewToCellLayout(View child, int index, int childId, LayoutParams params,
@@ -631,11 +624,7 @@ public class CellLayout extends ViewGroup {
BubbleTextView bubbleChild = (BubbleTextView) child;
Resources res = getResources();
- if (mIsHotseat) {
- bubbleChild.setTextColor(res.getColor(android.R.color.transparent));
- } else {
- bubbleChild.setTextColor(res.getColor(R.color.workspace_icon_text_color));
- }
+ bubbleChild.setTextVisibility(!mIsHotseat);
}
child.setScaleX(getChildrenScale());
@@ -940,49 +929,10 @@ public class CellLayout extends ViewGroup {
static void getMetrics(Rect metrics, Resources res, int measureWidth, int measureHeight,
int countX, int countY, int orientation) {
- int numWidthGaps = countX - 1;
- int numHeightGaps = countY - 1;
-
- int widthGap;
- int heightGap;
- int cellWidth;
- int cellHeight;
- int paddingLeft;
- int paddingRight;
- int paddingTop;
- int paddingBottom;
-
- int maxGap = res.getDimensionPixelSize(R.dimen.workspace_max_gap);
- if (orientation == LANDSCAPE) {
- cellWidth = res.getDimensionPixelSize(R.dimen.workspace_cell_width_land);
- cellHeight = res.getDimensionPixelSize(R.dimen.workspace_cell_height_land);
- widthGap = res.getDimensionPixelSize(R.dimen.workspace_width_gap_land);
- heightGap = res.getDimensionPixelSize(R.dimen.workspace_height_gap_land);
- paddingLeft = res.getDimensionPixelSize(R.dimen.cell_layout_left_padding_land);
- paddingRight = res.getDimensionPixelSize(R.dimen.cell_layout_right_padding_land);
- paddingTop = res.getDimensionPixelSize(R.dimen.cell_layout_top_padding_land);
- paddingBottom = res.getDimensionPixelSize(R.dimen.cell_layout_bottom_padding_land);
- } else {
- // PORTRAIT
- cellWidth = res.getDimensionPixelSize(R.dimen.workspace_cell_width_port);
- cellHeight = res.getDimensionPixelSize(R.dimen.workspace_cell_height_port);
- widthGap = res.getDimensionPixelSize(R.dimen.workspace_width_gap_port);
- heightGap = res.getDimensionPixelSize(R.dimen.workspace_height_gap_port);
- paddingLeft = res.getDimensionPixelSize(R.dimen.cell_layout_left_padding_port);
- paddingRight = res.getDimensionPixelSize(R.dimen.cell_layout_right_padding_port);
- paddingTop = res.getDimensionPixelSize(R.dimen.cell_layout_top_padding_port);
- paddingBottom = res.getDimensionPixelSize(R.dimen.cell_layout_bottom_padding_port);
- }
-
- if (widthGap < 0 || heightGap < 0) {
- int hSpace = measureWidth - paddingLeft - paddingRight;
- int vSpace = measureHeight - paddingTop - paddingBottom;
- int hFreeSpace = hSpace - (countX * cellWidth);
- int vFreeSpace = vSpace - (countY * cellHeight);
- widthGap = Math.min(maxGap, numWidthGaps > 0 ? (hFreeSpace / numWidthGaps) : 0);
- heightGap = Math.min(maxGap, numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0);
- }
- metrics.set(cellWidth, cellHeight, widthGap, heightGap);
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ metrics.set(grid.calculateCellWidth(measureWidth, countX),
+ grid.calculateCellHeight(measureHeight, countY), 0, 0);
}
public void setFixedSize(int width, int height) {
@@ -992,14 +942,22 @@ public class CellLayout extends ViewGroup {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
- int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
- int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+ if (mCellWidth < 0 || mCellHeight < 0) {
+ mCellWidth = grid.calculateCellWidth(widthSize, mCountX);
+ mCellHeight = grid.calculateCellHeight(heightSize, mCountY);
+ mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap,
+ mHeightGap, mCountX, mCountY);
+ }
- int newWidth = widthSpecSize;
- int newHeight = heightSpecSize;
+ int newWidth = widthSize;
+ int newHeight = heightSize;
if (mFixedWidth > 0 && mFixedHeight > 0) {
newWidth = mFixedWidth;
newHeight = mFixedHeight;
@@ -1011,29 +969,21 @@ public class CellLayout extends ViewGroup {
int numHeightGaps = mCountY - 1;
if (mOriginalWidthGap < 0 || mOriginalHeightGap < 0) {
- int hSpace = widthSpecSize - getPaddingLeft() - getPaddingRight();
- int vSpace = heightSpecSize - getPaddingTop() - getPaddingBottom();
+ int hSpace = widthSize - getPaddingLeft() - getPaddingRight();
+ int vSpace = heightSize - getPaddingTop() - getPaddingBottom();
int hFreeSpace = hSpace - (mCountX * mCellWidth);
int vFreeSpace = vSpace - (mCountY * mCellHeight);
mWidthGap = Math.min(mMaxGap, numWidthGaps > 0 ? (hFreeSpace / numWidthGaps) : 0);
mHeightGap = Math.min(mMaxGap,numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0);
- mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
- mCountX);
+ mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap,
+ mHeightGap, mCountX, mCountY);
} else {
mWidthGap = mOriginalWidthGap;
mHeightGap = mOriginalHeightGap;
}
-
- // Initial values correspond to widthSpecMode == MeasureSpec.EXACTLY
- if (widthSpecMode == MeasureSpec.AT_MOST) {
- newWidth = getPaddingLeft() + getPaddingRight() + (mCountX * mCellWidth) +
- ((mCountX - 1) * mWidthGap);
- newHeight = getPaddingTop() + getPaddingBottom() + (mCountY * mCellHeight) +
- ((mCountY - 1) * mHeightGap);
- setMeasuredDimension(newWidth, newHeight);
- }
-
int count = getChildCount();
+ int maxWidth = 0;
+ int maxHeight = 0;
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(newWidth - getPaddingLeft() -
@@ -1041,8 +991,10 @@ public class CellLayout extends ViewGroup {
int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(newHeight - getPaddingTop() -
getPaddingBottom(), MeasureSpec.EXACTLY);
child.measure(childWidthMeasureSpec, childheightMeasureSpec);
+ maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
+ maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
}
- setMeasuredDimension(newWidth, newHeight);
+ setMeasuredDimension(maxWidth, maxHeight);
}
@Override
@@ -1530,7 +1482,7 @@ public class CellLayout extends ViewGroup {
* matches exactly. Otherwise we find the best matching direction.
* @param occoupied The array which represents which cells in the CellLayout are occupied
* @param blockOccupied The array which represents which cells in the specified block (cellX,
- * cellY, spanX, spanY) are occupied. This is used when try to move a group of views.
+ * cellY, spanX, spanY) are occupied. This is used when try to move a group of views.
* @param result Array in which to place the result, or null (in which case a new array will
* be allocated)
* @return The X, Y cell of a vacant area that can contain this object,
@@ -2003,7 +1955,7 @@ public class CellLayout extends ViewGroup {
private boolean attemptPushInDirection(ArrayList<View> intersectingViews, Rect occupied,
int[] direction, View ignoreView, ItemConfiguration solution) {
if ((Math.abs(direction[0]) + Math.abs(direction[1])) > 1) {
- // If the direction vector has two non-zero components, we try pushing
+ // If the direction vector has two non-zero components, we try pushing
// separately in each of the components.
int temp = direction[1];
direction[1] = 0;
@@ -2044,7 +1996,7 @@ public class CellLayout extends ViewGroup {
direction[0] = temp;
direction[0] *= -1;
direction[1] *= -1;
-
+
} else {
// If the direction vector has a single non-zero component, we push first in the
// direction of the vector
@@ -2062,8 +2014,8 @@ public class CellLayout extends ViewGroup {
// Switch the direction back
direction[0] *= -1;
direction[1] *= -1;
-
- // If we have failed to find a push solution with the above, then we try
+
+ // If we have failed to find a push solution with the above, then we try
// to find a solution by pushing along the perpendicular axis.
// Swap the components
@@ -2125,7 +2077,7 @@ public class CellLayout extends ViewGroup {
}
}
- // First we try to find a solution which respects the push mechanic. That is,
+ // First we try to find a solution which respects the push mechanic. That is,
// we try to find a solution such that no displaced item travels through another item
// without also displacing that item.
if (attemptPushInDirection(mIntersectingViews, mOccupiedRect, direction, ignoreView,
@@ -3013,10 +2965,13 @@ public class CellLayout extends ViewGroup {
}
public static int[] rectToCell(Resources resources, int width, int height, int[] result) {
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+
// Always assume we're working with the smallest span to make sure we
// reserve enough space in both orientations.
- int actualWidth = resources.getDimensionPixelSize(R.dimen.workspace_cell_width);
- int actualHeight = resources.getDimensionPixelSize(R.dimen.workspace_cell_height);
+ int actualWidth = grid.cellWidthPx;
+ int actualHeight = grid.cellHeightPx;
int smallerSize = Math.min(actualWidth, actualHeight);
// Always round up to next largest cell