Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java |
index a0190f41f7137b9deb110cbb95d81fa366ea2421..725bef361304c2611074060745898a75627609b8 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java |
@@ -4,6 +4,8 @@ |
package org.chromium.chrome.browser.ntp.cards; |
+import android.util.Pair; |
+ |
import org.chromium.base.Log; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
@@ -15,6 +17,7 @@ |
import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig; |
import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; |
import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; |
+import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter; |
import java.util.LinkedHashMap; |
import java.util.List; |
@@ -24,8 +27,9 @@ |
* A node in the tree containing a list of all suggestions sections. It listens to changes in the |
* suggestions source and updates the corresponding sections. |
*/ |
-public class SectionList |
- extends InnerNode implements SuggestionsSource.Observer, SuggestionsSection.Delegate { |
+public class SectionList extends InnerNode implements SuggestionsSource.Observer, |
+ SuggestionsSection.Delegate, |
+ SuggestionsMetricsReporter.SuggestionRanker { |
private static final String TAG = "Ntp"; |
/** Maps suggestion categories to sections, with stable iteration ordering. */ |
@@ -35,6 +39,7 @@ |
public SectionList(NewTabPageManager newTabPageManager, OfflinePageBridge offlinePageBridge) { |
mNewTabPageManager = newTabPageManager; |
+ mNewTabPageManager.getSuggestionsMetricsReporter().setRanker(this); |
mNewTabPageManager.getSuggestionsSource().setObserver(this); |
mOfflinePageBridge = offlinePageBridge; |
resetSections(/* alwaysAllowEmptySections = */ false); |
@@ -63,7 +68,8 @@ public void resetSections(boolean alwaysAllowEmptySections) { |
resetSection(category, categoryStatus, alwaysAllowEmptySections); |
} |
- mNewTabPageManager.trackSnippetsPageImpression(categories, suggestionsPerCategory); |
+ mNewTabPageManager.getSuggestionsMetricsReporter().onPageShown( |
+ categories, suggestionsPerCategory); |
} |
/** |
@@ -175,17 +181,6 @@ public void onFullRefreshRequired() { |
private void setSuggestions(@CategoryInt int category, List<SnippetArticle> suggestions, |
@CategoryStatusEnum int status) { |
- // Count the number of suggestions before this category. |
- int globalPositionOffset = 0; |
- for (Map.Entry<Integer, SuggestionsSection> entry : mSections.entrySet()) { |
- if (entry.getKey() == category) break; |
- globalPositionOffset += entry.getValue().getSuggestionsCount(); |
- } |
- // Assign global indices to the new suggestions. |
- for (SnippetArticle suggestion : suggestions) { |
- suggestion.mGlobalPosition = globalPositionOffset + suggestion.mPosition; |
- } |
- |
mSections.get(category).addSuggestions(suggestions, status); |
} |
@@ -216,6 +211,29 @@ public void dismissSection(SuggestionsSection section) { |
removeSection(section); |
} |
+ @Override |
+ public Pair<Integer, Integer> getSuggestionRank(SnippetArticle suggestion) { |
+ int globalRank = 0; |
+ for (Map.Entry<Integer, SuggestionsSection> kvPair : mSections.entrySet()) { |
+ if (kvPair.getKey() == suggestion.mCategory) { |
+ int localRank = kvPair.getValue().getSuggestionRank(suggestion); |
+ globalRank += localRank; |
+ |
+ assert localRank != -1; |
+ return new Pair<>(localRank, globalRank); |
+ } |
+ globalRank += kvPair.getValue().getSuggestionsCount(); |
+ } |
+ |
+ throw new IndexOutOfBoundsException(); |
+ } |
+ |
+ @Override |
+ public int getActionItemRank(@CategoryInt int category) { |
+ assert mSections.get(category).getActionItem().isVisible(); |
+ return mSections.get(category).getSuggestionsCount(); |
+ } |
+ |
@VisibleForTesting |
void removeSection(SuggestionsSection section) { |
mSections.remove(section.getCategory()); |