Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1484)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java

Issue 1921553004: Add favicon and publisher name to snippet cards (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
index 5a6bcef7a1d21fa39737df1b42d9a8a69ae7d939..e13d6c94361f49e2a14d709d4ff7b57fb8ee2acc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
@@ -12,18 +12,22 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.media.ThumbnailUtils;
import android.os.AsyncTask;
+import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
+import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.Log;
import org.chromium.base.StreamUtil;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
+import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
import org.chromium.chrome.browser.ntp.NewTabPageUma;
import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
import org.chromium.chrome.browser.ntp.cards.NewTabPageListItem;
@@ -31,6 +35,7 @@ import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder;
import java.io.IOException;
import java.io.InputStream;
+import java.net.MalformedURLException;
import java.net.URL;
/**
@@ -38,6 +43,7 @@ import java.net.URL;
*/
public class SnippetArticleViewHolder extends NewTabPageViewHolder implements View.OnClickListener {
private static final String TAG = "NtpSnippets";
+ private static final String PUBLISHER_FORMAT_STRING = "%s - %s";
private static final int FADE_IN_ANIMATION_TIME_MS = 300;
private final NewTabPageManager mNewTabPageManager;
@@ -102,14 +108,16 @@ public class SnippetArticleViewHolder extends NewTabPageViewHolder implements Vi
SnippetArticle item = (SnippetArticle) article;
mHeadlineTextView.setText(item.mTitle);
- mPublisherTextView.setText(
+ mPublisherTextView.setText(String.format(PUBLISHER_FORMAT_STRING, item.mPublisher,
DateUtils.getRelativeTimeSpanString(item.mTimestamp, System.currentTimeMillis(),
- DateUtils.MINUTE_IN_MILLIS));
+ DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE)));
+
mArticleSnippetTextView.setText(item.mPreviewText);
mUrl = item.mUrl;
mPosition = item.mPosition;
updateThumbnail(item);
+ upadateFavicon(item);
}
private void updateThumbnail(final SnippetArticle snippet) {
@@ -177,6 +185,78 @@ public class SnippetArticleViewHolder extends NewTabPageViewHolder implements Vi
transitionDrawable.startTransition(FADE_IN_ANIMATION_TIME_MS);
}
+ private void upadateFavicon(final SnippetArticle snippet) {
Bernhard Bauer 2016/04/27 13:22:05 Nit: updateFavicon :) Also, the final is unnecess
May 2016/04/27 16:45:08 Done.
+ // The favicon size should match the textview height
+ int widthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ mPublisherTextView.measure(widthSpec, heightSpec);
+ fetchFavicon(snippet, mPublisherTextView.getHeight());
+ }
+
+ // Fetch the favicon using the article's url first. If that fails, try to fetch the
+ // favicon for the hostname
+ private void fetchFavicon(final SnippetArticle snippet, final int faviconSizePx) {
+ mNewTabPageManager.getLocalFaviconImageForURL(
+ snippet.mUrl, faviconSizePx, new FaviconImageCallback() {
+ @Override
+ public void onFaviconAvailable(Bitmap image, String iconUrl) {
+ if (image == null) {
+ fetchFaviconForHostname(snippet.mUrl, faviconSizePx);
+ } else {
+ Drawable siteFavicon = new BitmapDrawable(
+ mPublisherTextView.getContext().getResources(), image);
+ siteFavicon.setBounds(0, 0, faviconSizePx, faviconSizePx);
+ ApiCompatibilityUtils.setCompoundDrawablesRelative(
+ mPublisherTextView, siteFavicon, null, null, null);
+ mPublisherTextView.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ }
+
+ private void fetchFaviconForHostname(String urlStr, final int sizePx) {
+ URL url = null;
Bernhard Bauer 2016/04/27 13:22:05 I think it's more common to use java.net.URI when
May 2016/04/27 16:45:08 Done.
+ try {
+ url = new URL(urlStr);
+ } catch (MalformedURLException e) {
+ drawDefaultFavicon(sizePx);
+ return;
+ }
+
+ String origin = null;
Bernhard Bauer 2016/04/27 13:22:05 I wouldn't call this origin if it's just protocol
May 2016/04/27 16:45:08 Not sure I understand the second part. We first tr
Bernhard Bauer 2016/04/28 14:19:20 What I meant was extracting the part that removes
May 2016/04/28 18:01:52 True, I removed the checks and now there's just on
+ if (url != null) origin = String.format("%s://%s", url.getProtocol(), url.getHost());
+
+ if (!TextUtils.isEmpty(origin)) {
+ mNewTabPageManager.getLocalFaviconImageForURL(
+ origin, sizePx, new FaviconImageCallback() {
+ @Override
+ public void onFaviconAvailable(Bitmap image, String iconUrl) {
+ if (image == null) {
+ drawDefaultFavicon(sizePx);
+ } else {
+ Drawable domainFavicon = new BitmapDrawable(
Bernhard Bauer 2016/04/27 13:22:05 I think you could extract this into a shared metho
May 2016/04/27 16:45:07 Done.
+ mPublisherTextView.getContext().getResources(), image);
+ domainFavicon.setBounds(0, 0, sizePx, sizePx);
+ ApiCompatibilityUtils.setCompoundDrawablesRelative(
+ mPublisherTextView, domainFavicon, null, null, null);
+ mPublisherTextView.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ } else {
+ drawDefaultFavicon(sizePx);
+ }
+ }
+
+ private void drawDefaultFavicon(int faviconSizePx) {
+ Drawable newIcon = ApiCompatibilityUtils.getDrawable(
+ mPublisherTextView.getContext().getResources(), R.drawable.default_favicon);
+ newIcon.setBounds(0, 0, faviconSizePx, faviconSizePx);
+ ApiCompatibilityUtils.setCompoundDrawablesRelative(
+ mPublisherTextView, newIcon, null, null, null);
+ mPublisherTextView.setVisibility(View.VISIBLE);
+ }
+
@Override
public boolean isDismissable() {
return true;

Powered by Google App Engine
This is Rietveld 408576698