Bug 1234967 - Pre: implement getBookmarkForID draft
authorAndrzej Hunt <andrzej@ahunt.org>
Tue, 29 Mar 2016 14:20:53 -0700
changeset 450174 5f6790be0c2c3454a28b48c5b5e219f76fef88f3
parent 450173 be2d0df120001724b973129818a52ceee767e6f4
child 450175 f3dcdfe319b355f47f5944a7609ff593141eb560
push id38772
push userbmo:twointofive@gmail.com
push dateFri, 16 Dec 2016 03:01:04 +0000
bugs1234967
milestone53.0a1
Bug 1234967 - Pre: implement getBookmarkForID Rebased, with review comments addressed, by Tom Klein. MozReview-Commit-ID: 7lWNOC3sUoX
mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
@@ -101,17 +101,36 @@ public abstract class BrowserDB {
 
     public abstract void clearHistory(ContentResolver cr, boolean clearSearchHistory);
 
 
     public abstract String getUrlForKeyword(ContentResolver cr, String keyword);
 
     public abstract boolean isBookmark(ContentResolver cr, String uri);
     public abstract boolean addBookmark(ContentResolver cr, String title, String uri);
+
+    /**
+     * @return an open cursor if the bookmark with id {@code id} is found, null if not.
+     */
+    public abstract Cursor getBookmarkForID(ContentResolver cr, int id);
+
+    /**
+     * Retrieve a (random) bookmark for a given URL. If there are multiple bookmarks with the same
+     * URL there is no guarantee as to which bookmark will be returned.
+     *
+     * @return an open cursor if a bookmark with url {@code url} is found, null if not.
+     *
+     * @deprecated Use {@link #getBookmarkForID(ContentResolver, int)} instead to retrieve a specific bookmark.
+     */
+    @Deprecated
     public abstract Cursor getBookmarkForUrl(ContentResolver cr, String url);
+
+    /**
+     * @return an open cursor if at least one bookmark with the {@code partialUrl} is found, null if not.
+     */
     public abstract Cursor getBookmarksForPartialUrl(ContentResolver cr, String partialUrl);
     public abstract void removeBookmarksWithURL(ContentResolver cr, String uri);
     public abstract void removeBookmarkWithID(ContentResolver cr, int id);
     public abstract void registerBookmarkObserver(ContentResolver cr, ContentObserver observer);
     public abstract void updateBookmark(ContentResolver cr, int id, String uri, String title, String keyword);
     public abstract boolean hasBookmarkWithGuid(ContentResolver cr, String guid);
 
     public abstract boolean insertPageMetadata(ContentProviderClient contentProviderClient, String pageUrl, boolean hasImage, String metadataJSON);
--- a/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
@@ -1737,16 +1737,45 @@ public class LocalBrowserDB extends Brow
         cr.delete(mBookmarksUriWithProfile,
                   Bookmarks.PARENT + " == ? AND " + Bookmarks.POSITION + " = ?",
                   new String[] {
                       String.valueOf(Bookmarks.FIXED_PINNED_LIST_ID),
                       Integer.toString(position)
                   });
     }
 
+    private static Cursor nonemptyCursorOrNull(Cursor c) {
+        if (c == null) {
+            return null;
+        }
+
+        if (c.moveToFirst()) {
+            // Non-empty.
+            return c;
+        }
+
+        c.close();
+        return null;
+    }
+
+    @Override
+    @RobocopTarget
+    public Cursor getBookmarkForID(ContentResolver cr, int id) {
+        final Cursor c = cr.query(bookmarksUriWithLimit(1),
+                new String[] { Bookmarks._ID,
+                        Bookmarks.URL,
+                        Bookmarks.TITLE,
+                        Bookmarks.KEYWORD },
+                Bookmarks._ID + " = " + id,
+                null,
+                null);
+
+        return nonemptyCursorOrNull(c);
+    }
+
     @Override
     public void pinSiteForAS(ContentResolver cr, String url, String title) {
         ContentValues values = new ContentValues();
         final long now = System.currentTimeMillis();
         values.put(Bookmarks.TITLE, title);
         values.put(Bookmarks.URL, url);
         values.put(Bookmarks.PARENT, Bookmarks.FIXED_PINNED_LIST_ID);
         values.put(Bookmarks.DATE_MODIFIED, now);
@@ -1789,47 +1818,37 @@ public class LocalBrowserDB extends Brow
         } finally {
             c.close();
         }
     }
 
     @Override
     @RobocopTarget
     public Cursor getBookmarkForUrl(ContentResolver cr, String url) {
-        Cursor c = cr.query(bookmarksUriWithLimit(1),
+        final Cursor c = cr.query(bookmarksUriWithLimit(1),
                             new String[] { Bookmarks._ID,
                                            Bookmarks.URL,
                                            Bookmarks.TITLE,
                                            Bookmarks.KEYWORD },
                             Bookmarks.URL + " = ?",
                             new String[] { url },
                             null);
 
-        if (c != null && c.getCount() == 0) {
-            c.close();
-            c = null;
-        }
-
-        return c;
+        return nonemptyCursorOrNull(c);
     }
 
     @Override
     public Cursor getBookmarksForPartialUrl(ContentResolver cr, String partialUrl) {
-        Cursor c = cr.query(mBookmarksUriWithProfile,
+        final Cursor c = cr.query(mBookmarksUriWithProfile,
                 new String[] { Bookmarks.GUID, Bookmarks._ID, Bookmarks.URL },
                 Bookmarks.URL + " LIKE '%" + partialUrl + "%'", // TODO: Escaping!
                 null,
                 null);
 
-        if (c != null && c.getCount() == 0) {
-            c.close();
-            c = null;
-        }
-
-        return c;
+        return nonemptyCursorOrNull(c);
     }
 
     @Override
     public void setSuggestedSites(SuggestedSites suggestedSites) {
         mSuggestedSites = suggestedSites;
     }
 
     @Override