Move add contact to group autocomplete to the ActionBar (1/2)

Bug 28707265
Bug 18641067

Change-Id: Ibcaf95b5592bbb471d2ac42c7d2c84f19d77c379
diff --git a/res/layout/group_editor_autocomplete_view.xml b/res/layout/group_editor_autocomplete_view.xml
deleted file mode 100644
index c8e716a..0000000
--- a/res/layout/group_editor_autocomplete_view.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- Autocomplete text input field for adding new members to a group in the group editor -->
-
-<AutoCompleteTextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:textAppearance="?android:attr/textAppearanceMedium"
-    android:textColor="?android:attr/textColorPrimary"
-    android:imeOptions="flagNoExtractUi|flagNoFullscreen"
-    android:hint="@string/enter_contact_name"
-    android:minHeight="48dip"
-    android:paddingLeft="@dimen/group_editor_autocomplete_left_padding"
-    android:paddingStart="@dimen/group_editor_autocomplete_left_padding"/>
\ No newline at end of file
diff --git a/res/layout/group_editor_view.xml b/res/layout/group_editor_view.xml
index d94853d..72ceaf3 100644
--- a/res/layout/group_editor_view.xml
+++ b/res/layout/group_editor_view.xml
@@ -45,10 +45,6 @@
             android:paddingStart="8dip"/>
 
         <include
-            layout="@layout/group_editor_autocomplete_view"
-            android:id="@+id/add_member_field"/>
-
-        <include
             layout="@layout/group_editor_existing_member_list"
             android:id="@android:id/list"/>
     </LinearLayout>
diff --git a/res/menu/edit_group.xml b/res/menu/edit_group.xml
index ad17b80..c2d7f47 100644
--- a/res/menu/edit_group.xml
+++ b/res/menu/edit_group.xml
@@ -14,12 +14,21 @@
      limitations under the License.
 -->
 
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:contacts="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/menu_add"
+        android:icon="@drawable/ic_person_add_tinted_24dp"
+        android:title="@string/menu_addToGroup"
+        contacts:showAsAction="ifRoom" />
+
     <item
         android:id="@+id/menu_save"
-        android:showAsAction="ifRoom"
         android:icon="@drawable/ic_done_wht_24dp"
-        android:title="@string/menu_save" />
+        android:title="@string/menu_save"
+        contacts:showAsAction="ifRoom" />
+
     <item
         android:id="@+id/menu_discard"
         android:title="@string/menu_discard" />
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 78bec34..b519318 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -52,8 +52,6 @@
     <dimen name="group_editor_member_list_right_margin">4dip</dimen>
     <!-- Account title left padding -->
     <dimen name="account_container_left_padding">16dip</dimen>
-    <!-- Left padding of the auto complete field to line hint text up with member list -->
-    <dimen name="group_editor_autocomplete_left_padding">16dip</dimen>
     <dimen name="contact_detail_list_top_padding">8dip</dimen>
     <dimen name="frequently_contacted_title_text_size">24sp</dimen>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d4e40ee..6d516cf 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -154,9 +154,6 @@
     <!-- Right margin for the group member list to match the built in margin in the autocomplete asset -->
     <dimen name="group_editor_member_list_right_margin">4dip</dimen>
 
-    <!-- Left padding of the auto complete field to line hint text up with member list -->
-    <dimen name="group_editor_autocomplete_left_padding">8dip</dimen>
-
     <!-- Border padding for the group detail fragment -->
     <dimen name="group_detail_border_padding">0dip</dimen>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cec807f..22169e4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -137,11 +137,14 @@
     <!-- Menu item that deletes the currently selected label [CHAR LIMIT=30] -->
     <string name="menu_deleteGroup">Delete label</string>
 
+    <!-- Menu item to search for contacts to add to the currently selected label. CHAR LIMIT=30] -->
+    <string name="menu_addToGroup">Add contact</string>
+
     <!-- Menu item to remove the currently selected contacts from the currently selected label. [CHAR LIMIT=60] -->
     <string name="menu_removeFromGroup">Remove from label</string>
 
     <!-- Menu item (in the action bar) that creates a new contact [CHAR LIMIT=30] -->
-    <string name="menu_new_contact_action_bar">Add Contact</string>
+    <string name="menu_new_contact_action_bar">Add contact</string>
 
     <!-- Menu item (in the action bar) that creates a new label [CHAR LIMIT=30] -->
     <string name="menu_new_group_action_bar">Create new&#8230;</string>
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 2d6740d..7042121 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -110,6 +110,8 @@
     private boolean mShowHomeIcon;
     private boolean mShowHomeAsUp;
 
