Bug 1312016 - BrowserDB: Add method for getting 'highlight candidates'. r?
MozReview-Commit-ID: GrshyAKrFjy
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
@@ -608,16 +608,22 @@ public class BrowserContract {
public static final class Highlights {
public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "highlights");
public static final String DATE = "date";
public static final String METADATA = "metadata";
}
+ public static final class HighlightCandidates {
+ public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "highlight_candidates");
+
+ public static final String URL = "url";
+ }
+
@RobocopTarget
public static final class SearchHistory implements CommonColumns, HistoryColumns {
private SearchHistory() {}
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/searchhistory";
public static final String QUERY = "query";
public static final String DATE = "date";
public static final String TABLE_NAME = "searchhistory";
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
@@ -183,16 +183,24 @@ public abstract class BrowserDB {
* Obtain a set of links for highlights from bookmarks and history.
*
* @param context The context to load the cursor.
* @param limit Maximum number of results to return.
*/
public abstract CursorLoader getHighlights(Context context, int limit);
/**
+ * TODO
+ *
+ * @param context The context to load the cursor.
+ * @param limit Maximum number of results to return.
+ */
+ public abstract CursorLoader getHighlightCandidates(Context context, int limit);
+
+ /**
* Block a page from the highlights list.
*
* @param url The page URL. Only pages exactly matching this URL will be blocked.
*/
public abstract void blockActivityStreamSite(ContentResolver cr, String url);
public static BrowserDB from(final Context context) {
return from(GeckoProfile.get(context));
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
@@ -137,16 +137,18 @@ public class BrowserProvider extends Sha
static final int METADATA = 1200;
static final int HIGHLIGHTS = 1300;
static final int ACTIVITY_STREAM_BLOCKLIST = 1400;
static final int PAGE_METADATA = 1500;
+ static final int HIGHLIGHT_CANDIDATES = 1600;
+
static final String DEFAULT_BOOKMARKS_SORT_ORDER = Bookmarks.TYPE
+ " ASC, " + Bookmarks.POSITION + " ASC, " + Bookmarks._ID
+ " ASC";
static final String DEFAULT_HISTORY_SORT_ORDER = History.DATE_LAST_VISITED + " DESC";
static final String DEFAULT_VISITS_SORT_ORDER = Visits.DATE_VISITED + " DESC";
static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
@@ -314,16 +316,18 @@ public class BrowserProvider extends Sha
}
// Combined pinned sites, top visited sites, and suggested sites
URI_MATCHER.addURI(BrowserContract.AUTHORITY, "topsites", TOPSITES);
URI_MATCHER.addURI(BrowserContract.AUTHORITY, "highlights", HIGHLIGHTS);
URI_MATCHER.addURI(BrowserContract.AUTHORITY, ActivityStreamBlocklist.TABLE_NAME, ACTIVITY_STREAM_BLOCKLIST);
+
+ URI_MATCHER.addURI(BrowserContract.AUTHORITY, "highlight_candidates", HIGHLIGHT_CANDIDATES);
}
private static class ShrinkMemoryReceiver extends BroadcastReceiver {
private final WeakReference<BrowserProvider> mBrowserProviderWeakReference;
public ShrinkMemoryReceiver(final BrowserProvider browserProvider) {
mBrowserProviderWeakReference = new WeakReference<>(browserProvider);
}
@@ -1167,16 +1171,38 @@ public class BrowserProvider extends Sha
db.setTransactionSuccessful();
return c;
} finally {
db.endTransaction();
}
}
+ public Cursor getHighlightCandidates(final SQLiteDatabase db, String limit) {
+ final String query = "SELECT " +
+ DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + ", " +
+ DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + ", " +
+ DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + ", " +
+ DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.JSON) + " AS " + Highlights.METADATA + ", " +
+ DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " " +
+ "FROM " + History.TABLE_NAME + " " +
+ "LEFT JOIN " + Bookmarks.TABLE_NAME + " ON " +
+ DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + " = " +
+ DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " " +
+ // 1:1 relationship (Metadata is added via INSERT OR REPLACE)
+ "LEFT JOIN " + PageMetadata.TABLE_NAME + " ON " +
+ DBUtils.qualifyColumn(History.TABLE_NAME, History.GUID) + " = " +
+ DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.HISTORY_GUID) + " " +
+ "WHERE " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " NOT IN (SELECT " + ActivityStreamBlocklist.URL + " FROM " + ActivityStreamBlocklist.TABLE_NAME + " )" +
+ "ORDER BY " + DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " DESC " +
+ "LIMIT " + limit;
+
+ return db.rawQuery(query, null);
+ }
+
/**
* Obtain a set of links for highlights (from bookmarks and history).
*
* Based on the query for Activity^ Stream (desktop):
* https://github.com/mozilla/activity-stream/blob/9eb9f451b553bb62ae9b8d6b41a8ef94a2e020ea/addon/PlacesProvider.js#L578
*/
public Cursor getHighlights(final SQLiteDatabase db, String limit) {
final int totalLimit = limit == null ? 20 : Integer.parseInt(limit);
@@ -1413,16 +1439,20 @@ public class BrowserProvider extends Sha
}
case HIGHLIGHTS: {
debug("Highlights query: " + uri);
return getHighlights(db, limit);
}
+ case HIGHLIGHT_CANDIDATES:
+ debug("Highlight candidates query: " + uri);
+ return getHighlightCandidates(db, limit);
+
case PAGE_METADATA: {
debug("PageMetadata query: " + uri);
qb.setProjectionMap(PAGE_METADATA_PROJECTION_MAP);
qb.setTables(TABLE_PAGE_METADATA);
break;
}
--- a/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
@@ -106,27 +106,29 @@ public class LocalBrowserDB extends Brow
// Constants used when importing history data from legacy browser.
public static final String HISTORY_VISITS_DATE = "date";
public static final String HISTORY_VISITS_COUNT = "visits";
public static final String HISTORY_VISITS_URL = "url";
private static final String TELEMETRY_HISTOGRAM_ACTIVITY_STREAM_TOPSITES = "FENNEC_ACTIVITY_STREAM_TOPSITES_LOADER_TIME_MS";
private static final String TELEMETRY_HISTOGRAM_ACTIVITY_STREAM_HIGHLIGHTS = "FENNEC_ACTIVITY_STREAM_HIGHLIGHTS_LOADER_TIME_MS";
+ private static final String TELEMETRY_HISTOGRAM_ACTIVITY_STREAM_RECENTLY_VISITED = "FENNEC_ACTIVITY_STREAM_RECENTLY_VISITED_TIME_MS";
private final Uri mBookmarksUriWithProfile;
private final Uri mParentsUriWithProfile;
private final Uri mHistoryUriWithProfile;
private final Uri mHistoryExpireUriWithProfile;
private final Uri mCombinedUriWithProfile;
private final Uri mUpdateHistoryUriWithProfile;
private final Uri mFaviconsUriWithProfile;
private final Uri mThumbnailsUriWithProfile;
private final Uri mTopSitesUriWithProfile;
private final Uri mHighlightsUriWithProfile;
+ private final Uri mHighlightCandidatesUriWithProfile;
private final Uri mSearchHistoryUri;
private final Uri mActivityStreamBlockedUriWithProfile;
private final Uri mPageMetadataWithProfile;
private LocalSearches searches;
private LocalTabsAccessor tabsAccessor;
private LocalURLMetadata urlMetadata;
private LocalUrlAnnotations urlAnnotations;
@@ -146,16 +148,17 @@ public class LocalBrowserDB extends Brow
mBookmarksUriWithProfile = DBUtils.appendProfile(profile, Bookmarks.CONTENT_URI);
mParentsUriWithProfile = DBUtils.appendProfile(profile, Bookmarks.PARENTS_CONTENT_URI);
mHistoryUriWithProfile = DBUtils.appendProfile(profile, History.CONTENT_URI);
mHistoryExpireUriWithProfile = DBUtils.appendProfile(profile, History.CONTENT_OLD_URI);
mCombinedUriWithProfile = DBUtils.appendProfile(profile, Combined.CONTENT_URI);
mFaviconsUriWithProfile = DBUtils.appendProfile(profile, Favicons.CONTENT_URI);
mTopSitesUriWithProfile = DBUtils.appendProfile(profile, TopSites.CONTENT_URI);
mHighlightsUriWithProfile = DBUtils.appendProfile(profile, Highlights.CONTENT_URI);
+ mHighlightCandidatesUriWithProfile = DBUtils.appendProfile(profile, BrowserContract.HighlightCandidates.CONTENT_URI);
mThumbnailsUriWithProfile = DBUtils.appendProfile(profile, Thumbnails.CONTENT_URI);
mActivityStreamBlockedUriWithProfile = DBUtils.appendProfile(profile, ActivityStreamBlocklist.CONTENT_URI);
mPageMetadataWithProfile = DBUtils.appendProfile(profile, PageMetadata.CONTENT_URI);
mSearchHistoryUri = BrowserContract.SearchHistory.CONTENT_URI;
mUpdateHistoryUriWithProfile =
@@ -1980,15 +1983,25 @@ public class LocalBrowserDB extends Brow
.appendQueryParameter(BrowserContract.PARAM_LIMIT, String.valueOf(limit))
.build();
return new TelemetrisedCursorLoader(context, uri, null, null, null, null,
TELEMETRY_HISTOGRAM_ACTIVITY_STREAM_HIGHLIGHTS);
}
@Override
+ public CursorLoader getHighlightCandidates(Context context, int limit) {
+ final Uri uri = mHighlightCandidatesUriWithProfile.buildUpon()
+ .appendQueryParameter(BrowserContract.PARAM_LIMIT, String.valueOf(limit))
+ .build();
+
+ return new TelemetrisedCursorLoader(context, uri, null, null, null, null,
+ TELEMETRY_HISTOGRAM_ACTIVITY_STREAM_HIGHLIGHTS);
+ }
+
+ @Override
public void blockActivityStreamSite(ContentResolver cr, String url) {
final ContentValues values = new ContentValues();
values.put(ActivityStreamBlocklist.URL, url);
cr.insert(mActivityStreamBlockedUriWithProfile, values);
}
}