Bring back account filter

- ContactListFilterController no longer loads accounts and groups,
to display in the action bar drop down menu. Now it just stores
current filter and saves it to preferences.
- ContactListFilterLoader is no longer needed because we're not
loading groups anymore
- Move adapter from ContactListFilterController to the
AccountFilterActivity
- AccountFilterActivity loads a list of accounts and returns
a ContactListFilter as an activity result based on the account
selected
- If "customize" is selected, then the CustomContactListFilterActivity
will be launched.
- Show header in contacts list according to what account filter
was selected
- Update filter activities to holo theme

- TODO: Remove the "display phones only" option in the
customize menu on the phone

Change-Id: I45e0bdee80e7885d39bf09183a66ec50d81d1982
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 56bf4e5..e27445f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -315,11 +315,17 @@
             android:label="@string/activity_title_settings"
             android:theme="@style/ContactsPreferencesTheme" />
 
+        <!-- Used to filter contacts list by account -->
+        <activity
+            android:name=".list.AccountFilterActivity"
+            android:label="@string/activity_title_contacts_filter"
+            android:theme="@style/ContactListFilterTheme" />
+
         <!-- Used to select display and sync groups -->
         <activity
             android:name=".list.CustomContactListFilterActivity"
             android:label="@string/custom_list_filter"
-            android:theme="@style/CustomContactListFilterTheme" />
+            android:theme="@style/ContactListFilterTheme" />
 
         <activity
             android:name=".activities.ShowOrCreateActivity"
diff --git a/res/layout/contact_list_filter.xml b/res/layout/contact_list_filter.xml
new file mode 100644
index 0000000..de05cf8
--- /dev/null
+++ b/res/layout/contact_list_filter.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:fillViewport="true">
+
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dip"
+        android:layout_marginLeft="16dip"
+        android:layout_marginRight="16dip"
+        android:background="?android:attr/dividerHorizontal" />
+</LinearLayout>
diff --git a/res/layout/contacts_list_content.xml b/res/layout/contacts_list_content.xml
index 6792f9c..b92929b 100644
--- a/res/layout/contacts_list_content.xml
+++ b/res/layout/contacts_list_content.xml
@@ -21,6 +21,19 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
+    <TextView
+        android:id="@+id/account_filter_header"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:padding="5dip"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="@android:color/white"
+        android:background="@android:color/black"
+        android:visibility="gone" />
+
     <view
         class="com.android.contacts.list.ContactEntryListView"
         android:id="@android:id/list"
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 32d02be..4f2b073 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -60,10 +60,11 @@
         <item name="list_item_header_text_size">14sp</item>
     </style>
 
-    <style name="CustomContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
+    <style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
+        <item name="android:windowCloseOnTouchOutside">true</item>
     </style>
 
-    <style name="CustomContactListFilterView" parent="CustomContactListFilterTheme">
+    <style name="CustomContactListFilterView" parent="ContactListFilterTheme">
         <item name="android:layout_width">400dip</item>
         <item name="android:layout_height">400dip</item>
     </style>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 821e5f8..a25b73d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -366,6 +366,9 @@
     <!-- Displayed at the top of the contacts showing the zero total number of contacts visible when a group or account is selected  [CHAR LIMIT=64]-->
     <string name="listTotalAllContactsZeroGroup">No contacts in <xliff:g id="name" example="Friends">%s</xliff:g></string>
 
+    <!-- Displayed at the top of the contacts showing the account filter selected  [CHAR LIMIT=64] -->
+    <string name="listAllContactsInAccount">Contacts in <xliff:g id="name" example="abc@gmail.com">%s</xliff:g></string>
+
     <!-- Displayed at the top of the contacts showing the total number of contacts found when "Only contacts with phones" not selected -->
     <plurals name="listFoundAllContacts">
         <item quantity="one">1 found</item>
@@ -1490,6 +1493,9 @@
     <!-- Title of the settings activity [CHAR LIMIT=64] -->
     <string name="activity_title_settings">Settings</string>
 
+    <!-- Title of the activity that allows the uesr to filter the list of contacts displayed according to account [CHAR LIMIT=25] -->
+    <string name="activity_title_contacts_filter">Contacts to display</string>
+
     <!-- Menu item for the settings activity [CHAR LIMIT=64] -->
     <string name="menu_settings">Settings</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 067a730..914532c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -227,7 +227,7 @@
     <style name="ContactsPreferencesTheme" parent="@android:Theme.Holo.Light">
     </style>
 
