Implement CloseGuard in ContentResolver.

Also, don't try to close the cursor from the finalizer,
it just won't work because quite probably the Binder underneath
it has already been finalized or is about to be.

Change-Id: I6363cd30f32abe15412948d126e0bcc5f62943c5
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 1e72092..0d25926 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -16,6 +16,8 @@
 
 package android.content;
 
+import dalvik.system.CloseGuard;
+
 import android.accounts.Account;
 import android.app.ActivityManagerNative;
 import android.app.ActivityThread;
@@ -33,6 +35,7 @@
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.StrictMode;
 import android.os.SystemClock;
 import android.text.TextUtils;
 import android.util.EventLog;
@@ -1562,27 +1565,39 @@
     private final class CursorWrapperInner extends CursorWrapper {
         private final IContentProvider mContentProvider;
         public static final String TAG="CursorWrapperInner";
-        private boolean mCloseFlag = false;
+
+        private final CloseGuard mCloseGuard = CloseGuard.get();
+        private boolean mProviderReleased;
 
         CursorWrapperInner(Cursor cursor, IContentProvider icp) {
             super(cursor);
             mContentProvider = icp;
+            mCloseGuard.open("close");
         }
 
         @Override
         public void close() {
             super.close();
             ContentResolver.this.releaseProvider(mContentProvider);
-            mCloseFlag = true;
+            mProviderReleased = true;
+
+            if (mCloseGuard != null) {
+                mCloseGuard.close();
+            }
         }
 
         @Override
         protected void finalize() throws Throwable {
-            // TODO: integrate CloseGuard support.
             try {
-                if(!mCloseFlag) {
+                if (mCloseGuard != null) {
+                    mCloseGuard.warnIfOpen();
+                }
+
+                if (!mProviderReleased && mContentProvider != null) {
+                    // Even though we are using CloseGuard, log this anyway so that
+                    // application developers always see the message in the log.
                     Log.w(TAG, "Cursor finalized without prior close()");
-                    close();
+                    ContentResolver.this.releaseProvider(mContentProvider);
                 }
             } finally {
                 super.finalize();