Fixing issue where contact photos are shown in the wrong location due to
a concurrent change to the search results list which occurs after the
the request to load the contact photo is registered, but prior to it
being fulfilled.

Bug: 13967012
Change-Id: I6f14e69ad1841df8b7da5632e4a9551b6641e04b
diff --git a/TestCommon/src/com/android/contacts/common/test/mocks/MockContactPhotoManager.java b/TestCommon/src/com/android/contacts/common/test/mocks/MockContactPhotoManager.java
index 32fb899..dd919cc 100644
--- a/TestCommon/src/com/android/contacts/common/test/mocks/MockContactPhotoManager.java
+++ b/TestCommon/src/com/android/contacts/common/test/mocks/MockContactPhotoManager.java
@@ -45,6 +45,10 @@
     }
 
     @Override
+    public void cancelPendingRequests() {
+    }
+
+    @Override
     public void pause() {
     }
 
diff --git a/src/com/android/contacts/common/ContactPhotoManager.java b/src/com/android/contacts/common/ContactPhotoManager.java
index ce02a0b..f3a73ff 100644
--- a/src/com/android/contacts/common/ContactPhotoManager.java
+++ b/src/com/android/contacts/common/ContactPhotoManager.java
@@ -410,6 +410,11 @@
     public abstract void removePhoto(ImageView view);
 
     /**
+     * Cancels all pending requests to load photos asynchronously.
+     */
+    public abstract void cancelPendingRequests();
+
+    /**
      * Temporarily stops loading photos from the database.
      */
     public abstract void pause();
@@ -728,6 +733,15 @@
         mPendingRequests.remove(view);
     }
 
+
+    /**
+     * Cancels all pending requests to load photos asynchronously.
+     */
+    @Override
+    public void cancelPendingRequests() {
+        mPendingRequests.clear();
+    }
+
     @Override
     public void refreshCache() {
         if (mBitmapHolderCacheAllUnfresh) {
diff --git a/src/com/android/contacts/common/list/ContactEntryListAdapter.java b/src/com/android/contacts/common/list/ContactEntryListAdapter.java
index 202f121..3c8a450 100644
--- a/src/com/android/contacts/common/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/common/list/ContactEntryListAdapter.java
@@ -436,6 +436,9 @@
         if (isSectionHeaderDisplayEnabled() && partitionIndex == getIndexedPartition()) {
             updateIndexer(cursor);
         }
+
+        // When the cursor changes, cancel any pending asynchronous photo loads.
+        mPhotoLoader.cancelPendingRequests();
     }
 
     public void changeCursor(Cursor cursor) {