Modify getViewsIntersectingRegion to returns rects instead of view since we don't use the views after only the rects.
Intermidiate step for b/270395274
Bug: 270395275
Flag: NA
Test: ReorderAlgorithmUnitTest
Test: atest ReorderWidgets
Change-Id: I505372ccd61e954de19852427abe0b54fc06aa57
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 94e5970..1a0f2cf 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -57,6 +57,7 @@
import android.view.accessibility.AccessibilityEvent;
import androidx.annotation.IntDef;
+import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.core.graphics.ColorUtils;
import androidx.core.view.ViewCompat;
@@ -1657,15 +1658,16 @@
}
}
- // For a given cell and span, fetch the set of views intersecting the region.
- public void getViewsIntersectingRegion(int cellX, int cellY, int spanX, int spanY,
- View dragView, Rect boundingRect, ArrayList<View> intersectingViews) {
- if (boundingRect != null) {
- boundingRect.set(cellX, cellY, cellX + spanX, cellY + spanY);
- }
- intersectingViews.clear();
- Rect r0 = new Rect(cellX, cellY, cellX + spanX, cellY + spanY);
+ /**
+ * For a given region, return the rectangle of the overlapping cell and span with the given
+ * region including the region itself. If there is no overlap the rectangle will be
+ * invalid i.e. -1, 0, -1, 0.
+ */
+ @Nullable
+ public Rect getIntersectingRectanglesInRegion(final Rect region, final View dragView) {
+ Rect boundingRect = new Rect(region);
Rect r1 = new Rect();
+ boolean isOverlapping = false;
final int count = mShortcutsAndWidgets.getChildCount();
for (int i = 0; i < count; i++) {
View child = mShortcutsAndWidgets.getChildAt(i);
@@ -1674,21 +1676,21 @@
lp = (CellLayoutLayoutParams) child.getLayoutParams();
r1.set(lp.getCellX(), lp.getCellY(), lp.getCellX() + lp.cellHSpan,
lp.getCellY() + lp.cellVSpan);
- if (Rect.intersects(r0, r1)) {
- mIntersectingViews.add(child);
- if (boundingRect != null) {
- boundingRect.union(r1);
- }
+ if (Rect.intersects(region, r1)) {
+ isOverlapping = true;
+ boundingRect.union(r1);
}
}
+ return isOverlapping ? boundingRect : null;
}
public boolean isNearestDropLocationOccupied(int pixelX, int pixelY, int spanX, int spanY,
View dragView, int[] result) {
result = findNearestAreaIgnoreOccupied(pixelX, pixelY, spanX, spanY, result);
- getViewsIntersectingRegion(result[0], result[1], spanX, spanY, dragView, null,
- mIntersectingViews);
- return !mIntersectingViews.isEmpty();
+ return getIntersectingRectanglesInRegion(
+ new Rect(result[0], result[1], result[0] + spanX, result[1] + spanY),
+ dragView
+ ) != null;
}
void revertTempState() {
@@ -2241,9 +2243,10 @@
cellToRect(targetDestination[0], targetDestination[1], spanX, spanY, dragRect);
dragRect.offset(dragViewCenterX - dragRect.centerX(), dragViewCenterY - dragRect.centerY());
- Rect dropRegionRect = new Rect();
- getViewsIntersectingRegion(targetDestination[0], targetDestination[1], spanX, spanY,
- dragView, dropRegionRect, mIntersectingViews);
+ Rect region = new Rect(targetDestination[0], targetDestination[1],
+ targetDestination[0] + spanX, targetDestination[1] + spanY);
+ Rect dropRegionRect = getIntersectingRectanglesInRegion(region, dragView);
+ if (dropRegionRect == null) dropRegionRect = new Rect(region);
int dropRegionSpanX = dropRegionRect.width();
int dropRegionSpanY = dropRegionRect.height();