Merge "Change contacts version and target SDK to 25 (1/2)"
diff --git a/res/drawable/ic_menu_delete.xml b/res/drawable/ic_menu_delete.xml
new file mode 100644
index 0000000..d994368
--- /dev/null
+++ b/res/drawable/ic_menu_delete.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<!-- A trash can icon (ic_menu_delete) -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportHeight="24.0"
+        android:viewportWidth="24.0">
+    <path
+        android:fillColor="@color/actionbar_icon_color_grey"
+        android:pathData="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/>
+</vector>
diff --git a/res/drawable/ic_menu_link.xml b/res/drawable/ic_menu_link.xml
new file mode 100644
index 0000000..e631034
--- /dev/null
+++ b/res/drawable/ic_menu_link.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<!-- ic_menu_link -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportHeight="24.0"
+        android:viewportWidth="24.0">
+    <path
+        android:fillColor="@color/actionbar_icon_color_grey"
+        android:pathData="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/>
+</vector>
diff --git a/res/drawable/ic_menu_share.xml b/res/drawable/ic_menu_share.xml
new file mode 100644
index 0000000..99e873b
--- /dev/null
+++ b/res/drawable/ic_menu_share.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<!-- ic_menu_share -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportHeight="24.0"
+        android:viewportWidth="24.0">
+    <path
+        android:fillColor="@color/actionbar_icon_color_grey"
+        android:pathData="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/>
+</vector>
diff --git a/res/layout/selection_bar.xml b/res/layout/selection_bar.xml
index ca81faf..f8fd7fc 100644
--- a/res/layout/selection_bar.xml
+++ b/res/layout/selection_bar.xml
@@ -28,15 +28,29 @@
         android:background="?attr/selectableItemBackgroundBorderless"
         android:contentDescription="@string/action_menu_back_from_edit_select"
         android:layout_gravity="center_vertical|start"
-        android:tint="@android:color/white" />
+        android:alpha="@dimen/close_icon_alpha" />
 
     <TextView
         android:id="@+id/selection_count_text"
         android:layout_marginStart="72dp"
+        android:layout_marginEnd="@dimen/edit_group_end_margin"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:visibility="gone"
         android:layout_gravity="center_vertical|start"
-        style="@style/ContactsActionBarTitleTextAppCompat" />
+        android:singleLine="true"
+        android:ellipsize="end"
+        style="@style/ContactsActionBarTitleTextBlack" />
+
+    <TextView
+        android:id="@+id/add_contacts"
+        android:layout_marginEnd="16dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone"
+        android:layout_gravity="center_vertical|end"
+        android:text="@string/menu_add_contacts"
+        android:textColor="@color/primary_color"
+        android:textStyle="bold"/>
 
 </FrameLayout>
diff --git a/res/menu/group_member_picker.xml b/res/menu/group_member_picker.xml
index ab1fadf..9e623f6 100644
--- a/res/menu/group_member_picker.xml
+++ b/res/menu/group_member_picker.xml
@@ -18,12 +18,6 @@
     xmlns:contacts="http://schemas.android.com/apk/res-auto">
 
     <item
-        android:id="@+id/menu_done"
-        android:icon="@drawable/ic_done_wht_24dp"
-        android:title="@string/menu_addContactsToGroup"
-        contacts:showAsAction="always" />
-
-    <item
         android:id="@+id/menu_select"
         android:title="@string/menu_selectForGroup" />
         contacts:showAsAction="never" />
diff --git a/res/menu/people_options.xml b/res/menu/people_options.xml
index 46d6856..a2402b9 100644
--- a/res/menu/people_options.xml
+++ b/res/menu/people_options.xml
@@ -28,15 +28,21 @@
         android:showAsAction="never" />
 
     <item
-        android:id="@+id/menu_join"
-        android:title="@string/menu_joinAggregate" />
+        android:id="@+id/menu_share"
+        android:icon="@drawable/ic_menu_share"
+        android:title="@string/menu_share"
+        contacts:showAsAction="ifRoom"/>
 
     <item
         android:id="@+id/menu_delete"
-        android:title="@string/menu_deleteContact" />
+        android:icon="@drawable/ic_menu_delete"
+        android:title="@string/menu_deleteContact"
+        contacts:showAsAction="ifRoom"/>
 
     <item
