OSDN Git Service

Guarded against ArrayOutOfBounds
authorFabian Kozynski <kozynski@google.com>
Mon, 15 Oct 2018 18:25:18 +0000 (14:25 -0400)
committerFabian Kozynski <kozynski@google.com>
Wed, 17 Oct 2018 13:28:20 +0000 (09:28 -0400)
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

packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java

index 92f5cae..15d2e66 100644 (file)
@@ -308,6 +308,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> 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<Holder> 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<Holder> 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<Holder> 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);
         }