Merge "Remove some TODOs and imports"
diff --git a/res/layout-sw580dp/people_activity.xml b/res/layout-sw580dp/people_activity.xml
index 1d02042..8bf627f 100644
--- a/res/layout-sw580dp/people_activity.xml
+++ b/res/layout-sw580dp/people_activity.xml
@@ -40,11 +40,6 @@
             android:background="@drawable/list_background_holo"
             android:visibility="gone">
 
-            <View
-                style="@style/SectionDivider"
-                android:layout_marginLeft="40dip"
-                android:layout_marginTop="24dip" />
-
             <!-- All -->
             <fragment
                 android:id="@+id/all_fragment"
diff --git a/res/layout/contact_list_filter.xml b/res/layout/contact_list_filter.xml
index de05cf8..37aaf53 100644
--- a/res/layout/contact_list_filter.xml
+++ b/res/layout/contact_list_filter.xml
@@ -25,7 +25,9 @@
         android:id="@android:id/list"
         android:layout_width="match_parent"
         android:layout_height="0dip"
-        android:layout_weight="1" />
+        android:layout_weight="1"
+        android:layout_marginLeft="@dimen/contact_filter_left_margin"
+        android:layout_marginRight="@dimen/contact_filter_right_margin" />
 
     <View
         android:layout_width="match_parent"
diff --git a/res/layout/contact_list_filter_custom.xml b/res/layout/contact_list_filter_custom.xml
index 195ff1a..a4fe48e 100644
--- a/res/layout/contact_list_filter_custom.xml
+++ b/res/layout/contact_list_filter_custom.xml
@@ -25,8 +25,8 @@
         android:layout_width="match_parent"
         android:layout_height="0dip"
         android:layout_weight="1"
-        android:layout_marginLeft="16dip"
-        android:layout_marginRight="16dip"/>
+        android:layout_marginLeft="@dimen/contact_filter_left_margin"
+        android:layout_marginRight="@dimen/contact_filter_right_margin" />
 
     <View
         android:layout_width="match_parent"
diff --git a/res/layout/filter_spinner_item.xml b/res/layout/contact_list_filter_item.xml
similarity index 75%
rename from res/layout/filter_spinner_item.xml
rename to res/layout/contact_list_filter_item.xml
index c2d5d68..b27cab8 100644
--- a/res/layout/filter_spinner_item.xml
+++ b/res/layout/contact_list_filter_item.xml
@@ -17,32 +17,27 @@
 <view
     xmlns:android="http://schemas.android.com/apk/res/android"
     class="com.android.contacts.list.ContactListFilterView"
-    android:layout_height="52dip"
-    android:layout_width="fill_parent"
-    android:paddingLeft="7dip"
-    android:paddingRight="7dip"
-    android:paddingTop="2dip"
-    android:paddingBottom="2dip"
-    android:gravity="left">
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="@dimen/contact_filter_item_min_height">
 
     <View
         android:id="@+id/indent"
-        android:layout_width="40dip"
+        android:layout_width="32dip"
         android:layout_height="fill_parent" />
 
     <ImageView
         android:id="@+id/icon"
         android:scaleType="fitCenter"
-        android:layout_width="24dip"
-        android:layout_height="24dip"
-        android:layout_marginLeft="8dip"
-        android:layout_marginRight="7dip"
+        android:layout_width="@dimen/contact_filter_icon_size"
+        android:layout_height="@dimen/contact_filter_icon_size"
         android:layout_gravity="center_vertical" />
 
     <TextView
         android:id="@+id/label"
         android:layout_width="wrap_content"
-        android:layout_height="fill_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="8dip"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:gravity="center_vertical"
         android:ellipsize="end" />
diff --git a/res/layout/contacts_list_content.xml b/res/layout/contacts_list_content.xml
index 490499c..92841b6 100644
--- a/res/layout/contacts_list_content.xml
+++ b/res/layout/contacts_list_content.xml
@@ -14,10 +14,14 @@
      limitations under the License.
 -->
 
+<!-- android:paddingTop is used instead of android:layout_marginTop. It looks
+     android:layout_marginTop is ignored when used with <fragment></fragment>, which
+     only happens in Tablet UI since we rely on ViewPager in Phone UI.
+     Instead, android:layout_marginTop inside <fragment /> is effective. -->
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/pinned_header_list_layout"
-    android:layout_marginTop="@dimen/contact_browser_list_top_margin"
+    android:paddingTop="@dimen/contact_browser_list_top_margin"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
     <LinearLayout
@@ -25,24 +29,38 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <TextView
-            android:id="@+id/account_filter_header"
+        <!-- Shown only when an Account filter is set. -->
+        <LinearLayout
+            android:id="@+id/account_filter_header_container"
             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" />
