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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |