Merge "Some fixes to the new loader management."
diff --git a/core/java/android/app/LoaderManager.java b/core/java/android/app/LoaderManager.java
index cccf6e8..7125054 100644
--- a/core/java/android/app/LoaderManager.java
+++ b/core/java/android/app/LoaderManager.java
@@ -147,7 +147,10 @@
             LoaderManager.LoaderCallbacks<D> callback);
 
     /**
-     * Stops and removes the loader with the given ID.
+     * Stops and removes the loader with the given ID.  If this loader
+     * had previously reported data to the client through
+     * {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, a call
+     * will be made to {@link LoaderCallbacks#onLoaderReset(Loader)}.
      */
     public abstract void destroyLoader(int id);
 
@@ -397,7 +400,8 @@
             writer.print(prefix); writer.print("mData="); writer.println(mData);
             writer.print(prefix); writer.print("mStarted="); writer.print(mStarted);
                     writer.print(" mRetaining="); writer.print(mRetaining);
-                    writer.print(" mDestroyed="); writer.print(mDestroyed);
+                    writer.print(" mDestroyed="); writer.println(mDestroyed);
+            writer.print(prefix); writer.print("mNeedReset="); writer.print(mNeedReset);
                     writer.print(" mListenerRegistered="); writer.println(mListenerRegistered);
         }
     }
@@ -491,6 +495,12 @@
             mLoaders.removeAt(idx);
             info.destroy();
         }
+        idx = mInactiveLoaders.indexOfKey(id);
+        if (idx >= 0) {
+            LoaderInfo info = mInactiveLoaders.valueAt(idx);
+            mInactiveLoaders.removeAt(idx);
+            info.destroy();
+        }
     }
 
     @SuppressWarnings("unchecked")
diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java
index c73f95d..9e03c25 100644
--- a/core/java/android/content/CursorLoader.java
+++ b/core/java/android/content/CursorLoader.java
@@ -27,6 +27,7 @@
     Cursor mCursor;
     ForceLoadContentObserver mObserver;
     boolean mStopped;
+    boolean mContentChanged;
     boolean mReset;
     Uri mUri;
     String[] mProjection;
@@ -102,7 +103,9 @@
 
         if (mCursor != null) {
             deliverResult(mCursor);
-        } else {
+        }
+        if (mCursor == null || mContentChanged) {
+            mContentChanged = false;
             forceLoad();
         }
     }
@@ -120,6 +123,18 @@
     }
 
     @Override
+    public void onContentChanged() {
+        if (mStopped) {
+            // This loader has been stopped, so we don't want to load
+            // new data right now...  but keep track of it changing to
+            // refresh later if we start again.
+            mContentChanged = true;
+            return;
+        }
+        super.onContentChanged();
+    }
+    
+    @Override
     public void onCancelled(Cursor cursor) {
         if (cursor != null && !cursor.isClosed()) {
             cursor.close();