Fix some bugs introduced in LoaderActivity

Change-Id: Iad34bbcd17a601660dc9a235276f460cc3c4c957
diff --git a/LoaderApp/src/android/app/patterns/CursorLoader.java b/LoaderApp/src/android/app/patterns/CursorLoader.java
index 589be4f..be7bee2 100644
--- a/LoaderApp/src/android/app/patterns/CursorLoader.java
+++ b/LoaderApp/src/android/app/patterns/CursorLoader.java
@@ -65,6 +65,8 @@
      */
     @Override
     public void startLoading() {
+        mStopped = false;
+
         if (mCursor != null) {
             deliverResult(mCursor);
         } else {
diff --git a/LoaderApp/src/android/app/patterns/Loader.java b/LoaderApp/src/android/app/patterns/Loader.java
index e3005d2..275eb4f 100644
--- a/LoaderApp/src/android/app/patterns/Loader.java
+++ b/LoaderApp/src/android/app/patterns/Loader.java
@@ -45,7 +45,7 @@
         /**
          * Called on the thread that created the Loader when the load is complete.
          *
-         * @param id the ID of the loader that completed the load
+         * @param loader the loader that completed the load
          * @param data the result of the load
          */
         public void onLoadComplete(Loader loader, D data);
@@ -93,9 +93,9 @@
      * Must be called from the UI thread
      */
     public void registerListener(int id, OnLoadCompleteListener<D> listener) {
-//        if (mListener != null) {
- //           throw new IllegalStateException("There is already a listener registered");
-  //      }
+        if (mListener != null) {
+            throw new IllegalStateException("There is already a listener registered");
+        }
         mListener = listener;
         mId = id;
     }
diff --git a/LoaderApp/src/android/app/patterns/LoaderActivity.java b/LoaderApp/src/android/app/patterns/LoaderActivity.java
index 5e4c4bd..178cbbc 100644
--- a/LoaderApp/src/android/app/patterns/LoaderActivity.java
+++ b/LoaderApp/src/android/app/patterns/LoaderActivity.java
@@ -28,6 +28,8 @@
  */
 public abstract class LoaderActivity<D> extends Activity implements
         Loader.OnLoadCompleteListener<D> {
+    private boolean mStarted = false;
+
     static final class LoaderInfo {
         public Bundle args;
         public Loader loader;
@@ -53,9 +55,13 @@
         }
         mLoaders.put(id, info);
         loader = onCreateLoader(id, args);
-        loader.registerListener(id, this);
-        loader.startLoading();
         info.loader = loader;
+        if (mStarted) {
+            // The activity will start all existing loaders in it's onStart(), so only start them
+            // here if we're past that point of the activitiy's life cycle
+            loader.registerListener(id, this);
+            loader.startLoading();
+        }
     }
 
     protected abstract Loader onCreateLoader(int id, Bundle args);
@@ -90,11 +96,12 @@
             if (loader == null) {
                loader = onCreateLoader(id, info.args);
                info.loader = loader;
-            } else {
-                loader.registerListener(id, this);
             }
+            loader.registerListener(id, this);
             loader.startLoading();
         }
+
+        mStarted = true;
     }
 
     @Override
@@ -112,10 +119,12 @@
             loader.unregisterListener(this);
 
             // The loader isn't getting passed along to the next instance so ask it to stop loading
-//            if (!isChangingConfigurations()) {
-//                loader.stopLoading();
-//            }
+            if (!isChangingConfigurations()) {
+                loader.stopLoading();
+            }
         }
+
+        mStarted = false;
     }
 
     @Override
diff --git a/LoaderApp/src/com/android/loaderapp/DetailsNormal.java b/LoaderApp/src/com/android/loaderapp/DetailsNormal.java
index 686a5b4..be0b586 100644
--- a/LoaderApp/src/com/android/loaderapp/DetailsNormal.java
+++ b/LoaderApp/src/com/android/loaderapp/DetailsNormal.java
@@ -43,7 +43,9 @@
 
     @Override
     public void onInitializeLoaders() {
-        startLoading(LOADER_DETAILS, null);
+        Bundle args = new Bundle();
+        args.putParcelable("uri", getIntent().getData());
+        startLoading(LOADER_DETAILS, args);
     }
 
     @Override
diff --git a/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java b/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java
index 7a75f0d..b544e84 100644
--- a/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java
+++ b/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java
@@ -28,7 +28,6 @@
  * Loads a single Contact and all it constituent RawContacts.
  */
 public class ContactLoader extends Loader<ContactLoader.ContactData> {
-    Context mContext;
     Uri mLookupUri;
     ContactData mContact;
     ForceLoadContentObserver mObserver;
@@ -59,7 +58,7 @@
 
         @Override
         protected ContactData doInBackground(Void... args) {
-            ContentResolver resolver = mContext.getContentResolver();
+            ContentResolver resolver = getContext().getContentResolver();
             ContactData result = new ContactData();
 
             // Undo the lookup URI
@@ -147,7 +146,7 @@
                 if (mObserver == null) {
                     mObserver = new ForceLoadContentObserver();
                 }
-                mContext.getContentResolver().registerContentObserver(mLookupUri, true, mObserver);
+                getContext().getContentResolver().registerContentObserver(mLookupUri, true, mObserver);
                 deliverResult(result);
             }
         }
@@ -176,7 +175,7 @@
     public void stopLoading() {
         mContact = null;
         if (mObserver != null) {
-            mContext.getContentResolver().unregisterContentObserver(mObserver);
+            getContext().getContentResolver().unregisterContentObserver(mObserver);
         }
     }