Switching join contact functionality to LoaderManager.

Change-Id: I935e1610e18d5fb72a321aad9a329ae0232ee192
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index e07d3d1..5695456 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -383,7 +383,8 @@
                 fragment.setContextMenuAdapter(new ContactBrowseListContextMenuAdapter(fragment));
                 fragment.setSearchMode(mRequest.isSearchMode());
                 fragment.setQueryString(mRequest.getQueryString());
-                fragment.setDirectorySearchEnabled(mRequest.isDirectorySearchEnabled());
+                fragment.setDirectorySearchEnabled(
+                        mRequest.isSearchMode() && mRequest.isDirectorySearchEnabled());
                 fragment.setAizyEnabled(!mRequest.isSearchMode());
                 fragment.setSelectionVisible(mTwoPaneLayout);
                 return fragment;
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 8c491a2..9f6cc13 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -321,16 +321,10 @@
         if (loaderId == DIRECTORY_LOADER_ID) {
             mAdapter.changeDirectories(data);
         } else {
-            final int partitionIndex = loaderId;      // by convention
-            mAdapter.changeCursor(partitionIndex, data);
-            showCount(partitionIndex, data);
-            if (partitionIndex == mAdapter.getIndexedPartition()) {
-                mAizy.setIndexer(mAdapter.getIndexer());
-            }
-            completeRestoreInstanceState();
+            onPartitionLoaded(loaderId, data);
         }
 
-        if (isSearchMode()) {
+        if (isDirectorySearchEnabled()) {
             if (mLoadDirectoryList) {
                 mLoadDirectoryList = false;
                 startLoading(DIRECTORY_LOADER_ID, null);
@@ -346,6 +340,17 @@
 //            }
     }
 
+    protected void onPartitionLoaded(int partitionIndex, Cursor data) {
+        mAdapter.changeCursor(partitionIndex, data);
+        showCount(partitionIndex, data);
+        if (partitionIndex == mAdapter.getIndexedPartition()) {
+            mAizy.setIndexer(mAdapter.getIndexer());
+        }
+
+        // TODO should probably only restore instance state after all directories are loaded
+        completeRestoreInstanceState();
+    }
+
     protected void reloadData() {
         cancelLoading();
         mAdapter.onDataReload();
diff --git a/src/com/android/contacts/list/JoinContactListFragment.java b/src/com/android/contacts/list/JoinContactListFragment.java
index acbf725..ad75ef3 100644
--- a/src/com/android/contacts/list/JoinContactListFragment.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -19,6 +19,7 @@
 import com.android.contacts.R;
 
 import android.app.Activity;
+import android.app.LoaderManager.LoaderCallbacks;
 import android.content.ContentUris;
 import android.content.CursorLoader;
 import android.content.Intent;
@@ -42,6 +43,51 @@
     private long mTargetContactId;
     private boolean mAllContactsListShown = false;
 
+    private LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() {
+
+        @Override
+        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+            switch (id) {
+                case 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);
+                }
+                case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
+                    JoinContactLoader loader = new JoinContactLoader(getActivity());
+                    JoinContactListAdapter adapter = getAdapter();
+                    if (adapter != null) {
+                        adapter.configureLoader(loader, 0);
+                    }
+                    return loader;
+                }
+            }
+            throw new IllegalArgumentException("No loader for ID=" + id);
+        }
+
+        @Override
+        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+            switch (loader.getId()) {
+                case DISPLAY_NAME_LOADER: {
+                    if (data != null && data.moveToFirst()) {
+                        showTargetContactName(data.getString(0));
+                    }
+                    break;
+                }
+                case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
+                    setAizyEnabled(mAllContactsListShown);
+
+                    JoinContactListAdapter adapter = getAdapter();
+                    Cursor suggestionsCursor = ((JoinContactLoader)loader).getSuggestionsCursor();
+                    adapter.setSuggestionsCursor(suggestionsCursor);
+                    onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, data);
+                    break;
+                }
+            }
+        }
+    };
+
     public JoinContactListFragment() {
         setPhotoLoaderEnabled(true);
         setSectionHeaderDisplayEnabled(true);
@@ -53,57 +99,20 @@
     }
 
     @Override
-    protected void onInitializeLoaders() {
-        super.onInitializeLoaders();
-        startLoading(DISPLAY_NAME_LOADER, null);
+    public void onStart() {
+        super.onStart();
+        getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
+        getLoaderManager().initLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
+                null, mLoaderCallbacks);
     }
 
+    // TODO Remove this method when ContactEntryListFragment is converted to LoaderManager
     @Override
     public 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);
+        return null;
     }
 
-    @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 {
-            throw new IllegalArgumentException("No loader for ID=" + id);
-        }
-    }
-
-    @Override
-    protected void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-        if (loader.getId() == DISPLAY_NAME_LOADER) {
-            if (data != null && data.moveToFirst()) {
-                showTargetContactName(data.getString(0));
-            }
-        } else {
-            JoinContactListAdapter adapter = getAdapter();
-            Cursor suggestionsCursor = ((JoinContactLoader)loader).getSuggestionsCursor();
-            adapter.setSuggestionsCursor(suggestionsCursor);
-            super.onLoadFinished(loader, data);
-        }
-    }
-
-     private void showTargetContactName(String displayName) {
+    private void showTargetContactName(String displayName) {
         Activity activity = getActivity();
         TextView blurbView = (TextView)activity.findViewById(R.id.join_contact_blurb);
         String blurb = activity.getString(R.string.blurbJoinContactDataWith, displayName);
@@ -138,19 +147,15 @@
         int partition = adapter.getPartitionForPosition(position);
         if (partition == JoinContactListAdapter.PARTITION_SHOW_ALL_CONTACTS) {
             mAllContactsListShown = true;
-            reloadData();
+            configureAdapter();
+            getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
+                    null, mLoaderCallbacks);
         } else {
             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);