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