+            android:orientation="vertical"
+            android:layout_marginLeft="@dimen/contact_browser_list_header_left_margin"
+            android:layout_marginRight="@dimen/contact_browser_list_header_right_margin"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/account_filter_header"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:minHeight="@dimen/contact_filter_header_min_height"
+                android:layout_marginLeft="8dip"
+                android:singleLine="true"
+                android:ellipsize="end"
+                android:gravity="left"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorSecondary" />
+            <View
+                android:id="@+id/account_filter_header_bottom_divider"
+                style="@style/SectionDivider" />
+        </LinearLayout>
 
         <view
             class="com.android.contacts.list.ContactEntryListView"
             android:id="@android:id/list"
             android:layout_width="match_parent"
             android:layout_height="0dip"
+            android:layout_marginLeft="@dimen/contact_browser_list_left_margin"
+            android:layout_marginRight="@dimen/contact_browser_list_right_margin"
             android:fastScrollEnabled="true"
             android:layout_weight="1" />
 
@@ -61,7 +79,7 @@
         android:ellipsize="end"
         android:gravity="right"
         android:layout_gravity="top|right"
-        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textAppearance="?android:attr/textAppearanceSmall"
         android:textColor="@color/contact_count_text_color"
         android:background="@color/contact_browser_list_bk_color" />
 </FrameLayout>
diff --git a/res/layout/custom_contact_list_filter_account.xml b/res/layout/custom_contact_list_filter_account.xml
index b19ae2d..8c1b6c1 100644
--- a/res/layout/custom_contact_list_filter_account.xml
+++ b/res/layout/custom_contact_list_filter_account.xml
@@ -37,7 +37,7 @@
             android:layout_height="wrap_content"
             android:singleLine="true"
             android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:textAppearance="?android:attr/textAppearanceMedium"
             android:duplicateParentState="true" />
 
         <TextView
@@ -46,8 +46,9 @@
             android:layout_height="wrap_content"
             android:layout_below="@android:id/text1"
             android:layout_alignLeft="@android:id/text1"
-            android:maxLines="2"
+            android:maxLines="1"
             android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/textColorTertiary"
             android:duplicateParentState="true" />
 
     </RelativeLayout>
diff --git a/res/layout/directory_header.xml b/res/layout/directory_header.xml
index 2748923..af0b5bd 100644
--- a/res/layout/directory_header.xml
+++ b/res/layout/directory_header.xml
@@ -19,42 +19,40 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     style="@style/DirectoryHeader"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/directory_header_height"
-    >
-    <TextView
-        android:id="@+id/count"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_centerVertical="true"
-        android:layout_alignParentRight="true"
-        android:layout_marginRight="8dip"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:attr/textColorTertiary"
-        android:textStyle="bold"
-    />
-    <TextView
-        android:id="@+id/label"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignBaseline="@id/count"
-        android:layout_marginLeft="8dip"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:attr/textColorTertiary"
-        android:textStyle="bold"
-    />
+    android:layout_height="wrap_content">
     <TextView
         android:id="@+id/display_name"
-        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
-        android:layout_toRightOf="@id/label"
-        android:layout_toLeftOf="@id/count"
-        android:layout_alignBaseline="@id/count"
-        android:layout_marginLeft="6dip"
-        android:layout_marginRight="6dip"
+        android:layout_height="wrap_content"
+        android:minHeight="@dimen/directory_header_height"
+        android:layout_toRightOf="@+id/label"
+        android:layout_toLeftOf="@+id/count"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="8dip"
+        android:layout_marginRight="8dip"
         android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:attr/textColorTertiary"
-        android:singleLine="true"
-        android:ellipsize="end"
-    />
+        android:textColor="?android:attr/textColorSecondary"
+        android:singleLine="true" />
+    <TextView
+        android:id="@+id/label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignBaseline="@id/display_name"
+        android:layout_marginLeft="8dip"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary" />
+    <TextView
+        android:id="@+id/count"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_marginRight="8dip"
+        android:layout_alignBaseline="@id/display_name"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary" />
+    <View
+        android:id="@+id/contact_filter_header_bottom_divider"
+        style="@style/SectionDivider"
+        android:layout_below="@id/display_name" />
 </RelativeLayout>
diff --git a/res/layout/search_header.xml b/res/layout/search_header.xml
index ab8ec53..b1ba00f 100644
--- a/res/layout/search_header.xml
+++ b/res/layout/search_header.xml
@@ -17,18 +17,17 @@
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="28dip"
-    android:background="@drawable/infobar_dark">
+    android:layout_height="wrap_content"
+    android:minHeight="@dimen/contact_filter_header_min_height"
+    android:background="@android:color/transparent">
     <TextView
         android:id="@+id/totalContactsText"
-        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:layout_centerVertical="true"
         android:layout_alignParentLeft="true"
-        android:layout_marginLeft="8dip"
-        android:textColor="#ffbfbfbf"
-        android:textSize="14sp"
-        android:textStyle="normal" />
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary" />
 
     <ProgressBar
         android:id="@+id/progress"
