Merge "Use new Loader API and properly unregister Observers"
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 05f18ed..81c4a2b 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -83,10 +83,10 @@
 
     @Override
     public void onStart() {
-        super.onStart();
         if (mSelectedContactUri != null && isSelectionVisible()) {
             getLoaderManager().initLoader(SELECTED_ID_LOADER, null, mIdLoaderCallbacks);
         }
+        super.onStart();
    }
 
     @Override
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 9f6cc13..60b5bb1 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -24,11 +24,13 @@
 import com.android.contacts.ui.ContactsPreferences;
 import com.android.contacts.widget.CompositeCursorAdapter.Partition;
 import com.android.contacts.widget.ContextMenuAdapter;
-import com.android.contacts.widget.InstrumentedLoaderManagingFragment;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.app.Activity;
+import android.app.Fragment;
+import android.app.LoaderManager;
+import android.app.LoaderManager.LoaderCallbacks;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -69,8 +71,9 @@
  * Common base class for various contact-related list fragments.
  */
 public abstract class ContactEntryListFragment<T extends ContactEntryListAdapter>
-        extends InstrumentedLoaderManagingFragment<Cursor>
-        implements OnItemClickListener, OnScrollListener, OnFocusChangeListener, OnTouchListener {
+        extends Fragment
+        implements OnItemClickListener, OnScrollListener, OnFocusChangeListener, OnTouchListener,
+                LoaderCallbacks<Cursor> {
 
     public static final int ACTIVITY_REQUEST_CODE_PICKER = 1;
 
@@ -179,10 +182,6 @@
     }
 
     @Override
-    protected void onInitializeLoaders() {
-    }
-
-    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putBoolean(KEY_SECTION_HEADER_DISPLAY_ENABLED, mSectionHeaderDisplayEnabled);
@@ -274,13 +273,13 @@
                     startLoadingDirectoryPartition(i);
                 }
             } else {
-                startLoading(i, null);
+                getLoaderManager().initLoader(i, null, this);
             }
         }
     }
 
     @Override
