Merge "Replacing back arrow with "X" in multi select mode"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 72c6481..ed94546 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -16,8 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.contacts"
-    android:versionCode="10503"
-    android:versionName="1.5.3">
+    android:versionCode="10504"
+    android:versionName="1.5.4">
 
     <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="23" />
     <original-package android:name="com.android.contacts" />
diff --git a/res/drawable-v21/drawer_item_background.xml b/res/drawable-v21/drawer_item_background.xml
new file mode 100644
index 0000000..cfc7761
--- /dev/null
+++ b/res/drawable-v21/drawer_item_background.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2016 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
+  -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="@color/nav_item_selected_background">
+  <item>
+    <selector>
+      <item android:drawable="@color/nav_item_selected_background" android:state_checked="true"/>
+      <item android:drawable="@android:color/transparent"/>
+    </selector>
+  </item>
+</ripple>
\ No newline at end of file
diff --git a/res/drawable/drawer_item_background.xml b/res/drawable/drawer_item_background.xml
new file mode 100644
index 0000000..3ffe041
--- /dev/null
+++ b/res/drawable/drawer_item_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2016 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
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+        <item android:state_checked="true" android:drawable="@color/nav_item_selected_background"/>
+        <item android:drawable="@android:color/transparent" />
+</selector>
\ No newline at end of file
diff --git a/res/layout/contacts_drawer_activity.xml b/res/layout/contacts_drawer_activity.xml
index 008d4f5..ad68e84 100644
--- a/res/layout/contacts_drawer_activity.xml
+++ b/res/layout/contacts_drawer_activity.xml
@@ -57,6 +57,7 @@
         android:layout_height="match_parent"
         android:layout_gravity="start"
         android:fitsSystemWindows="true"
+        app:itemBackground="@drawable/drawer_item_background"
         app:headerLayout="@layout/nav_header_main"
         app:menu="@menu/activity_main_drawer"/>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 6a91140..8fa0e0d 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -21,6 +21,8 @@
 
     <color name="action_bar_background">#0288d1</color>
 
+    <color name="nav_item_selected_background">#0f000000</color>
+
     <color name="background_social_updates">#ffeeeeee</color>
 
     <color name="action_bar_button_text_color">#FFFFFF</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4ba767d..12471ef 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -288,13 +288,6 @@
     <!-- The text displayed when the contacts list is empty while displaying all contacts [CHAR LIMIT=NONE] -->
     <string name="noContacts">No contacts</string>
 
-    <!-- Label list header title with the number of members in the label. [CHAR LIMIT=30] -->
-    <plurals name="group_members_count">
-        <item quantity="zero">No contacts</item>
-        <item quantity="one">1 contact</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> contacts</item>
-    </plurals>
-
     <!-- The text displayed when the labels list is empty while displaying all labels [CHAR LIMIT=30] -->
     <string name="noGroups">No labels.</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 36b04f9..246438d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -173,7 +173,7 @@
     </style>
 
     <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
-        <item name="spinBars">true</item>
+        <item name="spinBars">false</item>
         <item name="color">@android:color/white</item>
         <item name="android:color">@android:color/white</item>
     </style>
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 888db49..466aa91 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -25,6 +25,7 @@
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.design.widget.NavigationView;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBarDrawerToggle;
@@ -36,10 +37,12 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.SubMenu;
+import android.view.View;
 import android.view.ViewGroup;
 
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.BlockedNumberContractCompat;
+import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.compat.TelecomManagerUtil;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
@@ -49,6 +52,7 @@
 import com.android.contacts.common.util.ViewUtil;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.group.GroupListItem;
+import com.android.contacts.group.GroupMetadata;
 import com.android.contacts.group.GroupUtil;
 import com.android.contacts.group.GroupsFragment;
 import com.android.contacts.group.GroupsFragment.GroupsListener;
