Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java

Issue 2338133006: [NTP] Fix article suggestion clicks contributing to Most Visited tiles (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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; 5 package org.chromium.chrome.browser.ntp;
6 6
7 import android.annotation.TargetApi; 7 import android.annotation.TargetApi;
8 import android.content.Context; 8 import android.content.Context;
9 import android.graphics.Canvas; 9 import android.graphics.Canvas;
10 import android.graphics.Point; 10 import android.graphics.Point;
(...skipping 27 matching lines...) Expand all
38 import org.chromium.chrome.browser.favicon.FaviconHelper; 38 import org.chromium.chrome.browser.favicon.FaviconHelper;
39 import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback; 39 import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
40 import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallbac k; 40 import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallbac k;
41 import org.chromium.chrome.browser.favicon.LargeIconBridge; 41 import org.chromium.chrome.browser.favicon.LargeIconBridge;
42 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; 42 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
43 import org.chromium.chrome.browser.metrics.StartupMetrics; 43 import org.chromium.chrome.browser.metrics.StartupMetrics;
44 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; 44 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
45 import org.chromium.chrome.browser.ntp.LogoBridge.Logo; 45 import org.chromium.chrome.browser.ntp.LogoBridge.Logo;
46 import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver; 46 import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver;
47 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; 47 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
48 import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
48 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; 49 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
49 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; 50 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
50 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig; 51 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
51 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; 52 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
52 import org.chromium.chrome.browser.preferences.PrefServiceBridge; 53 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
53 import org.chromium.chrome.browser.profiles.MostVisitedSites; 54 import org.chromium.chrome.browser.profiles.MostVisitedSites;
54 import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObse rver; 55 import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObse rver;
55 import org.chromium.chrome.browser.profiles.Profile; 56 import org.chromium.chrome.browser.profiles.Profile;
56 import org.chromium.chrome.browser.search_engines.TemplateUrlService; 57 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
57 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ServiceObserver; 58 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ServiceObserver;
58 import org.chromium.chrome.browser.snackbar.Snackbar; 59 import org.chromium.chrome.browser.snackbar.Snackbar;
59 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; 60 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
60 import org.chromium.chrome.browser.sync.SyncSessionsMetrics; 61 import org.chromium.chrome.browser.sync.SyncSessionsMetrics;
61 import org.chromium.chrome.browser.tab.EmptyTabObserver; 62 import org.chromium.chrome.browser.tab.EmptyTabObserver;
62 import org.chromium.chrome.browser.tab.Tab; 63 import org.chromium.chrome.browser.tab.Tab;
63 import org.chromium.chrome.browser.tab.TabObserver; 64 import org.chromium.chrome.browser.tab.TabObserver;
64 import org.chromium.chrome.browser.tabmodel.TabModel; 65 import org.chromium.chrome.browser.tabmodel.TabModel;
65 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; 66 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
66 import org.chromium.chrome.browser.tabmodel.TabModelSelector; 67 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
67 import org.chromium.chrome.browser.tabmodel.TabModelUtils; 68 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
68 import org.chromium.chrome.browser.tabmodel.document.TabDelegate; 69 import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
69 import org.chromium.chrome.browser.util.UrlUtilities; 70 import org.chromium.chrome.browser.util.UrlUtilities;
70 import org.chromium.content_public.browser.LoadUrlParams; 71 import org.chromium.content_public.browser.LoadUrlParams;
72 import org.chromium.content_public.common.Referrer;
71 import org.chromium.net.NetworkChangeNotifier; 73 import org.chromium.net.NetworkChangeNotifier;
72 import org.chromium.ui.WindowOpenDisposition; 74 import org.chromium.ui.WindowOpenDisposition;
73 import org.chromium.ui.base.DeviceFormFactor; 75 import org.chromium.ui.base.DeviceFormFactor;
74 import org.chromium.ui.base.PageTransition; 76 import org.chromium.ui.base.PageTransition;
75 77
76 import java.util.HashSet; 78 import java.util.HashSet;
77 import java.util.Set; 79 import java.util.Set;
78 import java.util.concurrent.TimeUnit; 80 import java.util.concurrent.TimeUnit;
79 81
80 import jp.tomorrowkey.android.gifplayer.BaseGifImage; 82 import jp.tomorrowkey.android.gifplayer.BaseGifImage;
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 mMostVisitedSites.recordOpenedMostVisitedItem( 234 mMostVisitedSites.recordOpenedMostVisitedItem(
233 item.getIndex(), item.getTileType(), item.getSource()); 235 item.getIndex(), item.getTileType(), item.getSource());
234 } 236 }
235 237
236 @Override 238 @Override
237 public void openMostVisitedItem(MostVisitedItem item) { 239 public void openMostVisitedItem(MostVisitedItem item) {
238 if (mIsDestroyed) return; 240 if (mIsDestroyed) return;
239 recordOpenedMostVisitedItem(item); 241 recordOpenedMostVisitedItem(item);
240 String url = item.getUrl(); 242 String url = item.getUrl();
241 if (!switchToExistingTab(url)) { 243 if (!switchToExistingTab(url)) {
242 openUrl(WindowOpenDisposition.CURRENT_TAB, url); 244 openUrlMostVisited(WindowOpenDisposition.CURRENT_TAB, url);
243 } 245 }
244 } 246 }
245 247
246 @Override 248 @Override
247 public void onLearnMoreClicked() { 249 public void onLearnMoreClicked() {
248 if (mIsDestroyed) return; 250 if (mIsDestroyed) return;
249 NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE); 251 NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE);
250 String url = "https://support.google.com/chrome/?p=new_tab"; 252 String url = "https://support.google.com/chrome/?p=new_tab";
251 openUrl(WindowOpenDisposition.CURRENT_TAB, url); 253 // TODO(mastiz): Change this to LINK?
254 openUrl(WindowOpenDisposition.CURRENT_TAB,
255 new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK));
252 } 256 }
253 257
254 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 258 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
255 private boolean switchToExistingTab(String url) { 259 private boolean switchToExistingTab(String url) {
256 String matchPattern = CommandLine.getInstance().getSwitchValue( 260 String matchPattern = CommandLine.getInstance().getSwitchValue(
257 ChromeSwitches.NTP_SWITCH_TO_EXISTING_TAB); 261 ChromeSwitches.NTP_SWITCH_TO_EXISTING_TAB);
258 boolean matchByHost; 262 boolean matchByHost;
259 if ("url".equals(matchPattern)) { 263 if ("url".equals(matchPattern)) {
260 matchByHost = false; 264 matchByHost = false;
261 } else if ("host".equals(matchPattern)) { 265 } else if ("host".equals(matchPattern)) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 public void trackSnippetCategoryActionClick(int category, int position) { 309 public void trackSnippetCategoryActionClick(int category, int position) {
306 mSnippetsBridge.onMoreButtonClicked(category, position); 310 mSnippetsBridge.onMoreButtonClicked(category, position);
307 } 311 }
308 312
309 @Override 313 @Override
310 public void openSnippet(int windowOpenDisposition, SnippetArticle articl e) { 314 public void openSnippet(int windowOpenDisposition, SnippetArticle articl e) {
311 mSnippetsBridge.onSuggestionOpened(article.mGlobalPosition, article. mCategory, 315 mSnippetsBridge.onSuggestionOpened(article.mGlobalPosition, article. mCategory,
312 article.mPosition, article.mPublishTimestampMilliseconds, ar ticle.mScore, 316 article.mPosition, article.mPublishTimestampMilliseconds, ar ticle.mScore,
313 windowOpenDisposition); 317 windowOpenDisposition);
314 NewTabPageUma.monitorContentSuggestionVisit(mTab, article.mCategory) ; 318 NewTabPageUma.monitorContentSuggestionVisit(mTab, article.mCategory) ;
315 openUrl(windowOpenDisposition, article.mUrl); 319 LoadUrlParams loadUrlParams =
320 new LoadUrlParams(article.mUrl, PageTransition.AUTO_BOOKMARK );
321
322 // For article suggestions, we set the referrer. This is exploited
323 // to filter out these history entries for NTP tiles.
324 if (article.mCategory == KnownCategories.ARTICLES) {
Marc Treib 2016/09/15 14:31:22 In the longer term, we need to decide for which ca
mastiz 2016/09/15 14:37:56 Acknowledged. I can a switch statement if you want
Marc Treib 2016/09/15 14:50:55 It can't be a switch, because remote categories ar
mastiz 2016/09/15 15:06:16 Done.
325 loadUrlParams.setReferrer(
326 new Referrer("https://www.googleapis.com/auth/chrome-con tent-suggestions",
Bernhard Bauer 2016/09/15 15:10:52 Can you make this a constant?
Marc Treib 2016/09/15 15:19:21 Ah, actually one more nit: This is the scope for O
mastiz 2016/09/15 15:31:57 Acknowledged. Although you're right about the usef
mastiz 2016/09/15 15:31:57 Done.
327 Referrer.REFERRER_POLICY_ALWAYS));
328 }
329
330 openUrl(windowOpenDisposition, loadUrlParams);
316 } 331 }
317 332
318 private void openUrl(int windowOpenDisposition, String url) { 333 // TODO(mastiz): Merge with openMostVisitedItem().
334 private void openUrlMostVisited(int windowOpenDisposition, String url) {
335 openUrl(windowOpenDisposition, new LoadUrlParams(url, PageTransition .AUTO_BOOKMARK));
336 }
337
338 private void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlPar ams) {
319 assert !mIsDestroyed; 339 assert !mIsDestroyed;
320 switch (windowOpenDisposition) { 340 switch (windowOpenDisposition) {
321 case WindowOpenDisposition.CURRENT_TAB: 341 case WindowOpenDisposition.CURRENT_TAB:
322 mTab.loadUrl(new LoadUrlParams(url, PageTransition.AUTO_BOOK MARK)); 342 mTab.loadUrl(loadUrlParams);
323 break; 343 break;
324 case WindowOpenDisposition.NEW_FOREGROUND_TAB: 344 case WindowOpenDisposition.NEW_FOREGROUND_TAB:
325 openUrlInNewTab(url, false); 345 openUrlInNewTab(loadUrlParams, false);
326 break; 346 break;
327 case WindowOpenDisposition.OFF_THE_RECORD: 347 case WindowOpenDisposition.OFF_THE_RECORD:
328 openUrlInNewTab(url, true); 348 openUrlInNewTab(loadUrlParams, true);
329 break; 349 break;
330 case WindowOpenDisposition.NEW_WINDOW: 350 case WindowOpenDisposition.NEW_WINDOW:
331 openUrlInNewWindow(url); 351 openUrlInNewWindow(loadUrlParams);
332 break; 352 break;
333 case WindowOpenDisposition.SAVE_TO_DISK: 353 case WindowOpenDisposition.SAVE_TO_DISK:
334 saveUrlForOffline(url); 354 saveUrlForOffline(loadUrlParams.getUrl());
335 break; 355 break;
336 default: 356 default:
337 assert false; 357 assert false;
338 } 358 }
339 } 359 }
340 360
341 @Override 361 @Override
342 public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListene r listener) { 362 public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListene r listener) {
343 if (mIsDestroyed) return; 363 if (mIsDestroyed) return;
344 if (isOpenInNewWindowEnabled()) { 364 if (isOpenInNewWindowEnabled()) {
(...skipping 11 matching lines...) Expand all
356 menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove) 376 menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove)
357 .setOnMenuItemClickListener(listener); 377 .setOnMenuItemClickListener(listener);
358 } 378 }
359 379
360 @Override 380 @Override
361 public boolean onMenuItemClick(int menuId, MostVisitedItem item) { 381 public boolean onMenuItemClick(int menuId, MostVisitedItem item) {
362 if (mIsDestroyed) return false; 382 if (mIsDestroyed) return false;
363 switch (menuId) { 383 switch (menuId) {
364 case ID_OPEN_IN_NEW_WINDOW: 384 case ID_OPEN_IN_NEW_WINDOW:
365 // TODO(treib): Should we call recordOpenedMostVisitedItem h ere? 385 // TODO(treib): Should we call recordOpenedMostVisitedItem h ere?
366 openUrl(WindowOpenDisposition.NEW_WINDOW, item.getUrl()); 386 openUrlMostVisited(WindowOpenDisposition.NEW_WINDOW, item.ge tUrl());
367 return true; 387 return true;
368 case ID_OPEN_IN_NEW_TAB: 388 case ID_OPEN_IN_NEW_TAB:
369 recordOpenedMostVisitedItem(item); 389 recordOpenedMostVisitedItem(item);
370 openUrl(WindowOpenDisposition.NEW_FOREGROUND_TAB, item.getUr l()); 390 openUrlMostVisited(WindowOpenDisposition.NEW_FOREGROUND_TAB, item.getUrl());
371 return true; 391 return true;
372 case ID_OPEN_IN_INCOGNITO_TAB: 392 case ID_OPEN_IN_INCOGNITO_TAB:
373 recordOpenedMostVisitedItem(item); 393 recordOpenedMostVisitedItem(item);
374 openUrl(WindowOpenDisposition.OFF_THE_RECORD, item.getUrl()) ; 394 openUrlMostVisited(WindowOpenDisposition.OFF_THE_RECORD, ite m.getUrl());
375 return true; 395 return true;
376 case ID_REMOVE: 396 case ID_REMOVE:
377 mMostVisitedSites.addBlacklistedUrl(item.getUrl()); 397 mMostVisitedSites.addBlacklistedUrl(item.getUrl());
378 showMostVisitedItemRemovedSnackbar(item.getUrl()); 398 showMostVisitedItemRemovedSnackbar(item.getUrl());
379 return true; 399 return true;
380 default: 400 default:
381 return false; 401 return false;
382 } 402 }
383 } 403 }
384 404
385 @Override 405 @Override
386 public boolean isOpenInNewWindowEnabled() { 406 public boolean isOpenInNewWindowEnabled() {
387 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(m Activity); 407 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(m Activity);
388 } 408 }
389 409
390 @Override 410 @Override
391 public boolean isOpenInIncognitoEnabled() { 411 public boolean isOpenInIncognitoEnabled() {
392 return PrefServiceBridge.getInstance().isIncognitoModeEnabled(); 412 return PrefServiceBridge.getInstance().isIncognitoModeEnabled();
393 } 413 }
394 414
395 private void openUrlInNewWindow(String url) { 415 private void openUrlInNewWindow(LoadUrlParams loadUrlParams) {
396 TabDelegate tabDelegate = new TabDelegate(false); 416 TabDelegate tabDelegate = new TabDelegate(false);
397 // TODO(treib): Should this use PageTransition.AUTO_BOOKMARK?
398 LoadUrlParams loadUrlParams = new LoadUrlParams(url);
399 tabDelegate.createTabInOtherWindow(loadUrlParams, mActivity, mTab.ge tParentId()); 417 tabDelegate.createTabInOtherWindow(loadUrlParams, mActivity, mTab.ge tParentId());
400 } 418 }
401 419
402 private void openUrlInNewTab(String url, boolean incognito) { 420 private void openUrlInNewTab(LoadUrlParams loadUrlParams, boolean incogn ito) {
403 mTabModelSelector.openNewTab(new LoadUrlParams(url, PageTransition.A UTO_BOOKMARK), 421 mTabModelSelector.openNewTab(
404 TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, incognito); 422 loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab , incognito);
405 } 423 }
406 424
407 private void saveUrlForOffline(String url) { 425 private void saveUrlForOffline(String url) {
408 OfflinePageBridge.getForProfile(mProfile) 426 OfflinePageBridge.getForProfile(mProfile)
409 .savePageLater(url, "ntp_suggestions", true /* userRequested */); 427 .savePageLater(url, "ntp_suggestions", true /* userRequested */);
410 } 428 }
411 429
412 @Override 430 @Override
413 public void navigateToBookmarks() { 431 public void navigateToBookmarks() {
414 if (mIsDestroyed) return; 432 if (mIsDestroyed) return;
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
914 @Override 932 @Override
915 public boolean shouldCaptureThumbnail() { 933 public boolean shouldCaptureThumbnail() {
916 return mNewTabPageView.shouldCaptureThumbnail(); 934 return mNewTabPageView.shouldCaptureThumbnail();
917 } 935 }
918 936
919 @Override 937 @Override
920 public void captureThumbnail(Canvas canvas) { 938 public void captureThumbnail(Canvas canvas) {
921 mNewTabPageView.captureThumbnail(canvas); 939 mNewTabPageView.captureThumbnail(canvas);
922 } 940 }
923 } 941 }
OLDNEW
« no previous file with comments | « no previous file | components/history/core/browser/history_backend.h » ('j') | components/history/core/browser/history_backend.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698