OSDN Git Service

Close Cursors when finished with them.
authorLeon Scroggins <scroggo@google.com>
Fri, 12 Mar 2010 23:09:39 +0000 (18:09 -0500)
committerLeon Scroggins <scroggo@google.com>
Mon, 15 Mar 2010 14:42:53 +0000 (10:42 -0400)
Change-Id: Idf284f59b05b3f5b3565f7374899927a70f3ca07

src/com/android/browser/Bookmarks.java
src/com/android/browser/BrowserActivity.java
src/com/android/browser/BrowserDownloadPage.java

index 2cbd851..5ada9dc 100644 (file)
@@ -47,6 +47,7 @@ import java.util.Date;
             "content:"
     };
 
+    private final static String LOGTAG = "Bookmarks";
     /**
      *  Add a bookmark to the database.
      *  @param context Context of the calling Activity.  This is used to make
@@ -66,66 +67,74 @@ import java.util.Date;
         // Want to append to the beginning of the list
         long creationTime = new Date().getTime();
         ContentValues map = new ContentValues();
-        Cursor cursor = Browser.getVisitedLike(cr, url);
-        if (cursor.moveToFirst() && cursor.getInt(
-                Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) == 0) {
-            // This means we have been to this site but not bookmarked
-            // it, so convert the history item to a bookmark
-            map.put(Browser.BookmarkColumns.CREATED, creationTime);
-            map.put(Browser.BookmarkColumns.TITLE, name);
-            map.put(Browser.BookmarkColumns.BOOKMARK, 1);
-            map.put(Browser.BookmarkColumns.THUMBNAIL, bitmapToBytes(thumbnail));
-            cr.update(Browser.BOOKMARKS_URI, map,
-                    "_id = " + cursor.getInt(0), null);
-        } else {
-            int count = cursor.getCount();
-            boolean matchedTitle = false;
-            for (int i = 0; i < count; i++) {
-                // One or more bookmarks already exist for this site.
-                // Check the names of each
-                cursor.moveToPosition(i);
-                if (cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX)
-                        .equals(name)) {
-                    // The old bookmark has the same name.
-                    // Update its creation time.
-                    map.put(Browser.BookmarkColumns.CREATED,
-                            creationTime);
-                    cr.update(Browser.BOOKMARKS_URI, map,
-                            "_id = " + cursor.getInt(0), null);
-                    matchedTitle = true;
-                    break;
-                }
-            }
-            if (!matchedTitle) {
-                // Adding a bookmark for a site the user has visited,
-                // or a new bookmark (with a different name) for a site
-                // the user has visited
-                map.put(Browser.BookmarkColumns.TITLE, name);
-                map.put(Browser.BookmarkColumns.URL, url);
+        Cursor cursor = null;
+        try {
+            cursor = Browser.getVisitedLike(cr, url);
+            if (cursor.moveToFirst() && cursor.getInt(
+                    Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) == 0) {
+                // This means we have been to this site but not bookmarked
+                // it, so convert the history item to a bookmark
                 map.put(Browser.BookmarkColumns.CREATED, creationTime);
+                map.put(Browser.BookmarkColumns.TITLE, name);
                 map.put(Browser.BookmarkColumns.BOOKMARK, 1);
-                map.put(Browser.BookmarkColumns.DATE, 0);
-                map.put(Browser.BookmarkColumns.THUMBNAIL, bitmapToBytes(thumbnail));
-                int visits = 0;
-                if (count > 0) {
-                    // The user has already bookmarked, and possibly
-                    // visited this site.  However, they are creating
-                    // a new bookmark with the same url but a different
-                    // name.  The new bookmark should have the same
-                    // number of visits as the already created bookmark.
-                    visits = cursor.getInt(
-                            Browser.HISTORY_PROJECTION_VISITS_INDEX);
+                map.put(Browser.BookmarkColumns.THUMBNAIL,
+                        bitmapToBytes(thumbnail));
+                cr.update(Browser.BOOKMARKS_URI, map,
+                        "_id = " + cursor.getInt(0), null);
+            } else {
+                int count = cursor.getCount();
+                boolean matchedTitle = false;
+                for (int i = 0; i < count; i++) {
+                    // One or more bookmarks already exist for this site.
+                    // Check the names of each
+                    cursor.moveToPosition(i);
+                    if (cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX)
+                            .equals(name)) {
+                        // The old bookmark has the same name.
+                        // Update its creation time.
+                        map.put(Browser.BookmarkColumns.CREATED,
+                                creationTime);
+                        cr.update(Browser.BOOKMARKS_URI, map,
+                                "_id = " + cursor.getInt(0), null);
+                        matchedTitle = true;
+                        break;
+                    }
+                }
+                if (!matchedTitle) {
+                    // Adding a bookmark for a site the user has visited,
+                    // or a new bookmark (with a different name) for a site
+                    // the user has visited
+                    map.put(Browser.BookmarkColumns.TITLE, name);
+                    map.put(Browser.BookmarkColumns.URL, url);
+                    map.put(Browser.BookmarkColumns.CREATED, creationTime);
+                    map.put(Browser.BookmarkColumns.BOOKMARK, 1);
+                    map.put(Browser.BookmarkColumns.DATE, 0);
+                    map.put(Browser.BookmarkColumns.THUMBNAIL,
+                            bitmapToBytes(thumbnail));
+                    int visits = 0;
+                    if (count > 0) {
+                        // The user has already bookmarked, and possibly
+                        // visited this site.  However, they are creating
+                        // a new bookmark with the same url but a different
+                        // name.  The new bookmark should have the same
+                        // number of visits as the already created bookmark.
+                        visits = cursor.getInt(
+                                Browser.HISTORY_PROJECTION_VISITS_INDEX);
+                    }
+                    // Bookmark starts with 3 extra visits so that it will
+                    // bubble up in the most visited and goto search box
+                    map.put(Browser.BookmarkColumns.VISITS, visits + 3);
+                    cr.insert(Browser.BOOKMARKS_URI, map);
                 }
-                // Bookmark starts with 3 extra visits so that it will
-                // bubble up in the most visited and goto search box
-                map.put(Browser.BookmarkColumns.VISITS, visits + 3);
-                cr.insert(Browser.BOOKMARKS_URI, map);
             }
+        } catch (IllegalStateException e) {
+            Log.e(LOGTAG, "addBookmark", e);
+        } finally {
+            if (cursor != null) cursor.close();
         }
         if (retainIcon) {
             WebIconDatabase.getInstance().retainIconForPageUrl(url);
         }
-        cursor.deactivate();
         if (context != null) {
             Toast.makeText(context, R.string.added_to_bookmarks,
                     Toast.LENGTH_LONG).show();
@@ -144,41 +153,48 @@ import java.util.Date;
      */
     /* package */ static void removeFromBookmarks(Context context,
             ContentResolver cr, String url, String title) {
-        Cursor cursor = cr.query(
-                Browser.BOOKMARKS_URI,
-                Browser.HISTORY_PROJECTION,
-                "url = ? AND title = ?",
-                new String[] { url, title },
-                null);
-        boolean first = cursor.moveToFirst();
-        // Should be in the database no matter what
-        if (!first) {
-            throw new AssertionError("URL is not in the database! " + url + " " + title);
-        }
-        // Remove from bookmarks
-        WebIconDatabase.getInstance().releaseIconForPageUrl(url);
-        Uri uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
-                cursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX));
-        int numVisits = cursor.getInt(
-                Browser.HISTORY_PROJECTION_VISITS_INDEX);
-        if (0 == numVisits) {
-            cr.delete(uri, null, null);
-        } else {
-            // It is no longer a bookmark, but it is still a visited
-            // site.
-            ContentValues values = new ContentValues();
-            values.put(Browser.BookmarkColumns.BOOKMARK, 0);
-            try {
-                cr.update(uri, values, null, null);
-            } catch (IllegalStateException e) {
-                Log.e("removeFromBookmarks", "no database!");
+        Cursor cursor = null;
+        try {
+            cursor = cr.query(
+                    Browser.BOOKMARKS_URI,
+                    Browser.HISTORY_PROJECTION,
+                    "url = ? AND title = ?",
+                    new String[] { url, title },
+                    null);
+            boolean first = cursor.moveToFirst();
+            // Should be in the database no matter what
+            if (!first) {
+                throw new AssertionError("URL is not in the database! " + url
+                        + " " + title);
             }
+            // Remove from bookmarks
+            WebIconDatabase.getInstance().releaseIconForPageUrl(url);
+            Uri uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
+                    cursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX));
+            int numVisits = cursor.getInt(
+                    Browser.HISTORY_PROJECTION_VISITS_INDEX);
+            if (0 == numVisits) {
+                cr.delete(uri, null, null);
+            } else {
+                // It is no longer a bookmark, but it is still a visited
+                // site.
+                ContentValues values = new ContentValues();
+                values.put(Browser.BookmarkColumns.BOOKMARK, 0);
+                try {
+                    cr.update(uri, values, null, null);
+                } catch (IllegalStateException e) {
+                    Log.e("removeFromBookmarks", "no database!");
+                }
+            }
+            if (context != null) {
+                Toast.makeText(context, R.string.removed_from_bookmarks,
+                        Toast.LENGTH_LONG).show();
+            }
+        } catch (IllegalStateException e) {
+            Log.e(LOGTAG, "removeFromBookmarks", e);
+        } finally {
+            if (cursor != null) cursor.close();
         }
