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