@@ -59,7 +63,11 @@
 import com.android.contactsbind.Assistants;
 import com.android.contactsbind.HelpUtils;
 
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * A common superclass for Contacts activities with a navigation drawer.
@@ -74,13 +82,63 @@
     protected static final String GROUPS_TAG = "groups";
     protected static final String FILTERS_TAG = "filters";
 
+    private class ContactsActionBarDrawerToggle extends ActionBarDrawerToggle {
+
+        private Runnable mRunnable;
+
+        public ContactsActionBarDrawerToggle(AppCompatActivity activity, DrawerLayout drawerLayout,
+                Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) {
+            super(activity, drawerLayout, toolbar, openDrawerContentDescRes,
+                    closeDrawerContentDescRes);
+        }
+
+        @Override
+        public void onDrawerOpened(View drawerView) {
+            super.onDrawerOpened(drawerView);
+            invalidateOptionsMenu();
+        }
+
+        @Override
+        public void onDrawerClosed(View view) {
+            super.onDrawerClosed(view);
+            invalidateOptionsMenu();
+        }
+
+        @Override
+        public void onDrawerStateChanged(int newState) {
+            super.onDrawerStateChanged(newState);
+            // Set transparent status bar when drawer starts to move.
+            if (CompatUtils.isLollipopCompatible() && newState != DrawerLayout.STATE_IDLE
+                    && getWindow().getStatusBarColor() == ContextCompat.getColor
+                    (ContactsDrawerActivity.this, R.color.primary_color_dark)) {
+                getWindow().setStatusBarColor(Color.TRANSPARENT);
+            }
+            if (mRunnable != null && newState == DrawerLayout.STATE_IDLE) {
+                mRunnable.run();
+                mRunnable = null;
+            }
+        }
+
+        public void runWhenIdle(Runnable runnable) {
+            mRunnable = runnable;
+        }
+    }
+
     protected ContactListFilterController mContactListFilterController;
     protected DrawerLayout mDrawer;
+    protected ContactsActionBarDrawerToggle mToggle;
     protected Toolbar mToolbar;
     protected NavigationView mNavigationView;
     protected GroupsFragment mGroupsFragment;
     protected AccountFiltersFragment mAccountFiltersFragment;
 
+    // Checkable menu item lookup maps. Every map declared here should be added to
+    // clearCheckedMenus() so that they can be cleared.
+    // TODO find a better way to handle selected menu item state, when swicthing to fragments.
+    protected Map<Long, MenuItem> mGroupMenuMap = new HashMap<>();
+    protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
+    protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
+
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
@@ -99,16 +157,20 @@
 
         // Set up hamburger button.
         mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
-        final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawer, mToolbar,
+        mToggle = new ContactsActionBarDrawerToggle(this, mDrawer, mToolbar,
                 R.string.navigation_drawer_open, R.string.navigation_drawer_close);
-        mDrawer.setDrawerListener(toggle);
-        toggle.syncState();
+        mDrawer.setDrawerListener(mToggle);
+        mToggle.syncState();
 
         // Set up hamburger menu items.
         mNavigationView = (NavigationView) findViewById(R.id.nav_view);
         mNavigationView.setNavigationItemSelectedListener(this);
 
         final Menu menu = mNavigationView.getMenu();
+
+        final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
+        mIdMenuMap.put(R.id.nav_all_contacts, allContacts);
+
         final boolean showBlockedNumbers = PhoneCapabilityTester.isPhone(this)
                 && ContactsUtils.FLAG_N_FEATURE
                 && BlockedNumberContractCompat.canCurrentUserBlockNumbers(this);
@@ -119,6 +181,9 @@
 
         if (Assistants.getDuplicatesActivityIntent(this) == null) {
             menu.removeItem(R.id.nav_find_duplicates);
+        } else {
+            final MenuItem findDup = menu.findItem(R.id.nav_find_duplicates);
+            mIdMenuMap.put(R.id.nav_find_duplicates, findDup);
         }
 
         if (!HelpUtils.isHelpAndFeedbackAvailable()) {
@@ -126,6 +191,19 @@
         }
 
         loadGroupsAndFilters();
