Bug 1252264 - Use MatrixCursor + MergeCursor to show the desktop bookmarks folder r=mcomella
MozReview-Commit-ID: 3qleedRWjKb
--- a/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
@@ -43,16 +43,18 @@ import org.mozilla.gecko.util.StringUtil
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.CursorWrapper;
+import android.database.MatrixCursor;
+import android.database.MergeCursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import org.mozilla.gecko.util.IOUtils;
@@ -779,16 +781,35 @@ public class LocalBrowserDB implements B
public void clearHistory(ContentResolver cr, boolean clearSearchHistory) {
if (clearSearchHistory) {
cr.delete(mSearchHistoryUri, null, null);
} else {
cr.delete(mHistoryUriWithProfile, null, null);
}
}
+ private void assertDefaultBookmarkColumnOrdering() {
+ // We need to insert MatrixCursor values in a specific order - in order to protect against changes
+ // in DEFAULT_BOOKMARK_COLUMNS we can just assert that we're using the correct ordering.
+ // Alternatively we could use RowBuilder.add(columnName, value) but that needs api >= 19,
+ // or we could iterate over DEFAULT_BOOKMARK_COLUMNS, but that gets messy once we need
+ // to add more than one artificial folder.
+ if (!((DEFAULT_BOOKMARK_COLUMNS[0].equals(Bookmarks._ID)) &&
+ (DEFAULT_BOOKMARK_COLUMNS[1].equals(Bookmarks.GUID)) &&
+ (DEFAULT_BOOKMARK_COLUMNS[2].equals(Bookmarks.URL)) &&
+ (DEFAULT_BOOKMARK_COLUMNS[3].equals(Bookmarks.TITLE)) &&
+ (DEFAULT_BOOKMARK_COLUMNS[4].equals(Bookmarks.TYPE)) &&
+ (DEFAULT_BOOKMARK_COLUMNS[5].equals(Bookmarks.PARENT)) &&
+ (DEFAULT_BOOKMARK_COLUMNS.length == 6))) {
+ // If DEFAULT_BOOKMARK_COLUMNS changes we need to update all the MatrixCursor rows
+ // to contain appropriate data.
+ throw new IllegalStateException("Fake folder MatrixCursor creation code must be updated to match DEFAULT_BOOKMARK_COLUMNS");
+ }
+ }
+
@Override
@RobocopTarget
public Cursor getBookmarksInFolder(ContentResolver cr, long folderId) {
final boolean addDesktopFolder;
// We always want to show mobile bookmarks in the root view.
if (folderId == Bookmarks.FIXED_ROOT_ID) {
folderId = getFolderIdFromGuid(cr, Bookmarks.MOBILE_FOLDER_GUID);
@@ -823,18 +844,29 @@ public class LocalBrowserDB implements B
"(" + Bookmarks.TYPE + " = ? AND " + Bookmarks.URL + " IS NOT NULL))",
new String[] { String.valueOf(folderId),
String.valueOf(Bookmarks.TYPE_FOLDER),
String.valueOf(Bookmarks.TYPE_BOOKMARK) },
null);
}
if (addDesktopFolder) {
- // Wrap cursor to add fake desktop bookmarks and reading list folders
- return new SpecialFoldersCursorWrapper(c, addDesktopFolder);
+ MatrixCursor desktopFolderCursor = new MatrixCursor(DEFAULT_BOOKMARK_COLUMNS);
+
+ assertDefaultBookmarkColumnOrdering();
+
+ desktopFolderCursor.addRow(
+ new Object[] { Bookmarks.FAKE_DESKTOP_FOLDER_ID,
+ Bookmarks.FAKE_DESKTOP_FOLDER_GUID,
+ "",
+ "", // Title localisation is done later, in the UI layer (BookmarksListAdapter)
+ Bookmarks.TYPE_FOLDER,
+ Bookmarks.FIXED_ROOT_ID
+ });
+ return new MergeCursor(new Cursor[] { desktopFolderCursor, c });
}
return c;
}
// Returns true if any desktop bookmarks exist, which will be true if the user
// has set up sync at one point, or done a profile migration from XUL fennec.
private boolean desktopBookmarksExist(ContentResolver cr) {