Fixing join contact functionality, including search

Change-Id: I3fe1f6270175cbdd13448c1adecbad1ee96d2fac
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index e899d69..037c670 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -749,12 +749,9 @@
 ////                mJustCreated = true;
 //                break;
 //
-            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_FILTER:
-//            case SUBACTIVITY_SEARCH:
-                // Pass through results of filter or search UI
+            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
                 if (resultCode == RESULT_OK) {
-                    setResult(RESULT_OK, data);
-                    finish();
+                    mListFragment.onPickerResult(data);
                 }
 
 // TODO fix or remove multipicker code
diff --git a/src/com/android/contacts/JoinContactActivity.java b/src/com/android/contacts/JoinContactActivity.java
index 0f3eab0..708da8a 100644
--- a/src/com/android/contacts/JoinContactActivity.java
+++ b/src/com/android/contacts/JoinContactActivity.java
@@ -17,8 +17,11 @@
 package com.android.contacts;
 
 
+import com.android.contacts.list.ContactEntryListFragment;
+import com.android.contacts.list.ContactsRequest;
 import com.android.contacts.list.JoinContactListFragment;
 import com.android.contacts.list.OnContactPickerActionListener;
+import com.android.contacts.ui.ContactsPreferencesActivity;
 
 import android.app.Activity;
 import android.app.FragmentTransaction;
@@ -26,7 +29,12 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract;
+import android.provider.Settings;
+import android.provider.ContactsContract.Contacts;
 import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 
 /**
  * An activity that shows a list of contacts that can be joined with the target contact.
@@ -52,6 +60,8 @@
 
     private long mTargetContactId;
 
+    private JoinContactListFragment mListFragment;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -66,9 +76,9 @@
             return;
         }
 
-        JoinContactListFragment fragment = new JoinContactListFragment();
-        fragment.setTargetContactId(mTargetContactId);
-        fragment.setOnContactPickerActionListener(new OnContactPickerActionListener() {
+        mListFragment = new JoinContactListFragment();
+        mListFragment.setTargetContactId(mTargetContactId);
+        mListFragment.setOnContactPickerActionListener(new OnContactPickerActionListener() {
             public void onPickContactAction(Uri contactUri) {
                 Intent intent = new Intent(null, contactUri);
                 setResult(RESULT_OK, intent);
@@ -86,7 +96,43 @@
         });
 
         FragmentTransaction transaction = openFragmentTransaction();
-        transaction.add(android.R.id.content, fragment);
+        transaction.add(android.R.id.content, mListFragment);
         transaction.commit();
     }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.search, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.menu_search: {
+                onSearchRequested();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
+            boolean globalSearch) {
+        if (globalSearch) {
+            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
+        } else {
+            mListFragment.startSearch(initialQuery);
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER
+                && resultCode == RESULT_OK) {
+            mListFragment.onPickerResult(data);
+        }
+    }
 }
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index ff402a2..b99c0d1 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -141,21 +141,6 @@
 
     public void setSearchMode(boolean flag) {
         mSearchMode = flag;
-
-        int defaultPartitionIndex = -1;
-        int count = getPartitionCount();
-        for (int i = 0; i < count; i++) {
-            Partition partition = getPartition(i);
-            if (partition instanceof DirectoryPartition &&
-                    ((DirectoryPartition)partition).getDirectoryId() == Directory.DEFAULT) {
-                defaultPartitionIndex = i;
-                break;
-            }
-        }
-        if (defaultPartitionIndex != -1) {
-            setShowIfEmpty(defaultPartitionIndex, flag);
-            setHasHeader(defaultPartitionIndex, flag);
-        }
     }
 
     public boolean isSearchResultsMode() {
@@ -350,6 +335,26 @@
         }
     }
 
+    /**
+     * Changes visibility parameters for the default directory partition.
+     */
+    public void configureDefaultPartition(boolean showIfEmpty, boolean hasHeader) {
+        int defaultPartitionIndex = -1;
+        int count = getPartitionCount();
+        for (int i = 0; i < count; i++) {
+            Partition partition = getPartition(i);
+            if (partition instanceof DirectoryPartition &&
+                    ((DirectoryPartition)partition).getDirectoryId() == Directory.DEFAULT) {
+                defaultPartitionIndex = i;
+                break;
+            }
+        }
+        if (defaultPartitionIndex != -1) {
+            setShowIfEmpty(defaultPartitionIndex, showIfEmpty);
+            setHasHeader(defaultPartitionIndex, hasHeader);
+        }
+    }
+
     @Override
     protected View newHeaderView(Context context, int partition, Cursor cursor,
             ViewGroup parent) {
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 9bfdbb3..b111e12 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -73,7 +73,7 @@
         extends LoaderManagingFragment<Cursor>
         implements OnItemClickListener, OnScrollListener, OnFocusChangeListener, OnTouchListener {
 
-    public static final int ACTIVITY_REQUEST_CODE_FILTER = 1;
+    public static final int ACTIVITY_REQUEST_CODE_PICKER = 1;
 
     private static final String TAG = "ContactEntryListFragment";
 
@@ -369,6 +369,7 @@
                 mAdapter.clearPartitions();
                 mAdapter.setSearchMode(flag);
                 mAdapter.setPinnedPartitionHeadersEnabled(flag);
+                mAdapter.configureDefaultPartition(flag, flag);
                 reloadData();
             }
 
@@ -474,7 +475,10 @@
         onCreateView(inflater, container);
 
         mAdapter = createListAdapter();
-        mAdapter.setSearchMode(isSearchMode());
+
+        boolean searchMode = isSearchMode();
+        mAdapter.setSearchMode(searchMode);
+        mAdapter.configureDefaultPartition(searchMode, searchMode);
         mAdapter.setSearchResultsMode(isSearchResultsMode());
         mAdapter.setPhotoLoader(mPhotoLoader);
         mListView.setAdapter(mAdapter);
@@ -854,6 +858,13 @@
         ContactsSearchManager.startSearch(getActivity(), initialQuery, mRequest);
     }
 
