| 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 3eb3a43cedbed68f480e5edf0336ebb4b41d407f..d313592dc429164d252dfad42e58a95b4cfc2695 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
 | 
| @@ -185,39 +185,43 @@ public class SnippetArticleViewHolder
 | 
|          mPublisherBar.setLayoutParams(params);
 | 
|      }
 | 
|  
 | 
| -    public void onBindViewHolder(SnippetArticle article, SuggestionsCategoryInfo categoryInfo) {
 | 
| -        super.onBindViewHolder();
 | 
| -
 | 
| -        // No longer listen for offline status changes to the old article.
 | 
| -        if (mArticle != null) mArticle.setOfflineStatusChangeRunnable(null);
 | 
| -
 | 
| -        mArticle = article;
 | 
| -        mCategoryInfo = categoryInfo;
 | 
| -        updateLayout();
 | 
| -
 | 
| -        mHeadlineTextView.setText(mArticle.mTitle);
 | 
| +    private static String getAttributionString(SnippetArticle article) {
 | 
| +        if (article.mPublishTimestampMilliseconds == 0) return article.mPublisher;
 | 
|  
 | 
|          // DateUtils.getRelativeTimeSpanString(...) calls through to TimeZone.getDefault(). If this
 | 
|          // has never been called before it loads the current time zone from disk. In most likelihood
 | 
|          // this will have been called previously and the current time zone will have been cached,
 | 
|          // but in some cases (eg instrumentation tests) it will cause a strict mode violation.
 | 
|          StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
 | 
| +        CharSequence relativeTimeSpan;
 | 
|          try {
 | 
|              long time = SystemClock.elapsedRealtime();
 | 
| -            CharSequence relativeTimeSpan = DateUtils.getRelativeTimeSpanString(
 | 
| -                    mArticle.mPublishTimestampMilliseconds, System.currentTimeMillis(),
 | 
| -                    DateUtils.MINUTE_IN_MILLIS);
 | 
| +            relativeTimeSpan =
 | 
| +                    DateUtils.getRelativeTimeSpanString(article.mPublishTimestampMilliseconds,
 | 
| +                            System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
 | 
|              RecordHistogram.recordTimesHistogram("Android.StrictMode.SnippetUIBuildTime",
 | 
|                      SystemClock.elapsedRealtime() - time, TimeUnit.MILLISECONDS);
 | 
| -
 | 
| -            // We format the publisher here so that having a publisher name in an RTL language
 | 
| -            // doesn't mess up the formatting on an LTR device and vice versa.
 | 
| -            String publisherAttribution = String.format(PUBLISHER_FORMAT_STRING,
 | 
| -                    BidiFormatter.getInstance().unicodeWrap(mArticle.mPublisher), relativeTimeSpan);
 | 
| -            mPublisherTextView.setText(publisherAttribution);
 | 
|          } finally {
 | 
|              StrictMode.setThreadPolicy(oldPolicy);
 | 
|          }
 | 
| +        // We format the publisher here so that having a publisher name in an RTL language
 | 
| +        // doesn't mess up the formatting on an LTR device and vice versa.
 | 
| +        return String.format(PUBLISHER_FORMAT_STRING,
 | 
| +                BidiFormatter.getInstance().unicodeWrap(article.mPublisher), relativeTimeSpan);
 | 
| +    }
 | 
| +
 | 
| +    public void onBindViewHolder(SnippetArticle article, SuggestionsCategoryInfo categoryInfo) {
 | 
| +        super.onBindViewHolder();
 | 
| +
 | 
| +        // No longer listen for offline status changes to the old article.
 | 
| +        if (mArticle != null) mArticle.setOfflineStatusChangeRunnable(null);
 | 
| +
 | 
| +        mArticle = article;
 | 
| +        mCategoryInfo = categoryInfo;
 | 
| +        updateLayout();
 | 
| +
 | 
| +        mHeadlineTextView.setText(mArticle.mTitle);
 | 
| +        mPublisherTextView.setText(getAttributionString(mArticle));
 | 
|  
 | 
|          // The favicon of the publisher should match the TextView height.
 | 
|          int widthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
 | 
| 
 |