OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.ntp.snippets; | 5 package org.chromium.chrome.browser.ntp.snippets; |
6 | 6 |
7 import android.graphics.Bitmap; | 7 import android.graphics.Bitmap; |
8 | 8 |
9 import org.chromium.base.Callback; | 9 import org.chromium.base.Callback; |
10 import org.chromium.base.annotations.CalledByNative; | 10 import org.chromium.base.annotations.CalledByNative; |
11 import org.chromium.chrome.browser.ntp.NewTabPageUma; | |
12 import org.chromium.chrome.browser.ntp.cards.ActionItem; | |
11 import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo; | 13 import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo; |
12 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnu m; | 14 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnu m; |
13 import org.chromium.chrome.browser.profiles.Profile; | 15 import org.chromium.chrome.browser.profiles.Profile; |
16 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter; | |
17 import org.chromium.chrome.browser.suggestions.SuggestionsRanker; | |
14 | 18 |
15 import java.util.ArrayList; | 19 import java.util.ArrayList; |
16 import java.util.List; | 20 import java.util.List; |
17 | 21 |
18 /** | 22 /** |
19 * Provides access to the snippets to display on the NTP using the C++ ContentSu ggestionsService. | 23 * Provides access to the snippets to display on the NTP using the C++ ContentSu ggestionsService. |
20 */ | 24 */ |
21 public class SnippetsBridge implements SuggestionsSource { | 25 public class SnippetsBridge implements SuggestionsSource, SuggestionsMetricsRepo rter { |
22 private static final String TAG = "SnippetsBridge"; | 26 private static final String TAG = "SnippetsBridge"; |
23 | 27 |
24 private long mNativeSnippetsBridge; | 28 private long mNativeSnippetsBridge; |
25 private SuggestionsSource.Observer mObserver; | 29 private SuggestionsSource.Observer mObserver; |
30 private SuggestionsRanker mSuggestionsRanker; | |
26 | 31 |
27 public static boolean isCategoryStatusAvailable(@CategoryStatusEnum int stat us) { | 32 public static boolean isCategoryStatusAvailable(@CategoryStatusEnum int stat us) { |
28 // Note: This code is duplicated in content_suggestions_category_status. cc. | 33 // Note: This code is duplicated in content_suggestions_category_status. cc. |
29 return status == CategoryStatus.AVAILABLE_LOADING || status == CategoryS tatus.AVAILABLE; | 34 return status == CategoryStatus.AVAILABLE_LOADING || status == CategoryS tatus.AVAILABLE; |
30 } | 35 } |
31 | 36 |
32 /** Returns whether the category is considered "enabled", and can show conte nt suggestions. */ | 37 /** Returns whether the category is considered "enabled", and can show conte nt suggestions. */ |
33 public static boolean isCategoryEnabled(@CategoryStatusEnum int status) { | 38 public static boolean isCategoryEnabled(@CategoryStatusEnum int status) { |
34 switch (status) { | 39 switch (status) { |
35 case CategoryStatus.INITIALIZING: | 40 case CategoryStatus.INITIALIZING: |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 @Override | 117 @Override |
113 public void fetchSuggestionImage(SnippetArticle suggestion, Callback<Bitmap> callback) { | 118 public void fetchSuggestionImage(SnippetArticle suggestion, Callback<Bitmap> callback) { |
114 assert mNativeSnippetsBridge != 0; | 119 assert mNativeSnippetsBridge != 0; |
115 nativeFetchSuggestionImage(mNativeSnippetsBridge, suggestion.mCategory, | 120 nativeFetchSuggestionImage(mNativeSnippetsBridge, suggestion.mCategory, |
116 suggestion.mIdWithinCategory, callback); | 121 suggestion.mIdWithinCategory, callback); |
117 } | 122 } |
118 | 123 |
119 @Override | 124 @Override |
120 public void dismissSuggestion(SnippetArticle suggestion) { | 125 public void dismissSuggestion(SnippetArticle suggestion) { |
121 assert mNativeSnippetsBridge != 0; | 126 assert mNativeSnippetsBridge != 0; |
122 nativeDismissSuggestion(mNativeSnippetsBridge, suggestion.mUrl, suggesti on.mGlobalPosition, | 127 nativeDismissSuggestion(mNativeSnippetsBridge, suggestion.mUrl, suggesti on.getGlobalRank(), |
123 suggestion.mCategory, suggestion.mPosition, suggestion.mIdWithin Category); | 128 suggestion.mCategory, suggestion.getPerSectionRank(), suggestion .mIdWithinCategory); |
124 } | 129 } |
125 | 130 |
126 @Override | 131 @Override |
127 public void dismissCategory(@CategoryInt int category) { | 132 public void dismissCategory(@CategoryInt int category) { |
128 assert mNativeSnippetsBridge != 0; | 133 assert mNativeSnippetsBridge != 0; |
129 nativeDismissCategory(mNativeSnippetsBridge, category); | 134 nativeDismissCategory(mNativeSnippetsBridge, category); |
130 } | 135 } |
131 | 136 |
132 @Override | 137 @Override |
133 public void restoreDismissedCategories() { | 138 public void restoreDismissedCategories() { |
134 assert mNativeSnippetsBridge != 0; | 139 assert mNativeSnippetsBridge != 0; |
135 nativeRestoreDismissedCategories(mNativeSnippetsBridge); | 140 nativeRestoreDismissedCategories(mNativeSnippetsBridge); |
136 } | 141 } |
137 | 142 |
143 @Override | |
138 public void onPageShown(int[] categories, int[] suggestionsPerCategory) { | 144 public void onPageShown(int[] categories, int[] suggestionsPerCategory) { |
139 assert mNativeSnippetsBridge != 0; | 145 assert mNativeSnippetsBridge != 0; |
140 nativeOnPageShown(mNativeSnippetsBridge, categories, suggestionsPerCateg ory); | 146 nativeOnPageShown(mNativeSnippetsBridge, categories, suggestionsPerCateg ory); |
141 } | 147 } |
142 | 148 |
149 @Override | |
143 public void onSuggestionShown(SnippetArticle suggestion) { | 150 public void onSuggestionShown(SnippetArticle suggestion) { |
144 assert mNativeSnippetsBridge != 0; | 151 assert mNativeSnippetsBridge != 0; |
145 nativeOnSuggestionShown(mNativeSnippetsBridge, suggestion.mGlobalPositio n, | 152 nativeOnSuggestionShown(mNativeSnippetsBridge, suggestion.getGlobalRank( ), |
146 suggestion.mCategory, suggestion.mPosition, | 153 suggestion.mCategory, suggestion.getPerSectionRank(), |
147 suggestion.mPublishTimestampMilliseconds, suggestion.mScore); | 154 suggestion.mPublishTimestampMilliseconds, suggestion.mScore); |
148 } | 155 } |
149 | 156 |
150 public void onSuggestionOpened( | 157 @Override |
151 SnippetArticle suggestion, int categoryIndex, int windowOpenDisposit ion) { | 158 public void onSuggestionOpened(SnippetArticle suggestion, int windowOpenDisp osition) { |
152 assert mNativeSnippetsBridge != 0; | 159 assert mNativeSnippetsBridge != 0; |
153 nativeOnSuggestionOpened(mNativeSnippetsBridge, suggestion.mGlobalPositi on, | 160 int categoryIndex = mSuggestionsRanker.getCategoryRank(suggestion.mCateg ory); |
vitaliii
2017/01/18 08:46:27
Rank is expected to be 1-based.
E.g. https://en.wi
dgn
2017/01/18 10:47:42
Maybe, but "index" and "position" are both mislead
| |
154 suggestion.mCategory, categoryIndex, suggestion.mPosition, | 161 nativeOnSuggestionOpened(mNativeSnippetsBridge, suggestion.getGlobalRank (), |
162 suggestion.mCategory, categoryIndex, suggestion.getPerSectionRan k(), | |
155 suggestion.mPublishTimestampMilliseconds, suggestion.mScore, win dowOpenDisposition); | 163 suggestion.mPublishTimestampMilliseconds, suggestion.mScore, win dowOpenDisposition); |
156 } | 164 } |
157 | 165 |
166 @Override | |
158 public void onSuggestionMenuOpened(SnippetArticle suggestion) { | 167 public void onSuggestionMenuOpened(SnippetArticle suggestion) { |
159 assert mNativeSnippetsBridge != 0; | 168 assert mNativeSnippetsBridge != 0; |
160 nativeOnSuggestionMenuOpened(mNativeSnippetsBridge, suggestion.mGlobalPo sition, | 169 nativeOnSuggestionMenuOpened(mNativeSnippetsBridge, suggestion.getGlobal Rank(), |
161 suggestion.mCategory, suggestion.mPosition, | 170 suggestion.mCategory, suggestion.getPerSectionRank(), |
162 suggestion.mPublishTimestampMilliseconds, suggestion.mScore); | 171 suggestion.mPublishTimestampMilliseconds, suggestion.mScore); |
163 } | 172 } |
164 | 173 |
165 public void onMoreButtonShown(int category, int position) { | 174 @Override |
175 public void onMoreButtonShown(ActionItem actionItem) { | |
166 assert mNativeSnippetsBridge != 0; | 176 assert mNativeSnippetsBridge != 0; |
167 nativeOnMoreButtonShown(mNativeSnippetsBridge, category, position); | 177 nativeOnMoreButtonShown( |
178 mNativeSnippetsBridge, actionItem.getCategory(), actionItem.getP erSectionRank()); | |
168 } | 179 } |
169 | 180 |
170 public void onMoreButtonClicked(int category, int position) { | 181 @Override |
182 public void onMoreButtonClicked(ActionItem actionItem) { | |
171 assert mNativeSnippetsBridge != 0; | 183 assert mNativeSnippetsBridge != 0; |
172 nativeOnMoreButtonClicked(mNativeSnippetsBridge, category, position); | 184 @CategoryInt |
185 int category = actionItem.getCategory(); | |
186 nativeOnMoreButtonClicked(mNativeSnippetsBridge, category, actionItem.ge tPerSectionRank()); | |
187 switch (category) { | |
188 case KnownCategories.BOOKMARKS: | |
189 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARKS _MANAGER); | |
190 break; | |
191 // MORE button in both categories leads to the recent tabs manager | |
192 case KnownCategories.FOREIGN_TABS: | |
193 case KnownCategories.RECENT_TABS: | |
194 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_RECENT_TA BS_MANAGER); | |
195 break; | |
196 case KnownCategories.DOWNLOADS: | |
197 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_DOWNLOADS _MANAGER); | |
198 break; | |
199 default: | |
200 // No action associated | |
201 break; | |
202 } | |
173 } | 203 } |
174 | 204 |
175 /** | 205 /** |
176 * Notifies the scheduler to adjust the plan due to a newly opened NTP. | 206 * Notifies the scheduler to adjust the plan due to a newly opened NTP. |
177 */ | 207 */ |
178 public void onNtpInitialized() { | 208 public void onNtpInitialized() { |
179 assert mNativeSnippetsBridge != 0; | 209 assert mNativeSnippetsBridge != 0; |
180 nativeOnNTPInitialized(mNativeSnippetsBridge); | 210 nativeOnNTPInitialized(mNativeSnippetsBridge); |
181 } | 211 } |
182 | 212 |
183 public static void notifySchedulerAboutWarmResume() { | 213 public static void notifySchedulerAboutWarmResume() { |
184 SnippetsBridge snippetsBridge = new SnippetsBridge(Profile.getLastUsedPr ofile()); | 214 SnippetsBridge snippetsBridge = new SnippetsBridge(Profile.getLastUsedPr ofile()); |
185 snippetsBridge.onActivityWarmResumed(); | 215 snippetsBridge.onActivityWarmResumed(); |
186 } | 216 } |
187 | 217 |
188 public static void notifySchedulerAboutColdStart() { | 218 public static void notifySchedulerAboutColdStart() { |
189 SnippetsBridge snippetsBridge = new SnippetsBridge(Profile.getLastUsedPr ofile()); | 219 SnippetsBridge snippetsBridge = new SnippetsBridge(Profile.getLastUsedPr ofile()); |
190 snippetsBridge.onColdStart(); | 220 snippetsBridge.onColdStart(); |
191 } | 221 } |
192 | 222 |
193 public static void onSuggestionTargetVisited(int category, long visitTimeMs) { | 223 public static void onSuggestionTargetVisited(int category, long visitTimeMs) { |
194 nativeOnSuggestionTargetVisited(category, visitTimeMs); | 224 nativeOnSuggestionTargetVisited(category, visitTimeMs); |
195 } | 225 } |
196 | 226 |
197 /** | |
198 * Sets the recipient for the fetched snippets. | |
199 * | |
200 * An observer needs to be set before the native code attempts to transmit s nippets them to | |
201 * java. Upon registration, the observer will be notified of already fetched snippets. | |
202 * | |
203 * @param observer object to notify when snippets are received. | |
204 */ | |
205 @Override | 227 @Override |
206 public void setObserver(SuggestionsSource.Observer observer) { | 228 public void setObserver(Observer observer) { |
207 assert observer != null; | 229 assert observer != null; |
208 mObserver = observer; | 230 mObserver = observer; |
209 } | 231 } |
210 | 232 |
211 @Override | 233 @Override |
234 public void setRanker(SuggestionsRanker suggestionsRanker) { | |
235 assert suggestionsRanker != null; | |
236 mSuggestionsRanker = suggestionsRanker; | |
237 } | |
238 | |
239 @Override | |
212 public void fetchSuggestions(@CategoryInt int category, String[] displayedSu ggestionIds) { | 240 public void fetchSuggestions(@CategoryInt int category, String[] displayedSu ggestionIds) { |
213 nativeFetch(mNativeSnippetsBridge, category, displayedSuggestionIds); | 241 nativeFetch(mNativeSnippetsBridge, category, displayedSuggestionIds); |
214 } | 242 } |
215 | 243 |
216 private void onActivityWarmResumed() { | 244 private void onActivityWarmResumed() { |
217 assert mNativeSnippetsBridge != 0; | 245 assert mNativeSnippetsBridge != 0; |
218 nativeOnActivityWarmResumed(mNativeSnippetsBridge); | 246 nativeOnActivityWarmResumed(mNativeSnippetsBridge); |
219 } | 247 } |
220 | 248 |
221 private void onColdStart() { | 249 private void onColdStart() { |
222 assert mNativeSnippetsBridge != 0; | 250 assert mNativeSnippetsBridge != 0; |
223 nativeOnColdStart(mNativeSnippetsBridge); | 251 nativeOnColdStart(mNativeSnippetsBridge); |
224 } | 252 } |
225 | 253 |
226 @CalledByNative | 254 @CalledByNative |
227 private static List<SnippetArticle> createSuggestionList() { | 255 private static List<SnippetArticle> createSuggestionList() { |
228 return new ArrayList<>(); | 256 return new ArrayList<>(); |
229 } | 257 } |
230 | 258 |
231 @CalledByNative | 259 @CalledByNative |
232 private static SnippetArticle addSuggestion(List<SnippetArticle> suggestions , int category, | 260 private static SnippetArticle addSuggestion(List<SnippetArticle> suggestions , int category, |
233 String id, String title, String publisher, String previewText, Strin g url, | 261 String id, String title, String publisher, String previewText, Strin g url, |
234 long timestamp, float score) { | 262 long timestamp, float score) { |
235 int position = suggestions.size(); | 263 int position = suggestions.size(); |
236 suggestions.add(new SnippetArticle( | 264 suggestions.add(new SnippetArticle( |
237 category, id, title, publisher, previewText, url, timestamp, sco re, position)); | 265 category, id, title, publisher, previewText, url, timestamp, sco re)); |
238 return suggestions.get(position); | 266 return suggestions.get(position); |
239 } | 267 } |
240 | 268 |
241 @CalledByNative | 269 @CalledByNative |
242 private static void setAssetDownloadDataForSuggestion( | 270 private static void setAssetDownloadDataForSuggestion( |
243 SnippetArticle suggestion, String filePath, String mimeType) { | 271 SnippetArticle suggestion, String filePath, String mimeType) { |
244 suggestion.setAssetDownloadData(filePath, mimeType); | 272 suggestion.setAssetDownloadData(filePath, mimeType); |
245 } | 273 } |
246 | 274 |
247 @CalledByNative | 275 @CalledByNative |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
321 float score); | 349 float score); |
322 private native void nativeOnMoreButtonShown( | 350 private native void nativeOnMoreButtonShown( |
323 long nativeNTPSnippetsBridge, int category, int position); | 351 long nativeNTPSnippetsBridge, int category, int position); |
324 private native void nativeOnMoreButtonClicked( | 352 private native void nativeOnMoreButtonClicked( |
325 long nativeNTPSnippetsBridge, int category, int position); | 353 long nativeNTPSnippetsBridge, int category, int position); |
326 private native void nativeOnActivityWarmResumed(long nativeNTPSnippetsBridge ); | 354 private native void nativeOnActivityWarmResumed(long nativeNTPSnippetsBridge ); |
327 private native void nativeOnColdStart(long nativeNTPSnippetsBridge); | 355 private native void nativeOnColdStart(long nativeNTPSnippetsBridge); |
328 private static native void nativeOnSuggestionTargetVisited(int category, lon g visitTimeMs); | 356 private static native void nativeOnSuggestionTargetVisited(int category, lon g visitTimeMs); |
329 private static native void nativeOnNTPInitialized(long nativeNTPSnippetsBrid ge); | 357 private static native void nativeOnNTPInitialized(long nativeNTPSnippetsBrid ge); |
330 } | 358 } |
OLD | NEW |