Fix crasher due to IndexOutOfBoundsException

Make sure that we check for the index to exist in the list before
we query for it.  The problem is that the index is grabbed from the
listview but then applied to the contact entry arraylist. It is
possible that these two are out of temporarily out of sync. This check
will make sure that we do not throw an exception in those cases.

Bug: 19103509
Change-Id: Iba620ec859866b9f8bfc2614a17b1b1a11037230
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index 3f67012..e957c83 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -431,7 +431,7 @@
      * @param itemIndex Position of the contact in {@link #mContactEntries}.
      * @return True if the given index is valid for {@link #mContactEntries}.
      */
-    private boolean isIndexInBound(int itemIndex) {
+    public boolean isIndexInBound(int itemIndex) {
         return itemIndex >= 0 && itemIndex < mContactEntries.size();
     }
 
diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java
index a420316..63f1f34 100644
--- a/src/com/android/dialer/list/SpeedDialFragment.java
+++ b/src/com/android/dialer/list/SpeedDialFragment.java
@@ -312,6 +312,12 @@
         for (int i = 0; i < mListView.getChildCount(); i++) {
             final View child = mListView.getChildAt(i);
             final int position = firstVisiblePosition + i;
+            // Since we are getting the position from mListView and then querying
+            // mContactTileAdapter, its very possible that things are out of sync
+            // and we might index out of bounds.  Let's make sure that this doesn't happen.
+            if (!mContactTileAdapter.isIndexInBound(position)) {
+                continue;
+            }
             final long itemId = mContactTileAdapter.getItemId(position);
             if (DEBUG) {
                 Log.d(TAG, "Saving itemId: " + itemId + " for listview child " + i + " Top: "
@@ -320,7 +326,6 @@
             mItemIdTopMap.put(itemId, child.getTop());
             mItemIdLeftMap.put(itemId, child.getLeft());
         }
-
         mItemIdTopMap.put(KEY_REMOVED_ITEM_HEIGHT, removedItemHeight);
     }
 
@@ -348,6 +353,13 @@
                     final View child = mListView.getChildAt(i);
                     int position = firstVisiblePosition + i;
 
+                    // Since we are getting the position from mListView and then querying
+                    // mContactTileAdapter, its very possible that things are out of sync
+                    // and we might index out of bounds.  Let's make sure that this doesn't happen.
+                    if (!mContactTileAdapter.isIndexInBound(position)) {
+                        continue;
+                    }
+
                     final long itemId = mContactTileAdapter.getItemId(position);
 
                     if (containsId(idsInPlace, itemId)) {