Widget resizing can now displace items

Change-Id: I005c9aebf64b2d01debe59f86a208075d19476ea
This commit is contained in:
Adam Cohen
2012-04-11 18:06:28 -07:00
parent c6cc61d458
commit bebf042666
5 changed files with 136 additions and 104 deletions
+33 -51
View File
@@ -2083,6 +2083,8 @@ public class CellLayout extends ViewGroup {
if (info != null) {
info.cellX = lp.cellX = lp.tmpCellX;
info.cellY = lp.cellY = lp.tmpCellY;
info.spanX = lp.cellHSpan;
info.spanY = lp.cellVSpan;
}
}
mLauncher.getWorkspace().updateItemLocationsInDatabase(this);
@@ -2214,6 +2216,37 @@ public class CellLayout extends ViewGroup {
setItemPlacementDirty(false);
}
boolean createAreaForResize(int cellX, int cellY, int spanX, int spanY,
View dragView, int[] direction, boolean commit) {
int[] pixelXY = new int[2];
regionToCenterPoint(cellX, cellY, spanX, spanY, pixelXY);
// First we determine if things have moved enough to cause a different layout
ItemConfiguration swapSolution = simpleSwap(pixelXY[0], pixelXY[1], spanX, spanY,
spanX, spanY, direction, dragView, true, new ItemConfiguration());
setUseTempCoords(true);
if (swapSolution != null && swapSolution.isSolution) {
// If we're just testing for a possible location (MODE_ACCEPT_DROP), we don't bother
// committing anything or animating anything as we just want to determine if a solution
// exists
copySolutionToTempState(swapSolution, dragView);
setItemPlacementDirty(true);
animateItemsToSolution(swapSolution, dragView, commit);
if (commit) {
commitTempPlacement();
completeAndClearReorderHintAnimations();
setItemPlacementDirty(false);
} else {
beginOrAdjustHintAnimations(swapSolution, dragView,
REORDER_ANIMATION_DURATION);
}
mShortcutsAndWidgets.requestLayout();
}
return swapSolution.isSolution;
}
int[] createArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX, int spanY,
View dragView, int[] result, int resultSpan[], int mode) {
// First we determine if things have moved enough to cause a different layout
@@ -2235,7 +2268,6 @@ public class CellLayout extends ViewGroup {
mPreviousReorderDirection[0] = INVALID_DIRECTION;
mPreviousReorderDirection[1] = INVALID_DIRECTION;
}
} else {
getDirectionVectorForDrop(pixelX, pixelY, spanX, spanY, dragView, mDirectionVector);
mPreviousReorderDirection[0] = mDirectionVector[0];
@@ -2694,56 +2726,6 @@ out: for (int i = x; i < x + spanX - 1 && x < xCount; i++) {
}
}
/**
* Given a view, determines how much that view can be expanded in all directions, in terms of
* whether or not there are other items occupying adjacent cells. Used by the
* AppWidgetResizeFrame to determine how the widget can be resized.
*/
public void getExpandabilityArrayForView(View view, int[] expandability) {
final LayoutParams lp = (LayoutParams) view.getLayoutParams();
boolean flag;
expandability[AppWidgetResizeFrame.LEFT] = 0;
for (int x = lp.cellX - 1; x >= 0; x--) {
flag = false;
for (int y = lp.cellY; y < lp.cellY + lp.cellVSpan; y++) {
if (mOccupied[x][y]) flag = true;
}
if (flag) break;
expandability[AppWidgetResizeFrame.LEFT]++;
}
expandability[AppWidgetResizeFrame.TOP] = 0;
for (int y = lp.cellY - 1; y >= 0; y--) {
flag = false;
for (int x = lp.cellX; x < lp.cellX + lp.cellHSpan; x++) {
if (mOccupied[x][y]) flag = true;
}
if (flag) break;
expandability[AppWidgetResizeFrame.TOP]++;
}
expandability[AppWidgetResizeFrame.RIGHT] = 0;
for (int x = lp.cellX + lp.cellHSpan; x < mCountX; x++) {
flag = false;
for (int y = lp.cellY; y < lp.cellY + lp.cellVSpan; y++) {
if (mOccupied[x][y]) flag = true;
}
if (flag) break;
expandability[AppWidgetResizeFrame.RIGHT]++;
}
expandability[AppWidgetResizeFrame.BOTTOM] = 0;
for (int y = lp.cellY + lp.cellVSpan; y < mCountY; y++) {
flag = false;
for (int x = lp.cellX; x < lp.cellX + lp.cellHSpan; x++) {
if (mOccupied[x][y]) flag = true;
}
if (flag) break;
expandability[AppWidgetResizeFrame.BOTTOM]++;
}
}
public void onMove(View view, int newCellX, int newCellY, int newSpanX, int newSpanY) {
markCellsAsUnoccupiedForView(view);
markCellsForView(newCellX, newCellY, newSpanX, newSpanY, mOccupied, true);