-        if (context != null) {
-            Toast.makeText(context, R.string.removed_from_bookmarks,
-                    Toast.LENGTH_LONG).show();
-        }
-        cursor.deactivate();
     }
 
     private static byte[] bitmapToBytes(Bitmap bm) {
index 2f4f39a..4308a2c 100644 (file)
@@ -1249,20 +1249,20 @@ public class BrowserActivity extends Activity
     private void retainIconsOnStartup() {
         final WebIconDatabase db = WebIconDatabase.getInstance();
         db.open(getDir("icons", 0).getPath());
+        Cursor c = null;
         try {
-            Cursor c = Browser.getAllBookmarks(mResolver);
-            if (!c.moveToFirst()) {
-                c.deactivate();
-                return;
+            c = Browser.getAllBookmarks(mResolver);
+            if (c.moveToFirst()) {
+                int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
+                do {
+                    String url = c.getString(urlIndex);
+                    db.retainIconForPageUrl(url);
+                } while (c.moveToNext());
             }
-            int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
-            do {
-                String url = c.getString(urlIndex);
-                db.retainIconForPageUrl(url);
-            } while (c.moveToNext());
-            c.deactivate();
         } catch (IllegalStateException e) {
             Log.e(LOGTAG, "retainIconsOnStartup", e);
+        } finally {
+            if (c!= null) c.close();
         }
     }
 
index c56991e..6a5ef28 100644 (file)
@@ -31,6 +31,7 @@ import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.provider.Downloads;
+import android.util.Log;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
@@ -63,6 +64,7 @@ public class BrowserDownloadPage extends ExpandableListActivity {
     // will be reopened on this View.
     private View                    mSelectedView;
 
+    private final static String LOGTAG = "BrowserDownloadPage";
     @Override 
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -252,25 +254,31 @@ public class BrowserDownloadPage extends ExpandableListActivity {
 
         @Override
         public void onChange(boolean selfChange) {
-            Cursor cursor = getContentResolver().query(mTrack,
-                    new String[] { Downloads.Impl.COLUMN_STATUS }, null, null,
-                    null);
-            if (cursor.moveToFirst() && Downloads.Impl.isStatusSuccess(
-                    cursor.getInt(0))) {
-                // Do this right away, so we get no more updates.
-                getContentResolver().unregisterContentObserver(
-                        mContentObserver);
-                // Post a runnable in case this ContentObserver gets notified
-                // before the one that updates the ListView.
-                mListView.post(new Runnable() {
-                    public void run() {
-                        // Close the context menu, reopen with up to date data.
-                        closeContextMenu();
-                        openContextMenu(mSelectedView);
-                    }
-                });
+            Cursor cursor = null;
+            try {
+                cursor = getContentResolver().query(mTrack,
+                        new String[] { Downloads.Impl.COLUMN_STATUS }, null, null,
+                        null);
+                if (cursor.moveToFirst() && Downloads.Impl.isStatusSuccess(
+                        cursor.getInt(0))) {
+                    // Do this right away, so we get no more updates.
+                    getContentResolver().unregisterContentObserver(
+                            mContentObserver);
+                    // Post a runnable in case this ContentObserver gets notified
+                    // before the one that updates the ListView.
+                    mListView.post(new Runnable() {
+                        public void run() {
+                            // Close the context menu, reopen with up to date data.
+                            closeContextMenu();
+                            openContextMenu(mSelectedView);
+                        }
+                    });
+                }
+            } catch (IllegalStateException e) {
+                Log.e(LOGTAG, "onChange", e);
+            } finally {
+                if (cursor != null) cursor.close();
             }
-            cursor.deactivate();
         }
     }