@@ -37,7 +36,6 @@
         android:layout_toRightOf="@id/totalContactsText"
         style="?android:attr/progressBarStyleSmall"
         android:layout_alignParentRight="true"
-        android:layout_centerVertical="true"
-        android:layout_marginRight="10dip" />
+        android:layout_centerVertical="true" />
 
 </RelativeLayout>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index aa3af3f..99f87ff 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -18,4 +18,9 @@
         android:id="@+id/search_on_action_bar"
         android:icon="@android:drawable/ic_menu_search"
         android:showAsAction="always" />
+
+    <item
+        android:id="@+id/filter_option"
+        android:title="@string/menu_contacts_filter"
+        android:showAsAction="withText" />
 </menu>
diff --git a/res/values-sw580dp-w1000dp/dimens.xml b/res/values-sw580dp-w1000dp/dimens.xml
index d8503d9..d5f5e58 100644
--- a/res/values-sw580dp-w1000dp/dimens.xml
+++ b/res/values-sw580dp-w1000dp/dimens.xml
@@ -21,6 +21,4 @@
     <dimen name="detail_header_view_margin">16dip</dimen>
     <dimen name="detail_header_attribution_height">56dip</dimen>
     <dimen name="detail_update_section_top_padding">48dip</dimen>
-    <dimen name="contact_browser_list_left_margin">0dip</dimen>
-    <dimen name="contacts_count_right_margin">24dip</dimen>
 </resources>
diff --git a/res/values-sw580dp-w720dp/dimens.xml b/res/values-sw580dp-w720dp/dimens.xml
index c072a95..399c26c 100644
--- a/res/values-sw580dp-w720dp/dimens.xml
+++ b/res/values-sw580dp-w720dp/dimens.xml
@@ -21,6 +21,4 @@
     <dimen name="editor_title_label_width">150dip</dimen>
     <dimen name="editor_interpolator_narrow_width">800dip</dimen>
     <dimen name="editor_name_text_field_right_margin">10dip</dimen>
-    <dimen name="contact_browser_list_left_margin">0dip</dimen>
-    <dimen name="contacts_count_right_margin">24dip</dimen>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index ab630d2..ed845be 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -32,11 +32,17 @@
     <dimen name="action_bar_search_spacing">12dip</dimen>
     <dimen name="shortcut_icon_size">64dip</dimen>
     <dimen name="list_section_height">37dip</dimen>
-    <dimen name="directory_header_height">56dip</dimen>
     <dimen name="detail_update_section_item_vertical_padding">32dip</dimen>
     <dimen name="search_view_width">400dip</dimen>
-    <dimen name="contact_browser_list_left_margin">0dip</dimen>
-    <dimen name="contacts_count_right_margin">24dip</dimen>
     <!-- Center vertically -->
     <dimen name="quick_contact_top_position">-1px</dimen>
+    <!-- Contact list (vertical scroll bar comes left) -->
+    <dimen name="directory_header_height">24dip</dimen>
+    <dimen name="contacts_count_right_margin">24dip</dimen>
+    <dimen name="contact_browser_list_top_margin">16dip</dimen>
+    <dimen name="contact_browser_list_header_left_margin">@dimen/list_visible_scrollbar_padding</dimen>
+    <dimen name="contact_browser_list_header_right_margin">24dip</dimen>
+    <dimen name="contact_browser_list_left_margin">0dip</dimen>
+    <dimen name="contact_browser_list_right_margin">0dip</dimen>
+    <dimen name="list_visible_scrollbar_padding">48dip</dimen>
 </resources>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 0c4c8ba..b9b87cf 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -84,6 +84,8 @@
     </style>
 
     <style name="DirectoryHeader" parent="PeopleTheme">
+        <item name="android:paddingTop">0dip</item>
+        <item name="android:paddingBottom">0dip</item>
         <item name="android:background">@drawable/directory_bg_holo</item>
     </style>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 997cdf0..a9d745f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -90,6 +90,7 @@
 
     <!-- Secondary text color in the People app -->
     <color name="secondary_text_color">#777777</color>
+    <color name="dialtacts_secondary_text_color">#888888</color>
 
     <!-- Colors in the contact browser list -->
     <color name="contact_browser_list_bk_color">#EEEEEE</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ae2bed5..1b737bc 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -143,7 +143,7 @@
     <dimen name="detail_vertical_divider_vertical_margin">16dip</dimen>
 
     <!-- Padding to be used between a visible scrollbar and the contact list -->
-    <dimen name="list_visible_scrollbar_padding">40dip</dimen>
+    <dimen name="list_visible_scrollbar_padding">32dip</dimen>
 
     <!-- Font size used for the contact name in the widget -->
     <dimen name="widget_text_size_name">14sp</dimen>
