Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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.contextmenu; | 5 package org.chromium.chrome.browser.contextmenu; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.net.MailTo; | 8 import android.net.MailTo; |
| 9 import android.support.annotation.IntDef; | 9 import android.support.annotation.IntDef; |
| 10 import android.text.TextUtils; | 10 import android.text.TextUtils; |
| 11 import android.view.ContextMenu; | 11 import android.view.ContextMenu; |
| 12 import android.view.MenuInflater; | 12 import android.view.MenuInflater; |
| 13 import android.view.MenuItem; | 13 import android.view.MenuItem; |
| 14 import android.webkit.MimeTypeMap; | 14 import android.webkit.MimeTypeMap; |
| 15 | 15 |
| 16 import org.chromium.base.metrics.RecordHistogram; | 16 import org.chromium.base.metrics.RecordHistogram; |
| 17 import org.chromium.chrome.R; | 17 import org.chromium.chrome.R; |
| 18 import org.chromium.chrome.browser.UrlConstants; | 18 import org.chromium.chrome.browser.UrlConstants; |
| 19 import org.chromium.chrome.browser.firstrun.FirstRunStatus; | 19 import org.chromium.chrome.browser.firstrun.FirstRunStatus; |
| 20 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; | 20 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; |
| 21 import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxyU ma; | 21 import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxyU ma; |
| 22 import org.chromium.chrome.browser.search_engines.TemplateUrlService; | 22 import org.chromium.chrome.browser.search_engines.TemplateUrlService; |
| 23 import org.chromium.chrome.browser.util.UrlUtilities; | 23 import org.chromium.chrome.browser.util.UrlUtilities; |
| 24 | 24 |
| 25 import java.lang.annotation.Retention; | 25 import java.lang.annotation.Retention; |
| 26 import java.lang.annotation.RetentionPolicy; | 26 import java.lang.annotation.RetentionPolicy; |
| 27 import java.util.Arrays; | 27 import java.util.Arrays; |
| 28 import java.util.Collections; | |
| 29 import java.util.HashSet; | |
| 30 import java.util.Iterator; | |
| 31 import java.util.Set; | |
| 28 | 32 |
| 29 /** | 33 /** |
| 30 * A {@link ContextMenuPopulator} used for showing the default Chrome context me nu. | 34 * A {@link ContextMenuPopulator} used for showing the default Chrome context me nu. |
| 31 */ | 35 */ |
| 32 public class ChromeContextMenuPopulator implements ContextMenuPopulator { | 36 public class ChromeContextMenuPopulator implements ContextMenuPopulator { |
| 33 | 37 |
| 34 private static final String TAG = "CCMenuPopulator"; | 38 private static final String TAG = "CCMenuPopulator"; |
| 35 | 39 |
| 36 /** | 40 /** |
| 37 * Defines the context menu modes | 41 * Defines the context menu modes |
| 38 */ | 42 */ |
| 39 @Retention(RetentionPolicy.SOURCE) | 43 @Retention(RetentionPolicy.SOURCE) |
| 40 @IntDef({ | 44 @IntDef({ |
| 41 NORMAL_MODE, /* Default mode */ | 45 NORMAL_MODE, /* Default mode */ |
| 42 CUSTOM_TAB_MODE, /* Custom tab mode */ | 46 CUSTOM_TAB_MODE, /* Custom tab mode */ |
| 43 FULLSCREEN_TAB_MODE /* Full screen mode */ | 47 FULLSCREEN_TAB_MODE /* Full screen mode */ |
| 44 }) | 48 }) |
| 45 public @interface ContextMenuMode {} | 49 public @interface ContextMenuMode {} |
| 46 | 50 |
| 47 public static final int NORMAL_MODE = 0; | 51 public static final int NORMAL_MODE = 0; |
| 48 public static final int CUSTOM_TAB_MODE = 1; | 52 public static final int CUSTOM_TAB_MODE = 1; |
| 49 public static final int FULLSCREEN_TAB_MODE = 2; | 53 public static final int FULLSCREEN_TAB_MODE = 2; |
| 50 | 54 |
| 51 // Items that are included in all context menus. | 55 // Items that are included in all context menus. |
| 52 private static final int[] BASE_WHITELIST = { | 56 private static final Integer[] BASE_WHITELIST = { |
|
JJ
2017/03/01 01:41:04
cl format would not letup about changing this from
| |
| 53 R.id.contextmenu_copy_link_address, | 57 R.id.contextmenu_copy_link_address, R.id.contextmenu_call, |
| 54 R.id.contextmenu_call, | 58 R.id.contextmenu_send_message, R.id.contextmenu_add_to_contacts, R.i d.contextmenu_copy, |
| 55 R.id.contextmenu_send_message, | 59 R.id.contextmenu_copy_link_text, R.id.contextmenu_load_original_imag e, |
| 56 R.id.contextmenu_add_to_contacts, | 60 R.id.contextmenu_save_link_as, R.id.contextmenu_save_image, |
| 57 R.id.contextmenu_copy, | 61 R.id.contextmenu_share_image, R.id.contextmenu_save_video, |
| 58 R.id.contextmenu_copy_link_text, | |
| 59 R.id.contextmenu_load_original_image, | |
| 60 R.id.contextmenu_save_link_as, | |
| 61 R.id.contextmenu_save_image, | |
| 62 R.id.contextmenu_share_image, | |
| 63 R.id.contextmenu_save_video, | |
| 64 }; | 62 }; |
| 65 | 63 |
| 66 // Items that are included for normal Chrome browser mode. | 64 // Items that are included for normal Chrome browser mode. |
| 67 private static final int[] NORMAL_MODE_WHITELIST = { | 65 private static final Integer[] NORMAL_MODE_WHITELIST = { |
| 68 R.id.contextmenu_open_in_new_tab, | 66 R.id.contextmenu_open_in_new_tab, R.id.contextmenu_open_in_other_win dow, |
| 69 R.id.contextmenu_open_in_other_window, | 67 R.id.contextmenu_open_in_incognito_tab, R.id.contextmenu_save_link_a s, |
| 70 R.id.contextmenu_open_in_incognito_tab, | 68 R.id.contextmenu_open_image_in_new_tab, R.id.contextmenu_search_by_i mage, |
| 71 R.id.contextmenu_save_link_as, | |
| 72 R.id.contextmenu_open_image_in_new_tab, | |
| 73 R.id.contextmenu_search_by_image, | |
| 74 }; | 69 }; |
| 75 | 70 |
| 76 // Additional items for custom tabs mode. | 71 // Additional items for custom tabs mode. |
| 77 private static final int[] CUSTOM_TAB_MODE_WHITELIST = { | 72 private static final Integer[] CUSTOM_TAB_MODE_WHITELIST = { |
| 78 R.id.contextmenu_open_image, R.id.contextmenu_search_by_image, | 73 R.id.contextmenu_open_image, R.id.contextmenu_search_by_image, |
| 79 R.id.contextmenu_open_in_new_chrome_tab, R.id.contextmenu_open_in_ch rome_incognito_tab, | 74 R.id.contextmenu_open_in_new_chrome_tab, R.id.contextmenu_open_in_ch rome_incognito_tab, |
| 80 R.id.contextmenu_open_in_browser_id, | 75 R.id.contextmenu_open_in_browser_id, |
| 81 }; | 76 }; |
| 82 | 77 |
| 83 // Additional items for fullscreen tabs mode. | 78 // Additional items for fullscreen tabs mode. |
| 84 private static final int[] FULLSCREEN_TAB_MODE_WHITELIST = { | 79 private static final Integer[] FULLSCREEN_TAB_MODE_WHITELIST = {R.id.menu_id _open_in_chrome}; |
| 85 R.id.menu_id_open_in_chrome | |
| 86 }; | |
| 87 | 80 |
| 88 private final ContextMenuItemDelegate mDelegate; | 81 private final ContextMenuItemDelegate mDelegate; |
| 89 private MenuInflater mMenuInflater; | 82 private MenuInflater mMenuInflater; |
| 90 private final int mMode; | 83 private final int mMode; |
| 91 | 84 |
| 92 static class ContextMenuUma { | 85 static class ContextMenuUma { |
| 93 // Note: these values must match the ContextMenuOption enum in histogram s.xml. | 86 // Note: these values must match the ContextMenuOption enum in histogram s.xml. |
| 94 static final int ACTION_OPEN_IN_NEW_TAB = 0; | 87 static final int ACTION_OPEN_IN_NEW_TAB = 0; |
| 95 static final int ACTION_OPEN_IN_INCOGNITO_TAB = 1; | 88 static final int ACTION_OPEN_IN_INCOGNITO_TAB = 1; |
| 96 static final int ACTION_COPY_LINK_ADDRESS = 2; | 89 static final int ACTION_COPY_LINK_ADDRESS = 2; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 198 setHeaderText(context, menu, params.getTitleText()); | 191 setHeaderText(context, menu, params.getTitleText()); |
| 199 } | 192 } |
| 200 | 193 |
| 201 if (mMenuInflater == null) mMenuInflater = new MenuInflater(context); | 194 if (mMenuInflater == null) mMenuInflater = new MenuInflater(context); |
| 202 | 195 |
| 203 mMenuInflater.inflate(R.menu.chrome_context_menu, menu); | 196 mMenuInflater.inflate(R.menu.chrome_context_menu, menu); |
| 204 | 197 |
| 205 menu.setGroupVisible(R.id.contextmenu_group_anchor, params.isAnchor()); | 198 menu.setGroupVisible(R.id.contextmenu_group_anchor, params.isAnchor()); |
| 206 menu.setGroupVisible(R.id.contextmenu_group_image, params.isImage()); | 199 menu.setGroupVisible(R.id.contextmenu_group_image, params.isImage()); |
| 207 menu.setGroupVisible(R.id.contextmenu_group_video, params.isVideo()); | 200 menu.setGroupVisible(R.id.contextmenu_group_video, params.isVideo()); |
| 201 menu.setGroupVisible(R.id.contextmenu_group_message, | |
| 202 MailTo.isMailTo(params.getLinkUrl()) | |
| 203 || UrlUtilities.isTelScheme(params.getLinkUrl())); | |
| 208 | 204 |
| 205 Set<Integer> supportedOptions = new HashSet<>(); | |
| 206 Collections.addAll(supportedOptions, BASE_WHITELIST); | |
| 207 if (mMode == FULLSCREEN_TAB_MODE) { | |
| 208 Collections.addAll(supportedOptions, FULLSCREEN_TAB_MODE_WHITELIST); | |
| 209 } else if (mMode == CUSTOM_TAB_MODE) { | |
| 210 Collections.addAll(supportedOptions, CUSTOM_TAB_MODE_WHITELIST); | |
| 211 if (!ChromePreferenceManager.getInstance().getCachedChromeDefaultBro wser()) { | |
| 212 menu.findItem(R.id.contextmenu_open_in_browser_id) | |
| 213 .setTitle(mDelegate.getTitleForOpenTabInExternalApp()); | |
| 214 } | |
| 215 } else { | |
| 216 Collections.addAll(supportedOptions, NORMAL_MODE_WHITELIST); | |
| 217 } | |
| 218 | |
| 219 trimInvisibleItems(supportedOptions, menu); | |
| 220 Set<Integer> disabledOptions = getDisabledOptions(params); | |
| 221 | |
| 222 // Iterate through the entire menu list, if if doesn't exist in the map, don't show it. | |
| 223 for (int i = 0; i < menu.size(); i++) { | |
| 224 MenuItem item = menu.getItem(i); | |
| 225 item.setVisible(supportedOptions.contains(item.getItemId()) | |
| 226 && !disabledOptions.contains(item.getItemId())); | |
| 227 } | |
| 228 | |
| 229 // Special case for searching by image element. | |
| 230 if (supportedOptions.contains(R.id.contextmenu_search_by_image)) { | |
| 231 menu.findItem(R.id.contextmenu_search_by_image) | |
| 232 .setTitle(context.getString(R.string.contextmenu_search_web_ for_image, | |
| 233 TemplateUrlService.getInstance() | |
| 234 .getDefaultSearchEngineTemplateUrl() | |
| 235 .getShortName())); | |
| 236 } | |
| 237 } | |
| 238 | |
| 239 /** | |
| 240 * Removes items from the list of supported items if they are not visible in the context menu. | |
| 241 */ | |
| 242 private void trimInvisibleItems(Set<Integer> supportedItems, ContextMenu men u) { | |
| 243 for (Iterator<Integer> itemsIterator = supportedItems.iterator(); | |
| 244 itemsIterator.hasNext();) { | |
| 245 Integer itemId = itemsIterator.next(); | |
| 246 if (!menu.findItem(itemId).isVisible()) { | |
| 247 itemsIterator.remove(); | |
| 248 } | |
| 249 } | |
| 250 } | |
| 251 | |
| 252 /** | |
| 253 * Given a set of params and context, and a list of all the items. This meth od never adds items, | |
| 254 * only removes or edits them from the | |
| 255 * list. | |
| 256 * @param params The parameters used to create a list of items that should n ot be allowed. | |
| 257 */ | |
| 258 private Set<Integer> getDisabledOptions(ContextMenuParams params) { | |
| 259 Set<Integer> disabledOptions = new HashSet<>(); | |
| 209 if (params.isAnchor() && !mDelegate.isOpenInOtherWindowSupported()) { | 260 if (params.isAnchor() && !mDelegate.isOpenInOtherWindowSupported()) { |
| 210 menu.findItem(R.id.contextmenu_open_in_other_window).setVisible(fals e); | 261 disabledOptions.add(R.id.contextmenu_open_in_other_window); |
| 211 } | 262 } |
| 212 | 263 |
| 213 if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) { | 264 if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) { |
| 214 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(fal se); | 265 disabledOptions.add(R.id.contextmenu_open_in_incognito_tab); |
| 215 } | 266 } |
| 216 | 267 |
| 217 if (params.getLinkText().trim().isEmpty() || params.isImage()) { | 268 if (params.getLinkText().trim().isEmpty() || params.isImage()) { |
| 218 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false); | 269 disabledOptions.add(R.id.contextmenu_copy_link_text); |
| 219 } | 270 } |
| 220 | 271 |
| 221 if (params.isAnchor() && !UrlUtilities.isAcceptedScheme(params.getLinkUr l())) { | 272 if (params.isAnchor() && !UrlUtilities.isAcceptedScheme(params.getLinkUr l())) { |
| 222 menu.findItem(R.id.contextmenu_open_in_other_window).setVisible(fals e); | 273 disabledOptions.add(R.id.contextmenu_open_in_other_window); |
| 223 menu.findItem(R.id.contextmenu_open_in_new_tab).setVisible(false); | 274 disabledOptions.add(R.id.contextmenu_open_in_new_tab); |
| 224 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(fal se); | 275 disabledOptions.add(R.id.contextmenu_open_in_incognito_tab); |
| 225 } | 276 } |
| 226 | 277 |
| 227 if (MailTo.isMailTo(params.getLinkUrl())) { | 278 if (MailTo.isMailTo(params.getLinkUrl())) { |
| 228 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false); | 279 disabledOptions.add(R.id.contextmenu_copy_link_text); |
| 229 menu.findItem(R.id.contextmenu_copy_link_address).setVisible(false); | 280 disabledOptions.add(R.id.contextmenu_copy_link_address); |
| 230 menu.setGroupVisible(R.id.contextmenu_group_message, true); | |
| 231 if (!mDelegate.supportsSendEmailMessage()) { | 281 if (!mDelegate.supportsSendEmailMessage()) { |
| 232 menu.findItem(R.id.contextmenu_send_message).setVisible(false); | 282 disabledOptions.add(R.id.contextmenu_send_message); |
| 233 } | 283 } |
| 234 if (TextUtils.isEmpty(MailTo.parse(params.getLinkUrl()).getTo()) | 284 if (TextUtils.isEmpty(MailTo.parse(params.getLinkUrl()).getTo()) |
| 235 || !mDelegate.supportsAddToContacts()) { | 285 || !mDelegate.supportsAddToContacts()) { |
| 236 menu.findItem(R.id.contextmenu_add_to_contacts).setVisible(false ); | 286 disabledOptions.add(R.id.contextmenu_add_to_contacts); |
| 237 } | 287 } |
| 238 menu.findItem(R.id.contextmenu_call).setVisible(false); | 288 disabledOptions.add(R.id.contextmenu_call); |
| 239 } else if (UrlUtilities.isTelScheme(params.getLinkUrl())) { | 289 } else if (UrlUtilities.isTelScheme(params.getLinkUrl())) { |
| 240 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false); | 290 disabledOptions.add(R.id.contextmenu_copy_link_text); |
| 241 menu.findItem(R.id.contextmenu_copy_link_address).setVisible(false); | 291 disabledOptions.add(R.id.contextmenu_copy_link_address); |
| 242 menu.setGroupVisible(R.id.contextmenu_group_message, true); | |
| 243 if (!mDelegate.supportsCall()) { | 292 if (!mDelegate.supportsCall()) { |
| 244 menu.findItem(R.id.contextmenu_call).setVisible(false); | 293 disabledOptions.add(R.id.contextmenu_call); |
| 245 } | 294 } |
| 246 if (!mDelegate.supportsSendTextMessage()) { | 295 if (!mDelegate.supportsSendTextMessage()) { |
| 247 menu.findItem(R.id.contextmenu_send_message).setVisible(false); | 296 disabledOptions.add(R.id.contextmenu_send_message); |
| 248 } | 297 } |
| 249 if (!mDelegate.supportsAddToContacts()) { | 298 if (!mDelegate.supportsAddToContacts()) { |
| 250 menu.findItem(R.id.contextmenu_add_to_contacts).setVisible(false ); | 299 disabledOptions.add(R.id.contextmenu_add_to_contacts); |
| 251 } | 300 } |
| 252 } else { | |
| 253 menu.setGroupVisible(R.id.contextmenu_group_message, false); | |
| 254 } | 301 } |
| 255 | 302 |
| 256 menu.findItem(R.id.contextmenu_save_link_as).setVisible( | 303 if (!UrlUtilities.isDownloadableScheme(params.getLinkUrl())) { |
| 257 UrlUtilities.isDownloadableScheme(params.getLinkUrl())); | 304 disabledOptions.add(R.id.contextmenu_save_link_as); |
| 305 } | |
| 258 | 306 |
| 307 boolean isSrcDownloadableScheme = UrlUtilities.isDownloadableScheme(para ms.getSrcUrl()); | |
| 259 if (params.isVideo()) { | 308 if (params.isVideo()) { |
| 260 menu.findItem(R.id.contextmenu_save_video).setVisible( | 309 boolean saveableAndDownloadable = params.canSaveMedia() && isSrcDown loadableScheme; |
| 261 params.canSaveMedia() && UrlUtilities.isDownloadableScheme(p arams.getSrcUrl())); | 310 if (!saveableAndDownloadable) { |
| 311 disabledOptions.add(R.id.contextmenu_save_video); | |
| 312 } | |
| 262 } else if (params.isImage() && params.imageWasFetchedLoFi()) { | 313 } else if (params.isImage() && params.imageWasFetchedLoFi()) { |
| 263 DataReductionProxyUma.previewsLoFiContextMenuAction( | 314 DataReductionProxyUma.previewsLoFiContextMenuAction( |
| 264 DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_SH OWN); | 315 DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_SH OWN); |
| 265 // All image context menu items other than "Load image," "Open origi nal image in | 316 // All image context menu items other than "Load image," "Open origi nal image in |
| 266 // new tab," and "Copy image URL" should be disabled on Lo-Fi images . | 317 // new tab," and "Copy image URL" should be disabled on Lo-Fi images . |
| 267 menu.findItem(R.id.contextmenu_save_image).setVisible(false); | 318 disabledOptions.add(R.id.contextmenu_save_image); |
| 268 menu.findItem(R.id.contextmenu_open_image).setVisible(false); | 319 disabledOptions.add(R.id.contextmenu_open_image); |
| 269 menu.findItem(R.id.contextmenu_search_by_image).setVisible(false); | 320 disabledOptions.add(R.id.contextmenu_search_by_image); |
| 270 menu.findItem(R.id.contextmenu_share_image).setVisible(false); | 321 disabledOptions.add(R.id.contextmenu_share_image); |
| 271 } else if (params.isImage() && !params.imageWasFetchedLoFi()) { | 322 } else if (params.isImage() && !params.imageWasFetchedLoFi()) { |
| 272 menu.findItem(R.id.contextmenu_load_original_image).setVisible(false ); | 323 disabledOptions.add(R.id.contextmenu_load_original_image); |
| 273 | 324 |
| 274 menu.findItem(R.id.contextmenu_save_image).setVisible( | 325 if (!isSrcDownloadableScheme) { |
| 275 UrlUtilities.isDownloadableScheme(params.getSrcUrl())); | 326 disabledOptions.add(R.id.contextmenu_save_image); |
| 327 } | |
| 276 | 328 |
| 277 // Avoid showing open image option for same image which is already o pened. | 329 // Avoid showing open image option for same image which is already o pened. |
| 278 if (mDelegate.getPageUrl().equals(params.getSrcUrl())) { | 330 if (mDelegate.getPageUrl().equals(params.getSrcUrl())) { |
| 279 menu.findItem(R.id.contextmenu_open_image).setVisible(false); | 331 disabledOptions.add(R.id.contextmenu_open_image); |
| 280 } | 332 } |
| 281 final TemplateUrlService templateUrlServiceInstance = TemplateUrlSer vice.getInstance(); | 333 final TemplateUrlService templateUrlServiceInstance = TemplateUrlSer vice.getInstance(); |
| 282 final boolean isSearchByImageAvailable = | 334 final boolean isSearchByImageAvailable = isSrcDownloadableScheme |
| 283 UrlUtilities.isDownloadableScheme(params.getSrcUrl()) | 335 && templateUrlServiceInstance.isLoaded() |
| 284 && templateUrlServiceInstance.isLoaded() | 336 && templateUrlServiceInstance.isSearchByImageAvailable() |
| 285 && templateUrlServiceInstance.isSearchByImageAvailab le() | 337 && templateUrlServiceInstance.getDefaultSearchEngineTemplate Url() != null; |
| 286 && templateUrlServiceInstance.getDefaultSearchEngine TemplateUrl() | |
| 287 != null; | |
| 288 | 338 |
| 289 menu.findItem(R.id.contextmenu_search_by_image).setVisible(isSearchB yImageAvailable); | 339 if (!isSearchByImageAvailable) { |
| 290 if (isSearchByImageAvailable) { | 340 disabledOptions.add(R.id.contextmenu_search_by_image); |
| 291 menu.findItem(R.id.contextmenu_search_by_image).setTitle( | |
| 292 context.getString(R.string.contextmenu_search_web_for_im age, | |
| 293 TemplateUrlService.getInstance() | |
| 294 .getDefaultSearchEngineTemplateUrl().get ShortName())); | |
| 295 } | 341 } |
| 296 } | 342 } |
| 297 | 343 |
| 298 // Hide all items that could spawn additional tabs until FRE has been co mpleted. | 344 // Hide all items that could spawn additional tabs until FRE has been co mpleted. |
| 299 if (!FirstRunStatus.getFirstRunFlowComplete()) { | 345 if (!FirstRunStatus.getFirstRunFlowComplete()) { |
| 300 menu.findItem(R.id.contextmenu_open_image_in_new_tab).setVisible(fal se); | 346 disabledOptions.add(R.id.contextmenu_open_image_in_new_tab); |
| 301 menu.findItem(R.id.contextmenu_open_in_other_window).setVisible(fals e); | 347 disabledOptions.add(R.id.contextmenu_open_in_other_window); |
| 302 menu.findItem(R.id.contextmenu_open_in_new_tab).setVisible(false); | 348 disabledOptions.add(R.id.contextmenu_open_in_new_tab); |
| 303 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(fal se); | 349 disabledOptions.add(R.id.contextmenu_open_in_incognito_tab); |
| 304 menu.findItem(R.id.contextmenu_search_by_image).setVisible(false); | 350 disabledOptions.add(R.id.contextmenu_search_by_image); |
| 305 menu.findItem(R.id.menu_id_open_in_chrome).setVisible(false); | 351 disabledOptions.add(R.id.menu_id_open_in_chrome); |
| 306 } | 352 } |
| 307 | 353 |
| 308 if (mMode == FULLSCREEN_TAB_MODE) { | 354 if (mMode == CUSTOM_TAB_MODE) { |
| 309 removeUnsupportedItems(menu, FULLSCREEN_TAB_MODE_WHITELIST); | |
| 310 } else if (mMode == CUSTOM_TAB_MODE) { | |
| 311 removeUnsupportedItems(menu, CUSTOM_TAB_MODE_WHITELIST); | |
| 312 MenuItem defaultOpenMenuItem = menu.findItem(R.id.contextmenu_open_i n_browser_id); | |
| 313 if (ChromePreferenceManager.getInstance().getCachedChromeDefaultBrow ser()) { | 355 if (ChromePreferenceManager.getInstance().getCachedChromeDefaultBrow ser()) { |
| 314 defaultOpenMenuItem.setVisible(false); | 356 disabledOptions.add(R.id.contextmenu_open_in_browser_id); |
| 315 } else { | 357 } else { |
| 316 menu.findItem(R.id.contextmenu_open_in_new_chrome_tab).setVisibl e(false); | 358 disabledOptions.add(R.id.contextmenu_open_in_new_chrome_tab); |
| 317 menu.findItem(R.id.contextmenu_open_in_chrome_incognito_tab).set Visible(false); | 359 disabledOptions.add(R.id.contextmenu_open_in_chrome_incognito_ta b); |
| 318 defaultOpenMenuItem.setTitle(mDelegate.getTitleForOpenTabInExter nalApp()); | |
| 319 } | 360 } |
| 320 } else { | |
| 321 removeUnsupportedItems(menu, NORMAL_MODE_WHITELIST); | |
| 322 } | 361 } |
| 362 | |
| 363 return disabledOptions; | |
| 323 } | 364 } |
| 324 | 365 |
| 325 private void removeUnsupportedItems(ContextMenu menu, int[] whitelist) { | 366 private void removeUnsupportedItems(Set<Integer> itemList, int[] whitelist) { |
| 326 Arrays.sort(BASE_WHITELIST); | 367 Arrays.sort(BASE_WHITELIST); |
| 327 Arrays.sort(whitelist); | 368 Arrays.sort(whitelist); |
| 328 for (int i = 0; i < menu.size(); i++) { | 369 for (Iterator<Integer> idIterator = itemList.iterator(); idIterator.hasN ext();) { |
| 329 MenuItem item = menu.getItem(i); | 370 int itemId = idIterator.next(); |
| 330 if (Arrays.binarySearch(whitelist, item.getItemId()) < 0 | 371 if (Arrays.binarySearch(whitelist, itemId) < 0 |
| 331 && Arrays.binarySearch(BASE_WHITELIST, item.getItemId()) < 0 ) { | 372 && Arrays.binarySearch(BASE_WHITELIST, itemId) < 0) { |
| 332 menu.removeItem(item.getItemId()); | 373 idIterator.remove(); |
| 333 i--; | |
| 334 } | 374 } |
| 335 } | 375 } |
| 336 } | 376 } |
| 337 | 377 |
| 338 @Override | 378 @Override |
| 339 public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams pa rams, int itemId) { | 379 public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams pa rams, int itemId) { |
| 340 if (itemId == R.id.contextmenu_open_in_other_window) { | 380 if (itemId == R.id.contextmenu_open_in_other_window) { |
| 341 ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_OTHER_WI NDOW); | 381 ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_OTHER_WI NDOW); |
| 342 mDelegate.onOpenInOtherWindow(params.getLinkUrl(), params.getReferre r()); | 382 mDelegate.onOpenInOtherWindow(params.getLinkUrl(), params.getReferre r()); |
| 343 } else if (itemId == R.id.contextmenu_open_in_new_tab) { | 383 } else if (itemId == R.id.contextmenu_open_in_new_tab) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 430 } | 470 } |
| 431 | 471 |
| 432 return true; | 472 return true; |
| 433 } | 473 } |
| 434 | 474 |
| 435 private void setHeaderText(Context context, ContextMenu menu, String text) { | 475 private void setHeaderText(Context context, ContextMenu menu, String text) { |
| 436 ContextMenuTitleView title = new ContextMenuTitleView(context, text); | 476 ContextMenuTitleView title = new ContextMenuTitleView(context, text); |
| 437 menu.setHeaderView(title); | 477 menu.setHeaderView(title); |
| 438 } | 478 } |
| 439 } | 479 } |
| OLD | NEW |