+    private int mSearchHintResId;
+
     public interface TabState {
         public static int ALL = 0;
 
@@ -121,6 +123,12 @@
 
     public ActionBarAdapter(Activity activity, Listener listener, ActionBar actionBar,
             View portraitTabs, View landscapeTabs, Toolbar toolbar) {
+        this(activity, listener, actionBar, portraitTabs, landscapeTabs, toolbar,
+                R.string.hint_findContacts);
+    }
+
+    public ActionBarAdapter(Activity activity, Listener listener, ActionBar actionBar,
+            View portraitTabs, View landscapeTabs, Toolbar toolbar, int searchHintResId) {
         mActivity = activity;
         mListener = listener;
         mActionBar = actionBar;
@@ -130,6 +138,7 @@
         mToolbar = toolbar;
         mToolBarFrame = (FrameLayout) mToolbar.getParent();
         mMaxToolbarContentInsetStart = mToolbar.getContentInsetStart();
+        mSearchHintResId = searchHintResId;
 
         setupSearchAndSelectionViews();
         setupTabs(mActivity);
@@ -143,6 +152,10 @@
         mShowHomeAsUp = showHomeAsUp;
     }
 
+    public EditText getSearchView() {
+        return mSearchView;
+    }
+
     private void setupTabs(Context context) {
         final TypedArray attributeArray = context.obtainStyledAttributes(
                 new int[]{android.R.attr.actionBarSize});
@@ -163,7 +176,7 @@
         mSearchContainer.setBackgroundColor(mActivity.getResources().getColor(
                 R.color.searchbox_background_color));
         mSearchView = (EditText) mSearchContainer.findViewById(R.id.search_view);
-        mSearchView.setHint(mActivity.getString(R.string.hint_findContacts));
+        mSearchView.setHint(mActivity.getString(mSearchHintResId));
         mSearchView.addTextChangedListener(new SearchTextWatcher());
         mSearchContainer.findViewById(R.id.search_back_button).setOnClickListener(
                 new OnClickListener() {
diff --git a/src/com/android/contacts/activities/GroupEditorActivity.java b/src/com/android/contacts/activities/GroupEditorActivity.java
index 5f2789e..e316902 100644
--- a/src/com/android/contacts/activities/GroupEditorActivity.java
+++ b/src/com/android/contacts/activities/GroupEditorActivity.java
@@ -22,6 +22,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.util.Log;
+import android.widget.AutoCompleteTextView;
 
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
@@ -140,6 +141,20 @@
             startActivity(ImplicitIntentsUtil.composeQuickContactIntent(
                     contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED));
         }
+
+        @Override
+        public AutoCompleteTextView getSearchView() {
+            return null;
+        }
+
+        @Override
+        public boolean isSearchMode() {
+            return false;
+        }
+
+        @Override
+        public void setSearchMode(boolean searchMode) {
+        }
     };
 
     @Override
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index 2221820..7ebb3e0 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -31,6 +31,7 @@
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.widget.AutoCompleteTextView;
 import android.widget.Toast;
 
 import com.android.contacts.AppCompatContactsActivity;
@@ -257,7 +258,8 @@
         final ContactsRequest contactsRequest = new ContactsRequest();
         contactsRequest.setActionCode(ContactsRequest.ACTION_GROUP);
         mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(),
-                /* portraitTabs */ null, /* landscapeTabs */ null, toolbar);
+                /* portraitTabs */ null, /* landscapeTabs */ null, toolbar,
+                R.string.enter_contact_name);
         mActionBarAdapter.setShowHomeIcon(true);
         mActionBarAdapter.setShowHomeAsUp(true);
         mActionBarAdapter.initialize(savedState, contactsRequest);
@@ -429,9 +431,6 @@
     @Override
     public void onAction(int action) {
         switch (action) {
-            case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
-                // TODO(wjang)
-                break;
             case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
                 mActionBarAdapter.setSearchMode(true);
                 invalidateOptionsMenu();
@@ -528,4 +527,22 @@
         startActivity(ImplicitIntentsUtil.composeQuickContactIntent(
                 contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED));
     }
+
+    @Override
+    public AutoCompleteTextView getSearchView() {
+        return mActionBarAdapter == null
+                ? null : (AutoCompleteTextView) mActionBarAdapter.getSearchView();
+    }
+
+    @Override
+    public boolean isSearchMode() {
+        return mActionBarAdapter == null ? false : mActionBarAdapter.isSearchMode();
+    }
+
+    @Override
+    public void setSearchMode(boolean searchMode) {
+        if (mActionBarAdapter != null) {
+            mActionBarAdapter.setSearchMode(searchMode);
+        }
+    }
 }
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index c738e33..a7d30a4 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -121,6 +121,24 @@
          * Group member name or photo was clicked in order to view contact details.
          */
         void onGroupMemberClicked(Uri contactLookupUri);
+
+        // TODO(wjang): consider calling these directly on the host Activity or moving these
+        // options menu items to the host Activity.
+
+        /**
+         * Returns the autocomplete view from the action bar.
+         */
+        AutoCompleteTextView getSearchView();
+
+        /**
+         * Whether the action bar is currently in search mode.
+         */
+        boolean isSearchMode();
+
+        /**
+         * Change whether the action bar is in search mode.
+         */
+        void setSearchMode(boolean searchMode);
     }
 
     private static final int LOADER_EXISTING_MEMBERS = 2;
@@ -421,8 +439,9 @@
         }
 
         mGroupNameView = (TextView) editorView.findViewById(R.id.group_name);
-        mAutoCompleteTextView = (AutoCompleteTextView) editorView.findViewById(
-                R.id.add_member_field);
+        if (mListener != null) {
+            mAutoCompleteTextView = mListener.getSearchView();
+        }
 
         mListView = (ListView) editorView.findViewById(android.R.id.list);
         mListView.setAdapter(mMemberListAdapter);
@@ -520,6 +539,21 @@
     }
 
     @Override
+    public void onPrepareOptionsMenu(Menu menu) {
+        final boolean isSearchMode = mListener == null ? false : mListener.isSearchMode();
+        setVisible(menu, R.id.menu_add, !isSearchMode);
+        setVisible(menu, R.id.menu_save, !isSearchMode);
+        setVisible(menu, R.id.menu_discard, !isSearchMode);
+    }
+
+    private static void setVisible(Menu menu, int id, boolean visible) {
+        final MenuItem menuItem = menu.findItem(id);
+        if (menuItem != null) {
+            menuItem.setVisible(visible);
+        }
+    }
+
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case android.R.id.home: {
@@ -530,6 +564,11 @@
                 }
                 return true;
             }
+            case R.id.menu_add:
+                if (mListener != null) {
+                    mListener.setSearchMode(true);
+                }
+                return true;
             case R.id.menu_save:
                 onDoneClicked();
                 return true;