gecko/mobile/android/base/db/BrowserDB.java
Ryan VanderMeulen 3fb03ee4f9 Backed out 5 changesets (bug 872388) for Android 2.2 bustage on a CLOSED TREE.
Backed out changeset f2fbb5c6cfc7 (bug 872388)
Backed out changeset 416f9cdde0f7 (bug 872388)
Backed out changeset 684ba082942b (bug 872388)
Backed out changeset 7acb6c63fdf4 (bug 872388)
Backed out changeset 2076903c21fa (bug 872388)
2013-05-30 22:11:26 -04:00

445 lines
15 KiB
Java

/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.db;
import org.mozilla.gecko.db.BrowserContract.Bookmarks;
import org.mozilla.gecko.db.BrowserContract.ExpirePriority;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.util.SparseArray;
import java.util.List;
public class BrowserDB {
public static String ABOUT_PAGES_URL_FILTER = "about:%";
public static interface URLColumns {
public static String URL = "url";
public static String TITLE = "title";
public static String FAVICON = "favicon";
public static String THUMBNAIL = "thumbnail";
public static String DATE_LAST_VISITED = "date-last-visited";
public static String VISITS = "visits";
public static String KEYWORD = "keyword";
}
private static BrowserDBIface sDb = null;
public interface BrowserDBIface {
public void invalidateCachedState();
public Cursor filter(ContentResolver cr, CharSequence constraint, int limit);
// This should onlyl return frecent sites, BrowserDB.getTopSites will do the
// work to combine that list with the pinned sites list
public Cursor getTopSites(ContentResolver cr, int limit);
public void updateVisitedHistory(ContentResolver cr, String uri);
public void updateHistoryTitle(ContentResolver cr, String uri, String title);
public void updateHistoryEntry(ContentResolver cr, String uri, String title,
long date, int visits);
public Cursor getAllVisitedHistory(ContentResolver cr);
public Cursor getRecentHistory(ContentResolver cr, int limit);
public void expireHistory(ContentResolver cr, ExpirePriority priority);
public void removeHistoryEntry(ContentResolver cr, int id);
public void removeHistoryEntry(ContentResolver cr, String url);
public void clearHistory(ContentResolver cr);
public Cursor getBookmarksInFolder(ContentResolver cr, long folderId);
public boolean isVisited(ContentResolver cr, String uri);
public boolean isBookmark(ContentResolver cr, String uri);
public boolean isReadingListItem(ContentResolver cr, String uri);
public String getUrlForKeyword(ContentResolver cr, String keyword);
public void addBookmark(ContentResolver cr, String title, String uri);
public void removeBookmark(ContentResolver cr, int id);
public void removeBookmarksWithURL(ContentResolver cr, String uri);
public void updateBookmark(ContentResolver cr, int id, String uri, String title, String keyword);
public void addReadingListItem(ContentResolver cr, String title, String uri);
public void removeReadingListItemWithURL(ContentResolver cr, String uri);
public Bitmap getFaviconForUrl(ContentResolver cr, String uri);
public Cursor getFaviconsForUrls(ContentResolver cr, List<String> urls);
public String getFaviconUrlForHistoryUrl(ContentResolver cr, String url);
public void updateFaviconForUrl(ContentResolver cr, String pageUri, Bitmap favicon, String faviconUri);
public void updateThumbnailForUrl(ContentResolver cr, String uri, BitmapDrawable thumbnail);
public byte[] getThumbnailForUrl(ContentResolver cr, String uri);
public Cursor getThumbnailsForUrls(ContentResolver cr, List<String> urls);
public void removeThumbnails(ContentResolver cr);
public void registerBookmarkObserver(ContentResolver cr, ContentObserver observer);
public void registerHistoryObserver(ContentResolver cr, ContentObserver observer);
public int getCount(ContentResolver cr, String database);
public void pinSite(ContentResolver cr, String url, String title, int position);
public void unpinSite(ContentResolver cr, int position);
public void unpinAllSites(ContentResolver cr);
public Cursor getPinnedSites(ContentResolver cr, int limit);
}
static {
// Forcing local DB no option to switch to Android DB for now
sDb = null;
}
public static void initialize(String profile) {
sDb = new LocalBrowserDB(profile);
}
public static void invalidateCachedState() {
sDb.invalidateCachedState();
}
public static Cursor filter(ContentResolver cr, CharSequence constraint, int limit) {
return sDb.filter(cr, constraint, limit);
}
public static Cursor getTopSites(ContentResolver cr, int limit) {
// Note this is not a single query anymore, but actually returns a mixture of two queries, one for topSites
// and one for pinned sites
Cursor topSites = sDb.getTopSites(cr, limit);
Cursor pinnedSites = sDb.getPinnedSites(cr, limit);
return new TopSitesCursorWrapper(pinnedSites, topSites, limit);
}
public static void updateVisitedHistory(ContentResolver cr, String uri) {
sDb.updateVisitedHistory(cr, uri);
}
public static void updateHistoryTitle(ContentResolver cr, String uri, String title) {
sDb.updateHistoryTitle(cr, uri, title);
}
public static void updateHistoryEntry(ContentResolver cr, String uri, String title,
long date, int visits) {
sDb.updateHistoryEntry(cr, uri, title, date, visits);
}
public static Cursor getAllVisitedHistory(ContentResolver cr) {
return sDb.getAllVisitedHistory(cr);
}
public static Cursor getRecentHistory(ContentResolver cr, int limit) {
return sDb.getRecentHistory(cr, limit);
}
public static void expireHistory(ContentResolver cr, ExpirePriority priority) {
if (sDb == null)
return;
if (priority == null)
priority = ExpirePriority.NORMAL;
sDb.expireHistory(cr, priority);
}
public static void removeHistoryEntry(ContentResolver cr, int id) {
sDb.removeHistoryEntry(cr, id);
}
public static void removeHistoryEntry(ContentResolver cr, String url) {
sDb.removeHistoryEntry(cr, url);
}
public static void clearHistory(ContentResolver cr) {
sDb.clearHistory(cr);
}
public static Cursor getBookmarksInFolder(ContentResolver cr, long folderId) {
return sDb.getBookmarksInFolder(cr, folderId);
}
public static String getUrlForKeyword(ContentResolver cr, String keyword) {
return sDb.getUrlForKeyword(cr, keyword);
}
public static boolean isVisited(ContentResolver cr, String uri) {
return sDb.isVisited(cr, uri);
}
public static boolean isBookmark(ContentResolver cr, String uri) {
return sDb.isBookmark(cr, uri);
}
public static boolean isReadingListItem(ContentResolver cr, String uri) {
return sDb.isReadingListItem(cr, uri);
}
public static void addBookmark(ContentResolver cr, String title, String uri) {
sDb.addBookmark(cr, title, uri);
}
public static void removeBookmark(ContentResolver cr, int id) {
sDb.removeBookmark(cr, id);
}
public static void removeBookmarksWithURL(ContentResolver cr, String uri) {
sDb.removeBookmarksWithURL(cr, uri);
}
public static void updateBookmark(ContentResolver cr, int id, String uri, String title, String keyword) {
sDb.updateBookmark(cr, id, uri, title, keyword);
}
public static void addReadingListItem(ContentResolver cr, String title, String uri) {
sDb.addReadingListItem(cr, title, uri);
}
public static void removeReadingListItemWithURL(ContentResolver cr, String uri) {
sDb.removeReadingListItemWithURL(cr, uri);
}
public static Bitmap getFaviconForUrl(ContentResolver cr, String uri) {
return sDb.getFaviconForUrl(cr, uri);
}
public static Cursor getFaviconsForUrls(ContentResolver cr, List<String> urls) {
return sDb.getFaviconsForUrls(cr, urls);
}
public static String getFaviconUrlForHistoryUrl(ContentResolver cr, String url) {
return sDb.getFaviconUrlForHistoryUrl(cr, url);
}
public static void updateFaviconForUrl(ContentResolver cr, String pageUri, Bitmap favicon, String faviconUri) {
sDb.updateFaviconForUrl(cr, pageUri, favicon, faviconUri);
}
public static void updateThumbnailForUrl(ContentResolver cr, String uri, BitmapDrawable thumbnail) {
sDb.updateThumbnailForUrl(cr, uri, thumbnail);
}
public static byte[] getThumbnailForUrl(ContentResolver cr, String uri) {
return sDb.getThumbnailForUrl(cr, uri);
}
public static Cursor getThumbnailsForUrls(ContentResolver cr, List<String> urls) {
return sDb.getThumbnailsForUrls(cr, urls);
}
public static void removeThumbnails(ContentResolver cr) {
sDb.removeThumbnails(cr);
}
public static void registerBookmarkObserver(ContentResolver cr, ContentObserver observer) {
sDb.registerBookmarkObserver(cr, observer);
}
public static void registerHistoryObserver(ContentResolver cr, ContentObserver observer) {
sDb.registerHistoryObserver(cr, observer);
}
public static void unregisterContentObserver(ContentResolver cr, ContentObserver observer) {
cr.unregisterContentObserver(observer);
}
public static int getCount(ContentResolver cr, String database) {
return sDb.getCount(cr, database);
}
public static void pinSite(ContentResolver cr, String url, String title, int position) {
sDb.pinSite(cr, url, title, position);
}
public static void unpinSite(ContentResolver cr, int position) {
sDb.unpinSite(cr, position);
}
public static void unpinAllSites(ContentResolver cr) {
sDb.unpinAllSites(cr);
}
public static Cursor getPinnedSites(ContentResolver cr, int limit) {
return sDb.getPinnedSites(cr, limit);
}
public static class PinnedSite {
public String title = "";
public String url = "";
public PinnedSite(String aTitle, String aUrl) {
title = aTitle;
url = aUrl;
}
}
/* Cursor wrapper that forces top sites to contain at least
* mNumberOfTopSites entries. For rows outside the wrapped cursor
* will return empty strings and zero.
*/
public static class TopSitesCursorWrapper extends CursorWrapper {
int mIndex = -1; // Current position of the cursor
Cursor mCursor = null;
int mSize = 0;
private SparseArray<PinnedSite> mPinnedSites = null;
public TopSitesCursorWrapper(Cursor pinnedCursor, Cursor normalCursor, int size) {
super(normalCursor);
setPinnedSites(pinnedCursor);
mCursor = normalCursor;
mSize = size;
}
public void setPinnedSites(Cursor c) {
mPinnedSites = new SparseArray<PinnedSite>();
if (c != null && c.getCount() > 0) {
c.moveToPosition(0);
do {
int pos = c.getInt(c.getColumnIndex(Bookmarks.POSITION));
String url = c.getString(c.getColumnIndex(URLColumns.URL));
String title = c.getString(c.getColumnIndex(URLColumns.TITLE));
mPinnedSites.put(pos, new PinnedSite(title, url));
} while (c.moveToNext());
}
if (c != null && !c.isClosed()) {
c.close();
}
}
public boolean hasPinnedSites() {
return mPinnedSites != null && mPinnedSites.size() > 0;
}
public PinnedSite getPinnedSite(int position) {
if (!hasPinnedSites()) {
return null;
}
return mPinnedSites.get(position);
}
public boolean isPinned() {
return mPinnedSites.get(mIndex) != null;
}
private int getPinnedBefore(int position) {
int numFound = 0;
if (!hasPinnedSites()) {
return numFound;
}
for (int i = 0; i < position; i++) {
if (mPinnedSites.get(i) != null) {
numFound++;
}
}
return numFound;
}
@Override
public int getPosition() { return mIndex; }
@Override
public int getCount() { return mSize; }
@Override
public boolean isAfterLast() { return mIndex >= mSize; }
@Override
public boolean isBeforeFirst() { return mIndex < 0; }
@Override
public boolean isLast() { return mIndex == mSize - 1; }
@Override
public boolean moveToNext() { return moveToPosition(mIndex + 1); }
@Override
public boolean moveToPrevious() { return moveToPosition(mIndex - 1); }
@Override
public boolean moveToPosition(int position) {
mIndex = position;
// move the real cursor as if we were stepping through it to this position
// be careful not to move it to far, and to account for any pinned sites
int before = getPinnedBefore(position);
int p2 = position - before;
if (p2 >= -1 && p2 <= mCursor.getCount()) {
super.moveToPosition(p2);
}
return !(isBeforeFirst() || isAfterLast());
}
@Override
public long getLong(int columnIndex) {
if (hasPinnedSites()) {
PinnedSite site = getPinnedSite(mIndex);
if (site != null) {
return 0;
}
}
if (!super.isBeforeFirst() && !super.isAfterLast())
return super.getLong(columnIndex);
return 0;
}
@Override
public String getString(int columnIndex) {
if (hasPinnedSites()) {
PinnedSite site = getPinnedSite(mIndex);
if (site != null) {
if (columnIndex == mCursor.getColumnIndex(URLColumns.URL)) {
return site.url;
} else if (columnIndex == mCursor.getColumnIndex(URLColumns.TITLE)) {
return site.title;
}
return "";
}
}
if (!super.isBeforeFirst() && !super.isAfterLast())
return super.getString(columnIndex);
return "";
}
@Override
public boolean move(int offset) {
return moveToPosition(mIndex + offset);
}
@Override
public boolean moveToFirst() {
return moveToPosition(0);
}
@Override
public boolean moveToLast() {
return moveToPosition(mSize-1);
}
}
}