Making list switch to All Contacts when contact not found

Bug: 3349063
Change-Id: Iaf85a98293f7bf947fe8d7a71e2538fa80a27a9d
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 4fb835a..ea7fffe 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -506,9 +506,16 @@
 
         @Override
         public void onInvalidSelection() {
-            ContactListFilter filter =
-                    new ContactListFilter(ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
-            mListFragment.setFilter(filter, false);
+            ContactListFilter filter;
+            ContactListFilter currentFilter = mListFragment.getFilter();
+            if (currentFilter != null
+                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
+                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+                mListFragment.setFilter(filter);
+            } else {
+                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
+                mListFragment.setFilter(filter, false);
+            }
             mContactListFilterController.setContactListFilter(filter, true);
         }
     }
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index b47c7db..03684f2 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -435,12 +435,6 @@
         if (selectedPosition != -1) {
             mLastSelectedPosition = selectedPosition;
         } else {
-            if (mSelectionRequired) {
-                mSelectionRequired = false;
-                notifyInvalidSelection();
-                return;
-            }
-
             if (isSearchMode()) {
                 selectFirstFoundContactAfterDelay();
                 if (mListener != null) {
@@ -449,6 +443,33 @@
                 return;
             }
 
+            if (mSelectionRequired) {
+                // A specific contact was requested, but it's not in the loaded list.
+
+                // Try reconfiguring and reloading the list that will hopefully contain
+                // the requested contact. Only take one attempt to avoid an infinite loop
+                // in case the contact cannot be found at all.
+                mSelectionRequired = false;
+
+                // If we were looking at a different specific contact, just reload
+                if (mFilter != null
+                        && mFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
+                    reloadData();
+                } else {
+                    // Otherwise, call the listener, which will adjust the filter.
+                    notifyInvalidSelection();
+                }
+                return;
+            }
+
+            // If we were trying to load a specific contact, but that contact no longer
+            // exists, call the listener, which will adjust the filter.
+            if (mFilter != null
+                    && mFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
+                notifyInvalidSelection();
+                return;
+            }
+
             saveSelectedUri(null);
             selectDefaultContact();
         }