+    /**
+     * Processes a result returned by the contact picker.
+     */
+    public void onPickerResult(Intent data) {
+        throw new UnsupportedOperationException("Picker result handler is not implemented.");
+    }
+
     // 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 c3a50a0..de978d0 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -164,6 +164,11 @@
     @Override
     public void startSearch(String initialQuery) {
         ContactsSearchManager.startSearchForResult(getActivity(), initialQuery,
-                ACTIVITY_REQUEST_CODE_FILTER, getContactsRequest());
+                ACTIVITY_REQUEST_CODE_PICKER, getContactsRequest());
+    }
+
+    @Override
+    public void onPickerResult(Intent data) {
+        mListener.onPickContactAction(data.getData());
     }
 }
diff --git a/src/com/android/contacts/list/JoinContactListAdapter.java b/src/com/android/contacts/list/JoinContactListAdapter.java
index 6258be4..83c5da2 100644
--- a/src/com/android/contacts/list/JoinContactListAdapter.java
+++ b/src/com/android/contacts/list/JoinContactListAdapter.java
@@ -70,7 +70,7 @@
         addPartition(false, false);
 
         // Partition 2: All contacts
-        addPartition(false, true);
+        addPartition(createDefaultDirectoryPartition());
     }
 
     public void setTargetContactId(long targetContactId) {
@@ -135,6 +135,12 @@
     }
 
     @Override
+    public void configureDefaultPartition(boolean showIfEmpty, boolean hasHeader) {
+         // Don't change default partition parameters from these defaults
+        super.configureDefaultPartition(false, true);
+    }
+
+    @Override
     public int getViewTypeCount() {
         return super.getViewTypeCount() + 1;
     }
