From de644de4fd1132deddf823f722d5151f8374a0c2 Mon Sep 17 00:00:00 2001 From: MrSluffy Date: Sat, 21 Oct 2023 09:53:51 +0800 Subject: [PATCH] Make sure not to access elements beyond their bounds This error occurs when dock grid is greater than workspace grid Error : java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 at com.android.launcher3.CellLayout$ViewCluster.isViewTouchingEdge(CellLayout.java:2053) at com.android.launcher3.CellLayout.pushViewsToTempLocation(CellLayout.java:1894) at com.android.launcher3.CellLayout.attemptPushInDirection(CellLayout.java:2173) at com.android.launcher3.CellLayout.rearrangementExists(CellLayout.java:2372) at com.android.launcher3.celllayout.ReorderAlgorithm.findReorderSolution(ReorderAlgorithm.java:76) at com.android.launcher3.celllayout.ReorderAlgorithm.calculateReorder(ReorderAlgorithm.java:185) at com.android.launcher3.CellLayout.calculateReorder(CellLayout.java:2435) at com.android.launcher3.CellLayout.performReorder(CellLayout.java:2453) at com.android.launcher3.Workspace.manageReorderOnDragOver(Workspace.java:2589) at com.android.launcher3.Workspace.onDragOver(Workspace.java:2570) at com.android.launcher3.dragndrop.DragController.checkTouchMove(DragController.java:489) at com.android.launcher3.dragndrop.DragController.handleMoveEvent(DragController.java:453) at com.android.launcher3.dragndrop.LauncherDragController.startDrag(LauncherDragController.java:154) at com.android.launcher3.dragndrop.DragController.startDrag(DragController.java:156) at com.android.launcher3.Workspace.beginDragShared(Workspace.java:1830) at com.android.launcher3.Workspace.beginDragShared(Workspace.java:1732) at com.android.launcher3.Workspace.startDrag(Workspace.java:1721) at com.android.launcher3.touch.ItemLongClickListener.beginDrag(ItemLongClickListener.java:85) at com.android.launcher3.touch.ItemLongClickListener.onWorkspaceItemLongClick(ItemLongClickListener.java:65) at com.android.launcher3.touch.ItemLongClickListener.$r8$lambda$nz9MSaglTImbNX-jBQmvpOY7s8M --- src/com/android/launcher3/CellLayout.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index ec80525d3b..52484b5a91 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -2026,31 +2026,35 @@ public class CellLayout extends ViewGroup { dirtyEdges &= ~whichEdge; } + int leftEdgeLength = leftEdge.length; + int rightEdgeLength = rightEdge.length; + int topEdgeLength = topEdge.length; + int bottomEdgeLength = bottomEdge.length; switch (whichEdge) { case LEFT: for (int i = cs.cellY; i < cs.cellY + cs.spanY; i++) { - if (leftEdge[i] == cs.cellX + cs.spanX) { + if (i >= 0 && i < leftEdgeLength && leftEdge[i] == cs.cellX + cs.spanX) { return true; } } break; case RIGHT: for (int i = cs.cellY; i < cs.cellY + cs.spanY; i++) { - if (rightEdge[i] == cs.cellX) { + if (i >= 0 && i < rightEdgeLength && rightEdge[i] == cs.cellX) { return true; } } break; case TOP: for (int i = cs.cellX; i < cs.cellX + cs.spanX; i++) { - if (topEdge[i] == cs.cellY + cs.spanY) { + if (i >= 0 && i < topEdgeLength && topEdge[i] == cs.cellY + cs.spanY) { return true; } } break; case BOTTOM: for (int i = cs.cellX; i < cs.cellX + cs.spanX; i++) { - if (bottomEdge[i] == cs.cellY) { + if (i >= 0 && i < bottomEdgeLength && bottomEdge[i] == cs.cellY) { return true; } }