-        android:id="@+id/menu_share"
-        android:title="@string/menu_share" />
+        android:id="@+id/menu_join"
+        android:icon="@drawable/ic_menu_link"
+        android:title="@string/menu_joinAggregate"
+        contacts:showAsAction="ifRoom"/>
 
 </menu>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 68e4e87..f0b28a9 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -45,4 +45,7 @@
     <dimen name="account_container_left_padding">16dip</dimen>
     <dimen name="contact_detail_list_top_padding">8dip</dimen>
     <dimen name="frequently_contacted_title_text_size">24sp</dimen>
+
+    <!-- End margin of edit group title -->
+    <dimen name="edit_group_end_margin">80dp</dimen>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ee4f55a..8089a2e 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -30,9 +30,9 @@
     <color name="actionbar_background_color">@color/primary_color</color>
     <color name="actionbar_background_color_dark">@color/primary_color_dark</color>
 
-    <color name="contextual_selection_bar_color">#616161</color>
+    <color name="contextual_selection_bar_color">#f6f6f6</color>
     <!-- Color of the status bar above the contextual selection bar. -->
-    <color name="contextual_selection_bar_status_bar_color">#424242</color>
+    <color name="contextual_selection_bar_status_bar_color">#bababa</color>
 
     <color name="primary_color_dark">#0277bd</color>
     <color name="primary_color">#0288d1</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2badc01..b1fecc8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -286,4 +286,7 @@
 
     <!-- Width for the image for empty group view-->
     <dimen name="empty_group_view_image_width">232dp</dimen>
+
+    <!-- End margin of edit group title -->
+    <dimen name="edit_group_end_margin">72dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 06e4ad7..d72b4b2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -438,6 +438,9 @@
     <!-- The menu item to add the the currently viewed contact to your contacts [CHAR LIMIT=30] -->
     <string name="menu_add_contact">Add to contacts</string>
 
+    <!-- The menu item to add the the currently selected contacts to a label [CHAR LIMIT=10] -->
+    <string name="menu_add_contacts">Add</string>
+
     <!-- Dialog title when picking the application to share one or multiple contacts with. [CHAR LIMIT=40] -->
     <plurals name="title_share_via">
         <item quantity="one">Share contact via</item>
@@ -669,7 +672,7 @@
     <string name="enter_contact_name">Search contacts</string>
 
     <!-- Title of edit label view  [CHAR LIMIT=20]-->
-    <string name="title_edit_group">Edit Label</string>
+    <string name="title_edit_group">Edit Label: <xliff:g id="group_name" example="Friends">%1$s</xliff:g></string>
 
     <!-- Header label in the contact editor for a profile that is local to the device only (and not associated with any account) [CHAR LIMIT=25] -->
     <string name="local_profile_title">My local profile</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 50d53dc..0af01f7 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -238,6 +238,10 @@
         <item name="android:textColor">@color/actionbar_text_color</item>
     </style>
 
+    <style name="ContactsActionBarTitleTextBlack" parent="@style/ContactsActionBarTitleTextAppCompat">
+        <item name="android:textColor">@color/actionbar_text_color_black</item>
+    </style>
+
     <!-- Styling for the tab bar; handles styling of the divider line. -->
     <style name="ContactsActionBarTabBarStyle"
            parent="@android:style/Widget.Material.ActionBar.TabBar">
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index e4f8010..cf44fe3 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -32,7 +32,10 @@
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBarDrawerToggle;
 import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -95,6 +98,13 @@
 
     protected static final String ACTION_CREATE_GROUP = "createGroup";
 
+    // TODO(wenyiw): remove all the code related to these constants after switching to fragments.
+    // Positions of "all contacts" and "duplicates" in navigation drawer.
+    private static final int ALL_CONTACTS_POSITION = 1;
+    private static final int DUPLICATES_POSITION = 2;
+    // Gap between two menu groups, including a separator, a menu group header.
+    private static final int GAP_BETWEEN_TWO_MENU_GROUPS = 2;
+
     private class ContactsActionBarDrawerToggle extends ActionBarDrawerToggle {
 
         private Runnable mRunnable;
@@ -153,6 +163,8 @@
     // The account the new group will be created under.
     private AccountWithDataSet mNewGroupAccount;
 
+    private int mPositionOfLastGroup;
+
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
@@ -202,6 +214,7 @@
             clearCheckedMenus();
             mIdMenuMap.get(R.id.nav_find_duplicates).setCheckable(true);
             mIdMenuMap.get(R.id.nav_find_duplicates).setChecked(true);
+            updateScrollPosition(DUPLICATES_POSITION);
         }
 
         if (savedState != null && savedState.containsKey(KEY_NEW_GROUP_ACCOUNT)) {
@@ -210,6 +223,20 @@
         }
     }
 
