Merge changes I36871463,I691a5cbb,I62105c1c into sc-v2-dev
* changes: Update reorder and folder creation radii Fix misaligned folder creation drag over target Update CellLayout.DEBUG_VISUALIZE_OCCUPIED to include drag over targets
This commit is contained in:
@@ -19,6 +19,8 @@ package com.android.launcher3;
|
||||
import static android.animation.ValueAnimator.areAnimatorsEnabled;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.DEACCEL_1_5;
|
||||
import static com.android.launcher3.dragndrop.DraggableView.DRAGGABLE_ICON;
|
||||
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
@@ -37,7 +39,6 @@ import android.graphics.Point;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Parcelable;
|
||||
import android.util.ArrayMap;
|
||||
@@ -61,6 +62,7 @@ import com.android.launcher3.LauncherSettings.Favorites;
|
||||
import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.dragndrop.DraggableView;
|
||||
import com.android.launcher3.folder.PreviewBackground;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.util.CellAndSpan;
|
||||
@@ -442,18 +444,43 @@ public class CellLayout extends ViewGroup {
|
||||
}
|
||||
|
||||
if (DEBUG_VISUALIZE_OCCUPIED) {
|
||||
int[] pt = new int[2];
|
||||
ColorDrawable cd = new ColorDrawable(Color.RED);
|
||||
cd.setBounds(0, 0, mCellWidth, mCellHeight);
|
||||
for (int i = 0; i < mCountX; i++) {
|
||||
for (int j = 0; j < mCountY; j++) {
|
||||
if (mOccupied.cells[i][j]) {
|
||||
cellToPoint(i, j, pt);
|
||||
canvas.save();
|
||||
canvas.translate(pt[0], pt[1]);
|
||||
cd.draw(canvas);
|
||||
canvas.restore();
|
||||
Rect cellBounds = new Rect();
|
||||
// Will contain the bounds of the cell including spacing between cells.
|
||||
Rect cellBoundsWithSpacing = new Rect();
|
||||
int[] targetCell = new int[2];
|
||||
int[] cellCenter = new int[2];
|
||||
Paint debugPaint = new Paint();
|
||||
debugPaint.setStrokeWidth(Utilities.dpToPx(1));
|
||||
for (int x = 0; x < mCountX; x++) {
|
||||
for (int y = 0; y < mCountY; y++) {
|
||||
if (!mOccupied.cells[x][y]) {
|
||||
continue;
|
||||
}
|
||||
targetCell[0] = x;
|
||||
targetCell[1] = y;
|
||||
|
||||
boolean canCreateFolder = canCreateFolder(getChildAt(x, y));
|
||||
cellToRect(x, y, 1, 1, cellBounds);
|
||||
cellBoundsWithSpacing.set(cellBounds);
|
||||
cellBoundsWithSpacing.inset(-mBorderSpace.x / 2, -mBorderSpace.y / 2);
|
||||
getWorkspaceCellVisualCenter(x, y, cellCenter);
|
||||
|
||||
canvas.save();
|
||||
canvas.clipRect(cellBoundsWithSpacing);
|
||||
|
||||
// Draw reorder drag target.
|
||||
debugPaint.setColor(Color.RED);
|
||||
canvas.drawCircle(cellCenter[0], cellCenter[1], getReorderRadius(targetCell),
|
||||
debugPaint);
|
||||
|
||||
// Draw folder creation drag target.
|
||||
if (canCreateFolder) {
|
||||
debugPaint.setColor(Color.GREEN);
|
||||
canvas.drawCircle(cellCenter[0], cellCenter[1],
|
||||
getFolderCreationRadius(targetCell), debugPaint);
|
||||
}
|
||||
|
||||
canvas.restore();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -481,6 +508,14 @@ public class CellLayout extends ViewGroup {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether dropping an icon on the given View can create (or add to) a folder.
|
||||
*/
|
||||
private boolean canCreateFolder(View child) {
|
||||
return child instanceof DraggableView
|
||||
&& ((DraggableView) child).getViewType() == DRAGGABLE_ICON;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the progress of the Workspace entering the SpringLoaded state; allows the
|
||||
* CellLayout to update various visuals for this state.
|
||||
@@ -817,7 +852,7 @@ public class CellLayout extends ViewGroup {
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a cell coordinate and span return the point that represents the center of the regio
|
||||
* Given a cell coordinate and span return the point that represents the center of the region
|
||||
*
|
||||
* @param cellX X coordinate of the cell
|
||||
* @param cellY Y coordinate of the cell
|
||||
@@ -830,11 +865,65 @@ public class CellLayout extends ViewGroup {
|
||||
result[1] = mTempRect.centerY();
|
||||
}
|
||||
|
||||
public float getDistanceFromCell(float x, float y, int[] cell) {
|
||||
cellToCenterPoint(cell[0], cell[1], mTmpPoint);
|
||||
/**
|
||||
* Returns the distance between the given coordinate and the visual center of the given cell.
|
||||
*/
|
||||
public float getDistanceFromWorkspaceCellVisualCenter(float x, float y, int[] cell) {
|
||||
getWorkspaceCellVisualCenter(cell[0], cell[1], mTmpPoint);
|
||||
return (float) Math.hypot(x - mTmpPoint[0], y - mTmpPoint[1]);
|
||||
}
|
||||
|
||||
private void getWorkspaceCellVisualCenter(int cellX, int cellY, int[] outPoint) {
|
||||
View child = getChildAt(cellX, cellY);
|
||||
if (child instanceof DraggableView) {
|
||||
DraggableView draggableChild = (DraggableView) child;
|
||||
if (draggableChild.getViewType() == DRAGGABLE_ICON) {
|
||||
cellToPoint(cellX, cellY, outPoint);
|
||||
draggableChild.getWorkspaceVisualDragBounds(mTempRect);
|
||||
mTempRect.offset(outPoint[0], outPoint[1]);
|
||||
outPoint[0] = mTempRect.centerX();
|
||||
outPoint[1] = mTempRect.centerY();
|
||||
return;
|
||||
}
|
||||
}
|
||||
cellToCenterPoint(cellX, cellY, outPoint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the max distance from the center of a cell that can accept a drop to create a folder.
|
||||
*/
|
||||
public float getFolderCreationRadius(int[] targetCell) {
|
||||
DeviceProfile grid = mActivity.getDeviceProfile();
|
||||
float iconVisibleRadius = ICON_VISIBLE_AREA_FACTOR * grid.iconSizePx / 2;
|
||||
// Halfway between reorder radius and icon.
|
||||
return (getReorderRadius(targetCell) + iconVisibleRadius) / 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the max distance from the center of a cell that will start to reorder on drag over.
|
||||
*/
|
||||
public float getReorderRadius(int[] targetCell) {
|
||||
int[] centerPoint = mTmpPoint;
|
||||
getWorkspaceCellVisualCenter(targetCell[0], targetCell[1], centerPoint);
|
||||
|
||||
Rect cellBoundsWithSpacing = mTempRect;
|
||||
cellToRect(targetCell[0], targetCell[1], 1, 1, cellBoundsWithSpacing);
|
||||
cellBoundsWithSpacing.inset(-mBorderSpace.x / 2, -mBorderSpace.y / 2);
|
||||
|
||||
if (canCreateFolder(getChildAt(targetCell[0], targetCell[1]))) {
|
||||
// Take only the circle in the smaller dimension, to ensure we don't start reordering
|
||||
// too soon before accepting a folder drop.
|
||||
int minRadius = centerPoint[0] - cellBoundsWithSpacing.left;
|
||||
minRadius = Math.min(minRadius, centerPoint[1] - cellBoundsWithSpacing.top);
|
||||
minRadius = Math.min(minRadius, cellBoundsWithSpacing.right - centerPoint[0]);
|
||||
minRadius = Math.min(minRadius, cellBoundsWithSpacing.bottom - centerPoint[1]);
|
||||
return minRadius;
|
||||
}
|
||||
// Take up the entire cell, including space between this cell and the adjacent ones.
|
||||
return (float) Math.hypot(cellBoundsWithSpacing.width() / 2f,
|
||||
cellBoundsWithSpacing.height() / 2f);
|
||||
}
|
||||
|
||||
public int getCellWidth() {
|
||||
return mCellWidth;
|
||||
}
|
||||
|
||||
@@ -220,7 +220,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
private FolderIcon mDragOverFolderIcon = null;
|
||||
private boolean mCreateUserFolderOnDrop = false;
|
||||
private boolean mAddToExistingFolderOnDrop = false;
|
||||
private float mMaxDistanceForFolderCreation;
|
||||
|
||||
// Variables relating to touch disambiguation (scrolling workspace vs. scrolling a widget)
|
||||
private float mXDown;
|
||||
@@ -308,8 +307,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
public void setInsets(Rect insets) {
|
||||
DeviceProfile grid = mLauncher.getDeviceProfile();
|
||||
|
||||
mMaxDistanceForFolderCreation = grid.isTablet
|
||||
? 0.75f * grid.iconSizePx : 0.55f * grid.iconSizePx;
|
||||
mWorkspaceFadeInAdjacentScreens = grid.shouldFadeAdjacentWorkspaceScreens();
|
||||
|
||||
Rect padding = grid.workspacePadding;
|
||||
@@ -1774,8 +1771,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
|
||||
(int) mDragViewVisualCenter[1], minSpanX, minSpanY, dropTargetLayout,
|
||||
mTargetCell);
|
||||
float distance = dropTargetLayout.getDistanceFromCell(mDragViewVisualCenter[0],
|
||||
mDragViewVisualCenter[1], mTargetCell);
|
||||
float distance = dropTargetLayout.getDistanceFromWorkspaceCellVisualCenter(
|
||||
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
|
||||
if (mCreateUserFolderOnDrop && willCreateUserFolder(d.dragInfo,
|
||||
dropTargetLayout, mTargetCell, distance, true)) {
|
||||
return true;
|
||||
@@ -1809,7 +1806,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
|
||||
boolean willCreateUserFolder(ItemInfo info, CellLayout target, int[] targetCell,
|
||||
float distance, boolean considerTimeout) {
|
||||
if (distance > mMaxDistanceForFolderCreation) return false;
|
||||
if (distance > target.getFolderCreationRadius(targetCell)) return false;
|
||||
View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
|
||||
return willCreateUserFolder(info, dropOverView, considerTimeout);
|
||||
}
|
||||
@@ -1844,7 +1841,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
|
||||
boolean willAddToExistingUserFolder(ItemInfo dragInfo, CellLayout target, int[] targetCell,
|
||||
float distance) {
|
||||
if (distance > mMaxDistanceForFolderCreation) return false;
|
||||
if (distance > target.getFolderCreationRadius(targetCell)) return false;
|
||||
View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
|
||||
return willAddToExistingUserFolder(dragInfo, dropOverView);
|
||||
|
||||
@@ -1868,7 +1865,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
|
||||
boolean createUserFolderIfNecessary(View newView, int container, CellLayout target,
|
||||
int[] targetCell, float distance, boolean external, DragObject d) {
|
||||
if (distance > mMaxDistanceForFolderCreation) return false;
|
||||
if (distance > target.getFolderCreationRadius(targetCell)) return false;
|
||||
View v = target.getChildAt(targetCell[0], targetCell[1]);
|
||||
|
||||
boolean hasntMoved = false;
|
||||
@@ -1925,7 +1922,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
|
||||
boolean addToExistingFolderIfNecessary(View newView, CellLayout target, int[] targetCell,
|
||||
float distance, DragObject d, boolean external) {
|
||||
if (distance > mMaxDistanceForFolderCreation) return false;
|
||||
if (distance > target.getFolderCreationRadius(targetCell)) return false;
|
||||
|
||||
View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
|
||||
if (!mAddToExistingFolderOnDrop) return false;
|
||||
@@ -1989,8 +1986,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
|
||||
mTargetCell = findNearestArea((int) mDragViewVisualCenter[0], (int)
|
||||
mDragViewVisualCenter[1], spanX, spanY, dropTargetLayout, mTargetCell);
|
||||
float distance = dropTargetLayout.getDistanceFromCell(mDragViewVisualCenter[0],
|
||||
mDragViewVisualCenter[1], mTargetCell);
|
||||
float distance = dropTargetLayout.getDistanceFromWorkspaceCellVisualCenter(
|
||||
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
|
||||
|
||||
// If the item being dropped is a shortcut and the nearest drop
|
||||
// cell also contains a shortcut, then create a folder with the two shortcuts.
|
||||
@@ -2418,7 +2415,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
|
||||
setCurrentDropOverCell(mTargetCell[0], mTargetCell[1]);
|
||||
|
||||
float targetCellDistance = mDragTargetLayout.getDistanceFromCell(
|
||||
float targetCellDistance = mDragTargetLayout.getDistanceFromWorkspaceCellVisualCenter(
|
||||
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
|
||||
|
||||
manageFolderFeedback(targetCellDistance, d);
|
||||
@@ -2431,8 +2428,9 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
mDragTargetLayout.visualizeDropLocation(mTargetCell[0], mTargetCell[1],
|
||||
item.spanX, item.spanY, d);
|
||||
} else if ((mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER)
|
||||
&& !mReorderAlarm.alarmPending() && (mLastReorderX != reorderX ||
|
||||
mLastReorderY != reorderY)) {
|
||||
&& !mReorderAlarm.alarmPending()
|
||||
&& (mLastReorderX != reorderX || mLastReorderY != reorderY)
|
||||
&& targetCellDistance < mDragTargetLayout.getReorderRadius(mTargetCell)) {
|
||||
|
||||
int[] resultSpan = new int[2];
|
||||
mDragTargetLayout.performReorder((int) mDragViewVisualCenter[0],
|
||||
@@ -2529,7 +2527,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
}
|
||||
|
||||
private void manageFolderFeedback(float distance, DragObject dragObject) {
|
||||
if (distance > mMaxDistanceForFolderCreation) {
|
||||
if (distance > mDragTargetLayout.getFolderCreationRadius(mTargetCell)) {
|
||||
if ((mDragMode == DRAG_MODE_ADD_TO_FOLDER
|
||||
|| mDragMode == DRAG_MODE_CREATE_FOLDER)) {
|
||||
setDragMode(DRAG_MODE_NONE);
|
||||
@@ -2674,8 +2672,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
if (pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
|
||||
mTargetCell = findNearestArea(touchXY[0], touchXY[1], spanX, spanY,
|
||||
cellLayout, mTargetCell);
|
||||
float distance = cellLayout.getDistanceFromCell(mDragViewVisualCenter[0],
|
||||
mDragViewVisualCenter[1], mTargetCell);
|
||||
float distance = cellLayout.getDistanceFromWorkspaceCellVisualCenter(
|
||||
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
|
||||
if (willCreateUserFolder(d.dragInfo, cellLayout, mTargetCell, distance, true)
|
||||
|| willAddToExistingUserFolder(
|
||||
d.dragInfo, cellLayout, mTargetCell, distance)) {
|
||||
@@ -2774,8 +2772,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
if (touchXY != null) {
|
||||
mTargetCell = findNearestArea(touchXY[0], touchXY[1], spanX, spanY,
|
||||
cellLayout, mTargetCell);
|
||||
float distance = cellLayout.getDistanceFromCell(mDragViewVisualCenter[0],
|
||||
mDragViewVisualCenter[1], mTargetCell);
|
||||
float distance = cellLayout.getDistanceFromWorkspaceCellVisualCenter(
|
||||
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
|
||||
if (createUserFolderIfNecessary(view, container, cellLayout, mTargetCell, distance,
|
||||
true, d)) {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user