@@ -187,9 +187,6 @@
     <!-- Height of the member list in the group editor -->
     <dimen name="group_editor_member_list_height">550dip</dimen>
 
-    <!-- Height for directory headers in contact lists -->
-    <dimen name="directory_header_height">28dip</dimen>
-
     <!-- Height of edit text in dialpad fragment -->
     <dimen name="dialpad_digits_height">67dip</dimen>
     <dimen name="dialpad_digits_text_size">33sp</dimen>
@@ -204,8 +201,12 @@
     <dimen name="search_view_width">0dip</dimen>
 
     <!-- contact browser list margins -->
-    <dimen name="contact_browser_list_left_margin">24dip</dimen>
-    <dimen name="contact_browser_list_top_margin">8dip</dimen>
+    <dimen name="contact_browser_list_header_left_margin">16dip</dimen>
+    <dimen name="contact_browser_list_header_right_margin">@dimen/list_visible_scrollbar_padding</dimen>
+    <dimen name="contact_browser_list_left_margin">16dip</dimen>
+    <dimen name="contact_browser_list_right_margin">0dip</dimen>
+
+    <dimen name="contact_browser_list_top_margin">0dip</dimen>
     <dimen name="contacts_count_right_margin">40dip</dimen>
 
     <!--  ContactTile Layouts -->
@@ -229,4 +230,14 @@
     <dimen name="no_accounts_message_margin">15dip</dimen>
     <dimen name="add_account_button_left_margin">50dip</dimen>
     <dimen name="add_account_button_right_margin">50dip</dimen>
+
+    <!-- For contact filter setting screens -->
+    <dimen name="contact_filter_left_margin">16dip</dimen>
+    <dimen name="contact_filter_right_margin">16dip</dimen>
+    <dimen name="contact_filter_item_min_height">48dip</dimen>
+    <dimen name="contact_filter_icon_size">32dip</dimen>
+    <dimen name="contact_filter_header_min_height">24dip</dimen>
+
+    <!-- Height for directory headers in contact lists -->
+    <dimen name="directory_header_height">24dip</dimen>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f8c1931..b25f0af 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -16,6 +16,7 @@
 <resources>
     <style name="DialtactsTheme"
            parent="android:Theme.Holo">
+        <item name="android:textColorSecondary">@color/dialtacts_secondary_text_color</item>
         <item name="android:windowActionBarOverlay">true</item>
         <item name="android:actionBarStyle">@style/DialtactsActionBarStyle</item>
         <item name="android:windowContentOverlay">@null</item>
@@ -27,7 +28,7 @@
         <item name="list_item_padding_top">0dip</item>
         <item name="list_item_padding_right">0dip</item>
         <item name="list_item_padding_bottom">0dip</item>
-        <item name="list_item_padding_left">24dip</item>
+        <item name="list_item_padding_left">0dip</item>
         <item name="list_item_gap_between_image_and_text">8dip</item>
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_call_button_padding">14dip</item>
@@ -132,7 +133,7 @@
         <item name="list_item_padding_top">0dip</item>
         <item name="list_item_padding_right">0dip</item>
         <item name="list_item_padding_bottom">0dip</item>
-        <item name="list_item_padding_left">24dip</item>
+        <item name="list_item_padding_left">0dip</item>
         <item name="list_item_gap_between_image_and_text">8dip</item>
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_call_button_padding">14dip</item>
@@ -226,7 +227,7 @@
     </style>
 
     <style name="DirectoryHeader" parent="PeopleTheme">
-        <item name="android:background">@drawable/directory_bg</item>
+        <item name="android:background">@android:color/transparent</item>
     </style>
 
     <style name="NonPhoneActivityTheme" parent="@android:Theme.Translucent">
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 9daa9af..a943130 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -20,10 +20,14 @@
 import com.android.contacts.calllog.CallLogFragment;
 import com.android.contacts.dialpad.DialpadFragment;
 import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.AccountFilterActivity;
+import com.android.contacts.list.ContactListFilter;
+import com.android.contacts.list.ContactListFilterController;
+import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
 import com.android.contacts.list.ContactTileAdapter.DisplayType;
+import com.android.contacts.list.ContactTileListFragment;
 import com.android.contacts.list.OnPhoneNumberPickerActionListener;
 import com.android.contacts.list.PhoneNumberPickerFragment;
-import com.android.contacts.list.ContactTileListFragment;
 import com.android.internal.telephony.ITelephony;
 
 import android.app.ActionBar;
@@ -81,6 +85,8 @@
 
     private static final int TAB_INDEX_COUNT = 3;
 
+    private static final int SUBACTIVITY_ACCOUNT_FILTER = 0;
+
     /** Name of the dialtacts shared preferences */
     static final String PREFS_DIALTACTS = "dialtacts";
     static final boolean PREF_FAVORITES_AS_CONTACTS_DEFAULT = false;
