Continued clean-up work on the contact browser state machine

Change-Id: Ief3060e6f81db8f58e1a213b75eafa42205d39d3
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 937ebee..dbf9f6c 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -231,11 +231,7 @@
             });
         }
 
-        configureListFragment(true /* from request */);
-
-        if (mContactContentDisplayed) {
-            setupContactDetailFragment(mListFragment.getSelectedContactUri());
-        }
+        configureFragments(true /* from request */);
     }
 
     @Override
@@ -285,13 +281,11 @@
 
     @Override
     protected void onStart() {
-        if (mContactListFilterController != null) {
-            mContactListFilterController.startLoading();
-        }
+        mContactListFilterController.startLoading();
         super.onStart();
     }
 
-    private void configureListFragment(boolean fromRequest) {
+    private void configureFragments(boolean fromRequest) {
         boolean searchMode = mSearchMode;
         if (fromRequest) {
             ContactListFilter filter = null;
@@ -321,36 +315,44 @@
                 mContactListFilterController.setContactListFilter(new ContactListFilter(
                         ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
             }
-        } else {
-            if (mHasActionBar) {
-                searchMode = mActionBarAdapter.isSearchMode();
-            }
+        } else if (mHasActionBar) {
+            searchMode = mActionBarAdapter.isSearchMode();
         }
 
         boolean replaceList = mListFragment == null || (mSearchMode != searchMode);
         if (replaceList) {
-            closeListFragment();
+            if (mListFragment != null) {
+                mListFragment.setOnContactListActionListener(null);
+            }
+
             mSearchMode = searchMode;
+
             if (mSearchMode) {
                 mListFragment = createContactSearchFragment();
                 // When switching to the search mode, erase previous state of the search UI
                 mListFragment.eraseSelectedUri(mPrefs);
             } else {
                 mListFragment = createListFragment(ContactsRequest.ACTION_DEFAULT);
-                mListFragment.requestSelectionOnScreen(false);
             }
         }
 
-        if (mHasActionBar && mSearchMode) {
-            mListFragment.setQueryString(mActionBarAdapter.getQueryString());
-        }
-
-        if (fromRequest && !mSearchMode) {
-            Uri selectUri = mRequest.getContactUri();
-            if (selectUri != null) {
-                mListFragment.setSelectedContactUri(selectUri);
-                mListFragment.saveSelectedUri(mPrefs);
-                mListFragment.requestSelectionOnScreen(false);
+        if (mSearchMode) {
+            if (mHasActionBar) {
+                mListFragment.setQueryString(mActionBarAdapter.getQueryString());
+            }
+        } else {
+            DefaultContactBrowseListFragment fragment =
+                (DefaultContactBrowseListFragment) mListFragment;
+            fragment.setFilter(mContactListFilterController.getFilter());
+            if (fromRequest && mRequest.getContactUri() != null) {
+                fragment.setSelectedContactUri(mRequest.getContactUri());
+                fragment.saveSelectedUri(mPrefs);
+            } else {
+                fragment.restoreSelectedUri(mPrefs);
+            }
+            fragment.requestSelectionOnScreen(false);
+            if (mContactContentDisplayed) {
+                setupContactDetailFragment(fragment.getSelectedContactUri());
             }
         }
 
@@ -358,17 +360,6 @@
             getFragmentManager().openTransaction()
                     .replace(R.id.list_container, mListFragment)
                     .commit();
-
-            if (mContactContentDisplayed) {
-                setupContactDetailFragment(mListFragment.getSelectedContactUri());
-            }
-        }
-    }
-
-    private void closeListFragment() {
-        if (mListFragment != null) {
-            mListFragment.setOnContactListActionListener(null);
-            mListFragment = null;
         }
     }
 
@@ -384,6 +375,10 @@
     public void onContactListFilterChanged() {
         resetContactSelectionInIntent();
 
+        if (mListFragment == null) {
+            return;
+        }
+
         DefaultContactBrowseListFragment fragment =
                 (DefaultContactBrowseListFragment) mListFragment;
         ContactListFilter filter = mContactListFilterController.getFilter();
@@ -529,7 +524,7 @@
      */
     @Override
     public void onAction() {
-        configureListFragment(false /* from request */);
+        configureFragments(false /* from request */);
     }
 
     /**
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 4b890cf..d5554ce 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -124,7 +124,9 @@
     public void startLoading() {
         // Set the "ready" flag right away - we only want to start the loader once
         mFiltersLoaded = false;
-        mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
+        if (mFilter == null) {
+            mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
+        }
         loadFilters();
     }