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

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

Issue 2452543005: 🏠 Merge the context menu code for NTP tiles and suggestions (Closed)
Patch Set: address comments Created 4 years, 1 month 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;
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698