+
+        if (isDuplicatesActivity()) {
+            clearCheckedMenus();
+            mIdMenuMap.get(R.id.nav_find_duplicates).setCheckable(true);
+            mIdMenuMap.get(R.id.nav_find_duplicates).setChecked(true);
+        }
+    }
+
+    /**
+     * Returns true if child class is DuplicatesActivity
+     */
+    protected boolean isDuplicatesActivity() {
+        return false;
     }
 
     // Set up fragment manager to load groups and filters.
@@ -174,6 +252,7 @@
         final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
         final SubMenu subMenu = groupsMenuItem.getSubMenu();
         subMenu.removeGroup(R.id.nav_groups_items);
+        mGroupMenuMap = new HashMap<>();
 
         if (groupListItems != null) {
             // Add each group
@@ -184,11 +263,18 @@
                 final String title = groupListItem.getTitle();
                 final MenuItem menuItem =
                         subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE, title);
+                mGroupMenuMap.put(groupListItem.getGroupId(), menuItem);
                 menuItem.setIcon(R.drawable.ic_menu_label);
                 menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                     @Override
                     public boolean onMenuItemClick(MenuItem item) {
-                        onGroupMenuItemClicked(groupListItem.getGroupId());
+                        mToggle.runWhenIdle(new Runnable() {
+                            @Override
+                            public void run() {
+                                onGroupMenuItemClicked(groupListItem.getGroupId());
+                            }
+                        });
+                        mDrawer.closeDrawer(GravityCompat.START);
                         return true;
                     }
                 });
@@ -207,20 +293,48 @@
         menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
             @Override
             public boolean onMenuItemClick(MenuItem item) {
-                onCreateGroupMenuItemClicked();
+                mToggle.runWhenIdle(new Runnable() {
+                    @Override
+                    public void run() {
+                        onCreateGroupMenuItemClicked();
+                    }
+                });
+                mDrawer.closeDrawer(GravityCompat.START);
                 return true;
             }
         });
+
+        if (getGroupMetadata() != null) {
+            updateGroupMenu(getGroupMetadata());
+        }
+    }
+
+    protected void updateGroupMenu(GroupMetadata groupMetadata) {
+        clearCheckedMenus();
+        if (groupMetadata != null && mGroupMenuMap != null
+                && mGroupMenuMap.get(groupMetadata.groupId) != null) {
+            mGroupMenuMap.get(groupMetadata.groupId).setCheckable(true);
+            mGroupMenuMap.get(groupMetadata.groupId).setChecked(true);
+        }
+    }
+
+    /**
+     * Returns group metadata if the child class is {@link GroupMembersActivity}, and null
+     * otherwise.
+     */
+    protected GroupMetadata getGroupMetadata() {
+        return null;
     }
 
     protected void onGroupMenuItemClicked(long groupId) {
-        final Intent intent = GroupUtil.createViewGroupIntent(this, groupId);
-        startActivity(intent);
+        startActivity(GroupUtil.createViewGroupIntent(this, groupId));
+        if (shouldFinish()) {
+            finish();
+        }
     }
 
     protected void onCreateGroupMenuItemClicked() {
         startActivity(GroupUtil.createAddGroupIntent(this));
-        mDrawer.closeDrawer(GravityCompat.START);
     }
 
     @Override
@@ -229,6 +343,7 @@
         final MenuItem filtersMenuItem = menu.findItem(R.id.nav_filters);
         final SubMenu subMenu = filtersMenuItem.getSubMenu();
         subMenu.removeGroup(R.id.nav_filters_items);