@@ -225,6 +231,28 @@
      */
     private int mLastManuallySelectedFragment;
 
+    private ContactListFilterController mContactListFilterController;
+    private OnMenuItemClickListener mFilterOptionsMenuItemClickListener =
+            new OnMenuItemClickListener() {
+        @Override
+        public boolean onMenuItemClick(MenuItem item) {
+            final Intent intent =
+                    new Intent(DialtactsActivity.this, AccountFilterActivity.class);
+            ContactListFilter filter = mContactListFilterController.getFilter();
+            startActivityForResult(intent, SUBACTIVITY_ACCOUNT_FILTER);
+            return true;
+        }
+    };
+
+    private OnMenuItemClickListener mSearchMenuItemClickListener =
+            new OnMenuItemClickListener() {
+        @Override
+        public boolean onMenuItemClick(MenuItem item) {
+            enterSearchUi();
+            return true;
+        }
+    };
+
     /**
      * Listener used when one of phone numbers in search UI is selected. This will initiate a
      * phone call using the phone number.
@@ -299,6 +327,20 @@
 
         setContentView(R.layout.dialtacts_activity);
 
+        mContactListFilterController = new ContactListFilterController(this);
+        mContactListFilterController.addListener(new ContactListFilterListener() {
+            @Override
+            public void onContactListFilterChanged() {
+                if (mSearchFragment == null || !mSearchFragment.isAdded()) {
+                    Log.w(TAG, "Search Fragment isn't available when ContactListFilter is changed");
+                    return;
+                }
+                mSearchFragment .setFilter(mContactListFilterController.getFilter());
+
+                invalidateOptionsMenu();
+            }
+        });
+
         mViewPager = (ViewPager) findViewById(R.id.pager);
         mViewPager.setAdapter(new ViewPagerAdapter(getFragmentManager()));
         mViewPager.setOnPageChangeListener(mPageChangeListener);
@@ -583,17 +625,20 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar);
-        if (mInSearchUi || getActionBar().getSelectedTab().getPosition() == TAB_INDEX_DIALER) {
+        final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option);
+        Tab tab = getActionBar().getSelectedTab();
+        if (mInSearchUi) {
             searchMenuItem.setVisible(false);
+            filterOptionMenuItem.setVisible(true);
+            filterOptionMenuItem.setOnMenuItemClickListener(
+                    mFilterOptionsMenuItemClickListener);
+        } else if (tab == null || tab.getPosition() == TAB_INDEX_DIALER) {
+            searchMenuItem.setVisible(false);
+            filterOptionMenuItem.setVisible(false);
         } else {
+            filterOptionMenuItem.setVisible(false);
             searchMenuItem.setVisible(true);
-            searchMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
-                @Override
-                public boolean onMenuItemClick(MenuItem item) {
-                    enterSearchUi();
-                    return true;
-                }
-            });
+            searchMenuItem.setOnMenuItemClickListener(mSearchMenuItemClickListener);
         }
 
         return true;
@@ -753,4 +798,26 @@
         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         return intent;
     }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (resultCode != Activity.RESULT_OK) {
+            return;
+        }
+        switch (requestCode) {
+            case SUBACTIVITY_ACCOUNT_FILTER: {
+                ContactListFilter filter = (ContactListFilter) data.getParcelableExtra(
+                        AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
+                if (filter == null) {
+                    return;
+                }
+                if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+                    mContactListFilterController.selectCustomFilter();
+                } else {
+                    mContactListFilterController.setContactListFilter(filter, true);
+                }
+            }
+            break;
+        }
+    }
 }
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 282e0b3..4da032e 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -42,7 +42,6 @@
 import com.android.contacts.list.ContactsIntentResolver;
 import com.android.contacts.list.ContactsRequest;
 import com.android.contacts.list.ContactsUnavailableFragment;
-import com.android.contacts.list.CustomContactListFilterActivity;
 import com.android.contacts.list.DefaultContactBrowseListFragment;
 import com.android.contacts.list.DirectoryListLoader;
 import com.android.contacts.list.OnContactBrowserActionListener;
@@ -109,7 +108,6 @@
     private static final int SUBACTIVITY_NEW_GROUP = 2;
     private static final int SUBACTIVITY_EDIT_GROUP = 3;
     private static final int SUBACTIVITY_ACCOUNT_FILTER = 4;
-    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 5;
 
     private static final String KEY_SEARCH_MODE = "searchMode";
 
@@ -1443,23 +1441,14 @@
                     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);
+                        mContactListFilterController.selectCustomFilter();
                     } else {
                         mContactListFilterController.setContactListFilter(filter, true);
                     }
                 }
                 break;
             }
-            case SUBACTIVITY_CUSTOMIZE_FILTER: {
-                if (resultCode == Activity.RESULT_OK) {
-                    mContactListFilterController.selectCustomFilter();
-                }
-                break;
-            }
 
             case SUBACTIVITY_NEW_GROUP:
             case SUBACTIVITY_EDIT_GROUP: {
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index f99b14e..9d872da 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -19,7 +19,6 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
-import com.android.contacts.activities.PeopleActivity;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.AccountWithDataSet;
@@ -35,7 +34,6 @@
 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;
 
@@ -51,6 +49,8 @@
 
     private static final String TAG = AccountFilterActivity.class.getSimpleName();
 
+    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 0;
+
     public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
 
     private ListView mListView;
@@ -63,14 +63,9 @@
         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));
-            }
-        });
+        mListView.setOnItemClickListener(this);
 
-        ActionBar actionBar =  getActionBar();
+        ActionBar actionBar = getActionBar();
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
         }
@@ -104,15 +99,38 @@
         mListView.setAdapter(new FilterListAdapter(this));
     }
 
+    @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        finishAndSetResult(mFilters.get(position));
+        ContactListFilter filter = mFilters.get(position);
+        if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+            final Intent intent = new Intent(this,
+                    CustomContactListFilterActivity.class);
+            startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+        } else {
+            final Intent intent = new Intent();
+            intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+            setResult(Activity.RESULT_OK, intent);
+            finish();
+        }
     }
 
-    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
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (resultCode != Activity.RESULT_OK) {
+            return;
+        }
+
+        switch (requestCode) {
+            case SUBACTIVITY_CUSTOMIZE_FILTER: {
+                final Intent intent = new Intent();
+                ContactListFilter filter = ContactListFilter.createFilterWithType(
+                        ContactListFilter.FILTER_TYPE_CUSTOM);
+                intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+                setResult(Activity.RESULT_OK, intent);
+                finish();
+                break;
+            }
+        }
     }
 
     @Override
@@ -154,7 +172,7 @@
                 view = (ContactListFilterView) convertView;
             } else {
                 view = (ContactListFilterView) mLayoutInflater.inflate(
-                        R.layout.filter_spinner_item, parent, false);
+                        R.layout.contact_list_filter_item, parent, false);
             }
             view.setSingleAccount(mFilters.size() == 1);
             ContactListFilter filter = mFilters.get(position);
@@ -168,10 +186,10 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case android.R.id.home:
-                Intent intent = new Intent(this, PeopleActivity.class);
-                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-                startActivity(intent);
-                finish();
+                // We have two logical "up" Activities: People and Phone.
+                // Instead of having one static "up" direction, behave like back as an
+                // exceptional case.
+                onBackPressed();
                 return true;
             default:
                 break;
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index cd3a7ed..f95dea3 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -77,6 +77,8 @@
 
     private boolean mSelectionVisible;
 
+    private ContactListFilter mFilter;
+
     public ContactEntryListAdapter(Context context) {
         super(context);
         addPartitions();
@@ -558,6 +560,17 @@
         return true;
     }
 
+    /**
+     * Returns the currently selected filter.
+     */
+    public ContactListFilter getFilter() {
+        return mFilter;
+    }
+
+    public void setFilter(ContactListFilter filter) {
+        mFilter = filter;
+    }
+
     @Override
     public Placement getItemPlacementInSection(int position) {
         // Special case code to prevent a section header from being displayed above the user's
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index e32e131..73d0859 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -544,13 +544,13 @@
             mListView.setFastScrollEnabled(hasScrollbar);
             mListView.setFastScrollAlwaysVisible(hasScrollbar);
             mListView.setVerticalScrollbarPosition(mVerticalScrollbarPosition);
+            mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
             int leftPadding = 0;
             int rightPadding = 0;
             if (mVerticalScrollbarPosition == View.SCROLLBAR_POSITION_LEFT) {
                 leftPadding = mContext.getResources().getDimensionPixelOffset(
                         R.dimen.list_visible_scrollbar_padding);
-                mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
-            } else if (hasScrollbar){
+            } else {
                 rightPadding = mContext.getResources().getDimensionPixelOffset(
                         R.dimen.list_visible_scrollbar_padding);
             }
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index 467dcc3..48fd342 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -113,12 +113,9 @@
     private String mSelectedContactLookupKey;
     private long mSelectedContactId;
 
-    private ContactListFilter mFilter;
-
     // View types for entries in the list view.
     private final int mViewTypeProfileEntry;
 
-
     public ContactListAdapter(Context context) {
         super(context);
 
@@ -130,17 +127,6 @@
         return mUnknownNameText;
     }
 
-    /**
-     * Returns the currently selected filter.
-     */
-    public ContactListFilter getFilter() {
-        return mFilter;
-    }
-
-    public void setFilter(ContactListFilter filter) {
-        mFilter = filter;
-    }
-
     public long getSelectedContactDirectoryId() {
         return mSelectedContactDirectoryId;
     }
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index e0965cc..26610dc 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -29,6 +29,7 @@
 import com.android.contacts.util.WeakAsyncTask;
 import com.google.android.collect.Lists;
 
+import android.app.ActionBar;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.LoaderManager.LoaderCallbacks;
@@ -107,6 +108,12 @@
         mList.setOnCreateContextMenuListener(this);
 
         mList.setAdapter(mAdapter);
+
+        ActionBar actionBar = getActionBar();
+        if (actionBar != null) {
+            // android.R.id.home will be triggered in onOptionsItemSelected()
+            actionBar.setDisplayHomeAsUpEnabled(true);
+        }
     }
 
     public static class CustomFilterConfigurationLoader extends AsyncTaskLoader<AccountSet> {
@@ -801,12 +808,6 @@
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public void onBackPressed() {
-        doSaveAction();
-    }
-
     @SuppressWarnings("unchecked")
     private void doSaveAction() {
         if (mAdapter == null || mAdapter.mAccounts == null) {
@@ -897,4 +898,18 @@
             ContactsSearchManager.startSearch(this, initialQuery);
         }
     }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home:
+                // Pretend cancel.
+                setResult(Activity.RESULT_CANCELED);
+                finish();
+                return true;
+            default:
+                break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
 }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index ded35a4..b6a5be0 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -35,6 +35,7 @@
     private TextView mCounterHeaderView;
     private View mSearchHeaderView;
     private TextView mAccountFilterHeaderView;
