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.app.Activity; | 7 import android.app.Activity; |
| 8 import android.content.Context; | 8 import android.content.Context; |
| 9 import android.graphics.Bitmap; | |
| 10 import android.graphics.BitmapFactory; | |
| 9 import android.util.Pair; | 11 import android.util.Pair; |
| 10 import android.view.ContextMenu; | 12 import android.view.ContextMenu; |
| 11 import android.view.ContextMenu.ContextMenuInfo; | 13 import android.view.ContextMenu.ContextMenuInfo; |
| 12 import android.view.View; | 14 import android.view.View; |
| 13 import android.view.View.OnCreateContextMenuListener; | 15 import android.view.View.OnCreateContextMenuListener; |
| 14 | 16 |
| 15 import org.chromium.base.Callback; | 17 import org.chromium.base.Callback; |
| 16 import org.chromium.base.VisibleForTesting; | 18 import org.chromium.base.VisibleForTesting; |
| 17 import org.chromium.base.annotations.CalledByNative; | 19 import org.chromium.base.annotations.CalledByNative; |
| 18 import org.chromium.base.metrics.RecordHistogram; | 20 import org.chromium.base.metrics.RecordHistogram; |
| 21 import org.chromium.chrome.R; | |
| 19 import org.chromium.chrome.browser.ChromeFeatureList; | 22 import org.chromium.chrome.browser.ChromeFeatureList; |
| 20 import org.chromium.chrome.browser.share.ShareHelper; | 23 import org.chromium.chrome.browser.share.ShareHelper; |
| 21 import org.chromium.content.browser.ContentViewCore; | 24 import org.chromium.content.browser.ContentViewCore; |
| 22 import org.chromium.content_public.browser.WebContents; | 25 import org.chromium.content_public.browser.WebContents; |
| 23 import org.chromium.ui.base.WindowAndroid; | 26 import org.chromium.ui.base.WindowAndroid; |
| 24 import org.chromium.ui.base.WindowAndroid.OnCloseContextMenuListener; | 27 import org.chromium.ui.base.WindowAndroid.OnCloseContextMenuListener; |
| 25 | 28 |
| 26 import java.util.List; | 29 import java.util.List; |
| 27 | 30 |
| 28 /** | 31 /** |
| 29 * A helper class that handles generating context menus for {@link ContentViewCo re}s. | 32 * A helper class that handles generating context menus for {@link ContentViewCo re}s. |
| 30 */ | 33 */ |
| 31 public class ContextMenuHelper implements OnCreateContextMenuListener { | 34 public class ContextMenuHelper implements OnCreateContextMenuListener { |
| 32 private long mNativeContextMenuHelper; | 35 private long mNativeContextMenuHelper; |
| 33 | 36 |
| 34 private ContextMenuPopulator mPopulator; | 37 private ContextMenuPopulator mPopulator; |
| 35 private ContextMenuParams mCurrentContextMenuParams; | 38 private ContextMenuParams mCurrentContextMenuParams; |
| 36 private Context mContext; | 39 private Context mContext; |
| 37 private Callback<Integer> mCallback; | 40 private Callback<Integer> mCallback; |
| 38 private Runnable mOnMenuShown; | 41 private Runnable mOnMenuShown; |
| 39 private Runnable mOnMenuClosed; | 42 private Runnable mOnMenuClosed; |
| 43 private OnThumbnailReceivedListener mOnThumbnailReceivedListener; | |
| 44 | |
| 45 /** | |
| 46 * This waits for a thumbnail to be retrieved by the native code. | |
| 47 */ | |
| 48 interface OnThumbnailReceivedListener { | |
|
Ted C
2017/03/31 16:19:32
FWIW, you can just use Callback.java from base/ to
JJ
2017/03/31 18:43:59
Done.
| |
| 49 /** | |
| 50 * When the thumbnail is received it will send the thumbnail via this me thod. This is | |
| 51 * activated after calling {@link #getThumbnail(OnThumbnailReceivedListe ner)}. | |
| 52 * @param bitmap The bitmap that is retrieved from native code. | |
| 53 */ | |
| 54 void onThumbnailReceived(Bitmap bitmap); | |
| 55 } | |
| 56 | |
| 57 @VisibleForTesting | |
| 58 ContextMenuHelper() {} | |
| 40 | 59 |
| 41 private ContextMenuHelper(long nativeContextMenuHelper) { | 60 private ContextMenuHelper(long nativeContextMenuHelper) { |
| 42 mNativeContextMenuHelper = nativeContextMenuHelper; | 61 mNativeContextMenuHelper = nativeContextMenuHelper; |
| 43 } | 62 } |
| 44 | 63 |
| 45 @CalledByNative | 64 @CalledByNative |
| 46 private static ContextMenuHelper create(long nativeContextMenuHelper) { | 65 private static ContextMenuHelper create(long nativeContextMenuHelper) { |
| 47 return new ContextMenuHelper(nativeContextMenuHelper); | 66 return new ContextMenuHelper(nativeContextMenuHelper); |
| 48 } | 67 } |
| 49 | 68 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 public void run() { | 120 public void run() { |
| 102 if (mNativeContextMenuHelper == 0) return; | 121 if (mNativeContextMenuHelper == 0) return; |
| 103 nativeOnContextMenuClosed(mNativeContextMenuHelper); | 122 nativeOnContextMenuClosed(mNativeContextMenuHelper); |
| 104 } | 123 } |
| 105 }; | 124 }; |
| 106 | 125 |
| 107 if (ChromeFeatureList.isEnabled(ChromeFeatureList.CUSTOM_CONTEXT_MENU)) { | 126 if (ChromeFeatureList.isEnabled(ChromeFeatureList.CUSTOM_CONTEXT_MENU)) { |
| 108 List<Pair<Integer, List<ContextMenuItem>>> items = | 127 List<Pair<Integer, List<ContextMenuItem>>> items = |
| 109 mPopulator.buildContextMenu(null, mContext, mCurrentContextM enuParams); | 128 mPopulator.buildContextMenu(null, mContext, mCurrentContextM enuParams); |
| 110 | 129 |
| 111 ContextMenuUi menuUi = new TabularContextMenuUi(); | 130 ContextMenuUi menuUi = new TabularContextMenuUi(this); |
| 112 menuUi.displayMenu(mContext, mCurrentContextMenuParams, items, mCall back, mOnMenuShown, | 131 menuUi.displayMenu(mContext, mCurrentContextMenuParams, items, mCall back, mOnMenuShown, |
| 113 mOnMenuClosed); | 132 mOnMenuClosed); |
|
Ted C
2017/03/31 16:19:33
from my comment in the other file, I think we shou
JJ
2017/03/31 18:43:59
Done.
| |
| 114 return; | 133 return; |
| 115 } | 134 } |
| 116 | 135 |
| 117 // The Platform Context Menu requires the listener within this hepler si nce this helper and | 136 // The Platform Context Menu requires the listener within this hepler si nce this helper and |
| 118 // provides context menu for us to show. | 137 // provides context menu for us to show. |
| 119 view.setOnCreateContextMenuListener(this); | 138 view.setOnCreateContextMenuListener(this); |
| 120 if (view.showContextMenu()) { | 139 if (view.showContextMenu()) { |
| 121 mOnMenuShown.run(); | 140 mOnMenuShown.run(); |
| 122 windowAndroid.addContextMenuCloseListener(new OnCloseContextMenuList ener() { | 141 windowAndroid.addContextMenuCloseListener(new OnCloseContextMenuList ener() { |
| 123 @Override | 142 @Override |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 | 176 |
| 158 @CalledByNative | 177 @CalledByNative |
| 159 private void onShareImageReceived( | 178 private void onShareImageReceived( |
| 160 WindowAndroid windowAndroid, byte[] jpegImageData) { | 179 WindowAndroid windowAndroid, byte[] jpegImageData) { |
| 161 Activity activity = windowAndroid.getActivity().get(); | 180 Activity activity = windowAndroid.getActivity().get(); |
| 162 if (activity == null) return; | 181 if (activity == null) return; |
| 163 | 182 |
| 164 ShareHelper.shareImage(activity, jpegImageData); | 183 ShareHelper.shareImage(activity, jpegImageData); |
| 165 } | 184 } |
| 166 | 185 |
| 186 /** | |
| 187 * Gets the thumbnail of the current image that triggered the context menu. | |
| 188 * @param listener Called once the the thumbnail is received | |
| 189 */ | |
| 190 public void getThumbnail(final OnThumbnailReceivedListener listener) { | |
| 191 mOnThumbnailReceivedListener = listener; | |
| 192 if (mNativeContextMenuHelper == 0) return; | |
| 193 int maxSizePx = mContext.getResources().getDimensionPixelSize( | |
| 194 R.dimen.context_menu_header_image_max_size); | |
| 195 nativeRetrieveHeaderThumbnail(mNativeContextMenuHelper, maxSizePx); | |
| 196 } | |
| 197 | |
| 198 @CalledByNative | |
| 199 private void onHeaderThumbnailReceived(WindowAndroid windowAndroid, byte[] j pegImageData) { | |
| 200 Bitmap bitmap = BitmapFactory.decodeByteArray(jpegImageData, 0, jpegImag eData.length); | |
|
Ted C
2017/03/31 16:19:33
Can you add another:
// TODO(tedchoc): Decode in
JJ
2017/03/31 18:43:59
Done.
| |
| 201 if (mOnThumbnailReceivedListener != null) { | |
| 202 mOnThumbnailReceivedListener.onThumbnailReceived(bitmap); | |
| 203 } | |
| 204 } | |
| 205 | |
| 167 @Override | 206 @Override |
| 168 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo me nuInfo) { | 207 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo me nuInfo) { |
| 169 List<Pair<Integer, List<ContextMenuItem>>> items = | 208 List<Pair<Integer, List<ContextMenuItem>>> items = |
| 170 mPopulator.buildContextMenu(menu, v.getContext(), mCurrentContex tMenuParams); | 209 mPopulator.buildContextMenu(menu, v.getContext(), mCurrentContex tMenuParams); |
| 171 ContextMenuUi menuUi = new PlatformContextMenuUi(menu); | 210 ContextMenuUi menuUi = new PlatformContextMenuUi(menu); |
| 172 menuUi.displayMenu( | 211 menuUi.displayMenu( |
| 173 mContext, mCurrentContextMenuParams, items, mCallback, mOnMenuSh own, mOnMenuClosed); | 212 mContext, mCurrentContextMenuParams, items, mCallback, mOnMenuSh own, mOnMenuClosed); |
| 174 } | 213 } |
| 175 | 214 |
| 176 /** | 215 /** |
| 177 * @return The {@link ContextMenuPopulator} responsible for populating the c ontext menu. | 216 * @return The {@link ContextMenuPopulator} responsible for populating the c ontext menu. |
| 178 */ | 217 */ |
| 179 @VisibleForTesting | 218 @VisibleForTesting |
| 180 public ContextMenuPopulator getPopulator() { | 219 public ContextMenuPopulator getPopulator() { |
| 181 return mPopulator; | 220 return mPopulator; |
| 182 } | 221 } |
| 183 | 222 |
| 184 private native void nativeOnStartDownload( | 223 private native void nativeOnStartDownload( |
| 185 long nativeContextMenuHelper, boolean isLink, boolean isDataReductio nProxyEnabled); | 224 long nativeContextMenuHelper, boolean isLink, boolean isDataReductio nProxyEnabled); |
| 186 private native void nativeSearchForImage(long nativeContextMenuHelper); | 225 private native void nativeSearchForImage(long nativeContextMenuHelper); |
| 187 private native void nativeShareImage(long nativeContextMenuHelper); | 226 private native void nativeShareImage(long nativeContextMenuHelper); |
| 188 private native void nativeOnContextMenuClosed(long nativeContextMenuHelper); | 227 private native void nativeOnContextMenuClosed(long nativeContextMenuHelper); |
| 228 private native void nativeRetrieveHeaderThumbnail(long nativeContextMenuHelp er, int maxSizePx); | |
| 189 } | 229 } |
| OLD | NEW |