| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |