Bug 1325380 - Use provider name for AS highlights. r?grisha draft
authorSebastian Kaspari <s.kaspari@gmail.com>
Thu, 22 Dec 2016 16:17:28 +0100
changeset 453413 0b84cbae6256945a96d564f55bb3aa9ed8c84302
parent 451490 a4bea7cdb40e3624cfc76ea567795c4e5a5e727d
child 540454 0f1c4f2e72537dc6554396cd1eb0a103c31a797f
push id39660
push users.kaspari@gmail.com
push dateFri, 23 Dec 2016 09:46:35 +0000
reviewersgrisha
bugs1325380
milestone53.0a1
Bug 1325380 - Use provider name for AS highlights. r?grisha MozReview-Commit-ID: 2vPk2DdrYed
mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamItem.java
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
@@ -601,16 +601,17 @@ public class BrowserContract {
 
         public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "topsites");
     }
 
     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";
     }
 
     @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";
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
@@ -1187,21 +1187,26 @@ public class BrowserProvider extends Sha
         // Select recent bookmarks that have not been visited much
         final String bookmarksQuery = "SELECT * FROM (SELECT " +
                 "-1 AS " + Combined.HISTORY_ID + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks._ID) + " AS " + Combined.BOOKMARK_ID + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.PARENT) + " AS " + Bookmarks.PARENT + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.POSITION) + " AS " + Bookmarks.POSITION + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.TITLE) + ", " +
-                DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " AS " + Highlights.DATE + " " +
+                DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " AS " + Highlights.DATE + ", " +
+                DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.JSON) + " AS " + Highlights.METADATA + " " +
                 "FROM " + Bookmarks.TABLE_NAME + " " +
                 "LEFT JOIN " + History.TABLE_NAME + " ON " +
                     DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " = " +
                     DBUtils.qualifyColumn(History.TABLE_NAME, History.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.DATE_CREATED) + " > " + threeDaysAgo + " " +
                 "AND (" + DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + " <= 3 " +
                   "OR " + DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + " IS NULL) " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.IS_DELETED)  + " = 0 " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.TYPE) + " = " + Bookmarks.TYPE_BOOKMARK + " " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.PARENT) + " >= " + Bookmarks.FIXED_ROOT_ID + " " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " NOT IN (SELECT " + ActivityStreamBlocklist.URL + " FROM " + ActivityStreamBlocklist.TABLE_NAME + " )" +
                 "ORDER BY " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " DESC " +
@@ -1213,21 +1218,26 @@ public class BrowserProvider extends Sha
         // Select recent history that has not been visited much.
         final String historyQuery = "SELECT * FROM (SELECT " +
                 DBUtils.qualifyColumn(History.TABLE_NAME, History._ID) + " AS " + Combined.HISTORY_ID + ", " +
                 "-1 AS " + Combined.BOOKMARK_ID + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.PARENT) + " AS " + Bookmarks.PARENT + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.POSITION) + " AS " + Bookmarks.POSITION + ", " +
                 DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + ", " +
                 DBUtils.qualifyColumn(History.TABLE_NAME, History.TITLE) + ", " +
-                DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " AS " + Highlights.DATE + " " +
+                DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " AS " + Highlights.DATE + ", " +
+                DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.JSON) + " AS " + Highlights.METADATA + " " +
                 "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(History.TABLE_NAME, History.DATE_LAST_VISITED) + " < " + last30Minutes + " " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + " <= 3 " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.TITLE) + " NOT NULL AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.TITLE) + " != '' " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.IS_DELETED) + " = 0 " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + " NOT IN (SELECT " + ActivityStreamBlocklist.URL + " FROM " + ActivityStreamBlocklist.TABLE_NAME + " )" +
                 // TODO: Implement domain black list (bug 1298786)
                 // TODO: Group by host (bug 1298785)
                 "ORDER BY " + DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " DESC " +
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamItem.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamItem.java
@@ -9,23 +9,26 @@ import android.content.SharedPreferences
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Color;
 import android.support.annotation.Nullable;
 import android.support.v4.view.ViewPager;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewStub;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.activitystream.ActivityStream.LabelCallback;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.home.activitystream.menu.ActivityStreamContextMenu;
 import org.mozilla.gecko.home.activitystream.topsites.CirclePageIndicator;
 import org.mozilla.gecko.home.activitystream.topsites.TopSitesPagerAdapter;
