1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.chrome.browser.contextmenu;
7 import android.content.Context;
8 import android.net.MailTo;
9 import android.os.Build;
10 import android.text.TextUtils;
11 import android.view.ContextMenu;
12 import android.view.MenuInflater;
14 import org.chromium.chrome.R;
15 import org.chromium.chrome.browser.UrlUtilities;
16 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
19 * A {@link ContextMenuPopulator} used for showing the default Chrome context menu.
21 public class ChromeContextMenuPopulator implements ContextMenuPopulator {
22 private final ChromeContextMenuItemDelegate mDelegate;
23 private MenuInflater mMenuInflater;
24 private static final String BLANK_URL = "about:blank";
27 * Builds a {@link ChromeContextMenuPopulator}.
28 * @param delegate The {@link ChromeContextMenuItemDelegate} that will be notified with actions
29 * to perform when menu items are selected.
31 public ChromeContextMenuPopulator(ChromeContextMenuItemDelegate delegate) {
36 public boolean shouldShowContextMenu(ContextMenuParams params) {
37 return params != null && (params.isAnchor() || params.isEditable() || params.isImage()
38 || params.isSelectedText() || params.isVideo() || params.isCustomMenu());
42 public void buildContextMenu(ContextMenu menu, Context context, ContextMenuParams params) {
43 if (!TextUtils.isEmpty(params.getLinkUrl()) && !params.getLinkUrl().equals(BLANK_URL))
44 menu.setHeaderTitle(params.getLinkUrl());
46 if (mMenuInflater == null) mMenuInflater = new MenuInflater(context);
48 mMenuInflater.inflate(R.menu.chrome_context_menu, menu);
50 menu.setGroupVisible(R.id.contextmenu_group_anchor, params.isAnchor());
51 menu.setGroupVisible(R.id.contextmenu_group_image, params.isImage());
52 menu.setGroupVisible(R.id.contextmenu_group_video, params.isVideo());
54 if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) {
55 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(false);
58 if (params.getLinkText().trim().isEmpty()) {
59 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false);
62 if (MailTo.isMailTo(params.getLinkUrl())) {
63 menu.findItem(R.id.contextmenu_copy_link_address_text).setVisible(false);
65 menu.findItem(R.id.contextmenu_copy_email_address).setVisible(false);
68 menu.findItem(R.id.contextmenu_save_link_as).setVisible(
69 UrlUtilities.isDownloadableScheme(params.getLinkUrl()));
71 if (params.isVideo()) {
72 menu.findItem(R.id.contextmenu_save_video).setVisible(
73 UrlUtilities.isDownloadableScheme(params.getSrcUrl()));
74 } else if (params.isImage()) {
75 menu.findItem(R.id.contextmenu_save_image).setVisible(
76 UrlUtilities.isDownloadableScheme(params.getSrcUrl()));
78 if (mDelegate.canLoadOriginalImage()) {
79 menu.findItem(R.id.contextmenu_open_image_in_new_tab).setVisible(false);
81 menu.findItem(R.id.contextmenu_open_original_image_in_new_tab).setVisible(false);
84 // Avoid showing open image option for same image which is already opened.
85 if (mDelegate.getPageUrl().equals(params.getSrcUrl())) {
86 menu.findItem(R.id.contextmenu_open_image).setVisible(false);
88 final TemplateUrlService templateUrlServiceInstance = TemplateUrlService.getInstance();
89 final boolean isSearchByImageAvailable =
90 UrlUtilities.isDownloadableScheme(params.getSrcUrl()) &&
91 templateUrlServiceInstance.isLoaded() &&
92 templateUrlServiceInstance.isSearchByImageAvailable() &&
93 templateUrlServiceInstance.getDefaultSearchEngineTemplateUrl() != null;
95 menu.findItem(R.id.contextmenu_search_by_image).setVisible(isSearchByImageAvailable);
96 if (isSearchByImageAvailable) {
97 menu.findItem(R.id.contextmenu_search_by_image).setTitle(
98 context.getString(R.string.contextmenu_search_web_for_image,
99 TemplateUrlService.getInstance().
100 getDefaultSearchEngineTemplateUrl().getShortName()));
103 menu.findItem(R.id.contextmenu_copy_image).setVisible(
104 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN);
109 public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams params, int itemId) {
110 if (itemId == R.id.contextmenu_open_in_new_tab) {
111 mDelegate.onOpenInNewTab(params.getLinkUrl(), params.getReferrer());
112 } else if (itemId == R.id.contextmenu_open_in_incognito_tab) {
113 mDelegate.onOpenInNewIncognitoTab(params.getLinkUrl());
114 } else if (itemId == R.id.contextmenu_open_image) {
115 mDelegate.onOpenImageUrl(params.getSrcUrl(), params.getReferrer());
116 } else if (itemId == R.id.contextmenu_open_image_in_new_tab ||
117 itemId == R.id.contextmenu_open_original_image_in_new_tab) {
118 mDelegate.onOpenImageInNewTab(params.getSrcUrl(), params.getReferrer());
119 } else if (itemId == R.id.contextmenu_copy_link_address_text) {
120 mDelegate.onSaveToClipboard(params.getUnfilteredLinkUrl(), true);
121 } else if (itemId == R.id.contextmenu_copy_email_address) {
122 mDelegate.onSaveToClipboard(MailTo.parse(params.getLinkUrl()).getTo(), false);
123 } else if (itemId == R.id.contextmenu_copy_link_text) {
124 mDelegate.onSaveToClipboard(params.getLinkText(), false);
125 } else if (itemId == R.id.contextmenu_save_image ||
126 itemId == R.id.contextmenu_save_video) {
127 if (mDelegate.startDownload(params.getSrcUrl(), false)) {
128 helper.startContextMenuDownload(false);
130 } else if (itemId == R.id.contextmenu_save_link_as) {
131 if (mDelegate.startDownload(params.getUnfilteredLinkUrl(), true)) {
132 helper.startContextMenuDownload(true);
134 } else if (itemId == R.id.contextmenu_search_by_image) {
135 mDelegate.onSearchByImageInNewTab();
136 } else if (itemId == R.id.contextmenu_copy_image) {
137 mDelegate.onSaveImageToClipboard(params.getSrcUrl());
138 } else if (itemId == R.id.contextmenu_copy_image_url) {
139 mDelegate.onSaveToClipboard(params.getSrcUrl(), true);