+    private View mAccountFilterHeaderContainer;
 
     public DefaultContactBrowseListFragment() {
         setPhotoLoaderEnabled(true);
@@ -65,6 +66,8 @@
         super.onCreateView(inflater, container);
 
         mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+        mAccountFilterHeaderContainer =
+                getView().findViewById(R.id.account_filter_header_container);
         mCounterHeaderView = (TextView) getView().findViewById(R.id.contacts_count);
 
         // Putting the header view inside a container will allow us to make
@@ -107,11 +110,11 @@
         }
         if (filter != null && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
                 !isSearchMode() && filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM) {
+            mAccountFilterHeaderContainer.setVisibility(View.VISIBLE);
             mAccountFilterHeaderView.setText(getContext().getString(
                     R.string.listAllContactsInAccount, filter.accountName));
-            mAccountFilterHeaderView.setVisibility(View.VISIBLE);
         } else {
-            mAccountFilterHeaderView.setVisibility(View.GONE);
+            mAccountFilterHeaderContainer.setVisibility(View.GONE);
         }
     }
 
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index 21a7846..87fb60f 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -22,15 +22,21 @@
 import android.net.Uri;
 import android.net.Uri.Builder;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.ContactCounts;
+import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.Directory;
+import android.provider.ContactsContract.RawContacts;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A cursor adapter for the {@link Phone#CONTENT_TYPE} content type.
  */
@@ -79,6 +85,20 @@
     public void configureLoader(CursorLoader loader, long directoryId) {
         Uri uri;
 
+        if (directoryId != Directory.DEFAULT) {
+            Log.w(TAG, "PhoneNumberListAdapter is not ready for non-default directory ID ("
+                    + "directoryId: " + directoryId + ")");
+        }
+
+        final ContactListFilter filter = getFilter();
+        if (filter != null &&
+                (filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
+                filter.filterType != ContactListFilter.FILTER_TYPE_ACCOUNT &&
+                filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM)) {
+            throw new IllegalArgumentException("Unexpected filter type came " +
+                    "(type: " + filter.filterType + ", toString: " + filter + ")");
+        }
+
         if (isSearchMode()) {
             String query = getQueryString();
             Builder builder = Phone.CONTENT_FILTER_URI.buildUpon();
@@ -102,6 +122,7 @@
             }
 
             loader.setProjection(PHONES_PROJECTION);
+            configureSelection(loader, directoryId, filter);
         }
 
         loader.setUri(uri);
@@ -114,6 +135,59 @@
         }
     }
 
