Bringing back contacts display preferences.

Cleaning up some life-cycle management issues.

Change-Id: Ifd29b898e46eb5bb713d65327d80cbf7aa562933
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 26fb083..f3660fe 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -409,7 +409,6 @@
     }
 
     // The size of a home screen shortcut icon.
-    private ContactsPreferences mContactsPrefs;
     public int mDisplayOrder;
     private int mSortOrder;
 
@@ -435,8 +434,6 @@
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        mContactsPrefs = new ContactsPreferences(this);
-
         mQueryHandler = new QueryHandler(this);
         mJustCreated = true;
         mSyncEnabled = true;
@@ -673,7 +670,6 @@
             }
             case MODE_LEGACY_PICK_PHONE:
             case MODE_PICK_PHONE: {
-                mListFragment = new DefaultContactListFragment();
                 PhoneNumberPickerFragment fragment = new PhoneNumberPickerFragment();
                 if (mMode == MODE_LEGACY_PICK_PHONE) {
                     fragment.setLegacyCompatibility(true);
@@ -739,8 +735,6 @@
         mListFragment.setSearchMode(mSearchMode);
         mListFragment.setSearchResultsMode(mSearchResultsMode);
         mListFragment.setQueryString(mInitialFilter);
-        mListFragment.setContactNameDisplayOrder(mContactsPrefs.getDisplayOrder());
-        mListFragment.setSortOrder(mContactsPrefs.getSortOrder());
 
         if ((mMode & MODE_MASK_SHOW_PHOTOS) == MODE_MASK_SHOW_PHOTOS) {
             mListFragment.setPhotoLoaderEnabled(true);
@@ -793,29 +787,6 @@
         }
     }
 
-    /**
-     * Sets the mode when the request is for "default"
-     */
-    private void setDefaultMode() {
-        // Load the preferences
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-
-        mDisplayOnlyPhones = prefs.getBoolean(Prefs.DISPLAY_ONLY_PHONES,
-                Prefs.DISPLAY_ONLY_PHONES_DEFAULT);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-
-        // Move to the fragment
-        if (mListFragment != null) {
-            mListFragment.setContactNameDisplayOrder(mContactsPrefs.getDisplayOrder());
-            mListFragment.setSortOrder(mContactsPrefs.getSortOrder());
-        }
-    }
-
-
     @Override
     protected void onStop() {
         super.onStop();
@@ -1588,33 +1559,6 @@
         // Cancel any pending queries
         mQueryHandler.cancelOperation(QUERY_TOKEN);
 
-        mSortOrder = mContactsPrefs.getSortOrder();
-        mDisplayOrder = mContactsPrefs.getDisplayOrder();
-
-        if (mListFragment != null) {
-            mListFragment.setContactNameDisplayOrder(mDisplayOrder);
-            mListFragment.setSortOrder(mSortOrder);
-        }
-
-        if (mListView instanceof ContactEntryListView) {
-            ContactEntryListView listView = (ContactEntryListView)mListView;
-
-            // When sort order and display order contradict each other, we want to
-            // highlight the part of the name used for sorting.
-            if (mSortOrder == ContactsContract.Preferences.SORT_ORDER_PRIMARY &&
-                    mDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE) {
-                listView.setHighlightNamesWhenScrolling(true);
-                mAdapter.setNameHighlightingEnabled(true);
-            } else if (mSortOrder == ContactsContract.Preferences.SORT_ORDER_ALTERNATIVE &&
-                    mDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
-                listView.setHighlightNamesWhenScrolling(true);
-                mAdapter.setNameHighlightingEnabled(true);
-            } else {
-                listView.setHighlightNamesWhenScrolling(false);
-                mAdapter.setNameHighlightingEnabled(false);
-            }
-        }
-
         String[] projection = getProjectionForQuery();
         if (mSearchMode && TextUtils.isEmpty(mListFragment.getQueryString())) {
             mAdapter.changeCursor(new MatrixCursor(projection));
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 94585a0..05f2364 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -28,17 +28,12 @@
 
     private OnContactBrowserActionListener mListener;
 
-    // TODO
-    private boolean mContactsWithPhoneNumbersOnly;
-
     @Override
     protected void prepareEmptyView() {
         if (isSearchMode()) {
             return;
         } else if (isSearchResultsMode()) {
             setEmptyText(R.string.noMatchingContacts);
-        } else if (mContactsWithPhoneNumbersOnly) {
-            setEmptyText(R.string.noContactsWithPhoneNumbers);
         } else if (isSyncActive()) {
             if (hasIccCard()) {
                 setEmptyText(R.string.noContactsHelpTextWithSync);
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 6f133c4..18a1297 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -22,6 +22,7 @@
 import com.android.contacts.ContactsApplicationController;
 import com.android.contacts.ContactsListActivity;
 import com.android.contacts.R;
+import com.android.contacts.ui.ContactsPreferences;
 import com.android.contacts.widget.ContextMenuAdapter;
 import com.android.contacts.widget.SearchEditText;
 import com.android.contacts.widget.SearchEditText.OnCloseListener;
@@ -36,12 +37,14 @@
 import android.content.Context;
 import android.content.IContentService;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Parcelable;
 import android.os.RemoteException;
+import android.preference.PreferenceManager;
 import android.provider.ContactsContract;
 import android.provider.Settings;
 import android.provider.ContactsContract.ProviderStatus;
@@ -109,6 +112,8 @@
     private SearchEditText mSearchEditText;
     private ContactListEmptyView mEmptyView;
     private ProviderStatusLoader mProviderStatusLoader;
+    private SharedPreferences mSharedPrefs;
+    private ContactsPreferences mContactsPrefs;
 
     private int mProviderStatus = ProviderStatus.STATUS_NORMAL;
 
@@ -130,19 +135,6 @@
         return mAdapter;
     }
 
-    public void setListAdapter(T adapter) {
-        mAdapter = adapter;
-        mListView.setAdapter(mAdapter);
-        if (isPhotoLoaderEnabled()) {
-            mAdapter.setPhotoLoader(mPhotoLoader);
-        }
-        if (isNameHighlighingEnabled()) {
-            mAdapter.setNameHighlightingEnabled(true);
-        }
-
-        ((ContactsListActivity)getActivity()).setupListView(mAdapter, mListView);
-    }
-
     public View getView() {
         return mView;
     }
@@ -189,6 +181,7 @@
     }
 
     protected void reloadData() {
+        configureAdapter();
         mAdapter.configureLoader(mLoader);
         mLoader.forceLoad();
     }
@@ -309,11 +302,41 @@
     }
 
     @Override
+    public void onStart() {
+        if (mSharedPrefs == null) {
+            Context activity = getActivity();
+            mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
+            mContactsPrefs = new ContactsPreferences(activity);
+        }
+
+        loadPreferences(mSharedPrefs, mContactsPrefs);
+        configureAdapter();
+        mAdapter.configureLoader(mLoader);
+
+        ContactEntryListView listView = (ContactEntryListView)mListView;
+        listView.setHighlightNamesWhenScrolling(isNameHighlighingEnabled());
+
+        super.onStart();
+    }
+
+    protected void loadPreferences(SharedPreferences prefs, ContactsPreferences contactsPrefs) {
+        setContactNameDisplayOrder(contactsPrefs.getDisplayOrder());
+        setSortOrder(contactsPrefs.getSortOrder());
+    }
+
+    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container) {
         mView = createView(inflater, container);
         mAdapter = createListAdapter();
-        mAdapter.configureLoader(mLoader);
-        setListAdapter(mAdapter);
+        mAdapter.setSearchMode(isSearchMode());
+        mAdapter.setSearchResultsMode(isSearchResultsMode());
+
+        mListView.setAdapter(mAdapter);
+        if (isPhotoLoaderEnabled()) {
+            mAdapter.setPhotoLoader(mPhotoLoader);
+        }
+
+        ((ContactsListActivity)getActivity()).setupListView(mAdapter, mListView);
         return mView;
     }
 
@@ -350,9 +373,6 @@
             mListView.setOnCreateContextMenuListener(mContextMenuAdapter);
         }
 
-        ContactEntryListView listView = (ContactEntryListView)mListView;
-        listView.setHighlightNamesWhenScrolling(isNameHighlighingEnabled());
-
         if (isPhotoLoaderEnabled()) {
             mPhotoLoader =
                 new ContactPhotoLoader(getActivity(), R.drawable.ic_contact_list_picture);
@@ -377,6 +397,13 @@
         return mView;
     }
 
+    protected void configureAdapter() {
+        mAdapter.setQueryString(mQueryString);
+        mAdapter.setContactNameDisplayOrder(mDisplayOrder);
+        mAdapter.setSortOrder(mSortOrder);
+        mAdapter.setNameHighlightingEnabled(isNameHighlighingEnabled());
+    }
+
     private boolean isNameHighlighingEnabled() {
         // When sort order and display order contradict each other, we want to
         // highlight the part of the name used for sorting.
@@ -423,7 +450,6 @@
         super.onDestroy();
     }
 
-
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         hideSoftKeyboard();
 
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index e52a9a2..78c5493 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -104,10 +104,6 @@
 
         adapter.setSearchMode(isSearchMode());
         adapter.setSearchResultsMode(isSearchResultsMode());
-        adapter.setQueryString(getQueryString());
-
-        adapter.setContactNameDisplayOrder(getContactNameDisplayOrder());
-        adapter.setSortOrder(getSortOrder());
 
         // If "Create new contact" is shown, don't display the empty list UI
         adapter.setEmptyListEnabled(!isCreateContactEnabled());
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 2aa9627..d9f87f4 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -16,7 +16,10 @@
 package com.android.contacts.list;
 
 import com.android.contacts.R;
+import com.android.contacts.ui.ContactsPreferences;
+import com.android.contacts.ui.ContactsPreferencesActivity.Prefs;
 
+import android.content.SharedPreferences;
 import android.database.Cursor;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -31,6 +34,32 @@
 
     private boolean mEditMode;
     private boolean mCreateContactEnabled;
+    private boolean mContactsWithPhoneNumbersOnly;
+
+    @Override
+    protected void prepareEmptyView() {
+        if (mContactsWithPhoneNumbersOnly) {
+            setEmptyText(R.string.noContactsWithPhoneNumbers);
+        } else {
+            super.prepareEmptyView();
+        }
+    }
+
+    @Override
+    protected void loadPreferences(SharedPreferences prefs, ContactsPreferences contactsPrefs) {
+        super.loadPreferences(prefs, contactsPrefs);
+
+        setContactsWithPhoneNumbersOnly(prefs.getBoolean(Prefs.DISPLAY_ONLY_PHONES,
+                Prefs.DISPLAY_ONLY_PHONES_DEFAULT));
+    }
+
+    public void setContactsWithPhoneNumbersOnly(boolean flag) {
+        mContactsWithPhoneNumbersOnly = flag;
+        ContactListAdapter adapter = getAdapter();
+        if (adapter != null) {
+            ((DefaultContactListAdapter)adapter).setContactsWithPhoneNumbersOnly(flag);
+        }
+    }
 
     @Override
     protected void onItemClick(int position, long id) {
@@ -56,14 +85,6 @@
     protected ContactListAdapter createListAdapter() {
         DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity());
         adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled());
-
-        adapter.setSearchMode(isSearchMode());
-        adapter.setSearchResultsMode(isSearchResultsMode());
-        adapter.setQueryString(getQueryString());
-
-        adapter.setContactNameDisplayOrder(getContactNameDisplayOrder());
-        adapter.setSortOrder(getSortOrder());
-
         adapter.setDisplayPhotos(true);
         adapter.setQuickContactEnabled(true);
 
@@ -71,6 +92,14 @@
     }
 
     @Override