@@ -167,6 +173,11 @@
     }
 
     @Override
+    protected void bindHeaderView(View view, int partitionIndex, Cursor cursor) {
+        // Header views are static - nothing needs to be bound
+    }
+
+    @Override
     protected View newView(Context context, int partition, Cursor cursor, int position,
             ViewGroup parent) {
         switch (partition) {
diff --git a/src/com/android/contacts/list/JoinContactListFragment.java b/src/com/android/contacts/list/JoinContactListFragment.java
index 12b4ae4..74ff844 100644
--- a/src/com/android/contacts/list/JoinContactListFragment.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -15,11 +15,13 @@
  */
 package com.android.contacts.list;
 
+import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 
 import android.app.Activity;
 import android.content.ContentUris;
 import android.content.CursorLoader;
+import android.content.Intent;
 import android.content.Loader;
 import android.database.Cursor;
 import android.os.Bundle;
@@ -34,7 +36,7 @@
  */
 public class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
 
-    private static final int DISPLAY_NAME_LOADER = 1;
+    private static final int DISPLAY_NAME_LOADER = -2;
 
     private OnContactPickerActionListener mListener;
     private long mTargetContactId;
@@ -43,6 +45,7 @@
     public JoinContactListFragment() {
         setPhotoLoaderEnabled(true);
         setSectionHeaderDisplayEnabled(true);
+        setAizyEnabled(false);
     }
 
     public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
@@ -56,14 +59,33 @@
     }
 
     @Override
+    protected Loader<Cursor> startLoading(int id, Bundle args) {
+
+        // The first two partitions don't require loaders
+        if (id == JoinContactListAdapter.PARTITION_SUGGESTIONS ||
+                id == JoinContactListAdapter.PARTITION_SHOW_ALL_CONTACTS) {
+            return null;
+        }
+
+        return super.startLoading(id, args);
+    }
+
+    @Override
     protected Loader<Cursor> onCreateLoader(int id, Bundle args) {
         if (id == DISPLAY_NAME_LOADER) {
             // Loader for the display name of the target contact
             return new CursorLoader(getActivity(),
                     ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId),
                     new String[] {Contacts.DISPLAY_NAME}, null, null, null);
+        } else if (id == JoinContactListAdapter.PARTITION_ALL_CONTACTS) {
+            JoinContactLoader loader = new JoinContactLoader(getActivity());
+            JoinContactListAdapter adapter = getAdapter();
+            if (adapter != null) {
+                adapter.configureLoader(loader, 0);
+            }
+            return loader;
         } else {
-            return new JoinContactLoader(getActivity());
+            throw new IllegalArgumentException("No loader for ID=" + id);
         }
     }
 
@@ -121,4 +143,23 @@
             mListener.onPickContactAction(adapter.getContactUri(position));
         }
     }
+
+    @Override
+    protected void reloadData() {
+        setAizyEnabled(mAllContactsListShown);
+        super.reloadData();
+    }
+
+    @Override
+    public void startSearch(String initialQuery) {
+        ContactsRequest request = new ContactsRequest();
+        request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT);
+        ContactsSearchManager.startSearchForResult(getActivity(), initialQuery,
+                ACTIVITY_REQUEST_CODE_PICKER, request);
+    }
+
+    @Override
+    public void onPickerResult(Intent data) {
+        mListener.onPickContactAction(data.getData());
+    }
 }
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index cf787d2..93b66ac 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -104,6 +104,11 @@
     @Override
     public void startSearch(String initialQuery) {
         ContactsSearchManager.startSearchForResult(getActivity(), initialQuery,
-                ACTIVITY_REQUEST_CODE_FILTER, getContactsRequest());
+                ACTIVITY_REQUEST_CODE_PICKER, getContactsRequest());
+    }
+
+    @Override
+    public void onPickerResult(Intent data) {
+        mListener.onPickPhoneNumberAction(data.getData());
     }
 }