Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/context_menu/ContextMenuHelper.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/context_menu/ContextMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/context_menu/ContextMenuHelper.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..85abea8672e056c9ab293bcd0d01c9e58298dbd2 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/context_menu/ContextMenuHelper.java |
| @@ -0,0 +1,110 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.chrome.browser.context_menu; |
| + |
| +import android.view.ContextMenu; |
| +import android.view.ContextMenu.ContextMenuInfo; |
| +import android.view.HapticFeedbackConstants; |
| +import android.view.Menu; |
| +import android.view.MenuItem; |
| +import android.view.MenuItem.OnMenuItemClickListener; |
| +import android.view.View; |
| +import android.view.ViewTreeObserver; |
| + |
| +import org.chromium.base.CalledByNative; |
| +import org.chromium.content.browser.ContentView; |
| +import org.chromium.content.browser.ContentViewCore; |
| + |
| +import android.view.View.OnCreateContextMenuListener; |
| + |
| +/** |
| + * A helper class that handles generating context menus for {@link ContentView}s. |
| + */ |
| +public class ContextMenuHelper implements OnCreateContextMenuListener, OnMenuItemClickListener { |
| + private long mNativeContextMenuHelper; |
| + |
| + private ContextMenuPopulator mPopulator; |
| + private ContextMenuParams mCurrentContextMenuParams; |
| + |
| + private ContextMenuHelper(long nativeContextMenuHelper) { |
| + mNativeContextMenuHelper = nativeContextMenuHelper; |
| + } |
| + |
| + @CalledByNative |
| + private static ContextMenuHelper create(long nativeContextMenuHelper) { |
| + return new ContextMenuHelper(nativeContextMenuHelper); |
| + } |
| + |
| + @CalledByNative |
| + private void destroy() { |
| + mNativeContextMenuHelper = 0; |
| + } |
| + |
| + /** |
| + * @param populator A {@link ContextMenuPopulator} that is responsible for managing and showing |
| + * context menus. |
| + */ |
| + @CalledByNative |
| + private void setPopulator(ContextMenuPopulator populator) { |
| + mPopulator = populator; |
| + } |
| + |
| + /** |
| + * Starts showing a context menu for {@code view} based on {@code params}. |
| + * @param contentViewCore |
|
Ted C
2013/11/19 02:44:03
missing description
David Trainor- moved to gerrit
2013/11/25 19:42:50
Done.
|
| + * @param params The {@link ContextMenuParams} that indicate what menu items to show. |
| + */ |
| + @CalledByNative |
| + private void showContextMenu(ContentViewCore contentViewCore, ContextMenuParams params) { |
| + if (!shouldShowMenu(params)) return; |
| + |
| + mCurrentContextMenuParams = params; |
| + |
| + View view = contentViewCore.getContainerView(); |
| + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); |
| + if (view instanceof ContentView) ((ContentView) view).setIgnoreRemainingTouchEvents(); |
| + view.setOnCreateContextMenuListener(this); |
| + view.showContextMenu(); |
| + } |
| + |
| + @Override |
| + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { |
| + if (!shouldShowMenu(mCurrentContextMenuParams)) return; |
| + |
| + if (mCurrentContextMenuParams.isCustomMenu()) { |
| + for (int i = 0; i < mCurrentContextMenuParams.getCustomMenuSize(); i++) { |
| + menu.add(Menu.NONE, i, Menu.NONE, mCurrentContextMenuParams.getCustomLabelAt(i)); |
| + } |
| + } else { |
| + assert mPopulator != null; |
| + mPopulator.buildContextMenu(menu, v.getContext(), mCurrentContextMenuParams); |
| + } |
| + |
| + for (int i = 0; i < menu.size(); i++) { |
| + menu.getItem(i).setOnMenuItemClickListener(this); |
| + } |
| + } |
| + |
| + @Override |
| + public boolean onMenuItemClick(MenuItem item) { |
| + if (mCurrentContextMenuParams.isCustomMenu()) { |
| + if (mNativeContextMenuHelper != 0) { |
| + final int action = mCurrentContextMenuParams.getCustomActionAt(item.getItemId()); |
| + nativeOnCustomItemSelected(mNativeContextMenuHelper, action); |
| + } |
| + return true; |
| + } else { |
| + return mPopulator.onItemSelected(mCurrentContextMenuParams, item.getItemId()); |
| + } |
| + } |
| + |
| + private boolean shouldShowMenu(ContextMenuParams params) { |
| + // Custom menus are handled by this class and do not require a ContextMenuPopulator. |
| + return params.isCustomMenu() || |
| + (mPopulator != null && mPopulator.shouldShowContextMenu(params)); |
| + } |
| + |
| + private native void nativeOnCustomItemSelected(long nativeContextMenuHelper, int action); |
| +} |