Making UI.LIST_ALL_CONTACTS_ACTION work with loaders/fragments.

Change-Id: If529dc8294439b6b2d2ef91cbea95dc7b45859fc
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 2eb54ca..9e3f067 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -464,6 +464,7 @@
 
         switch (mMode) {
             case MODE_DEFAULT:
+            case MODE_CUSTOM:
             case MODE_INSERT_OR_EDIT_CONTACT:
             case MODE_QUERY_PICK_TO_EDIT:
             case MODE_FREQUENT:
@@ -486,6 +487,11 @@
                     fragment.setSearchResultsMode(true);
                 }
 
+                fragment.setContactsWithPhonesOnlyRestrictionEnabled(
+                        mIntentResolver.isContactsWithPhonesOnlyRestrictionEnabled());
+                fragment.setVisibleContactsRestrictionEnabled(
+                        mIntentResolver.isVisibleContactsRestrictionEnabled());
+
                 fragment.setOnContactListActionListener(new OnContactBrowserActionListener() {
                     public void onSearchAllContactsAction(String string) {
                         doSearch();
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index c1b90a5..3ded6de 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -405,10 +405,12 @@
     }
 
     protected void configureAdapter() {
-        mAdapter.setQueryString(mQueryString);
-        mAdapter.setContactNameDisplayOrder(mDisplayOrder);
-        mAdapter.setSortOrder(mSortOrder);
-        mAdapter.setNameHighlightingEnabled(isNameHighlighingEnabled());
+        if (mAdapter != null) {
+            mAdapter.setQueryString(mQueryString);
+            mAdapter.setContactNameDisplayOrder(mDisplayOrder);
+            mAdapter.setSortOrder(mSortOrder);
+            mAdapter.setNameHighlightingEnabled(isNameHighlighingEnabled());
+        }
     }
 
     @Override
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 888994b..3f8b524 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -470,4 +470,12 @@
         }
         return null;
     }
+
+    public boolean isVisibleContactsRestrictionEnabled() {
+        return mMode != MODE_CUSTOM && !mSearchResultsMode;
+    }
+
+    public boolean isContactsWithPhonesOnlyRestrictionEnabled() {
+        return mMode != MODE_CUSTOM;
+    }
 }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 8ea4901..12de913 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -35,10 +35,13 @@
     private boolean mEditMode;
     private boolean mCreateContactEnabled;
     private boolean mContactsWithPhoneNumbersOnly;
+    private boolean mContactsWithPhonesOnlyRestrictionEnabled = true;
+    private boolean mVisibleContactsRestrictionEnabled = true;
 
     // TODO: Remove this horrible hack once the framework can lookup fragments via findFragmentById
     public static DefaultContactBrowseListFragment sLastFragment = null;
 
+
     public DefaultContactBrowseListFragment() {
         setPhotoLoaderEnabled(true);
 
@@ -64,10 +67,17 @@
 
     public void setContactsWithPhoneNumbersOnly(boolean flag) {
         mContactsWithPhoneNumbersOnly = flag;
-        ContactListAdapter adapter = getAdapter();
-        if (adapter != null) {
-            ((DefaultContactListAdapter)adapter).setContactsWithPhoneNumbersOnly(flag);
-        }
+        configureAdapter();
+    }
+
+    public void setContactsWithPhonesOnlyRestrictionEnabled(boolean flag) {
+        this.mContactsWithPhonesOnlyRestrictionEnabled = flag;
+        configureAdapter();
+    }
+
+    public void setVisibleContactsRestrictionEnabled(boolean flag) {
+        this.mVisibleContactsRestrictionEnabled = flag;
+        configureAdapter();
     }
 
     @Override
@@ -96,7 +106,6 @@
         adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled());
         adapter.setDisplayPhotos(true);
         adapter.setQuickContactEnabled(true);
-
         return adapter;
     }
 
@@ -105,7 +114,12 @@
         super.configureAdapter();
 
         DefaultContactListAdapter adapter = (DefaultContactListAdapter)getAdapter();
-        adapter.setContactsWithPhoneNumbersOnly(mContactsWithPhoneNumbersOnly);
+        if (adapter != null) {
+            adapter.setContactsWithPhoneNumbersOnly(mContactsWithPhoneNumbersOnly
+                    && mContactsWithPhonesOnlyRestrictionEnabled);
+            adapter.setVisibleContactsOnly(!isSearchResultsMode()
+                    && mVisibleContactsRestrictionEnabled);
+        }
     }
 
     @Override
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 984e808..4c4323f 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -23,7 +23,6 @@
 import android.provider.ContactsContract.Contacts;
 import android.text.TextUtils;
 import android.view.View;
-import android.view.ViewGroup;
 
 /**
  * A cursor adapter for the {@link ContactsContract.Contacts#CONTENT_TYPE} content type.
@@ -31,6 +30,7 @@
 public class DefaultContactListAdapter extends ContactListAdapter {
 
     private boolean mContactsWithPhoneNumbersOnly;
+    private boolean mVisibleContactsOnly;
 
     public DefaultContactListAdapter(Context context) {
         super(context);
@@ -40,31 +40,31 @@
         mContactsWithPhoneNumbersOnly = flag;
     }
 
+    public void setVisibleContactsOnly(boolean flag) {
+        mVisibleContactsOnly = flag;
+    }
+
     @Override
     public void configureLoader(CursorLoader loader) {
         Uri uri;
+
         if (isSearchMode() || isSearchResultsMode()) {
             String query = getQueryString();
             uri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
                     TextUtils.isEmpty(query) ? "" : Uri.encode(query));
             loader.setProjection(FILTER_PROJECTION);
-            if (!isSearchResultsMode()) {
-                if (mContactsWithPhoneNumbersOnly) {
-                    loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1 AND "
-                            + Contacts.HAS_PHONE_NUMBER + "=1");
-                } else {
-                    loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1");
-                }
-            }
         } else {
             uri = Contacts.CONTENT_URI;
             loader.setProjection(PROJECTION);
-            if (mContactsWithPhoneNumbersOnly) {
-                loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1 AND "
-                        + Contacts.HAS_PHONE_NUMBER + "=1");
-            } else {
-                loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1");
-            }
+        }
+
+        if (mVisibleContactsOnly && mContactsWithPhoneNumbersOnly) {
+            loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1"
+                    + " AND " + Contacts.HAS_PHONE_NUMBER + "=1");
+        } else if (mVisibleContactsOnly) {
+            loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1");
+        } else if (mContactsWithPhoneNumbersOnly) {
+            loader.setSelection(Contacts.HAS_PHONE_NUMBER + "=1");
         }
 
         if (isSectionHeaderDisplayEnabled()) {