-    <style name="CustomContactListFilterTheme" parent="@android:Theme">
+    <style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light">
     </style>
 
     <style name="ContactPickerLayout" parent="ContactPickerTheme">
@@ -235,7 +235,7 @@
         <item name="android:layout_height">match_parent</item>
     </style>
 
-    <style name="CustomContactListFilterView" parent="CustomContactListFilterTheme">
+    <style name="CustomContactListFilterView" parent="ContactListFilterTheme">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">match_parent</item>
     </style>
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index e0f8aef..51ed1e8 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -18,8 +18,6 @@
 
 import com.android.contacts.R;
 import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
-import com.android.contacts.list.ContactListFilterController;
-import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
 import com.android.contacts.list.ContactsRequest;
 
 import android.app.ActionBar;
@@ -36,8 +34,7 @@
 /**
  * Adapter for the action bar at the top of the Contacts activity.
  */
-public class ActionBarAdapter
-        implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
+public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
 
     public interface Listener {
         public enum Action {
@@ -61,7 +58,6 @@
     private final boolean mAlwaysShowSearchView;
 
     private Listener mListener;
-    private ContactListFilterController mFilterController;
 
     private ActionBar mActionBar;
 
@@ -108,11 +104,6 @@
         mListener = listener;
     }
 
-    public void setContactListFilterController(ContactListFilterController controller) {
-        mFilterController = controller;
-        mFilterController.addListener(this);
-    }
-
     public boolean isSearchMode() {
         return mSearchMode;
     }
@@ -210,20 +201,6 @@
         mActionBar.setSelectedNavigationItem(savedState.getInt(EXTRA_KEY_SELECTED_TAB));
     }
 
-    @Override
-    public void onContactListFiltersLoaded() {
-        update();
-    }
-
-    @Override
-    public void onContactListFilterChanged() {
-        update();
-    }
-
-    @Override
-    public void onContactListFilterCustomizationRequest() {
-    }
-
     private void setFocusOnSearchView() {
         mSearchView.requestFocus();
         mSearchView.setIconified(false); // Workaround for the "IME not popping up" issue.
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 19019f4..049deb0 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -32,6 +32,7 @@
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ImportExportDialogFragment;
 import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.AccountFilterActivity;
 import com.android.contacts.list.ContactBrowseListContextMenuAdapter;
 import com.android.contacts.list.ContactBrowseListFragment;
 import com.android.contacts.list.ContactEntryListFragment;
@@ -108,7 +109,8 @@
     private static final int SUBACTIVITY_EDIT_CONTACT = 3;
     private static final int SUBACTIVITY_NEW_GROUP = 4;
     private static final int SUBACTIVITY_EDIT_GROUP = 5;
-    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 6;
+    private static final int SUBACTIVITY_ACCOUNT_FILTER = 6;
+    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 7;
 
     private static final String KEY_SEARCH_MODE = "searchMode";
 
@@ -178,8 +180,6 @@
 
     public PeopleActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
-        // TODO: Get rid of the ContactListFilterController class because there aren't any
-        // dropdown filters anymore. Just store the selected filter as a member variable.
         mContactListFilterController = new ContactListFilterController(this);
         mContactListFilterController.addListener(this);
         mProviderStatusLoader = new ProviderStatusLoader(this);
@@ -304,7 +304,6 @@
         ActionBar actionBar = getActionBar();
         mActionBarAdapter = new ActionBarAdapter(this, this);
         mActionBarAdapter.onCreate(savedState, mRequest, getActionBar());
-        mActionBarAdapter.setContactListFilterController(mContactListFilterController);
 
         ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
         ContactDetailTabCarousel tabCarousel = (ContactDetailTabCarousel)
@@ -489,17 +488,6 @@
     }
 
     @Override