+        mFilterMenuMap = new HashMap<>();
 
         if (accountFilterItems == null || accountFilterItems.size() < 2) {
             return;
@@ -239,17 +354,24 @@
             final String accountName = filter.accountName;
             final MenuItem menuItem = subMenu.add(R.id.nav_filters_items, Menu.NONE, Menu.NONE,
                     accountName);
+            mFilterMenuMap.put(filter, menuItem);
             final Intent intent = new Intent();
             intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
             menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                 @Override
                 public boolean onMenuItemClick(MenuItem item) {
+                    mToggle.runWhenIdle(new Runnable() {
+                        @Override
+                        public void run() {
+                            AccountFilterUtil.handleAccountFilterResult(
+                                    mContactListFilterController, AppCompatActivity.RESULT_OK,
+                                    intent);
+                            if (shouldFinish()) {
+                                finish();
+                            }
+                        }
+                    });
                     mDrawer.closeDrawer(GravityCompat.START);
-                    AccountFilterUtil.handleAccountFilterResult(mContactListFilterController,
-                            AppCompatActivity.RESULT_OK, intent);
-                    if (shouldFinish()) {
-                        finish();
-                    }
                     return true;
                 }
             });
@@ -257,34 +379,66 @@
             // Get rid of the default memu item overlay and show original account icons.
             menuItem.getIcon().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_ATOP);
         }
+
+        if (getContactListFilter() != null) {
+            updateFilterMenu(getContactListFilter());
+        }
+    }
+
+    protected void updateFilterMenu(ContactListFilter filter) {
+        clearCheckedMenus();
+        if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+            if (mIdMenuMap != null && mIdMenuMap.get(R.id.nav_all_contacts) != null) {
+                mIdMenuMap.get(R.id.nav_all_contacts).setCheckable(true);
+                mIdMenuMap.get(R.id.nav_all_contacts).setChecked(true);
+            }
+        } else {
+            if (mFilterMenuMap != null && mFilterMenuMap.get(filter) != null) {
+                mFilterMenuMap.get(filter).setCheckable(true);
+                mFilterMenuMap.get(filter).setChecked(true);
+            }
+        }
     }
 
     /**
-     * @return true if the child activity should finish after launching another activity.
+     * Returns the current filter if the child class is {@link PeopleActivity}, and null otherwise.
+     */
+    protected ContactListFilter getContactListFilter() {
+        return null;
+    }
+
+    /**
+     * Returns true if the child activity should finish after launching another activity.
      */
     protected abstract boolean shouldFinish();
 
     @Override
