1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)package org.chromium.chrome.browser.contextmenu;
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.content.Context;
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.net.MailTo;
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.os.Build;
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.text.TextUtils;
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.view.ContextMenu;
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.view.MenuInflater;
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.chrome.R;
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.chrome.browser.UrlUtilities;
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.chrome.browser.search_engines.TemplateUrlService;
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A {@link ContextMenuPopulator} used for showing the default Chrome context menu.
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)public class ChromeContextMenuPopulator implements ContextMenuPopulator {
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private final ChromeContextMenuItemDelegate mDelegate;
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private MenuInflater mMenuInflater;
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static final String BLANK_URL = "about:blank";
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    /**
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     * Builds a {@link ChromeContextMenuPopulator}.
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     * @param delegate The {@link ChromeContextMenuItemDelegate} that will be notified with actions
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     *                 to perform when menu items are selected.
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     */
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    public ChromeContextMenuPopulator(ChromeContextMenuItemDelegate delegate) {
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mDelegate = delegate;
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    @Override
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    public boolean shouldShowContextMenu(ContextMenuParams params) {
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return params != null && (params.isAnchor() || params.isEditable() || params.isImage()
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                || params.isSelectedText() || params.isVideo() || params.isCustomMenu());
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    @Override
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    public void buildContextMenu(ContextMenu menu, Context context, ContextMenuParams params) {
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!TextUtils.isEmpty(params.getLinkUrl()) && !params.getLinkUrl().equals(BLANK_URL))
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                menu.setHeaderTitle(params.getLinkUrl());
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (mMenuInflater == null) mMenuInflater = new MenuInflater(context);
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mMenuInflater.inflate(R.menu.chrome_context_menu, menu);
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        menu.setGroupVisible(R.id.contextmenu_group_anchor, params.isAnchor());
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        menu.setGroupVisible(R.id.contextmenu_group_image, params.isImage());
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        menu.setGroupVisible(R.id.contextmenu_group_video, params.isVideo());
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) {
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(false);
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (params.getLinkText().trim().isEmpty()) {
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false);
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (MailTo.isMailTo(params.getLinkUrl())) {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            menu.findItem(R.id.contextmenu_copy_link_address_text).setVisible(false);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } else {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            menu.findItem(R.id.contextmenu_copy_email_address).setVisible(false);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        menu.findItem(R.id.contextmenu_save_link_as).setVisible(
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                UrlUtilities.isDownloadableScheme(params.getLinkUrl()));
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (params.isVideo()) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            menu.findItem(R.id.contextmenu_save_video).setVisible(
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    UrlUtilities.isDownloadableScheme(params.getSrcUrl()));
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (params.isImage()) {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            menu.findItem(R.id.contextmenu_save_image).setVisible(
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    UrlUtilities.isDownloadableScheme(params.getSrcUrl()));
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            if (mDelegate.canLoadOriginalImage()) {
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                menu.findItem(R.id.contextmenu_open_image_in_new_tab).setVisible(false);
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            } else {
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                menu.findItem(R.id.contextmenu_open_original_image_in_new_tab).setVisible(false);
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            }
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            // Avoid showing open image option for same image which is already opened.
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            if (mDelegate.getPageUrl().equals(params.getSrcUrl())) {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                menu.findItem(R.id.contextmenu_open_image).setVisible(false);
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            }
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            final TemplateUrlService templateUrlServiceInstance = TemplateUrlService.getInstance();
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            final boolean isSearchByImageAvailable =
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    UrlUtilities.isDownloadableScheme(params.getSrcUrl()) &&
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            templateUrlServiceInstance.isLoaded() &&
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            templateUrlServiceInstance.isSearchByImageAvailable() &&
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            templateUrlServiceInstance.getDefaultSearchEngineTemplateUrl() != null;
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            menu.findItem(R.id.contextmenu_search_by_image).setVisible(isSearchByImageAvailable);
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if (isSearchByImageAvailable) {
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                menu.findItem(R.id.contextmenu_search_by_image).setTitle(
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        context.getString(R.string.contextmenu_search_web_for_image,
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                TemplateUrlService.getInstance().
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        getDefaultSearchEngineTemplateUrl().getShortName()));
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            }
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            menu.findItem(R.id.contextmenu_copy_image).setVisible(
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN);
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    @Override
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams params, int itemId) {
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (itemId == R.id.contextmenu_open_in_new_tab) {
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            mDelegate.onOpenInNewTab(params.getLinkUrl(), params.getReferrer());
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_open_in_incognito_tab) {
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mDelegate.onOpenInNewIncognitoTab(params.getLinkUrl());
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_open_image) {
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            mDelegate.onOpenImageUrl(params.getSrcUrl(), params.getReferrer());
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_open_image_in_new_tab ||
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                itemId == R.id.contextmenu_open_original_image_in_new_tab) {
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            mDelegate.onOpenImageInNewTab(params.getSrcUrl(), params.getReferrer());
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_copy_link_address_text) {
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mDelegate.onSaveToClipboard(params.getUnfilteredLinkUrl(), true);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } else if (itemId == R.id.contextmenu_copy_email_address) {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mDelegate.onSaveToClipboard(MailTo.parse(params.getLinkUrl()).getTo(), false);
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_copy_link_text) {
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mDelegate.onSaveToClipboard(params.getLinkText(), false);
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_save_image ||
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                itemId == R.id.contextmenu_save_video) {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (mDelegate.startDownload(params.getSrcUrl(), false)) {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                helper.startContextMenuDownload(false);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_save_link_as) {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (mDelegate.startDownload(params.getUnfilteredLinkUrl(), true)) {
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                helper.startContextMenuDownload(true);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_search_by_image) {
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mDelegate.onSearchByImageInNewTab();
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (itemId == R.id.contextmenu_copy_image) {
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mDelegate.onSaveImageToClipboard(params.getSrcUrl());
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        } else if (itemId == R.id.contextmenu_copy_image_url) {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            mDelegate.onSaveToClipboard(params.getSrcUrl(), true);
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else {
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            assert false;
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return true;
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
147