From: Fabian Kozynski Date: Mon, 15 Oct 2018 18:25:18 +0000 (-0400) Subject: Guarded against ArrayOutOfBounds X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=1fda7cba7e0d9d82f2459ea1e3595d72fb3faf9f;p=android-x86%2Fframeworks-base.git Guarded against ArrayOutOfBounds In some monkey tests, getAdapterPosition returns -1 (for example, if the ViewHolder is not bound). In this case, we shouldn't proceed with the moving operation. Test: manual Change-Id: I1eccc2c60136ddf5cc0175d88a3fddbe1d2a5a97 Fixes: 117769352 Fixes: 116871219 --- diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 92f5cae4e165..15d2e66a82ce 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -308,6 +308,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public void onClick(View v) { int position = holder.getAdapterPosition(); + if (position == RecyclerView.NO_POSITION) return; if (mAccessibilityAction != ACTION_NONE) { selectPosition(position, v); } else { @@ -561,6 +562,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta if (viewHolder == mCurrentDrag) return; if (mCurrentDrag != null) { int position = mCurrentDrag.getAdapterPosition(); + if (position == RecyclerView.NO_POSITION) return; TileInfo info = mTiles.get(position); mCurrentDrag.mTileView.setShowAppLabel( position > mEditIndex && !info.isSystem); @@ -582,13 +584,14 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public boolean canDropOver(RecyclerView recyclerView, ViewHolder current, ViewHolder target) { - if (target.getAdapterPosition() == 0){ + final int position = target.getAdapterPosition(); + if (position == 0 || position == RecyclerView.NO_POSITION){ return false; } if (!canRemoveTiles() && current.getAdapterPosition() < mEditIndex) { - return target.getAdapterPosition() < mEditIndex; + return position < mEditIndex; } - return target.getAdapterPosition() <= mEditIndex + 1; + return position <= mEditIndex + 1; } @Override @@ -610,6 +613,10 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta public boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target) { int from = viewHolder.getAdapterPosition(); int to = target.getAdapterPosition(); + if (from == 0 || from == RecyclerView.NO_POSITION || + to == 0 || to == RecyclerView.NO_POSITION) { + return false; + } return move(from, to, target.itemView); }