-    public boolean onNavigationItemSelected(MenuItem item) {
+    public boolean onNavigationItemSelected(final MenuItem item) {
         final int id = item.getItemId();
 
-        if (id == R.id.nav_settings) {
-            startActivity(createPreferenceIntent());
-        } else if (id == R.id.nav_help) {
-            HelpUtils.launchHelpAndFeedbackForMainScreen(this);
-        } else if (id == R.id.nav_all_contacts) {
-            switchToAllContacts();
-        } else if (id == R.id.nav_blocked_numbers) {
-            final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent(
-                    (TelecomManager) getSystemService(Context.TELECOM_SERVICE));
-            ImplicitIntentsUtil.startActivityInApp(this, intent);
-        } else if (id == R.id.nav_find_duplicates) {
-            launchFindDuplicates();
-        } else if (item.getIntent() != null) {
-            ImplicitIntentsUtil.startActivityInApp(this, item.getIntent());
-        } else {
-            Log.w(TAG, "Unhandled navigation view item selection");
-        }
+        mToggle.runWhenIdle(new Runnable() {
+            @Override
+            public void run() {
+                if (id == R.id.nav_settings) {
+                    startActivity(createPreferenceIntent());
+                } else if (id == R.id.nav_help) {
+                    HelpUtils.launchHelpAndFeedbackForMainScreen(ContactsDrawerActivity.this);
+                } else if (id == R.id.nav_all_contacts) {
+                    switchToAllContacts();
+                } else if (id == R.id.nav_blocked_numbers) {
+                    final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent(
+                            (TelecomManager) getSystemService(Context.TELECOM_SERVICE));
+                    startActivity(intent);
+                } else if (id == R.id.nav_find_duplicates) {
+                    launchFindDuplicates();
+                } else if (item.getIntent() != null) {
+                    ImplicitIntentsUtil.startActivityInApp(ContactsDrawerActivity.this,
+                            item.getIntent());
+                } else {
+                    Log.w(TAG, "Unhandled navigation view item selection");
+                }
+            }
+        });
 
         mDrawer.closeDrawer(GravityCompat.START);
         return true;
@@ -307,6 +461,9 @@
         intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
         AccountFilterUtil.handleAccountFilterResult(
                 mContactListFilterController, AppCompatActivity.RESULT_OK, intent);
+        if (shouldFinish()) {
+            finish();
+        }
     }
 
     protected void launchFindDuplicates() {
@@ -318,4 +475,18 @@
         return ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
     }
 
+    private void clearCheckedMenus() {
+        clearCheckedMenu(mFilterMenuMap);
+        clearCheckedMenu(mGroupMenuMap);
+        clearCheckedMenu(mIdMenuMap);
+    }
+
+    private void clearCheckedMenu(Map<?, MenuItem> map) {
+        final Iterator it = map.entrySet().iterator();
+        while (it.hasNext()) {
+            Entry pair = (Entry)it.next();
+            map.get(pair.getKey()).setCheckable(false);
+            map.get(pair.getKey()).setChecked(false);
+        }
+    }
 }
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 047be6a..3723d52 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -81,7 +81,6 @@
 
     private boolean mSelectionMode;
     private boolean mSearchMode;
-    private boolean mTransparentStatuBar;
     private String mQueryString;
 
     private EditText mSearchView;
@@ -315,11 +314,6 @@
         return mSelectionMode;
     }
 
-    /** Whether to make the status bar transparent. */
-    public void setTransparentStatuBar(boolean flag) {
-        mTransparentStatuBar = flag;
-    }
-
     public void setSearchMode(boolean flag) {
         if (mSearchMode != flag) {
             mSearchMode = flag;
@@ -523,12 +517,10 @@
             final int cabStatusBarColor = mActivity.getResources().getColor(
                     R.color.contextual_selection_bar_status_bar_color);
             mActivity.getWindow().setStatusBarColor(cabStatusBarColor);
-        } else if (!mTransparentStatuBar) {
+        } else {
             final int normalStatusBarColor = ContextCompat.getColor(
                     mActivity, R.color.primary_color_dark);
             mActivity.getWindow().setStatusBarColor(normalStatusBarColor);
-        } else {
-            mActivity.getWindow().setStatusBarColor(Color.TRANSPARENT);
         }
     }
 
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 71ab0e7..22d9f7a 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -148,7 +148,6 @@
                 R.string.enter_contact_name);
         mActionBarAdapter.setShowHomeIcon(true);
         mActionBarAdapter.setShowHomeAsUp(true);
-        mActionBarAdapter.setTransparentStatuBar(false);
         mActionBarAdapter.initialize(savedState, mRequest);
 
         // Postal address pickers (and legacy pickers) don't support search, so just show
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index 6ba354b..1511849 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -359,9 +359,7 @@
     protected void onGroupMenuItemClicked(long groupId) {
         if (mGroupMetadata.groupId != groupId) {
             super.onGroupMenuItemClicked(groupId);
-            finish();
         }
-        mDrawer.closeDrawer(GravityCompat.START);
     }
 
     @Override
@@ -370,12 +368,6 @@
     }
 
     @Override
-    protected void switchToAllContacts() {
-        super.switchToAllContacts();
-        finish();
-    }
-
-    @Override
     protected void launchFindDuplicates() {
         super.launchFindDuplicates();
         finish();
@@ -520,6 +512,7 @@
         } else if (mActionBarAdapter.isSearchMode()) {
             mActionBarAdapter.setSearchMode(false);
         } else {
+            switchToAllContacts();
             super.onBackPressed();
         }
     }
