Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java

Issue 73173002: Add ContextMenu support upstream for Android (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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.view.ContextMenu;
8 import android.view.ContextMenu.ContextMenuInfo;
9 import android.view.HapticFeedbackConstants;
10 import android.view.Menu;
11 import android.view.MenuItem;
12 import android.view.MenuItem.OnMenuItemClickListener;
13 import android.view.View;
14 import android.view.ViewTreeObserver;
15
16 import org.chromium.base.CalledByNative;
17 import org.chromium.content.browser.ContentView;
18 import org.chromium.content.browser.ContentViewCore;
19
20 import android.view.View.OnCreateContextMenuListener;
21
22 import com.google.common.annotations.VisibleForTesting;
23
24 /**
25 * A helper class that handles generating context menus for {@link ContentView}s .
26 */
27 public class ContextMenuHelper implements OnCreateContextMenuListener, OnMenuIte mClickListener {
28 private long mNativeContextMenuHelper;
29
30 private ContextMenuPopulator mPopulator;
31 private ContextMenuParams mCurrentContextMenuParams;
32
33 private ContextMenuHelper(long nativeContextMenuHelper) {
34 mNativeContextMenuHelper = nativeContextMenuHelper;
35 }
36
37 @CalledByNative
38 private static ContextMenuHelper create(long nativeContextMenuHelper) {
39 return new ContextMenuHelper(nativeContextMenuHelper);
40 }
41
42 @CalledByNative
43 private void destroy() {
44 mNativeContextMenuHelper = 0;
45 }
46
47 /**
48 * @param populator A {@link ContextMenuPopulator} that is responsible for m anaging and showing
49 * context menus.
50 */
51 @CalledByNative
52 private void setPopulator(ContextMenuPopulator populator) {
53 mPopulator = populator;
54 }
55
56 /**
57 * Starts showing a context menu for {@code view} based on {@code params}.
58 * @param contentViewCore The {@link ContentViewCore} to show the menu to.
59 * @param params The {@link ContextMenuParams} that indicate what m enu items to show.
60 */
61 @CalledByNative
62 private void showContextMenu(ContentViewCore contentViewCore, ContextMenuPar ams params) {
63 if (!shouldShowMenu(params)) return;
64
65 mCurrentContextMenuParams = params;
66
67 View view = contentViewCore.getContainerView();
68 view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
69 if (view instanceof ContentView) ((ContentView) view).setIgnoreRemaining TouchEvents();
70 view.setOnCreateContextMenuListener(this);
71 view.showContextMenu();
72 }
73
74 /**
75 * Starts a download based on the current {@link ContextMenuParams}.
76 * @param isLink Whether or not the download target is a link.
77 */
78 public void startContextMenuDownload(boolean isLink) {
79 if (mNativeContextMenuHelper != 0) nativeOnStartDownload(mNativeContextM enuHelper, isLink);
80 }
81
82 @Override
83 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo me nuInfo) {
84 if (!shouldShowMenu(mCurrentContextMenuParams)) return;
85
86 if (mCurrentContextMenuParams.isCustomMenu()) {
87 for (int i = 0; i < mCurrentContextMenuParams.getCustomMenuSize(); i ++) {
88 menu.add(Menu.NONE, i, Menu.NONE, mCurrentContextMenuParams.getC ustomLabelAt(i));
89 }
90 } else {
91 assert mPopulator != null;
92 mPopulator.buildContextMenu(menu, v.getContext(), mCurrentContextMen uParams);
93 }
94
95 for (int i = 0; i < menu.size(); i++) {
96 menu.getItem(i).setOnMenuItemClickListener(this);
97 }
98 }
99
100 @Override
101 public boolean onMenuItemClick(MenuItem item) {
102 if (mCurrentContextMenuParams.isCustomMenu()) {
103 if (mNativeContextMenuHelper != 0) {
104 final int action = mCurrentContextMenuParams.getCustomActionAt(i tem.getItemId());
105 nativeOnCustomItemSelected(mNativeContextMenuHelper, action);
106 }
107 return true;
108 } else {
109 return mPopulator.onItemSelected(this, mCurrentContextMenuParams, it em.getItemId());
110 }
111 }
112
113 /**
114 * @return The {@link ContextMenuPopulator} responsible for populating the c ontext menu.
115 */
116 @VisibleForTesting
117 public ContextMenuPopulator getPopulator() {
118 return mPopulator;
119 }
120
121 private boolean shouldShowMenu(ContextMenuParams params) {
122 // Custom menus are handled by this class and do not require a ContextMe nuPopulator.
123 return params.isCustomMenu() ||
124 (mPopulator != null && mPopulator.shouldShowContextMenu(params)) ;
125 }
126
127 private native void nativeOnStartDownload(long nativeContextMenuHelper, bool ean isLink);
128 private native void nativeOnCustomItemSelected(long nativeContextMenuHelper, int action);
129 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698