indexOfValueByValue now uses .equals

To address the issue that indexOfValue does not compare objects by
value (using .equals). I have made a method that does the indexOfValue
operation but instead comparing Objects using equals. New method created
as it was too late to change indexOfValue itself.

Change-Id: Ie58ce279aca74ef25ce151d8f8bde769f644f0d0
diff --git a/core/java/android/util/SparseArray.java b/core/java/android/util/SparseArray.java
index 34e6f04..c766660 100644
--- a/core/java/android/util/SparseArray.java
+++ b/core/java/android/util/SparseArray.java
@@ -346,14 +346,44 @@
             gc();
         }
 
-        for (int i = 0; i < mSize; i++)
-            if (mValues[i] == value)
+        for (int i = 0; i < mSize; i++) {
+            if (mValues[i] == value) {
                 return i;
+            }
+        }
 
         return -1;
     }
 
     /**
+     * Returns an index for which {@link #valueAt} would return the
+     * specified key, or a negative number if no keys map to the
+     * specified value.
+     * <p>Beware that this is a linear search, unlike lookups by key,
+     * and that multiple keys can map to the same value and this will
+     * find only one of them.
+     * <p>Note also that this method uses {@code equals} unlike {@code indexOfValue}.
+     */
+    public int indexOfValueByValue(E value) {
+        if (mGarbage) {
+            gc();
+        }
+
+        for (int i = 0; i < mSize; i++) {
+            if (value == null) {
+                if (mValues[i] == null) {
+                    return i;
+                }
+            } else {
+                if (value.equals(mValues[i])) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
      * Removes all key-value mappings from this SparseArray.
      */
     public void clear() {