+    private void configureSelection(
+            CursorLoader loader, long directoryId, ContactListFilter filter) {
+        if (filter == null || directoryId != Directory.DEFAULT) {
+            return;
+        }
+
+        final StringBuilder selection = new StringBuilder();
+        final List<String> selectionArgs = new ArrayList<String>();
+
+        switch (filter.filterType) {
+            case ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS: {
+                break;
+            }
+            case ContactListFilter.FILTER_TYPE_CUSTOM: {
+                selection.append(Contacts.IN_VISIBLE_GROUP + "=1");
+                selection.append(" AND " + Contacts.HAS_PHONE_NUMBER + "=1");
+                break;
+            }
+            case ContactListFilter.FILTER_TYPE_ACCOUNT: {
+                selection.append("(");
+
+                selection.append(RawContacts.ACCOUNT_TYPE + "=?"
+                        + " AND " + RawContacts.ACCOUNT_NAME + "=?");
+                selectionArgs.add(filter.accountType);
+                selectionArgs.add(filter.accountName);
+                if (filter.dataSet != null) {
+                    selection.append(" AND " + RawContacts.DATA_SET + "=?");
+                    selectionArgs.add(filter.dataSet);
+                } else {
+                    selection.append(" AND " + RawContacts.DATA_SET + " IS NULL");
+                }
+                selection.append(")");
+                break;
+            }
+            case ContactListFilter.FILTER_TYPE_GROUP: {
+                selection.append(Data.MIMETYPE + "=?"
+                        + " AND " + GroupMembership.GROUP_ROW_ID + "=?");
+                selectionArgs.add(GroupMembership.CONTENT_ITEM_TYPE);
+                selectionArgs.add(String.valueOf(filter.groupId));
+                break;
+            }
+
+            case ContactListFilter.FILTER_TYPE_SINGLE_CONTACT:
+            case ContactListFilter.FILTER_TYPE_STARRED:
+            case ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY:
+            default:
+                throw new IllegalArgumentException("Unexpected filter type came " +
+                        "(type: " + filter.filterType + ", toString: " + filter + ")");
+        }
+        loader.setSelection(selection.toString());
+        loader.setSelectionArgs(selectionArgs.toArray(new String[0]));
+    }
+
     protected static Uri buildSectionIndexerUri(Uri uri) {
         return uri.buildUpon()
                 .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index 1866ea0..306efbd 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -19,14 +19,19 @@
 import com.android.contacts.R;
 import com.android.contacts.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
 
+import android.app.Activity;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.net.Uri;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Adapter;
+import android.widget.TextView;
 
 /**
  * Fragment containing a phone number list for picking.
@@ -38,6 +43,14 @@
     private OnPhoneNumberPickerActionListener mListener;
     private String mShortcutAction;
 
+    private SharedPreferences mPrefs;
+    private ContactListFilter mFilter;
+
+    private TextView mAccountFilterHeaderView;
+    private View mAccountFilterHeaderContainer;
+
+    private static final String KEY_FILTER = "filter";
+
     /**
      * Used to remember the result of {@link #setNameHighlightingEnabled(boolean)} when it is called
      * before this Fragment is attached to its parent Activity. The value will be used after
@@ -64,6 +77,66 @@
     }
 
     @Override
+    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+        super.onCreateView(inflater, container);
+
+        mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+        mAccountFilterHeaderContainer =
+                getView().findViewById(R.id.account_filter_header_container);
+        updateFilterHeaderView();
+    }
+
+    @Override
+    public void setSearchMode(boolean flag) {
+        super.setSearchMode(flag);
+        updateFilterHeaderView();
+    }
+
+    private void updateFilterHeaderView() {
+        if (mAccountFilterHeaderView != null) {
+            ContactListFilter filter = getFilter();
+            if (filter != null
+                    && !isSearchMode()
+                    && filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
+                mAccountFilterHeaderContainer.setVisibility(View.VISIBLE);
+                mAccountFilterHeaderView.setText(getContext().getString(
+                        R.string.listAllContactsInAccount, filter.accountName));
+            } else {
+                mAccountFilterHeaderContainer.setVisibility(View.GONE);
+            }
+        }
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+        mPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mPrefs = null;
+    }
+
+    @Override
+    public void restoreSavedState(Bundle savedState) {
+        super.restoreSavedState(savedState);
+
+        if (savedState == null) {
+            return;
+        }
+
+        mFilter = savedState.getParcelable(KEY_FILTER);
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putParcelable(KEY_FILTER, mFilter);
+    }
+
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         final int itemId = item.getItemId();
         if (itemId == android.R.id.home) {  // See ActionBar#setDisplayHomeAsUpEnabled()
@@ -122,6 +195,20 @@
     }
 
     @Override
+    protected void configureAdapter() {
+        super.configureAdapter();
+
+        ContactEntryListAdapter adapter = getAdapter();
+        if (adapter == null) {
+            return;
+        }
+
+        if (!isSearchMode() && mFilter != null) {
+            adapter.setFilter(mFilter);
+        }
+    }
+
+    @Override
     protected View inflateView(LayoutInflater inflater, ViewGroup container) {
         return inflater.inflate(R.layout.contacts_list_content, null);
     }
@@ -171,4 +258,24 @@
             mDelayedNameHighlightingEnabled = null;
         }
     }
+
+    public ContactListFilter getFilter() {
+        return mFilter;
+    }
+
+    public void setFilter(ContactListFilter filter) {
+        if ((mFilter == null && filter == null) ||
+                (mFilter != null && mFilter.equals(filter))) {
+            return;
+        }
+
+        mFilter = filter;
+        if (mPrefs != null) {
+            // Save the preference now.
+            ContactListFilter.storeToPreferences(mPrefs, mFilter);
+        }
+
+        reloadData();
+        updateFilterHeaderView();
+    }
 }