+    private void updateScrollPosition(int position) {
+        final RecyclerView recyclerView = (RecyclerView) mNavigationView.getChildAt(0);
+        final LinearLayoutManager layoutManager =
+                (LinearLayoutManager) recyclerView.getLayoutManager();
+
+        // Get screen height
+        final DisplayMetrics metrics = getResources().getDisplayMetrics();
+        final int height = metrics.heightPixels;
+
+        // Set 1/3 screen height as offset if possible.
+        layoutManager.scrollToPositionWithOffset(position, height / 3);
+        recyclerView.requestLayout();
+    }
+
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
@@ -227,9 +254,10 @@
     }
 
     private void makeStatusBarTransparent() {
-        if (CompatUtils.isLollipopCompatible()
-                && getWindow().getStatusBarColor() ==
-                        ContextCompat.getColor(this, R.color.primary_color_dark)) {
+        // Avoid making status bar transparent when action bar's selection mode is on.
+        if (getWindow().getStatusBarColor() !=
+                ContextCompat.getColor(this, R.color.contextual_selection_bar_status_bar_color)
+                        && CompatUtils.isLollipopCompatible()) {
             getWindow().setStatusBarColor(Color.TRANSPARENT);
         }
     }
@@ -312,15 +340,18 @@
         subMenu.removeGroup(R.id.nav_groups_items);
         mGroupMenuMap = new HashMap<>();
 
+        mPositionOfLastGroup = DUPLICATES_POSITION + GAP_BETWEEN_TWO_MENU_GROUPS;
+
         if (groupListItems != null) {
             // Add each group
             for (final GroupListItem groupListItem : groupListItems) {
                 if (GroupUtil.isEmptyFFCGroup(groupListItem)) {
                     continue;
                 }
+                mPositionOfLastGroup++;
                 final String title = groupListItem.getTitle();
                 final MenuItem menuItem =
-                        subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE, title);
+                        subMenu.add(R.id.nav_groups_items, Menu.NONE, mPositionOfLastGroup, title);
                 mGroupMenuMap.put(groupListItem.getGroupId(), menuItem);
                 menuItem.setIcon(R.drawable.ic_menu_label);
                 menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@@ -345,9 +376,10 @@
             return;
         }
 
+        mPositionOfLastGroup++;
         // Create a menu item in the sub menu to add new groups
-        final MenuItem menuItem = subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE,
-                getString(R.string.menu_new_group_action_bar));
+        final MenuItem menuItem = subMenu.add(R.id.nav_groups_items, Menu.NONE,
+                mPositionOfLastGroup, getString(R.string.menu_new_group_action_bar));
         menuItem.setIcon(R.drawable.ic_add);
         menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
             @Override
@@ -374,6 +406,7 @@
                 && mGroupMenuMap.get(groupMetadata.groupId) != null) {
             mGroupMenuMap.get(groupMetadata.groupId).setCheckable(true);
             mGroupMenuMap.get(groupMetadata.groupId).setChecked(true);
+            updateScrollPosition(mGroupMenuMap.get(groupMetadata.groupId).getOrder());
         }
     }
 
@@ -420,13 +453,16 @@
             return;
         }
 
+        int positionOfLastFilter = mPositionOfLastGroup + GAP_BETWEEN_TWO_MENU_GROUPS;
+
         for (int i = 0; i < accountFilterItems.size(); i++) {
+            positionOfLastFilter++;
             final ContactListFilter filter = accountFilterItems.get(i);
             final String menuName =
                     filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS
                             ? getString(R.string.account_phone) : filter.accountName;
-            final MenuItem menuItem = subMenu.add(R.id.nav_filters_items, Menu.NONE, Menu.NONE,
-                    menuName);
+            final MenuItem menuItem = subMenu.add(R.id.nav_filters_items, Menu.NONE,
+                    positionOfLastFilter, menuName);
             mFilterMenuMap.put(filter, menuItem);
             final Intent intent = new Intent();
             intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
@@ -449,7 +485,7 @@
                 }
             });
             menuItem.setIcon(filter.icon);
-            // Get rid of the default memu item overlay and show original account icons.
+            // Get rid of the default menu item overlay and show original account icons.
             menuItem.getIcon().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_ATOP);
         }
 
@@ -464,11 +500,13 @@
             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);