+    protected void configureAdapter() {
+        super.configureAdapter();
+
+        DefaultContactListAdapter adapter = (DefaultContactListAdapter)getAdapter();
+        adapter.setContactsWithPhoneNumbersOnly(mContactsWithPhoneNumbersOnly);
+    }
+
+    @Override
     protected View inflateView(LayoutInflater inflater, ViewGroup container) {
         if (isSearchMode()) {
             return inflater.inflate(R.layout.contacts_search_content, null);
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 3ddf42c..5322041 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -30,10 +30,16 @@
  */
 public class DefaultContactListAdapter extends ContactListAdapter {
 
+    private boolean mContactsWithPhoneNumbersOnly;
+
     public DefaultContactListAdapter(Context context) {
         super(context);
     }
 
+    public void setContactsWithPhoneNumbersOnly(boolean flag) {
+        mContactsWithPhoneNumbersOnly = flag;
+    }
+
     @Override
     public void configureLoader(CursorLoader loader) {
         Uri uri;
@@ -43,12 +49,22 @@
                     TextUtils.isEmpty(query) ? "" : Uri.encode(query));
             loader.setProjection(CONTACTS_SUMMARY_FILTER_PROJECTION);
             if (!isSearchResultsMode()) {
-                loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1");
+                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(CONTACTS_SUMMARY_PROJECTION);
-            loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1");
+            if (mContactsWithPhoneNumbersOnly) {
+                loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1 AND "
+                        + Contacts.HAS_PHONE_NUMBER + "=1");
+            } else {
+                loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1");
+            }
         }
 
         if (isSectionHeaderDisplayEnabled()) {
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index 315ac82..7d00669 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -63,17 +63,8 @@
     @Override
     protected PhoneNumberListAdapter createListAdapter() {
         PhoneNumberListAdapter adapter = new PhoneNumberListAdapter(getActivity());
-
         adapter.setSectionHeaderDisplayEnabled(true);
         adapter.setDisplayPhotos(true);
-
-        adapter.setSearchMode(isSearchMode());
-        adapter.setSearchResultsMode(isSearchResultsMode());
-        adapter.setQueryString(getQueryString());
-
-        adapter.setContactNameDisplayOrder(getContactNameDisplayOrder());
-        adapter.setSortOrder(getSortOrder());
-
         return adapter;
     }
 
diff --git a/src/com/android/contacts/list/PostalAddressPickerFragment.java b/src/com/android/contacts/list/PostalAddressPickerFragment.java
index 133ce10..e886a76 100644
--- a/src/com/android/contacts/list/PostalAddressPickerFragment.java
+++ b/src/com/android/contacts/list/PostalAddressPickerFragment.java
@@ -57,13 +57,6 @@
         adapter.setSectionHeaderDisplayEnabled(true);
         adapter.setDisplayPhotos(true);
 
-        adapter.setSearchMode(isSearchMode());
-        adapter.setSearchResultsMode(isSearchResultsMode());
-        adapter.setQueryString(getQueryString());
-
-        adapter.setContactNameDisplayOrder(getContactNameDisplayOrder());
-        adapter.setSortOrder(getSortOrder());
-
         return adapter;
     }
 
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 58f7de3..be330ec 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -43,12 +43,7 @@
                 new StrequentContactListAdapter(getActivity(), CALL_BUTTON_ID);
         adapter.setSectionHeaderDisplayEnabled(false);
         adapter.setDisplayPhotos(true);
-
-        adapter.setContactNameDisplayOrder(getContactNameDisplayOrder());
-        adapter.setSortOrder(getSortOrder());
-
         adapter.setQuickContactEnabled(true);
-
         adapter.setCallButtonListener(this);
 
         return adapter;
diff --git a/tests/src/com/android/contacts/ContactListModeTest.java b/tests/src/com/android/contacts/ContactListModeTest.java
index 8a3a341..f09cc8d 100644
--- a/tests/src/com/android/contacts/ContactListModeTest.java
+++ b/tests/src/com/android/contacts/ContactListModeTest.java
@@ -102,7 +102,6 @@
         startActivity(intent, null, null);
         ContactsListActivity activity = getActivity();
         activity.runQueriesSynchronously();
-        activity.onResume();        // Trigger the queries
 
         ListView listView = (ListView)activity.findViewById(android.R.id.list);
         ListAdapter adapter = listView.getAdapter();