Merge "Fixing search in the contact shortcut maker"
diff --git a/res/menu/search.xml b/res/menu/search.xml
new file mode 100644
index 0000000..4e2e8e3
--- /dev/null
+++ b/res/menu/search.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/menu_search"
+        android:icon="@android:drawable/ic_menu_search"
+        android:title="@string/menu_search" />
+
+</menu>
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 683fea4..093aec6 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -88,7 +88,6 @@
     private static final int SUBACTIVITY_VIEW_CONTACT = 2;
     private static final int SUBACTIVITY_DISPLAY_GROUP = 3;
     private static final int SUBACTIVITY_SEARCH = 4;
-    protected static final int SUBACTIVITY_FILTER = 5;
 
     private static final String[] RAW_CONTACTS_PROJECTION = new String[] {
         RawContacts._ID, //0
@@ -260,6 +259,7 @@
                 ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setOnContactPickerActionListener(new ContactPickerActionListener());
                 fragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
+                fragment.setSearchMode(mRequest.isSearchMode());
                 mListFragment = fragment;
                 break;
             }
@@ -267,7 +267,7 @@
             case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: {
                 ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setOnContactPickerActionListener(new ContactPickerActionListener());
-                fragment.setCreateContactEnabled(true);
+                fragment.setCreateContactEnabled(!mRequest.isSearchMode());
                 fragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
                 mListFragment = fragment;
                 break;
@@ -276,8 +276,9 @@
             case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: {
                 ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setOnContactPickerActionListener(new ContactPickerActionListener());
-                fragment.setCreateContactEnabled(true);
+                fragment.setCreateContactEnabled(!mRequest.isSearchMode());
                 fragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
+                fragment.setSearchMode(mRequest.isSearchMode());
                 fragment.setShortcutRequested(true);
                 mListFragment = fragment;
                 break;
@@ -326,6 +327,7 @@
             default:
                 throw new IllegalStateException("Invalid action code: " + mActionCode);
         }
+        mListFragment.setContactsRequest(mRequest);
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
@@ -453,19 +455,26 @@
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
 
-        // TODO what other actions need the menu?
+        MenuInflater inflater = getMenuInflater();
         if (mActionCode == ContactsRequest.ACTION_DEFAULT ||
                 mActionCode == ContactsRequest.ACTION_STREQUENT) {
-            MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.list, menu);
+            return true;
+        } else if (!mListFragment.isSearchMode()) {
+            inflater.inflate(R.menu.search, menu);
+            return true;
+        } else {
+            return false;
         }
-        return true;
     }
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
-        menu.findItem(R.id.menu_display_groups).setVisible(
-                mActionCode == ContactsRequest.ACTION_DEFAULT);
+        MenuItem displayGroups = menu.findItem(R.id.menu_display_groups);
+        if (displayGroups != null) {
+            displayGroups.setVisible(
+                    mActionCode == ContactsRequest.ACTION_DEFAULT);
+        }
         return true;
     }
 
@@ -513,14 +522,7 @@
         if (globalSearch) {
             super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
         } else {
-//            if (!mSearchMode && (mMode & MODE_MASK_NO_FILTER) == 0) {
-//                if ((mMode & MODE_MASK_PICKER) != 0) {
-//                    ContactsSearchManager.startSearchForResult(this, initialQuery,
-//                            SUBACTIVITY_FILTER, null);
-//                } else {
-                    ContactsSearchManager.startSearch(this, initialQuery, mRequest);
-//                }
-//            }
+            mListFragment.startSearch(initialQuery);
         }
     }
 
@@ -722,16 +724,17 @@
         AccountSelectionUtil.doImport(this, resId, (size == 1 ? accountList.get(0) : null));
     }
 
