Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / android / java / src / org / chromium / chrome / browser / contextmenu / ChromeContextMenuPopulator.java
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.
4
5 package org.chromium.chrome.browser.contextmenu;
6
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;
13
14 import org.chromium.chrome.R;
15 import org.chromium.chrome.browser.UrlUtilities;
16 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
17
18 /**
19  * A {@link ContextMenuPopulator} used for showing the default Chrome context menu.
20  */
21 public class ChromeContextMenuPopulator implements ContextMenuPopulator {
22     private final ChromeContextMenuItemDelegate mDelegate;
23     private MenuInflater mMenuInflater;
24     private static final String BLANK_URL = "about:blank";
25
26     /**
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.
30      */
31     public ChromeContextMenuPopulator(ChromeContextMenuItemDelegate delegate) {
32         mDelegate = delegate;
33     }
34
35     @Override
36     public boolean shouldShowContextMenu(ContextMenuParams params) {
37         return params != null && (params.isAnchor() || params.isEditable() || params.isImage()
38                 || params.isSelectedText() || params.isVideo() || params.isCustomMenu());
39     }
40
41     @Override
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());
45
46         if (mMenuInflater == null) mMenuInflater = new MenuInflater(context);
47
48         mMenuInflater.inflate(R.menu.chrome_context_menu, menu);
49
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());
53
54         if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) {
55             menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(false);
56         }
57
58         if (params.getLinkText().trim().isEmpty()) {
59             menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false);
60         }
61
62         if (MailTo.isMailTo(params.getLinkUrl())) {
63             menu.findItem(R.id.contextmenu_copy_link_address_text).setVisible(false);
64         } else {
65             menu.findItem(R.id.contextmenu_copy_email_address).setVisible(false);
66         }
67
68         menu.findItem(R.id.contextmenu_save_link_as).setVisible(
69                 UrlUtilities.isDownloadableScheme(params.getLinkUrl()));
70
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()));
77
78             if (mDelegate.canLoadOriginalImage()) {
79                 menu.findItem(R.id.contextmenu_open_image_in_new_tab).setVisible(false);
80             } else {
81                 menu.findItem(R.id.contextmenu_open_original_image_in_new_tab).setVisible(false);
82             }
83
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);
87             }
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;
94
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()));
101             }
102
103             menu.findItem(R.id.contextmenu_copy_image).setVisible(
104                     Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN);
105         }
106     }
107
108     @Override
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);
129             }
130         } else if (itemId == R.id.contextmenu_save_link_as) {
131             if (mDelegate.startDownload(params.getUnfilteredLinkUrl(), true)) {
132                 helper.startContextMenuDownload(true);
133             }
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);
140         } else {
141             assert false;
142         }
143
144         return true;
145     }
146 }