@@ -675,6 +668,9 @@
     @Override
     public void onGroupMetadataLoaded(GroupMetadata groupMetadata) {
         mGroupMetadata = groupMetadata;
+
+        updateGroupMenu(mGroupMetadata);
+
         if (!mIsInsertAction) {
             setActionBarTitle(mGroupMetadata.groupName);
         }
@@ -694,6 +690,11 @@
     }
 
     @Override
+    protected GroupMetadata getGroupMetadata() {
+        return mGroupMetadata;
+    }
+
+    @Override
     public void onGroupMemberListItemClicked(int position, Uri contactLookupUri) {
         final int count = mMembersFragment.getAdapter().getCount();
         Logger.logListEvent(ListEvent.ActionType.CLICK, ListEvent.ListType.GROUP, count,
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 5e882f8..4d827bd 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -852,13 +852,6 @@
     }
 
     @Override
-    protected void onGroupMenuItemClicked(long groupId) {
-        switchToAllContacts();
-        super.onGroupMenuItemClicked(groupId);
-        mDrawer.closeDrawer(GravityCompat.START);
-    }
-
-    @Override
     public void onProviderStatusChange() {
         reloadGroupsAndFiltersIfNeeded();
         updateViewConfiguration(false);
@@ -1392,6 +1385,9 @@
         final int listType =  filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS
                 ? ListEvent.ListType.ALL_CONTACTS : ListEvent.ListType.ACCOUNT;
         mAllFragment.setListType(listType);
+
+        updateFilterMenu(filter);
+
         if (getSupportActionBar() != null) {
             final String actionBarTitle = TextUtils.isEmpty(filter.accountName) ?
                     getString(R.string.contactsList) : filter.accountName;
@@ -1413,4 +1409,9 @@
     protected boolean shouldFinish() {
         return false;
     }
+
+    @Override
+    protected ContactListFilter getContactListFilter() {
+        return mContactListFilterController.getFilter();
+    }
 }
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 45a3834..98d66b4 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -285,8 +285,8 @@
 
             final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
                     R.id.account_filter_header);
-            accountFilterHeader.setText(getResources().getQuantityString(
-                    R.plurals.group_members_count, memberCount, memberCount));
+            accountFilterHeader.setText(mGroupMetadata.accountName);
+            accountFilterHeader.setAllCaps(false);
         } else {
             accountFilterContainer.setVisibility(View.GONE);
         }
diff --git a/src/com/android/contacts/list/GroupMemberPickerFragment.java b/src/com/android/contacts/list/GroupMemberPickerFragment.java
index 362ff80..f4dde36 100644
--- a/src/com/android/contacts/list/GroupMemberPickerFragment.java
+++ b/src/com/android/contacts/list/GroupMemberPickerFragment.java
@@ -28,6 +28,7 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.TextView;
 
 import com.android.contacts.activities.ContactSelectionActivity;
 import com.android.contacts.common.R;
@@ -185,6 +186,7 @@
         setPhotoLoaderEnabled(true);
         setSectionHeaderDisplayEnabled(true);
         setHasOptionsMenu(true);
+        setDisplayDirectoryHeader(false);
     }
 
     @Override
@@ -227,6 +229,15 @@
             // Wait until contacts are loaded before showing the scrollbar
             setVisibleScrollbarEnabled(true);
 
+            // Bind account filter header.
+            final View accountFilterContainer = getView().findViewById(
+                    R.id.account_filter_header_container);
+            accountFilterContainer.setVisibility(View.VISIBLE);
+            final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
+                    R.id.account_filter_header);
+            accountFilterHeader.setText(mAccountName);
+            accountFilterHeader.setAllCaps(false);
+
             super.onLoadFinished(loader, new FilterCursorWrapper(data));
         }
     }