-    public void onContactListFiltersLoaded() {
-        if (mListFragment == null || !mListFragment.isAdded()) {
-            return;
-        }
-
-        mListFragment.setFilter(mContactListFilterController.getFilter());
-
-        invalidateOptionsMenuIfNeeded();
-    }
-
-    @Override
     public void onContactListFilterChanged() {
         if (mListFragment == null || !mListFragment.isAdded()) {
             return;
@@ -510,12 +498,6 @@
         invalidateOptionsMenuIfNeeded();
     }
 
-    @Override
-    public void onContactListFilterCustomizationRequest() {
-        startActivityForResult(new Intent(this, CustomContactListFilterActivity.class),
-                SUBACTIVITY_CUSTOMIZE_FILTER);
-    }
-
     private void setupContactDetailFragment(final Uri contactLookupUri) {
         mContactDetailLoaderFragment.loadUri(contactLookupUri);
         invalidateOptionsMenuIfNeeded();
@@ -593,7 +575,7 @@
             mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
         }
 
-        if (mContactListFilterController.isLoaded()) {
+        if (mContactListFilterController.isInitialized()) {
             mListFragment.setFilter(mContactListFilterController.getFilter());
         }
     }
@@ -1035,8 +1017,8 @@
                 return true;
             }
             case R.id.menu_contacts_filter: {
-                final Intent intent = new Intent(this, CustomContactListFilterActivity.class);
-                startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+                final Intent intent = new Intent(this, AccountFilterActivity.class);
+                startActivityForResult(intent, SUBACTIVITY_ACCOUNT_FILTER);
                 return true;
             }
             case R.id.menu_search: {
@@ -1115,13 +1097,30 @@
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
+            case SUBACTIVITY_ACCOUNT_FILTER: {
+                if (resultCode == Activity.RESULT_OK) {
+                    ContactListFilter filter = (ContactListFilter) data.getParcelableExtra(
+                            AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
+                    if (filter == null) {
+                        return;
+                    }
+                    // If this is a custom filter, launch the activity to customize the display list
+                    if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+                        final Intent intent = new Intent(this,
+                                CustomContactListFilterActivity.class);
+                        startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+                    } else {
+                        mContactListFilterController.setContactListFilter(filter, true);
+                    }
+                }
+                break;
+            }
             case SUBACTIVITY_CUSTOMIZE_FILTER: {
                 if (resultCode == Activity.RESULT_OK) {
                     mContactListFilterController.selectCustomFilter();
                 }
                 break;
             }
-
             case SUBACTIVITY_EDIT_CONTACT:
             case SUBACTIVITY_NEW_CONTACT: {
                 if (resultCode == RESULT_OK && mContentPaneDisplayed) {
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
new file mode 100644
index 0000000..c38599e
--- /dev/null
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.list;
+
+import com.android.contacts.ContactsActivity;
+import com.android.contacts.ContactsSearchManager;
+import com.android.contacts.R;
+import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypeManager;
+
+import android.accounts.Account;
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Shows a list of all available accounts, letting the user select under which account to view
+ * contacts.
+ */
+public class AccountFilterActivity extends ContactsActivity
+        implements AdapterView.OnItemClickListener {
+
+    private static final String TAG = AccountFilterActivity.class.getSimpleName();
+
+    public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
+
+    private ListView mListView;
+
+    private List<ContactListFilter> mFilters = new ArrayList<ContactListFilter>();
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.contact_list_filter);
+
+        mListView = (ListView) findViewById(com.android.internal.R.id.list);
+        mListView.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                finishAndSetResult(mFilters.get(position));
+            }
+        });
+
+        ActionBar actionBar =  getActionBar();
+        if (actionBar != null) {
+            actionBar.setDisplayHomeAsUpEnabled(true);
+        }
+
+        loadAccountFilters();
+    }
+
+    private void loadAccountFilters() {
+        ArrayList<ContactListFilter> accountFilters = new ArrayList<ContactListFilter>();
+        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
+        ArrayList<Account> accounts = accountTypes.getAccounts(false);
+        for (Account account : accounts) {
+            AccountType accountType = accountTypes.getAccountType(account.type);
+            Drawable icon = accountType != null ? accountType.getDisplayIcon(this) : null;
+            accountFilters.add(ContactListFilter.createAccountFilter(account.type, account.name,
+                    icon, account.name));
+        }
+        int count = accountFilters.size();
+
+        if (count >= 1) {
+            // If we only have one account, don't show it as "account", instead show it as "all"
+            mFilters.add(ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+            if (count > 1) {
+                mFilters.addAll(accountFilters);
+                mFilters.add(ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_CUSTOM));
+            }
+        }
+
+        mListView.setAdapter(new FilterListAdapter(this));
+    }
+
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        finishAndSetResult(mFilters.get(position));
+    }
+
+    private void finishAndSetResult(ContactListFilter filter) {
+        final Intent intent = new Intent();
+        intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+        setResult(Activity.RESULT_OK, intent);
+        finish();
+    }
+
+    @Override
+    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
+            boolean globalSearch) {
+        if (globalSearch) {
+            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
+        } else {
+            ContactsSearchManager.startSearch(this, initialQuery);
+        }
+    }
+
+    private class FilterListAdapter extends BaseAdapter {
+        private LayoutInflater mLayoutInflater;
+
+        public FilterListAdapter(Context context) {
+            mLayoutInflater = (LayoutInflater) context.getSystemService
+                    (Context.LAYOUT_INFLATER_SERVICE);
+        }
+
+        @Override
+        public int getCount() {
+            return mFilters.size();
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public ContactListFilter getItem(int position) {
+            return mFilters.get(position);
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ContactListFilterView view;
+            if (convertView != null) {
+                view = (ContactListFilterView) convertView;
+            } else {
+                view = (ContactListFilterView) mLayoutInflater.inflate(
+                        R.layout.filter_spinner_item, parent, false);
+            }
+            view.setSingleAccount(mFilters.size() == 1);
+            ContactListFilter filter = mFilters.get(position);
+            view.setContactListFilter(filter);
+            view.bindView(true);
+            return view;
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home:
+                finish();
+                return true;
+            default:
+                break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 533f24a..28b62ca 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -15,67 +15,43 @@
  */
 package com.android.contacts.list;
 
-import com.android.contacts.R;
-
 import android.app.Activity;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Context;
-import android.content.Loader;
 import android.content.SharedPreferences;
-import android.content.res.TypedArray;
-import android.os.Bundle;
 import android.preference.PreferenceManager;
-import android.text.TextUtils;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.ListPopupWindow;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Controls a list of {@link ContactListFilter}'s.
+ * Stores the {@link ContactListFilter} selected by the user and saves it to
+ * {@link SharedPreferences} if necessary.
  */
-// TODO: Remove the extra functionality dealing with loading and displaying a list of filters in
-// the action bar.
-public class ContactListFilterController
-        implements LoaderCallbacks<List<ContactListFilter>>, OnClickListener, OnItemClickListener {
+public class ContactListFilterController {
 
     public interface ContactListFilterListener {
-        void onContactListFiltersLoaded();
         void onContactListFilterChanged();
-        void onContactListFilterCustomizationRequest();
     }
 
     private Context mContext;
-    private LoaderManager mLoaderManager;
-    private boolean mEnabled = true;
     private List<ContactListFilterListener> mListeners = new ArrayList<ContactListFilterListener>();
-    private ListPopupWindow mPopup;
-    private int mPopupWidth = -1;
-    private List<ContactListFilter> mCachedFilters;
-    private SparseArray<ContactListFilter> mFilters;
-    private int mNextFilterId = 1;
-    private View mAnchor;
-    private FilterListAdapter mFilterListAdapter;
     private ContactListFilter mFilter;
-    private boolean mFiltersLoaded;
-    private int mAccountCount;
+
+    private boolean mIsInitialized;
 
     public ContactListFilterController(Activity activity) {
         mContext = activity;
-        mLoaderManager = activity.getLoaderManager();
     }
 
-    public void setEnabled(boolean flag) {
-        mEnabled = flag;
+    public void onStart() {
+        if (mFilter == null) {
+            mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
+            mIsInitialized = true;
+        }
+    }
+
+    public boolean isInitialized() {
+        return mIsInitialized;
     }
 
     public void addListener(ContactListFilterListener listener) {
@@ -90,157 +66,10 @@
         return mFilter;
     }
 
-    public int getFilterCount() {
-        return mFilters != null ? mFilters.size() : 0;
-    }
-
-    public boolean isLoaded() {
-        return mFiltersLoaded;
-    }
-
-    public void onStart() {
-        if (mFilter == null) {
-            mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
-        }
-    }
-
     private SharedPreferences getSharedPreferences() {
         return PreferenceManager.getDefaultSharedPreferences(mContext);
     }
 
-    @Override
-    public ContactListFilterLoader onCreateLoader(int id, Bundle args) {
-        return new ContactListFilterLoader(mContext);
-    }
-
-    @Override
-    public void onLoadFinished(
-            Loader<List<ContactListFilter>> loader, List<ContactListFilter> filters) {
-        int count = filters.size();
-        if (mCachedFilters != null && mCachedFilters.size() == count) {
-            boolean changed = false;
-            for (int i = 0; i < filters.size(); i++) {
-                ContactListFilter filter1 = mCachedFilters.get(i);
-                ContactListFilter filter2 = filters.get(i);
-                if (!filter1.equals(filter2)) {
-                    changed = true;
-                    break;
-                }
-
-                // Group title is intentionally not included in the "equals" algorithm for
-                // ContactListFilter, because we want stability of filter identity
-                // across label changes.  However, here we do care about the label changes.
-                if (filter1.filterType == ContactListFilter.FILTER_TYPE_GROUP &&
-                        !TextUtils.equals(filter1.title, filter2.title)) {
-                    changed = true;
-                    break;
-                }
-            }
-
-            if (!changed) {
-                return;
-            }
-        }
-
-        mCachedFilters = filters;
-
-        if (mFilters == null) {
-            mFilters = new SparseArray<ContactListFilter>(filters.size());
-        } else {
-            mFilters.clear();
-        }
-
-        boolean filterValid = mFilter != null && !mFilter.isValidationRequired();
-
-        mAccountCount = 0;
-        for (int index = 0; index < count; index++) {
-            if (filters.get(index).filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
-                mAccountCount++;
-            }
-        }
-
-        if (mAccountCount != 1) {
-            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
-            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_STARRED));
-        }
-
-        for (int index = 0; index < count; index++) {
-            ContactListFilter filter = filters.get(index);
-
-            boolean firstAndOnly = mAccountCount == 1
-                    && filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT;
-
-            // If we only have one account, don't show it as "account", instead show it as "all"
-            if (firstAndOnly) {
-                filter = ContactListFilter.createFilterWithType(
-                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-            }
-
-            mFilters.append(mNextFilterId++, filter);
-
-            if (filter.equals(mFilter)) {
-                // Refresh the filter in case the title got changed
-                mFilter = filter;
-                filterValid = true;
-            }
-
-            if (firstAndOnly) {
-                mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                        ContactListFilter.FILTER_TYPE_STARRED));
-            }
-        }
-
-        if (mAccountCount > 0) {
-            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_CUSTOM));
-        }
-
-        boolean filterChanged = false;
-        if (mFilter == null  || !filterValid) {
-            filterChanged = mFilter != null;
-            mFilter = getDefaultFilter();
-        }
-
-        if (mFilterListAdapter == null) {
-            mFilterListAdapter = new FilterListAdapter();
-        } else {
-            mFilterListAdapter.notifyDataSetChanged();
-        }
-
-        mFiltersLoaded = true;
-        notifyContacListFiltersLoaded();
-
-        if (filterChanged) {
-            notifyContactListFilterChanged();
-        }
-    }
-
-    public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
-    }
-
-    private void setContactListFilter(int filterId) {
-        ContactListFilter filter;
-        if (filterId == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
-            filter = ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-        } else if (filterId == ContactListFilter.FILTER_TYPE_CUSTOM) {
-            filter = ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_CUSTOM);
-        } else if (filterId == ContactListFilter.FILTER_TYPE_STARRED) {
-            filter = ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_STARRED);
-        } else {
-            filter = mFilters.get(filterId);
-            if (filter == null) {
-                filter = getDefaultFilter();
-            }
-        }
-
-        setContactListFilter(filter, true);
-    }
-
     public void setContactListFilter(ContactListFilter filter, boolean persistent) {
         if (!filter.equals(mFilter)) {
             mFilter = filter;
@@ -253,59 +82,9 @@
         }
     }
 