+                updateScrollPosition(ALL_CONTACTS_POSITION);
             }
         } else {
             if (mFilterMenuMap != null && mFilterMenuMap.get(filter) != null) {
                 mFilterMenuMap.get(filter).setCheckable(true);
                 mFilterMenuMap.get(filter).setChecked(true);
+                updateScrollPosition(mFilterMenuMap.get(filter).getOrder());
             }
         }
     }
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 669735c..aa48bce 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -20,6 +20,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
@@ -33,8 +34,10 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.FrameLayout;
+import android.widget.ImageView;
 import android.widget.LinearLayout.LayoutParams;
 import android.widget.SearchView.OnCloseListener;
 import android.view.View.OnClickListener;
@@ -46,6 +49,8 @@
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.list.ContactsRequest;
 
+import java.util.ArrayList;
+
 /**
  * Adapter for the action bar at the top of the Contacts activity.
  */
@@ -156,6 +161,10 @@
         return mSearchView;
     }
 
+    public View getSelectionContainer() {
+        return mSelectionContainer;
+    }
+
     private void setupTabs(Context context) {
         final TypedArray attributeArray = context.obtainStyledAttributes(
                 new int[]{android.R.attr.actionBarSize});
@@ -417,6 +426,8 @@
     private void update(boolean skipAnimation) {
         updateStatusBarColor();
 
+        updateOverflowButtonColor();
+
         final boolean isSelectionModeChanging
                 = (mSelectionContainer.getParent() == null) == mSelectionMode;
         final boolean isSwitchingFromSearchToSelection =
@@ -498,6 +509,45 @@
         }
     }
 
+    /**
+     * Find overflow menu ImageView by its content description and update its color.
+     */
+    private void updateOverflowButtonColor() {
+        final String overflowDescription = mActivity.getResources().getString(
+                R.string.abc_action_menu_overflow_description);
+        final ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();
+        final ViewTreeObserver viewTreeObserver = decorView.getViewTreeObserver();
+        viewTreeObserver.addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        // Find the overflow ImageView.
+                        final ArrayList<View> outViews = new ArrayList<>();
+                        decorView.findViewsWithText(outViews, overflowDescription,
+                                View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
+                        if (outViews.isEmpty()) {
+                            return;
+                        }
+                        final ImageView overflow = (ImageView) outViews.get(0);
+                        overflow.setImageResource(R.drawable.ic_more_vert);
+
+                        // Update the overflow image color.
+                        final int iconColor;
+                        if (mSelectionMode) {
+                            iconColor = mActivity.getResources().getColor(
+                                    R.color.actionbar_color_grey_solid);
+                        } else {
+                            iconColor = mActivity.getResources().getColor(
+                                    R.color.actionbar_text_color);
+                        }
+                        overflow.setImageTintList(ColorStateList.valueOf(iconColor));
+
+                        // We're done, remove the listener.
+                        decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                    }
+                });
+    }
+
     public void setSelectionCount(int selectionCount) {
         TextView textView = (TextView) mSelectionContainer.findViewById(R.id.selection_count_text);
         if (selectionCount == 0) {
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 22d9f7a..dae57fc 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -31,6 +31,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnFocusChangeListener;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import com.android.contacts.AppCompatContactsActivity;
@@ -441,13 +442,34 @@
     @Override
     public void onSelectedContactIdsChanged() {
         if (mListFragment instanceof MultiSelectContactsListFragment) {
-            mActionBarAdapter.setSelectionCount(((MultiSelectContactsListFragment) mListFragment)
-                    .getSelectedContactIds().size());
+            final int count = getMultiSelectListFragment().getSelectedContactIds().size();
+            mActionBarAdapter.setSelectionCount(count);
+            updateAddContactsButton(count);
+
             // Show or hide the multi select "Done" button
             invalidateOptionsMenu();
         }
     }
 
+    private void updateAddContactsButton(int count) {
+        final TextView textView = (TextView) mActionBarAdapter.getSelectionContainer()
+                .findViewById(R.id.add_contacts);
+        if (count > 0) {
+            textView.setVisibility(View.VISIBLE);
+            textView.setAllCaps(true);
+            textView.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    final long[] contactIds =
+                            getMultiSelectListFragment().getSelectedContactIdsArray();
+                    returnSelectedContacts(contactIds);
+                }
+            });
+        } else {
+            textView.setVisibility(View.GONE);
+        }
+    }
+
     @Override
     public void onStopDisplayingCheckBoxes() {
         mActionBarAdapter.setSelectionMode(false);
@@ -532,9 +554,7 @@
 
         @Override
         public void onGroupMembersSelected(long[] contactIds) {
-            final Intent intent = new Intent();
-            intent.putExtra(UiIntentActions.TARGET_CONTACT_IDS_EXTRA_KEY, contactIds);
-            returnPickerResult(intent);
+            returnSelectedContacts(contactIds);
         }
 
         @Override
@@ -543,6 +563,12 @@
         }
     }
 