-//    @Override
-//    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-//        switch (requestCode) {
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode) {
 //            case SUBACTIVITY_NEW_CONTACT:
 //                if (resultCode == RESULT_OK) {
-////                    returnPickerResult(null, data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME),
-////                            data.getData());
+//                    returnPickerResult(null, data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME),
+//                            data.getData());
+//                    setRe
 //                }
 //                break;
-//
+
 //            case SUBACTIVITY_VIEW_CONTACT:
 //                if (resultCode == RESULT_OK) {
 //                    mAdapter.notifyDataSetChanged();
@@ -743,20 +746,23 @@
 ////                mJustCreated = true;
 //                break;
 //
-//            case SUBACTIVITY_FILTER:
+            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_FILTER:
 //            case SUBACTIVITY_SEARCH:
-//                // Pass through results of filter or search UI
-//                if (resultCode == RESULT_OK) {
-//                    setResult(RESULT_OK, data);
-//                    finish();
-//                } else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
+                // Pass through results of filter or search UI
+                if (resultCode == RESULT_OK) {
+                    setResult(RESULT_OK, data);
+                    finish();
+                }
+
+// TODO fix or remove multipicker code
+//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
 //                    // Finish the activity if the sub activity was canceled as back key is used
 //                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
 //                    finish();
 //                }
 //                break;
-//        }
-//    }
+        }
+    }
 
     @Override
     public boolean onContextItemSelected(MenuItem item) {
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 44c50af..8c2abb3 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -19,6 +19,7 @@
 import com.android.contacts.ContactEntryListView;
 import com.android.contacts.ContactListEmptyView;
 import com.android.contacts.ContactPhotoLoader;
+import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 import com.android.contacts.ui.ContactsPreferences;
 import com.android.contacts.widget.ContextMenuAdapter;
@@ -76,6 +77,7 @@
         extends LoaderManagingFragment<Cursor>
         implements OnItemClickListener, OnScrollListener, OnFocusChangeListener, OnTouchListener {
 
+    public static final int ACTIVITY_REQUEST_CODE_FILTER = 1;
 
     private static final String TAG = "ContactEntryListFragment";
 
@@ -122,6 +124,8 @@
      */
     private boolean mInitialLoadComplete;
 
+    private ContactsRequest mRequest;
+
     private static final class DirectoryQuery {
         public static final Uri URI = Directory.CONTENT_URI;
         public static final String ORDER_BY = Directory._ID;
@@ -170,6 +174,20 @@
     protected void onInitializeLoaders() {
     }
 
+    /**
+     * Returns the parsed intent that started the activity hosting this fragment.
+     */
+    public ContactsRequest getContactsRequest() {
+        return mRequest;
+    }
+
+    /**
+     * Sets a parsed intent that started the activity hosting this fragment.
+     */
+    public void setContactsRequest(ContactsRequest request) {
+        mRequest = request;
+    }
+
     @Override
     public void onStart() {
         if (mContactsPrefs == null) {
@@ -939,6 +957,14 @@
         return telephonyManager.hasIccCard();
     }
 
+    /**
+     * Processes a user request to start search. This may be triggered by the
+     * search key, a menu item or some other user action.
+     */
+    public void startSearch(String initialQuery) {
+        ContactsSearchManager.startSearch(getActivity(), initialQuery, mRequest);
+    }
+
     // TODO integrate into picker fragments
 //    protected Uri buildCallingPackageUri(Uri uri) {
 //        String callingPackage = getContext().getCallingPackage();
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index 2907603..c3a50a0 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.contacts.list;
 
+import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 import com.android.contacts.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
 
@@ -38,6 +39,8 @@
 
     public ContactPickerFragment() {
         setPhotoLoaderEnabled(true);
+        setSectionHeaderDisplayEnabled(true);
+        setAizyEnabled(true);
     }
 
     public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
@@ -68,10 +71,6 @@
         }
     }
 
-    public boolean isSearchAllContactsItemPosition(int position) {
-        return isSearchMode() && position == getAdapter().getCount() - 1;
-    }
-
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         if (position == 0 && !isSearchMode() && mCreateContactEnabled) {
@@ -83,21 +82,17 @@
 
     @Override
     protected void onItemClick(int position, long id) {
-        if (isSearchAllContactsItemPosition(position)) {
-            mListener.onSearchAllContactsAction((String)null);
+        Uri uri;
+        if (isLegacyCompatibilityMode()) {
+            uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
         } else {
-            Uri uri;
-            if (isLegacyCompatibilityMode()) {
-                uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
-            } else {
-                uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
-            }
-            if (mShortcutRequested) {
-                ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
-                builder.createContactShortcutIntent(uri);
-            } else {
-                mListener.onPickContactAction(uri);
-            }
+            uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
+        }
+        if (mShortcutRequested) {
+            ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
+            builder.createContactShortcutIntent(uri);
+        } else {
+            mListener.onPickContactAction(uri);
         }
     }
 
@@ -120,7 +115,11 @@
     @Override
     protected void configureAdapter() {
         super.configureAdapter();
+
         ContactEntryListAdapter adapter = getAdapter();
+        if (adapter instanceof DefaultContactListAdapter) {
+            ((DefaultContactListAdapter)adapter).setVisibleContactsOnly(true);
+        }
 
         // If "Create new contact" is shown, don't display the empty list UI
         adapter.setEmptyListEnabled(!isCreateContactEnabled());
@@ -128,13 +127,7 @@
 
     @Override
     protected View inflateView(LayoutInflater inflater, ViewGroup container) {
-        if (isSearchMode()) {
-            return inflater.inflate(R.layout.contacts_search_content, null);
-        } else if (isSearchResultsMode()) {
-            return inflater.inflate(R.layout.contacts_list_search_results, null);
-        } else {
-            return inflater.inflate(R.layout.contacts_list_content, null);
-        }
+        return inflater.inflate(R.layout.contacts_list_content, null);
     }
 
     @Override
@@ -167,4 +160,10 @@
     public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
         mListener.onShortcutIntentCreated(shortcutIntent);
     }
+
+    @Override
+    public void startSearch(String initialQuery) {
+        ContactsSearchManager.startSearchForResult(getActivity(), initialQuery,
+                ACTIVITY_REQUEST_CODE_FILTER, getContactsRequest());
+    }
 }