-    @Override
-    public void onClick(View v) {
-        if (!mFiltersLoaded || !mEnabled) {
-            return;
-        }
-
-        if (mPopupWidth == -1) {
-            TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ContactBrowser);
-            mPopupWidth = a.getDimensionPixelSize(
-                    R.styleable.ContactBrowser_contact_filter_popup_width, -1);
-            a.recycle();
-
-            if (mPopupWidth == -1) {
-                mPopupWidth = mAnchor.getWidth();
-            }
-        }
-
-        mPopup = new ListPopupWindow(mContext, null);
-        mPopup.setWidth(mPopupWidth);
-        mPopup.setAdapter(mFilterListAdapter);
-        mPopup.setAnchorView(mAnchor);
-        mPopup.setOnItemClickListener(this);
-        mPopup.setModal(true);
-        mPopup.show();
-    }
-
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        mPopup.dismiss();
-        if (mFilters.get((int) id).filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
-            notifyContactListFilterCustomizationRequest();
-        } else {
-            setContactListFilter((int) id);
-        }
-    }
-
     public void selectCustomFilter() {
-        mFilter = ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_CUSTOM);
-        notifyContactListFilterChanged();
-    }
-
-    public int getAccountCount() {
-        return mAccountCount;
-    }
-
-    private ContactListFilter getDefaultFilter() {
-        return mFilters.size() > 0 ? mFilters.valueAt(0) : null;
-    }
-
-    private void notifyContacListFiltersLoaded() {
-        for (ContactListFilterListener listener : mListeners) {
-            listener.onContactListFiltersLoaded();
-        }
+        setContactListFilter(ContactListFilter.createFilterWithType(
+                ContactListFilter.FILTER_TYPE_CUSTOM), true);
     }
 
     private void notifyContactListFilterChanged() {
@@ -314,48 +93,4 @@
         }
     }
 
