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 c4ecfd880faeb8c229a9edc9d5489d7c293eb21d..bc2c4b0e4685f59dc7a0e97a182bafbee7255ca3 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 |
@@ -32,8 +32,10 @@ |
private final Map<Integer, SuggestionsSection> mSections = new LinkedHashMap<>(); |
private final NewTabPageManager mNewTabPageManager; |
private final OfflinePageBridge mOfflinePageBridge; |
+ private final SuggestionRanker mSuggestionRanker; |
public SectionList(NewTabPageManager newTabPageManager, OfflinePageBridge offlinePageBridge) { |
+ mSuggestionRanker = new SuggestionRanker(); |
mNewTabPageManager = newTabPageManager; |
mNewTabPageManager.getSuggestionsSource().setObserver(this); |
mOfflinePageBridge = offlinePageBridge; |
@@ -63,7 +65,8 @@ public void resetSections(boolean alwaysAllowEmptySections) { |
resetSection(category, categoryStatus, alwaysAllowEmptySections); |
} |
- mNewTabPageManager.trackSnippetsPageImpression(categories, suggestionsPerCategory); |
+ mNewTabPageManager.getSuggestionsMetricsReporter().onPageShown( |
+ categories, suggestionsPerCategory); |
} |
/** |
@@ -92,8 +95,10 @@ private int resetSection(@CategoryInt int category, @CategoryStatusEnum int cate |
// Create the section if needed. |
if (section == null) { |
- section = new SuggestionsSection(this, mNewTabPageManager, mOfflinePageBridge, info); |
+ section = new SuggestionsSection( |
+ this, mNewTabPageManager, mSuggestionRanker, mOfflinePageBridge, info); |
mSections.put(category, section); |
+ mSuggestionRanker.registerCategory(category); |
addChild(section); |
} |
@@ -183,17 +188,6 @@ public void onFullRefreshRequired() { |
*/ |
private void setSuggestions(@CategoryInt int category, List<SnippetArticle> suggestions, |
@CategoryStatusEnum int status, boolean replaceExisting) { |
- // 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).setSuggestions(suggestions, status, replaceExisting); |
} |
@@ -254,4 +248,41 @@ public boolean isEmpty() { |
SuggestionsSection getSectionForTesting(@CategoryInt int categoryId) { |
return mSections.get(categoryId); |
} |
+ |
+ /** |
+ * Attributes ranks to suggestions and related elements. |
+ * |
+ * Ranks here are 0-based scores attributed based on the position or loading order of the |
+ * elements. See implementation for more details. |
+ */ |
+ public static class SuggestionRanker { |
Bernhard Bauer
2017/01/17 17:42:31
Can we move this to a separate class? There isn't
dgn
2017/01/17 18:46:24
Done.
|
+ private final Map<Integer, Integer> mSuggestionsAddedPerSection = new LinkedHashMap<>(); |
+ private int mTotalAddedSuggestions; |
+ |
+ /** |
+ * Attributes a per section rank to the provided action item. |
+ * @see ActionItem#getPerSectionRank() |
+ */ |
+ public void rankItem(ActionItem actionItem, SuggestionsSection section) { |
Bernhard Bauer
2017/01/17 17:42:31
Can we rename these methods to rankActionItem() an
dgn
2017/01/17 18:46:24
Done.
|
+ if (actionItem.getPerSectionRank() != -1) return; // Item was already ranked. |
+ actionItem.setRank(section.getSuggestionsCount()); |
+ } |
+ |
+ /** |
+ * Attributes global and per section rank to the provided suggestion. |
+ * @see SnippetArticle#getPerSectionRank() |
+ * @see SnippetArticle#getGlobalRank() |
+ */ |
+ public void rankItem(SnippetArticle suggestion) { |
+ int globalRank = mTotalAddedSuggestions++; |
+ int perSectionRank = mSuggestionsAddedPerSection.get(suggestion.mCategory); |
+ mSuggestionsAddedPerSection.put(suggestion.mCategory, perSectionRank + 1); |
+ |
+ suggestion.setRank(perSectionRank, globalRank); |
+ } |
+ |
+ public void registerCategory(@CategoryInt int category) { |
+ mSuggestionsAddedPerSection.put(category, 0); |
+ } |
+ } |
} |