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

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: Updated trivial occurrence in unit test. 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
« no previous file with comments | « no previous file | chrome/browser/history/history_tab_helper.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 13 matching lines...) Expand all
94 // UMA enum constants. CTA means the "click-to-action" icon. 96 // UMA enum constants. CTA means the "click-to-action" icon.
95 private static final String LOGO_SHOWN_UMA_NAME = "NewTabPage.LogoShown"; 97 private static final String LOGO_SHOWN_UMA_NAME = "NewTabPage.LogoShown";
96 private static final int STATIC_LOGO_SHOWN = 0; 98 private static final int STATIC_LOGO_SHOWN = 0;
97 private static final int CTA_IMAGE_SHOWN = 1; 99 private static final int CTA_IMAGE_SHOWN = 1;
98 100
99 private static final String LOGO_CLICK_UMA_NAME = "NewTabPage.LogoClick"; 101 private static final String LOGO_CLICK_UMA_NAME = "NewTabPage.LogoClick";
100 private static final int STATIC_LOGO_CLICKED = 0; 102 private static final int STATIC_LOGO_CLICKED = 0;
101 private static final int CTA_IMAGE_CLICKED = 1; 103 private static final int CTA_IMAGE_CLICKED = 1;
102 private static final int ANIMATED_LOGO_CLICKED = 2; 104 private static final int ANIMATED_LOGO_CLICKED = 2;
103 105
106 private static final String CHROME_CONTENT_SUGGESTIONS_REFERRER =
107 "https://www.googleapis.com/auth/chrome-content-suggestions";
108
104 private static MostVisitedSites sMostVisitedSitesForTests; 109 private static MostVisitedSites sMostVisitedSitesForTests;
105 110
106 private final Tab mTab; 111 private final Tab mTab;
107 private final TabModelSelector mTabModelSelector; 112 private final TabModelSelector mTabModelSelector;
108 private final ChromeActivity mActivity; 113 private final ChromeActivity mActivity;
109 114
110 private final Profile mProfile; 115 private final Profile mProfile;
111 private final String mTitle; 116 private final String mTitle;
112 private final int mBackgroundColor; 117 private final int mBackgroundColor;
113 private final int mThemeColor; 118 private final int mThemeColor;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 mMostVisitedSites.recordOpenedMostVisitedItem( 237 mMostVisitedSites.recordOpenedMostVisitedItem(
233 item.getIndex(), item.getTileType(), item.getSource()); 238 item.getIndex(), item.getTileType(), item.getSource());
234 } 239 }
235 240
236 @Override 241 @Override
237 public void openMostVisitedItem(MostVisitedItem item) { 242 public void openMostVisitedItem(MostVisitedItem item) {
238 if (mIsDestroyed) return; 243 if (mIsDestroyed) return;
239 recordOpenedMostVisitedItem(item); 244 recordOpenedMostVisitedItem(item);
240 String url = item.getUrl(); 245 String url = item.getUrl();
241 if (!switchToExistingTab(url)) { 246 if (!switchToExistingTab(url)) {
242 openUrl(WindowOpenDisposition.CURRENT_TAB, url); 247 openUrlMostVisited(WindowOpenDisposition.CURRENT_TAB, url);
243 } 248 }
244 } 249 }
245 250
246 @Override 251 @Override
247 public void onLearnMoreClicked() { 252 public void onLearnMoreClicked() {
248 if (mIsDestroyed) return; 253 if (mIsDestroyed) return;
249 NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE); 254 NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE);
250 String url = "https://support.google.com/chrome/?p=new_tab"; 255 String url = "https://support.google.com/chrome/?p=new_tab";
251 openUrl(WindowOpenDisposition.CURRENT_TAB, url); 256 // TODO(mastiz): Change this to LINK?
257 openUrl(WindowOpenDisposition.CURRENT_TAB,
258 new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK));
252 } 259 }
253 260
254 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 261 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
255 private boolean switchToExistingTab(String url) { 262 private boolean switchToExistingTab(String url) {
256 String matchPattern = CommandLine.getInstance().getSwitchValue( 263 String matchPattern = CommandLine.getInstance().getSwitchValue(
257 ChromeSwitches.NTP_SWITCH_TO_EXISTING_TAB); 264 ChromeSwitches.NTP_SWITCH_TO_EXISTING_TAB);
258 boolean matchByHost; 265 boolean matchByHost;
259 if ("url".equals(matchPattern)) { 266 if ("url".equals(matchPattern)) {
260 matchByHost = false; 267 matchByHost = false;
261 } else if ("host".equals(matchPattern)) { 268 } 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) { 312 public void trackSnippetCategoryActionClick(int category, int position) {
306 mSnippetsBridge.onMoreButtonClicked(category, position); 313 mSnippetsBridge.onMoreButtonClicked(category, position);
307 } 314 }
308 315
309 @Override 316 @Override
310 public void openSnippet(int windowOpenDisposition, SnippetArticle articl e) { 317 public void openSnippet(int windowOpenDisposition, SnippetArticle articl e) {
311 mSnippetsBridge.onSuggestionOpened(article.mGlobalPosition, article. mCategory, 318 mSnippetsBridge.onSuggestionOpened(article.mGlobalPosition, article. mCategory,
312 article.mPosition, article.mPublishTimestampMilliseconds, ar ticle.mScore, 319 article.mPosition, article.mPublishTimestampMilliseconds, ar ticle.mScore,
313 windowOpenDisposition); 320 windowOpenDisposition);
314 NewTabPageUma.monitorContentSuggestionVisit(mTab, article.mCategory) ; 321 NewTabPageUma.monitorContentSuggestionVisit(mTab, article.mCategory) ;
315 openUrl(windowOpenDisposition, article.mUrl); 322 LoadUrlParams loadUrlParams =
323 new LoadUrlParams(article.mUrl, PageTransition.AUTO_BOOKMARK );
324
325 // For article suggestions, we set the referrer. This is exploited
326 // to filter out these history entries for NTP tiles.
327 // TODO(mastiz): Extend this with support for other categories.
328 if (article.mCategory == KnownCategories.ARTICLES) {
329 loadUrlParams.setReferrer(new Referrer(
330 CHROME_CONTENT_SUGGESTIONS_REFERRER, Referrer.REFERRER_P OLICY_ALWAYS));
331 }
332
333 openUrl(windowOpenDisposition, loadUrlParams);
316 } 334 }
317 335
318 private void openUrl(int windowOpenDisposition, String url) { 336 // TODO(mastiz): Merge with openMostVisitedItem().
337 private void openUrlMostVisited(int windowOpenDisposition, String url) {
338 openUrl(windowOpenDisposition, new LoadUrlParams(url, PageTransition .AUTO_BOOKMARK));
339 }
340
341 private void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlPar ams) {
319 assert !mIsDestroyed; 342 assert !mIsDestroyed;
320 switch (windowOpenDisposition) { 343 switch (windowOpenDisposition) {
321 case WindowOpenDisposition.CURRENT_TAB: 344 case WindowOpenDisposition.CURRENT_TAB:
322 mTab.loadUrl(new LoadUrlParams(url, PageTransition.AUTO_BOOK MARK)); 345 mTab.loadUrl(loadUrlParams);
323 break; 346 break;
324 case WindowOpenDisposition.NEW_FOREGROUND_TAB: 347 case WindowOpenDisposition.NEW_FOREGROUND_TAB:
325 openUrlInNewTab(url, false); 348 openUrlInNewTab(loadUrlParams, false);
326 break; 349 break;
327 case WindowOpenDisposition.OFF_THE_RECORD: 350 case WindowOpenDisposition.OFF_THE_RECORD:
328 openUrlInNewTab(url, true); 351 openUrlInNewTab(loadUrlParams, true);
329 break; 352 break;
330 case WindowOpenDisposition.NEW_WINDOW: 353 case WindowOpenDisposition.NEW_WINDOW:
331 openUrlInNewWindow(url); 354 openUrlInNewWindow(loadUrlParams);
332 break; 355 break;
333 case WindowOpenDisposition.SAVE_TO_DISK: 356 case WindowOpenDisposition.SAVE_TO_DISK:
334 saveUrlForOffline(url); 357 saveUrlForOffline(loadUrlParams.getUrl());
335 break; 358 break;
336 default: 359 default:
337 assert false; 360 assert false;
338 } 361 }
339 } 362 }
340 363
341 @Override 364 @Override
342 public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListene r listener) { 365 public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListene r listener) {
343 if (mIsDestroyed) return; 366 if (mIsDestroyed) return;
344 if (isOpenInNewWindowEnabled()) { 367 if (isOpenInNewWindowEnabled()) {
(...skipping 11 matching lines...) Expand all
356 menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove) 379 menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove)
357 .setOnMenuItemClickListener(listener); 380 .setOnMenuItemClickListener(listener);
358 } 381 }
359 382
360 @Override 383 @Override
361 public boolean onMenuItemClick(int menuId, MostVisitedItem item) { 384 public boolean onMenuItemClick(int menuId, MostVisitedItem item) {
362 if (mIsDestroyed) return false; 385 if (mIsDestroyed) return false;
363 switch (menuId) { 386 switch (menuId) {
364 case ID_OPEN_IN_NEW_WINDOW: 387 case ID_OPEN_IN_NEW_WINDOW:
365 // TODO(treib): Should we call recordOpenedMostVisitedItem h ere? 388 // TODO(treib): Should we call recordOpenedMostVisitedItem h ere?
366 openUrl(WindowOpenDisposition.NEW_WINDOW, item.getUrl()); 389 openUrlMostVisited(WindowOpenDisposition.NEW_WINDOW, item.ge tUrl());
367 return true; 390 return true;
368 case ID_OPEN_IN_NEW_TAB: 391 case ID_OPEN_IN_NEW_TAB:
369 recordOpenedMostVisitedItem(item); 392 recordOpenedMostVisitedItem(item);
370 openUrl(WindowOpenDisposition.NEW_FOREGROUND_TAB, item.getUr l()); 393 openUrlMostVisited(WindowOpenDisposition.NEW_FOREGROUND_TAB, item.getUrl());
371 return true; 394 return true;
372 case ID_OPEN_IN_INCOGNITO_TAB: 395 case ID_OPEN_IN_INCOGNITO_TAB:
373 recordOpenedMostVisitedItem(item); 396 recordOpenedMostVisitedItem(item);
374 openUrl(WindowOpenDisposition.OFF_THE_RECORD, item.getUrl()) ; 397 openUrlMostVisited(WindowOpenDisposition.OFF_THE_RECORD, ite m.getUrl());
375 return true; 398 return true;
376 case ID_REMOVE: 399 case ID_REMOVE:
377 mMostVisitedSites.addBlacklistedUrl(item.getUrl()); 400 mMostVisitedSites.addBlacklistedUrl(item.getUrl());
378 showMostVisitedItemRemovedSnackbar(item.getUrl()); 401 showMostVisitedItemRemovedSnackbar(item.getUrl());
379 return true; 402 return true;
380 default: 403 default:
381 return false; 404 return false;
382 } 405 }
383 } 406 }
384 407
385 @Override 408 @Override
386 public boolean isOpenInNewWindowEnabled() { 409 public boolean isOpenInNewWindowEnabled() {
387 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(m Activity); 410 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(m Activity);
388 } 411 }
389 412
390 @Override 413 @Override
391 public boolean isOpenInIncognitoEnabled() { 414 public boolean isOpenInIncognitoEnabled() {
392 return PrefServiceBridge.getInstance().isIncognitoModeEnabled(); 415 return PrefServiceBridge.getInstance().isIncognitoModeEnabled();
393 } 416 }
394 417
395 private void openUrlInNewWindow(String url) { 418 private void openUrlInNewWindow(LoadUrlParams loadUrlParams) {
396 TabDelegate tabDelegate = new TabDelegate(false); 419 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()); 420 tabDelegate.createTabInOtherWindow(loadUrlParams, mActivity, mTab.ge tParentId());
400 } 421 }
401 422
402 private void openUrlInNewTab(String url, boolean incognito) { 423 private void openUrlInNewTab(LoadUrlParams loadUrlParams, boolean incogn ito) {
403 mTabModelSelector.openNewTab(new LoadUrlParams(url, PageTransition.A UTO_BOOKMARK), 424 mTabModelSelector.openNewTab(
404 TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, incognito); 425 loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab , incognito);
405 } 426 }
406 427
407 private void saveUrlForOffline(String url) { 428 private void saveUrlForOffline(String url) {
408 OfflinePageBridge.getForProfile(mProfile) 429 OfflinePageBridge.getForProfile(mProfile)
409 .savePageLater(url, "ntp_suggestions", true /* userRequested */); 430 .savePageLater(url, "ntp_suggestions", true /* userRequested */);
410 } 431 }
411 432
412 @Override 433 @Override
413 public void navigateToBookmarks() { 434 public void navigateToBookmarks() {
414 if (mIsDestroyed) return; 435 if (mIsDestroyed) return;
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
914 @Override 935 @Override
915 public boolean shouldCaptureThumbnail() { 936 public boolean shouldCaptureThumbnail() {
916 return mNewTabPageView.shouldCaptureThumbnail(); 937 return mNewTabPageView.shouldCaptureThumbnail();
917 } 938 }
918 939
919 @Override 940 @Override
920 public void captureThumbnail(Canvas canvas) { 941 public void captureThumbnail(Canvas canvas) {
921 mNewTabPageView.captureThumbnail(canvas); 942 mNewTabPageView.captureThumbnail(canvas);
922 } 943 }
923 } 944 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/history/history_tab_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698