Fixing selection management problems:

1. Clicking on a contact in QSB would not select the contact
and sometimes would not show it at all.
2. A really slow directory would prevent the first found contact
from being selected
3. If a request to view a non-existent contact was sent to the app,
it would sometimes fall into an infinite loop.

Bug: 3304574
Bug: 3304475


Change-Id: Id31582840535992550e33bc64674a0248ad7d66c
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 251393c..0b3e044 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.contacts.list;
 
+import com.android.common.widget.CompositeCursorAdapter.Partition;
 import com.android.contacts.R;
 import com.android.contacts.widget.AutoScrollListView;
 
@@ -351,6 +352,9 @@
 
         if (mFilterEnabled && mFilter != null) {
             adapter.setFilter(mFilter);
+            if (mSelectionRequired) {
+                adapter.setSelectedContact(mSelectedContactDirectoryId, mSelectedContactLookupKey);
+            }
         }
     }
 
@@ -372,7 +376,11 @@
             return;
         }
 
-        if (isLoading()) {
+        if (mRefreshingContactUri) {
+            return;
+        }
+
+        if (isLoadingDirectoryList()) {
             return;
         }
 
@@ -381,11 +389,29 @@
             return;
         }
 
+        boolean directoryLoading = true;
+        int count = adapter.getPartitionCount();
+        for (int i = 0; i < count; i++) {
+            Partition partition = adapter.getPartition(i);
+            if (partition instanceof DirectoryPartition) {
+                DirectoryPartition directory = (DirectoryPartition) partition;
+                if (directory.getDirectoryId() == mSelectedContactDirectoryId) {
+                    directoryLoading = directory.isLoading();
+                    break;
+                }
+            }
+        }
+
+        if (directoryLoading) {
+            return;
+        }
+
         adapter.setSelectedContact(mSelectedContactDirectoryId, mSelectedContactLookupKey);
 
         int selectedPosition = adapter.getSelectedContactPosition();
         if (selectedPosition == -1) {
             if (mSelectionRequired) {
+                mSelectionRequired = false;
                 notifyInvalidSelection();
                 return;
             }
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index c73b86e..1b7c9dc 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -296,7 +296,7 @@
     @Override
     public void onStart() {
         super.onStart();
-        
+
         mContactsPrefs.registerChangeListener(mPreferencesChangeListener);
 
         if (mProviderStatusLoader == null) {
@@ -450,15 +450,19 @@
             return true;
         }
 
-        if (isSearchMode() && getDirectorySearchMode() != DirectoryListLoader.SEARCH_MODE_NONE
-                && (mDirectoryListStatus == STATUS_NOT_LOADED
-                        || mDirectoryListStatus == STATUS_LOADING)) {
+        if (isLoadingDirectoryList()) {
             return true;
         }
 
         return false;
     }
 
+    public boolean isLoadingDirectoryList() {
+        return isSearchMode() && getDirectorySearchMode() != DirectoryListLoader.SEARCH_MODE_NONE
+                && (mDirectoryListStatus == STATUS_NOT_LOADED
+                        || mDirectoryListStatus == STATUS_LOADING);
+    }
+
     @Override
     public void onStop() {
         super.onStop();
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index f573003..c647402 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -135,11 +135,8 @@
     }
 
     public void setSelectedContact(long selectedDirectoryId, String lookupKey) {
-        if (mSelectedContactDirectoryId != selectedDirectoryId ||
-                !TextUtils.equals(mSelectedContactLookupKey, lookupKey)) {
-            this.mSelectedContactDirectoryId = selectedDirectoryId;
-            this.mSelectedContactLookupKey = lookupKey;
-        }
+        mSelectedContactDirectoryId = selectedDirectoryId;
+        mSelectedContactLookupKey = lookupKey;
     }
 
     protected static Uri buildSectionIndexerUri(Uri uri) {