-    private void notifyContactListFilterCustomizationRequest() {
-        for (ContactListFilterListener listener : mListeners) {
-            listener.onContactListFilterCustomizationRequest();
-        }
-    }
-
-    private class FilterListAdapter extends BaseAdapter {
-        private LayoutInflater mLayoutInflater;
-
-        public FilterListAdapter() {
-            mLayoutInflater = LayoutInflater.from(mContext);
-        }
-
-        @Override
-        public int getCount() {
-            return mFilters.size();
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return mFilters.keyAt(position);
-        }
-
-        @Override
-        public Object getItem(int position) {
-            return mFilters.valueAt(position);
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ContactListFilterView view;
-            if (convertView != null) {
-                view = (ContactListFilterView) convertView;
-            } else {
-                view = (ContactListFilterView) mLayoutInflater.inflate(
-                        R.layout.filter_spinner_item, parent, false);
-            }
-            view.setSingleAccount(mAccountCount == 1);
-            ContactListFilter filter = mFilters.valueAt(position);
-            view.setContactListFilter(filter);
-            view.setActivated(filter.equals(mFilter));
-            view.bindView(true);
-            return view;
-        }
-    }
 }
diff --git a/src/com/android/contacts/list/ContactListFilterLoader.java b/src/com/android/contacts/list/ContactListFilterLoader.java
deleted file mode 100644
index 07c11bc..0000000
--- a/src/com/android/contacts/list/ContactListFilterLoader.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.list;
-
-import com.android.contacts.model.AccountType;
-import com.android.contacts.model.AccountTypeManager;
-
-import android.accounts.Account;
-import android.content.AsyncTaskLoader;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Groups;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A loader for the data needed for the group selector.
- */
-public class ContactListFilterLoader extends AsyncTaskLoader<List<ContactListFilter>> {
-
-    private static final class GroupQuery {
-        public static final String[] COLUMNS = {
-            Groups._ID,
-            Groups.ACCOUNT_TYPE,
-            Groups.ACCOUNT_NAME,
-            Groups.TITLE,
-            Groups.AUTO_ADD,
-            Groups.SOURCE_ID,
-            Groups.GROUP_IS_READ_ONLY,
-        };
-
-        public static final int ID = 0;
-        public static final int ACCOUNT_TYPE = 1;
-        public static final int ACCOUNT_NAME = 2;
-        public static final int TITLE = 3;
-        public static final int IS_DEFAULT_GROUP = 4;       // Using the AUTO_ADD group as default
-        public static final int SOURCE_ID = 5;
-        public static final int GROUP_IS_READ_ONLY = 6;
-
-        public static final String SELECTION =
-                Groups.DELETED + "=0" +
-                " AND " + Groups.FAVORITES + "=0" +
-                " AND " + Groups.ACCOUNT_TYPE + " NOT NULL" +
-                " AND " + Groups.ACCOUNT_NAME + " NOT NULL";
-    }
-
-    private boolean mStopped;
-    private ForceLoadContentObserver mObserver;
-    private ArrayList<ContactListFilter> mResults;
-
-    public ContactListFilterLoader(Context context) {
-        super(context);
-    }
-
-    @Override
-    public List<ContactListFilter> loadInBackground() {
-
-        ArrayList<ContactListFilter> results = new ArrayList<ContactListFilter>();
-        Context context = getContext();
-        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(context);
-        ArrayList<Account> accounts = accountTypes.getAccounts(false);
-        for (Account account : accounts) {
-            AccountType accountType = accountTypes.getAccountType(account.type);
-            Drawable icon = accountType != null ? accountType.getDisplayIcon(getContext()) : null;
-            results.add(ContactListFilter.createAccountFilter(account.type, account.name, icon,
-                    account.name));
-        }
-
-        ContentResolver resolver = context.getContentResolver();
-
-        Cursor cursor = resolver.query(
-                Groups.CONTENT_URI, GroupQuery.COLUMNS, GroupQuery.SELECTION, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long groupId = cursor.getLong(GroupQuery.ID);
-                String groupSourceId = cursor.getString(GroupQuery.SOURCE_ID);
-                boolean groupReadOnly = cursor.getInt(GroupQuery.GROUP_IS_READ_ONLY) != 0;
-                String accountType = cursor.getString(GroupQuery.ACCOUNT_TYPE);
-                String accountName = cursor.getString(GroupQuery.ACCOUNT_NAME);
-                boolean defaultGroup = false;
-                if (!cursor.isNull(GroupQuery.IS_DEFAULT_GROUP)) {
-                    defaultGroup = cursor.getInt(GroupQuery.IS_DEFAULT_GROUP) != 0;
-                }
-                if (defaultGroup) {
-                    // Find the filter for this account and set the default group ID
-                    for (ContactListFilter filter : results) {
-                        if (filter.accountName.equals(accountName)
-                                && filter.accountType.equals(accountType)) {
-                            filter.groupId = groupId;
-                            filter.groupSourceId = groupSourceId;
-                            break;
-                        }
-                    }
-                } else {
-                    String title = cursor.getString(GroupQuery.TITLE);
-                    results.add(ContactListFilter.createGroupFilter(accountType, accountName,
-                            groupId, groupSourceId, groupReadOnly, title));
-                }
-            }
-        } finally {
-            cursor.close();
-        }
-
-        Collections.sort(results);
-
-        mResults = results;
-        return results;
-    }
-
-    /* Runs on the UI thread */
-    @Override
-    public void deliverResult(List<ContactListFilter> results) {
-        if (!mStopped) {
-            super.deliverResult(results);
-        }
-    }
-
-    @Override
-    protected void onStartLoading() {
-        if (mObserver == null) {
-            mObserver = new ForceLoadContentObserver();
-            getContext().getContentResolver().registerContentObserver(
-                    Contacts.CONTENT_URI, true, mObserver);
-        }
-
-        mStopped = false;
-
-        if (mResults != null) {
-            deliverResult(mResults);
-        } else {
-            forceLoad();
-        }
-    }
-
-    @Override
-    protected void onStopLoading() {
-        if (mObserver != null) {
-            getContext().getContentResolver().unregisterContentObserver(mObserver);
-            mObserver = null;
-        }
-
-        mResults = null;
-
-        // Attempt to cancel the current load task if possible.
-        cancelLoad();
-
-        // Make sure that any outstanding loads clean themselves up properly
-        mStopped = true;
-    }
-
-    @Override
-    protected void onReset() {
-        stopLoading();
-    }
-}
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index f95c4af..88531e1 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -34,6 +34,7 @@
 
     private View mCounterHeaderView;
     private View mSearchHeaderView;
+    private TextView mAccountFilterHeaderView;
 
     public DefaultContactBrowseListFragment() {
         setPhotoLoaderEnabled(true);
@@ -63,6 +64,8 @@
     protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
         super.onCreateView(inflater, container);
 
+        mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+
         // Putting the header view inside a container will allow us to make
         // it invisible later. See checkHeaderViewVisibility()
         FrameLayout headerContainer = new FrameLayout(inflater.getContext());
@@ -92,6 +95,19 @@
     }
 
     @Override
+    public void setFilter(ContactListFilter filter) {
+        super.setFilter(filter);
+        if (filter != null && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
+                filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM) {
+            mAccountFilterHeaderView.setText(getContext().getString(
+                    R.string.listAllContactsInAccount, filter.accountName));
+            mAccountFilterHeaderView.setVisibility(View.VISIBLE);
+        } else {
+            mAccountFilterHeaderView.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
     protected void showCount(int partitionIndex, Cursor data) {
         if (!isSearchMode() && data != null) {
             int count = data.getCount();