| 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; |
| 11 import android.graphics.Rect; | 11 import android.graphics.Rect; |
| 12 import android.net.Uri; | 12 import android.net.Uri; |
| 13 import android.os.Build; | 13 import android.os.Build; |
| 14 import android.os.SystemClock; | 14 import android.os.SystemClock; |
| 15 import android.support.v4.view.ViewCompat; | 15 import android.support.v4.view.ViewCompat; |
| 16 import android.support.v7.widget.RecyclerView; | 16 import android.support.v7.widget.RecyclerView; |
| 17 import android.text.TextUtils; | 17 import android.text.TextUtils; |
| 18 import android.view.ContextMenu; | |
| 19 import android.view.LayoutInflater; | 18 import android.view.LayoutInflater; |
| 20 import android.view.Menu; | 19 import android.view.Menu; |
| 21 import android.view.MenuItem.OnMenuItemClickListener; | |
| 22 import android.view.View; | 20 import android.view.View; |
| 23 | 21 |
| 24 import org.chromium.base.ApiCompatibilityUtils; | 22 import org.chromium.base.ApiCompatibilityUtils; |
| 25 import org.chromium.base.Callback; | 23 import org.chromium.base.Callback; |
| 26 import org.chromium.base.CommandLine; | 24 import org.chromium.base.CommandLine; |
| 27 import org.chromium.base.Log; | 25 import org.chromium.base.Log; |
| 28 import org.chromium.base.ThreadUtils; | 26 import org.chromium.base.ThreadUtils; |
| 29 import org.chromium.base.VisibleForTesting; | 27 import org.chromium.base.VisibleForTesting; |
| 30 import org.chromium.base.metrics.RecordHistogram; | 28 import org.chromium.base.metrics.RecordHistogram; |
| 31 import org.chromium.base.metrics.RecordUserAction; | 29 import org.chromium.base.metrics.RecordUserAction; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 | 85 |
| 88 import jp.tomorrowkey.android.gifplayer.BaseGifImage; | 86 import jp.tomorrowkey.android.gifplayer.BaseGifImage; |
| 89 | 87 |
| 90 /** | 88 /** |
| 91 * Provides functionality when the user interacts with the NTP. | 89 * Provides functionality when the user interacts with the NTP. |
| 92 */ | 90 */ |
| 93 public class NewTabPage | 91 public class NewTabPage |
| 94 implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlSe
rviceObserver { | 92 implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlSe
rviceObserver { |
| 95 private static final String TAG = "NewTabPage"; | 93 private static final String TAG = "NewTabPage"; |
| 96 | 94 |
| 97 // MostVisitedItem Context menu item IDs. | |
| 98 static final int ID_OPEN_IN_NEW_WINDOW = 0; | |
| 99 static final int ID_OPEN_IN_NEW_TAB = 1; | |
| 100 static final int ID_OPEN_IN_INCOGNITO_TAB = 2; | |
| 101 static final int ID_REMOVE = 3; | |
| 102 | |
| 103 // UMA enum constants. CTA means the "click-to-action" icon. | 95 // UMA enum constants. CTA means the "click-to-action" icon. |
| 104 private static final String LOGO_SHOWN_UMA_NAME = "NewTabPage.LogoShown"; | 96 private static final String LOGO_SHOWN_UMA_NAME = "NewTabPage.LogoShown"; |
| 105 private static final int STATIC_LOGO_SHOWN = 0; | 97 private static final int STATIC_LOGO_SHOWN = 0; |
| 106 private static final int CTA_IMAGE_SHOWN = 1; | 98 private static final int CTA_IMAGE_SHOWN = 1; |
| 107 | 99 |
| 108 private static final String LOGO_CLICK_UMA_NAME = "NewTabPage.LogoClick"; | 100 private static final String LOGO_CLICK_UMA_NAME = "NewTabPage.LogoClick"; |
| 109 private static final int STATIC_LOGO_CLICKED = 0; | 101 private static final int STATIC_LOGO_CLICKED = 0; |
| 110 private static final int CTA_IMAGE_CLICKED = 1; | 102 private static final int CTA_IMAGE_CLICKED = 1; |
| 111 private static final int ANIMATED_LOGO_CLICKED = 2; | 103 private static final int ANIMATED_LOGO_CLICKED = 2; |
| 112 | 104 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_MOST_VISITED_
ENTRY); | 248 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_MOST_VISITED_
ENTRY); |
| 257 NewTabPageUma.recordExplicitUserNavigation( | 249 NewTabPageUma.recordExplicitUserNavigation( |
| 258 item.getUrl(), NewTabPageUma.RAPPOR_ACTION_VISITED_SUGGESTED
_TILE); | 250 item.getUrl(), NewTabPageUma.RAPPOR_ACTION_VISITED_SUGGESTED
_TILE); |
| 259 RecordHistogram.recordMediumTimesHistogram("NewTabPage.MostVisitedTi
me", | 251 RecordHistogram.recordMediumTimesHistogram("NewTabPage.MostVisitedTi
me", |
| 260 System.nanoTime() - mLastShownTimeNs, TimeUnit.NANOSECONDS); | 252 System.nanoTime() - mLastShownTimeNs, TimeUnit.NANOSECONDS); |
| 261 mMostVisitedSites.recordOpenedMostVisitedItem( | 253 mMostVisitedSites.recordOpenedMostVisitedItem( |
| 262 item.getIndex(), item.getTileType(), item.getSource()); | 254 item.getIndex(), item.getTileType(), item.getSource()); |
| 263 } | 255 } |
| 264 | 256 |
| 265 @Override | 257 @Override |
| 266 public void openMostVisitedItem(MostVisitedItem item) { | 258 public void openMostVisitedItem(int windowDisposition, MostVisitedItem i
tem) { |
| 267 if (mIsDestroyed) return; | 259 if (mIsDestroyed) return; |
| 268 recordOpenedMostVisitedItem(item); | 260 |
| 269 String url = item.getUrl(); | 261 String url = item.getUrl(); |
| 270 if (!switchToExistingTab(url)) { | 262 |
| 271 openUrlMostVisited(WindowOpenDisposition.CURRENT_TAB, url); | 263 // TODO(treib): Should we call recordOpenedMostVisitedItem here? |
| 264 if (windowDisposition != WindowOpenDisposition.NEW_WINDOW) { |
| 265 recordOpenedMostVisitedItem(item); |
| 272 } | 266 } |
| 267 |
| 268 if (windowDisposition == WindowOpenDisposition.CURRENT_TAB |
| 269 && switchToExistingTab(url)) { |
| 270 return; |
| 271 } |
| 272 |
| 273 openUrl(windowDisposition, new LoadUrlParams(url, PageTransition.AUT
O_BOOKMARK)); |
| 273 } | 274 } |
| 274 | 275 |
| 275 @Override | 276 @Override |
| 277 public void removeMostVisitedItem(MostVisitedItem item) { |
| 278 mMostVisitedSites.addBlacklistedUrl(item.getUrl()); |
| 279 showMostVisitedItemRemovedSnackbar(item.getUrl()); |
| 280 } |
| 281 |
| 282 @Override |
| 276 public void onLearnMoreClicked() { | 283 public void onLearnMoreClicked() { |
| 277 if (mIsDestroyed) return; | 284 if (mIsDestroyed) return; |
| 278 NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE); | 285 NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE); |
| 279 String url = "https://support.google.com/chrome/?p=new_tab"; | 286 String url = "https://support.google.com/chrome/?p=new_tab"; |
| 280 // TODO(mastiz): Change this to LINK? | 287 // TODO(mastiz): Change this to LINK? |
| 281 openUrl(WindowOpenDisposition.CURRENT_TAB, | 288 openUrl(WindowOpenDisposition.CURRENT_TAB, |
| 282 new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK)); | 289 new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK)); |
| 283 } | 290 } |
| 284 | 291 |
| 285 @TargetApi(Build.VERSION_CODES.LOLLIPOP) | 292 @TargetApi(Build.VERSION_CODES.LOLLIPOP) |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 // to filter out these history entries for NTP tiles. | 354 // to filter out these history entries for NTP tiles. |
| 348 // TODO(mastiz): Extend this with support for other categories. | 355 // TODO(mastiz): Extend this with support for other categories. |
| 349 if (article.mCategory == KnownCategories.ARTICLES) { | 356 if (article.mCategory == KnownCategories.ARTICLES) { |
| 350 loadUrlParams.setReferrer(new Referrer( | 357 loadUrlParams.setReferrer(new Referrer( |
| 351 CHROME_CONTENT_SUGGESTIONS_REFERRER, Referrer.REFERRER_P
OLICY_ALWAYS)); | 358 CHROME_CONTENT_SUGGESTIONS_REFERRER, Referrer.REFERRER_P
OLICY_ALWAYS)); |
| 352 } | 359 } |
| 353 | 360 |
| 354 openUrl(windowOpenDisposition, loadUrlParams); | 361 openUrl(windowOpenDisposition, loadUrlParams); |
| 355 } | 362 } |
| 356 | 363 |
| 357 // TODO(mastiz): Merge with openMostVisitedItem(). | |
| 358 private void openUrlMostVisited(int windowOpenDisposition, String url) { | |
| 359 openUrl(windowOpenDisposition, new LoadUrlParams(url, PageTransition
.AUTO_BOOKMARK)); | |
| 360 } | |
| 361 | |
| 362 private void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlPar
ams) { | 364 private void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlPar
ams) { |
| 363 assert !mIsDestroyed; | 365 assert !mIsDestroyed; |
| 364 switch (windowOpenDisposition) { | 366 switch (windowOpenDisposition) { |
| 365 case WindowOpenDisposition.CURRENT_TAB: | 367 case WindowOpenDisposition.CURRENT_TAB: |
| 366 mTab.loadUrl(loadUrlParams); | 368 mTab.loadUrl(loadUrlParams); |
| 367 break; | 369 break; |
| 368 case WindowOpenDisposition.NEW_FOREGROUND_TAB: | 370 case WindowOpenDisposition.NEW_FOREGROUND_TAB: |
| 369 openUrlInNewTab(loadUrlParams, false); | 371 openUrlInNewTab(loadUrlParams, false); |
| 370 break; | 372 break; |
| 371 case WindowOpenDisposition.OFF_THE_RECORD: | 373 case WindowOpenDisposition.OFF_THE_RECORD: |
| 372 openUrlInNewTab(loadUrlParams, true); | 374 openUrlInNewTab(loadUrlParams, true); |
| 373 break; | 375 break; |
| 374 case WindowOpenDisposition.NEW_WINDOW: | 376 case WindowOpenDisposition.NEW_WINDOW: |
| 375 openUrlInNewWindow(loadUrlParams); | 377 openUrlInNewWindow(loadUrlParams); |
| 376 break; | 378 break; |
| 377 case WindowOpenDisposition.SAVE_TO_DISK: | 379 case WindowOpenDisposition.SAVE_TO_DISK: |
| 378 saveUrlForOffline(loadUrlParams.getUrl()); | 380 saveUrlForOffline(loadUrlParams.getUrl()); |
| 379 break; | 381 break; |
| 380 default: | 382 default: |
| 381 assert false; | 383 assert false; |
| 382 } | 384 } |
| 383 } | 385 } |
| 384 | 386 |
| 385 @Override | 387 @Override |
| 386 public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListene
r listener) { | |
| 387 if (mIsDestroyed) return; | |
| 388 if (isOpenInNewWindowEnabled()) { | |
| 389 menu.add(Menu.NONE, ID_OPEN_IN_NEW_WINDOW, Menu.NONE, | |
| 390 R.string.contextmenu_open_in_other_window) | |
| 391 .setOnMenuItemClickListener(listener); | |
| 392 } | |
| 393 menu.add(Menu.NONE, ID_OPEN_IN_NEW_TAB, Menu.NONE, R.string.contextm
enu_open_in_new_tab) | |
| 394 .setOnMenuItemClickListener(listener); | |
| 395 if (isOpenInIncognitoEnabled()) { | |
| 396 menu.add(Menu.NONE, ID_OPEN_IN_INCOGNITO_TAB, Menu.NONE, | |
| 397 R.string.contextmenu_open_in_incognito_tab).setOnMenuIte
mClickListener( | |
| 398 listener); | |
| 399 } | |
| 400 menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove) | |
| 401 .setOnMenuItemClickListener(listener); | |
| 402 } | |
| 403 | |
| 404 @Override | |
| 405 public boolean onMenuItemClick(int menuId, MostVisitedItem item) { | |
| 406 if (mIsDestroyed) return false; | |
| 407 switch (menuId) { | |
| 408 case ID_OPEN_IN_NEW_WINDOW: | |
| 409 // TODO(treib): Should we call recordOpenedMostVisitedItem h
ere? | |
| 410 openUrlMostVisited(WindowOpenDisposition.NEW_WINDOW, item.ge
tUrl()); | |
| 411 return true; | |
| 412 case ID_OPEN_IN_NEW_TAB: | |
| 413 recordOpenedMostVisitedItem(item); | |
| 414 openUrlMostVisited(WindowOpenDisposition.NEW_FOREGROUND_TAB,
item.getUrl()); | |
| 415 return true; | |
| 416 case ID_OPEN_IN_INCOGNITO_TAB: | |
| 417 recordOpenedMostVisitedItem(item); | |
| 418 openUrlMostVisited(WindowOpenDisposition.OFF_THE_RECORD, ite
m.getUrl()); | |
| 419 return true; | |
| 420 case ID_REMOVE: | |
| 421 mMostVisitedSites.addBlacklistedUrl(item.getUrl()); | |
| 422 showMostVisitedItemRemovedSnackbar(item.getUrl()); | |
| 423 return true; | |
| 424 default: | |
| 425 return false; | |
| 426 } | |
| 427 } | |
| 428 | |
| 429 @Override | |
| 430 public boolean isOpenInNewWindowEnabled() { | 388 public boolean isOpenInNewWindowEnabled() { |
| 431 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(m
Activity); | 389 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(m
Activity); |
| 432 } | 390 } |
| 433 | 391 |
| 434 @Override | 392 @Override |
| 435 public boolean isOpenInIncognitoEnabled() { | 393 public boolean isOpenInIncognitoEnabled() { |
| 436 return PrefServiceBridge.getInstance().isIncognitoModeEnabled(); | 394 return PrefServiceBridge.getInstance().isIncognitoModeEnabled(); |
| 437 } | 395 } |
| 438 | 396 |
| 439 private void openUrlInNewWindow(LoadUrlParams loadUrlParams) { | 397 private void openUrlInNewWindow(LoadUrlParams loadUrlParams) { |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 @Override | 986 @Override |
| 1029 public boolean shouldCaptureThumbnail() { | 987 public boolean shouldCaptureThumbnail() { |
| 1030 return mNewTabPageView.shouldCaptureThumbnail(); | 988 return mNewTabPageView.shouldCaptureThumbnail(); |
| 1031 } | 989 } |
| 1032 | 990 |
| 1033 @Override | 991 @Override |
| 1034 public void captureThumbnail(Canvas canvas) { | 992 public void captureThumbnail(Canvas canvas) { |
| 1035 mNewTabPageView.captureThumbnail(canvas); | 993 mNewTabPageView.captureThumbnail(canvas); |
| 1036 } | 994 } |
| 1037 } | 995 } |
| OLD | NEW |