-    protected Loader<Cursor> onCreateLoader(int id, Bundle args) {
+    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
         if (id == DIRECTORY_LOADER_ID) {
             DirectoryListLoader loader = new DirectoryListLoader(mContext);
             mAdapter.configureDirectoryLoader(loader);
@@ -297,19 +296,18 @@
 
     private void startLoadingDirectoryPartition(int partitionIndex) {
         DirectoryPartition partition = (DirectoryPartition)mAdapter.getPartition(partitionIndex);
-        CursorLoader loader = (CursorLoader)getLoader(partitionIndex);
-        if (loader == null) {
-            Bundle args = new Bundle();
-            args.putLong(DIRECTORY_ID_ARG_KEY, partition.getDirectoryId());
-            startLoading(partitionIndex, args);
-        } else if (mForceLoad) {
-            mAdapter.configureLoader(loader, partition.getDirectoryId());
-            loader.forceLoad();
+        Bundle args = new Bundle();
+        long directoryId = partition.getDirectoryId();
+        args.putLong(DIRECTORY_ID_ARG_KEY, directoryId);
+        if (mForceLoad) {
+            getLoaderManager().restartLoader(partitionIndex, args, this);
+        } else {
+            getLoaderManager().initLoader(partitionIndex, args, this);
         }
     }
 
     @Override
-    protected void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
         if (!checkProviderStatus(false)) {
             if (data != null) {
                 data.close();
@@ -327,7 +325,7 @@
         if (isDirectorySearchEnabled()) {
             if (mLoadDirectoryList) {
                 mLoadDirectoryList = false;
-                startLoading(DIRECTORY_LOADER_ID, null);
+                getLoaderManager().initLoader(DIRECTORY_LOADER_ID, null, this);
             } else if (mLoadPriorityDirectoriesOnly) {
                 mLoadPriorityDirectoriesOnly = false;
                 startLoading();
@@ -352,29 +350,12 @@
     }
 
     protected void reloadData() {
-        cancelLoading();
         mAdapter.onDataReload();
         mLoadPriorityDirectoriesOnly = true;
         mForceLoad = true;
         startLoading();
     }
 
-    private void cancelLoading() {
-        int size = mAdapter.getPartitionCount();
-        for (int i = 0; i < size; i++) {
-            CursorLoader loader = (CursorLoader)getLoader(i);
-            if (loader != null) {
-                loader.cancelLoad();
-            }
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        mAdapter.clearPartitions();
-    }
-
     /**
      * Configures the empty view. It is called when we are about to populate
      * the list with an empty cursor.
diff --git a/src/com/android/contacts/list/JoinContactListFragment.java b/src/com/android/contacts/list/JoinContactListFragment.java
index ad75ef3..591a999 100644
--- a/src/com/android/contacts/list/JoinContactListFragment.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -106,12 +106,6 @@
                 null, mLoaderCallbacks);
     }
 
-    // TODO Remove this method when ContactEntryListFragment is converted to LoaderManager
-    @Override
-    public Loader<Cursor> startLoading(int id, Bundle args) {
-        return null;
-    }
-
     private void showTargetContactName(String displayName) {
         Activity activity = getActivity();
         TextView blurbView = (TextView)activity.findViewById(R.id.join_contact_blurb);
diff --git a/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java b/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java
index 213f954..af72389 100644
--- a/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java
+++ b/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.contacts.widget;
 
+import android.app.Fragment;
 import android.app.LoaderManagingFragment;
 import android.content.Loader;
 import android.os.Bundle;
@@ -23,7 +24,7 @@
  * A modification of the {@link LoaderManagingFragment} class that supports testing of
  * loader-based fragments using synchronous data loading.
  */
-public abstract class InstrumentedLoaderManagingFragment<D> extends LoaderManagingFragment<D> {
+public abstract class InstrumentedLoaderManagingFragment<D> extends Fragment {
 
     public interface Delegate<D> {
         void onStartLoading(Loader<D> loader);
@@ -35,15 +36,15 @@
         this.mDelegate = listener;
     }
 
-    @Override
-    public Loader<D> startLoading(int id, Bundle args) {
-        if (mDelegate != null) {
-            Loader<D> loader = onCreateLoader(id, args);
-            loader.registerListener(id, this);
-            mDelegate.onStartLoading(loader);
-            return loader;
-        } else {
-            return super.startLoading(id, args);
-        }
-    }
+//    public Loader<D> startLoading(int id, Bundle args) {
+//        getLoaderManager().initLoader(id, args, callback);
+//        if (mDelegate != null) {
+//            Loader<D> loader = onCreateLoader(id, args);
+//            loader.registerListener(id, this);
+//            mDelegate.onStartLoading(loader);
+//            return loader;
+//        } else {
+//            return super.startLoading(id, args);
+//        }
+//    }
 }
diff --git a/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java b/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java
index cfc87d9..40607bf 100644
--- a/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java
+++ b/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java
@@ -105,7 +105,7 @@
                 new LoaderManagingFragmentTestDelegate<Cursor>();
 
         // Divert loader registration to the delegate to ensure that loading is done synchronously
-        fragment.setDelegate(delegate);
+//        fragment.setDelegate(delegate);
 
         // Fragment life cycle
         fragment.onCreate(null);
diff --git a/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java b/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java
index d5763a2..353bfc7 100644
--- a/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java
+++ b/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java
@@ -13,8 +13,7 @@
  * A delegate of {@link InstrumentedLoaderManagingFragment} that performs
  * synchronous loading on demand for unit testing.
  */
-public class LoaderManagingFragmentTestDelegate<D> implements
-        InstrumentedLoaderManagingFragment.Delegate<D> {
+public class LoaderManagingFragmentTestDelegate<D> {
 
     // Using a linked hash map to get all loading done in a predictable order.
     private LinkedHashMap<Integer, Loader<D>> mStartedLoaders =