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 6887bbd20f6487ac68a9f422e78a0c574e10a505..dc7c8abd503da0e413e29e8fb5f93240cf1d8a4a 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 |
@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.ntp.snippets; |
import android.content.res.Resources; |
import android.graphics.Bitmap; |
+import android.graphics.Rect; |
import android.graphics.drawable.BitmapDrawable; |
import android.graphics.drawable.Drawable; |
import android.graphics.drawable.TransitionDrawable; |
@@ -16,6 +17,7 @@ import android.view.LayoutInflater; |
import android.view.View; |
import android.view.View.MeasureSpec; |
import android.view.ViewGroup; |
+import android.view.ViewTreeObserver; |
import android.widget.ImageView; |
import android.widget.TextView; |
@@ -51,6 +53,8 @@ public class SnippetArticleViewHolder extends NewTabPageViewHolder implements Vi |
private FetchImageCallback mImageCallback; |
private long mPublishTimestampMilliseconds; |
private float mScore; |
+ private SnippetArticle mArticle; |
+ private ViewTreeObserver.OnPreDrawListener mPreDrawObserver; |
public String mUrl; |
public int mPosition; |
@@ -72,7 +76,7 @@ public class SnippetArticleViewHolder extends NewTabPageViewHolder implements Vi |
* @param cardView The View for the snippet card |
* @param manager The SnippetsManager object used to open an article |
*/ |
- public SnippetArticleViewHolder(View cardView, NewTabPageManager manager) { |
+ public SnippetArticleViewHolder(final View cardView, NewTabPageManager manager) { |
super(cardView); |
mNewTabPageManager = manager; |
@@ -81,15 +85,32 @@ public class SnippetArticleViewHolder extends NewTabPageViewHolder implements Vi |
mHeadlineTextView = (TextView) cardView.findViewById(R.id.article_headline); |
mPublisherTextView = (TextView) cardView.findViewById(R.id.article_publisher); |
mArticleSnippetTextView = (TextView) cardView.findViewById(R.id.article_snippet); |
+ |
+ mPreDrawObserver = new ViewTreeObserver.OnPreDrawListener() { |
+ @Override |
+ public boolean onPreDraw() { |
+ if (mArticle != null && !mArticle.impressionTracked()) { |
+ Rect r = new Rect(0, 0, cardView.getWidth(), cardView.getHeight()); |
+ cardView.getParent().getChildVisibleRect(cardView, r, null); |
+ // Track impression if at least one third of the snippet is shown. |
+ if (r.height() >= cardView.getHeight() / 3) mArticle.trackImpression(); |
+ } |
+ // Proceed with the current drawing pass. |
+ return true; |
+ } |
+ }; |
+ |
+ // Listen to onPreDraw only if this view is potentially visible (attached to the window). |
cardView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { |
@Override |
public void onViewAttachedToWindow(View v) { |
- RecordHistogram.recordSparseSlowlyHistogram( |
- "NewTabPage.Snippets.CardShown", mPosition); |
+ cardView.getViewTreeObserver().addOnPreDrawListener(mPreDrawObserver); |
} |
@Override |
- public void onViewDetachedFromWindow(View v) {} |
+ public void onViewDetachedFromWindow(View v) { |
+ cardView.getViewTreeObserver().removeOnPreDrawListener(mPreDrawObserver); |
+ } |
}); |
} |
@@ -120,33 +141,33 @@ public class SnippetArticleViewHolder extends NewTabPageViewHolder implements Vi |
@Override |
public void onBindViewHolder(NewTabPageListItem article) { |
- SnippetArticle item = (SnippetArticle) article; |
+ mArticle = (SnippetArticle) article; |
- mHeadlineTextView.setText(item.mTitle); |
- String publisherAttribution = String.format(PUBLISHER_FORMAT_STRING, item.mPublisher, |
- DateUtils.getRelativeTimeSpanString( |
- item.mTimestamp, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS)); |
+ mHeadlineTextView.setText(mArticle.mTitle); |
+ String publisherAttribution = String.format(PUBLISHER_FORMAT_STRING, mArticle.mPublisher, |
+ DateUtils.getRelativeTimeSpanString(mArticle.mTimestamp, System.currentTimeMillis(), |
+ DateUtils.MINUTE_IN_MILLIS)); |
mPublisherTextView.setText(BidiFormatter.getInstance().unicodeWrap(publisherAttribution)); |
- mArticleSnippetTextView.setText(item.mPreviewText); |
- mUrl = item.mUrl; |
- mPosition = item.mPosition; |
- mPublishTimestampMilliseconds = item.mTimestamp; |
- mScore = item.mScore; |
+ mArticleSnippetTextView.setText(mArticle.mPreviewText); |
+ mUrl = mArticle.mUrl; |
+ mPosition = mArticle.mPosition; |
+ mPublishTimestampMilliseconds = mArticle.mTimestamp; |
+ mScore = mArticle.mScore; |
// If there's still a pending thumbnail fetch, cancel it. |
cancelImageFetch(); |
// If the article has a thumbnail already, reuse it. Otherwise start a fetch. |
- if (item.getThumbnailBitmap() != null) { |
- mThumbnailView.setImageBitmap(item.getThumbnailBitmap()); |
+ if (mArticle.getThumbnailBitmap() != null) { |
+ mThumbnailView.setImageBitmap(mArticle.getThumbnailBitmap()); |
} else { |
mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder); |
- mImageCallback = new FetchImageCallback(this, item); |
- mNewTabPageManager.fetchSnippetImage(item, mImageCallback); |
+ mImageCallback = new FetchImageCallback(this, mArticle); |
+ mNewTabPageManager.fetchSnippetImage(mArticle, mImageCallback); |
} |
- updateFavicon(item); |
+ updateFavicon(mArticle); |
} |
private static class FetchImageCallback extends Callback<Bitmap> { |