@@ -37,16 +40,18 @@ import org.mozilla.gecko.util.ViewUtil;
 import org.mozilla.gecko.util.TouchTargetUtil;
 import org.mozilla.gecko.widget.FaviconView;
 
 import java.util.concurrent.Future;
 
 import static org.mozilla.gecko.activitystream.ActivityStream.extractLabel;
 
 public abstract class StreamItem extends RecyclerView.ViewHolder {
+    private static final String LOGTAG = "GeckoStreamItem";
+
     public StreamItem(View itemView) {
         super(itemView);
     }
 
     public static class HighlightsTitle extends StreamItem {
         public static final int LAYOUT_ID = R.layout.activity_stream_main_highlightstitle;
 
         public HighlightsTitle(final View itemView) {
@@ -137,16 +142,17 @@ public abstract class StreamItem extends
 
         enum HighlightSource {
             VISITED,
             BOOKMARKED
         }
 
         String title;
         String url;
+        JSONObject metadata;
 
         @Nullable Boolean isPinned;
         @Nullable Boolean isBookmarked;
 
         final FaviconView vIconView;
         final TextView vLabel;
         final TextView vTimeSince;
         final TextView vSourceView;
@@ -195,29 +201,38 @@ public abstract class StreamItem extends
         public void bind(Cursor cursor, int tilesWidth, int tilesHeight) {
 
             final long time = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.DATE));
             final String ago = DateUtils.getRelativeTimeSpanString(time, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, 0).toString();
 
             title = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.History.TITLE));
             url = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Combined.URL));
 
+            try {
+                final String rawMetadata = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.METADATA));
+                if (rawMetadata != null) {
+                    metadata = new JSONObject(rawMetadata);
+                }
+            } catch (JSONException e) {
+                Log.w(LOGTAG, "JSONException while parsing page metadata", e);
+            }
+
             vLabel.setText(title);
             vTimeSince.setText(ago);
 
             ViewGroup.LayoutParams layoutParams = vIconView.getLayoutParams();
             layoutParams.width = tilesWidth - tilesMargin;
             layoutParams.height = tilesHeight;
             vIconView.setLayoutParams(layoutParams);
 
             final HighlightSource source = highlightSource(cursor);
 
             updateStateForSource(source, cursor);
             updateUiForSource(source);
-            updatePage(url);
+            updatePage(metadata, url);
 
             if (ongoingIconLoad != null) {
                 ongoingIconLoad.cancel(true);
             }
 
             ongoingIconLoad = Icons.with(itemView.getContext())
                     .pageUrl(url)
                     .skipNetwork()
@@ -260,17 +275,30 @@ public abstract class StreamItem extends
                     vSourceIconView.setImageResource(0);
                     break;
             }
 
             // TODO Why?
             // vSourceView.setText(vSourceView.getText());
         }
 
-        private void updatePage(final String url) {
+        private void updatePage(final JSONObject metadata, final String url) {
+            // First try to set the provider name from the page's metadata.
+
+            try {
+                if (metadata != null && metadata.has("provider")) {
+                    vPageView.setText(metadata.getString("provider"));
+                    return;
+                }
+            } catch (JSONException e) {
+                // Broken JSON? Continue with fallback.
+            }
+
+            // If there's no provider name available then let's try to extract one from the URL.
+
             extractLabel(itemView.getContext(), url, false, new LabelCallback() {
                 @Override
                 public void onLabelExtracted(String label) {
                     vPageView.setText(TextUtils.isEmpty(label) ? url : label);
                 }
             });
         }