+    private void returnSelectedContacts(long[] contactIds) {
+        final Intent intent = new Intent();
+        intent.putExtra(UiIntentActions.TARGET_CONTACT_IDS_EXTRA_KEY, contactIds);
+        returnPickerResult(intent);
+    }
+
     private final class PostalAddressPickerActionListener implements
             OnPostalAddressPickerActionListener {
         @Override
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index 88b5db2..34b6b25 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -495,7 +495,8 @@
                 if (mMembersFragment != null) {
                     if (mIsEditMode) {
                         mMembersFragment.displayDeleteButtons(true);
-                        mActionBarAdapter.setActionBarTitle(getString(R.string.title_edit_group));
+                        mActionBarAdapter.setActionBarTitle(
+                                getString(R.string.title_edit_group, mGroupMetadata.groupName));
                     } else {
                         mMembersFragment.displayCheckBoxes(true);
                     }
@@ -544,7 +545,8 @@
     @Override
     public void onSelectedContactIdsChanged() {
         if (mIsEditMode) {
-            mActionBarAdapter.setActionBarTitle(getString(R.string.title_edit_group));
+            mActionBarAdapter.setActionBarTitle(
+                    getString(R.string.title_edit_group, mGroupMetadata.groupName));
         } else {
             mActionBarAdapter.setSelectionCount(mMembersFragment.getSelectedContactIds().size());
         }
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 63d75d8..61c1061 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -300,8 +300,8 @@
                             mEntry.getAsString(mType.customColumn),
                             getContext().getString(mKind.titleRes)));
         } else {
-            mLabel.setSelection(mEditTypeAdapter.getPosition(mType));
             if (mType != null) {
+                mLabel.setSelection(mEditTypeAdapter.getPosition(mType));
                 mDeleteContainer.setContentDescription(
                         getContext().getString(R.string.editor_delete_view_description,
                                 getContext().getString(mType.labelRes),
@@ -408,10 +408,8 @@
         mLabel.setEnabled(!readOnly && isEnabled());
         mLabel.setContentDescription(getContext().getResources().getString(mKind.titleRes));
 
-        if (hasTypes) {
-            mType = RawContactModifier.getCurrentType(entry, kind);
-            rebuildLabel();
-        }
+        mType = RawContactModifier.getCurrentType(entry, kind);
+        rebuildLabel();
     }
 
     public ValuesDelta getValues() {
diff --git a/src/com/android/contacts/list/GroupMemberPickerFragment.java b/src/com/android/contacts/list/GroupMemberPickerFragment.java
index d981de0..519a6a9 100644
--- a/src/com/android/contacts/list/GroupMemberPickerFragment.java
+++ b/src/com/android/contacts/list/GroupMemberPickerFragment.java
@@ -279,9 +279,6 @@
 
         // Added in ContactSelectionActivity but we must account for selection mode
         setVisible(menu, R.id.menu_search, !isSearchMode && !isSelectionMode);
-
-        setVisible(menu, R.id.menu_done, isSelectionMode &&
-                getAdapter().getSelectedContactIds().size() > 0);
         setVisible(menu, R.id.menu_select, !isSearchMode && !isSelectionMode);
     }
 
@@ -310,12 +307,6 @@
                 }
                 return true;
             }
-            case R.id.menu_done: {
-                if (mListener != null) {
-                    mListener.onGroupMembersSelected(getAdapter().getSelectedContactIdsArray());
-                }
-                return true;
-            }
             case R.id.menu_select: {
                 if (mListener != null) {
                     mListener.onSelectGroupMembers();
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 5ec7818..07720f2 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -69,6 +69,7 @@
 import android.provider.ContactsContract.Intents;
 import android.provider.ContactsContract.QuickContact;
 import android.provider.ContactsContract.RawContacts;
+import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.graphics.Palette;
@@ -2683,8 +2684,9 @@
                 Trace.endSection();
                 Trace.beginSection("initialize permission explanation card");
 
-                final Drawable historyIcon = getResources().getDrawable(
-                        R.drawable.ic_history_24dp).mutate();
+                final Drawable historyIcon = VectorDrawableCompat.create(
+                        getResources(), R.drawable.ic_history_24dp, null);
+
                 final Entry permissionExplanationEntry = new Entry(CARD_ENTRY_ID_REQUEST_PERMISSION,
                         historyIcon, getString(R.string.permission_explanation_header),
                         mPermissionExplanationCardSubHeader, /* subHeaderIcon = */ null,