Fixes in selection management

Specifically, after creating a new contact that contact
would not get selected.  Also, after deleting a contact
the default contact would get selected, but the selection
would not get shown in the detail panel.

Change-Id: Ia4d078d22f257419c9fa9c590dc6e0083be3d457
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 4f1f353..c202615 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -238,7 +238,7 @@
                 configureFragments(false /* from request */);
             }
 
-            mListFragment.setSelectedContactUri(uri);
+            mListFragment.reloadDataAndSetSelectedUri(uri);
         }
     }
 
@@ -609,8 +609,8 @@
         public void onInvalidSelection() {
             ContactListFilter filter =
                     new ContactListFilter(ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
+            mListFragment.setFilter(filter, false);
             mContactListFilterController.setContactListFilter(filter, true);
-            mListFragment.setFilter(filter);
         }
     }
 
@@ -945,7 +945,7 @@
             case SUBACTIVITY_NEW_CONTACT: {
                 if (resultCode == RESULT_OK) {
                     mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
-                    mListFragment.setSelectedContactUri(data.getData());
+                    mListFragment.reloadDataAndSetSelectedUri(data.getData());
                 }
                 break;
             }
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 636f74c..82658a4 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -1182,6 +1182,10 @@
 
         @Override
         public void onLoadFinished(Loader<ContactLoader.Result> loader, ContactLoader.Result data) {
+            if (!((ContactLoader)loader).getLookupUri().equals(mLookupUri)) {
+                return;
+            }
+
             if (data != ContactLoader.Result.NOT_FOUND && data != ContactLoader.Result.ERROR) {
                 mContactData = data;
             } else {
@@ -1198,6 +1202,7 @@
 
         public void onLoaderReset(Loader<ContactLoader.Result> loader) {
             mContactData = null;
+            bindData();
         }
     };
 
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 3d227cc..a53fce7 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -124,7 +124,14 @@
                 return;
             }
 
-            onContactUriQueryFinished(Contacts.getLookupUri(contactId, lookupKey));
+            Uri uri;
+            if (contactId != 0 && lookupKey != null) {
+                uri = Contacts.getLookupUri(contactId, lookupKey);
+            } else {
+                uri = null;
+            }
+
+            onContactUriQueryFinished(uri);
         }
     }
 
@@ -160,6 +167,10 @@
     }
 
     public void setFilter(ContactListFilter filter) {
+        setFilter(filter, true);
+    }
+
+    public void setFilter(ContactListFilter filter, boolean restoreSelectedUri) {
         if (mFilter == null && filter == null) {
             return;
         }
@@ -172,8 +183,10 @@
 
         mFilter = filter;
         saveFilter();
-        mSelectedContactUri = null;
-        restoreSelectedUri(true);
+        if (restoreSelectedUri) {
+            mSelectedContactUri = null;
+            restoreSelectedUri(true);
+        }
         reloadData();
     }
 
@@ -494,6 +507,11 @@
         super.startLoading();
     }
 
+    public void reloadDataAndSetSelectedUri(Uri uri) {
+        setSelectedContactUri(uri, true, true, true, true);
+        reloadData();
+    }
+
     @Override
     public void reloadData() {
         if (mStartedLoading) {