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.ComponentName; | 8 import android.content.ComponentName; |
9 import android.graphics.Bitmap; | 9 import android.graphics.Bitmap; |
10 import android.graphics.BitmapFactory; | 10 import android.graphics.BitmapFactory; |
(...skipping 10 matching lines...) Expand all Loading... |
21 import org.chromium.chrome.R; | 21 import org.chromium.chrome.R; |
22 import org.chromium.chrome.browser.ChromeFeatureList; | 22 import org.chromium.chrome.browser.ChromeFeatureList; |
23 import org.chromium.chrome.browser.share.ShareHelper; | 23 import org.chromium.chrome.browser.share.ShareHelper; |
24 import org.chromium.content.browser.ContentViewCore; | 24 import org.chromium.content.browser.ContentViewCore; |
25 import org.chromium.content_public.browser.WebContents; | 25 import org.chromium.content_public.browser.WebContents; |
26 import org.chromium.ui.base.WindowAndroid; | 26 import org.chromium.ui.base.WindowAndroid; |
27 import org.chromium.ui.base.WindowAndroid.OnCloseContextMenuListener; | 27 import org.chromium.ui.base.WindowAndroid.OnCloseContextMenuListener; |
28 | 28 |
29 import java.util.List; | 29 import java.util.List; |
30 | 30 |
| 31 import javax.annotation.Nullable; |
| 32 |
31 /** | 33 /** |
32 * A helper class that handles generating context menus for {@link ContentViewCo
re}s. | 34 * A helper class that handles generating context menus for {@link ContentViewCo
re}s. |
33 */ | 35 */ |
34 public class ContextMenuHelper implements OnCreateContextMenuListener { | 36 public class ContextMenuHelper implements OnCreateContextMenuListener { |
| 37 private static final int MAX_SHARE_DIMEN_PX = 2048; |
| 38 |
35 private long mNativeContextMenuHelper; | 39 private long mNativeContextMenuHelper; |
36 | 40 |
37 private ContextMenuPopulator mPopulator; | 41 private ContextMenuPopulator mPopulator; |
38 private ContextMenuParams mCurrentContextMenuParams; | 42 private ContextMenuParams mCurrentContextMenuParams; |
39 private Activity mActivity; | 43 private Activity mActivity; |
40 private Callback<Integer> mCallback; | 44 private Callback<Integer> mCallback; |
41 private Runnable mOnMenuShown; | 45 private Runnable mOnMenuShown; |
42 private Runnable mOnMenuClosed; | 46 private Runnable mOnMenuClosed; |
43 private Callback<Bitmap> mOnThumbnailReceivedCallback; | |
44 private ComponentName mComponentName; | |
45 | 47 |
46 private ContextMenuHelper(long nativeContextMenuHelper) { | 48 private ContextMenuHelper(long nativeContextMenuHelper) { |
47 mNativeContextMenuHelper = nativeContextMenuHelper; | 49 mNativeContextMenuHelper = nativeContextMenuHelper; |
48 } | 50 } |
49 | 51 |
50 @CalledByNative | 52 @CalledByNative |
51 private static ContextMenuHelper create(long nativeContextMenuHelper) { | 53 private static ContextMenuHelper create(long nativeContextMenuHelper) { |
52 return new ContextMenuHelper(nativeContextMenuHelper); | 54 return new ContextMenuHelper(nativeContextMenuHelper); |
53 } | 55 } |
54 | 56 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 */ | 164 */ |
163 public void searchForImage() { | 165 public void searchForImage() { |
164 if (mNativeContextMenuHelper == 0) return; | 166 if (mNativeContextMenuHelper == 0) return; |
165 nativeSearchForImage(mNativeContextMenuHelper); | 167 nativeSearchForImage(mNativeContextMenuHelper); |
166 } | 168 } |
167 | 169 |
168 /** | 170 /** |
169 * Share the image that triggered the current context menu. | 171 * Share the image that triggered the current context menu. |
170 */ | 172 */ |
171 public void shareImage() { | 173 public void shareImage() { |
172 if (mNativeContextMenuHelper == 0) return; | 174 shareImageDirectly(null); |
173 nativeShareImage(mNativeContextMenuHelper); | |
174 } | |
175 | |
176 @CalledByNative | |
177 private void onShareImageReceived( | |
178 WindowAndroid windowAndroid, byte[] jpegImageData) { | |
179 Activity activity = windowAndroid.getActivity().get(); | |
180 if (activity == null) return; | |
181 | |
182 ShareHelper.shareImage(activity, jpegImageData, mComponentName); | |
183 // This needs to be reset to null after a share. This way the next time
a user shares an | |
184 // image it won't share with the last shared app unless explicitly told. | |
185 mComponentName = null; | |
186 } | 175 } |
187 | 176 |
188 /** | 177 /** |
189 * Share image triggered with the current context menu directly with a speci
fic app. | 178 * Share image triggered with the current context menu directly with a speci
fic app. |
190 * @param name The {@link ComponentName} of the app to share the image direc
tly with. | 179 * @param name The {@link ComponentName} of the app to share the image direc
tly with. |
191 */ | 180 */ |
192 public void shareImageDirectly(ComponentName name) { | 181 public void shareImageDirectly(@Nullable final ComponentName name) { |
193 mComponentName = name; | 182 if (mNativeContextMenuHelper == 0) return; |
194 shareImage(); | 183 Callback<byte[]> callback = new Callback<byte[]>() { |
| 184 @Override |
| 185 public void onResult(byte[] result) { |
| 186 WebContents webContents = nativeGetJavaWebContents(mNativeContex
tMenuHelper); |
| 187 WindowAndroid windowAndroid = webContents.getTopLevelNativeWindo
w(); |
| 188 |
| 189 Activity activity = windowAndroid.getActivity().get(); |
| 190 if (activity == null) return; |
| 191 |
| 192 ShareHelper.shareImage(activity, result, name); |
| 193 } |
| 194 }; |
| 195 nativeRetrieveImage(mNativeContextMenuHelper, callback, MAX_SHARE_DIMEN_
PX); |
195 } | 196 } |
196 | 197 |
197 /** | 198 /** |
198 * Gets the thumbnail of the current image that triggered the context menu. | 199 * Gets the thumbnail of the current image that triggered the context menu. |
199 * @param callback Called once the the thumbnail is received. | 200 * @param callback Called once the the thumbnail is received. |
200 */ | 201 */ |
201 private void getThumbnail(Callback<Bitmap> callback) { | 202 private void getThumbnail(final Callback<Bitmap> callback) { |
202 mOnThumbnailReceivedCallback = callback; | |
203 if (mNativeContextMenuHelper == 0) return; | 203 if (mNativeContextMenuHelper == 0) return; |
204 int maxSizePx = mActivity.getResources().getDimensionPixelSize( | 204 int maxSizePx = mActivity.getResources().getDimensionPixelSize( |
205 R.dimen.context_menu_header_image_max_size); | 205 R.dimen.context_menu_header_image_max_size); |
206 nativeRetrieveHeaderThumbnail(mNativeContextMenuHelper, maxSizePx); | 206 Callback<byte[]> rawDataCallback = new Callback<byte[]>() { |
207 } | 207 @Override |
208 | 208 public void onResult(byte[] result) { |
209 @CalledByNative | 209 // TODO(tedchoc): Decode in separate process before launch. |
210 private void onHeaderThumbnailReceived(WindowAndroid windowAndroid, byte[] j
pegImageData) { | 210 Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.
length); |
211 // TODO(tedchoc): Decode in separate process before launch. | 211 callback.onResult(bitmap); |
212 Bitmap bitmap = BitmapFactory.decodeByteArray(jpegImageData, 0, jpegImag
eData.length); | 212 } |
213 if (mOnThumbnailReceivedCallback != null) { | 213 }; |
214 mOnThumbnailReceivedCallback.onResult(bitmap); | 214 nativeRetrieveImage(mNativeContextMenuHelper, rawDataCallback, maxSizePx
); |
215 } | |
216 } | 215 } |
217 | 216 |
218 @Override | 217 @Override |
219 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo me
nuInfo) { | 218 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo me
nuInfo) { |
220 List<Pair<Integer, List<ContextMenuItem>>> items = | 219 List<Pair<Integer, List<ContextMenuItem>>> items = |
221 mPopulator.buildContextMenu(menu, v.getContext(), mCurrentContex
tMenuParams); | 220 mPopulator.buildContextMenu(menu, v.getContext(), mCurrentContex
tMenuParams); |
222 ContextMenuUi menuUi = new PlatformContextMenuUi(menu); | 221 ContextMenuUi menuUi = new PlatformContextMenuUi(menu); |
223 menuUi.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallbac
k, mOnMenuShown, | 222 menuUi.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallbac
k, mOnMenuShown, |
224 mOnMenuClosed); | 223 mOnMenuClosed); |
225 } | 224 } |
226 | 225 |
227 /** | 226 /** |
228 * @return The {@link ContextMenuPopulator} responsible for populating the c
ontext menu. | 227 * @return The {@link ContextMenuPopulator} responsible for populating the c
ontext menu. |
229 */ | 228 */ |
230 @VisibleForTesting | 229 @VisibleForTesting |
231 public ContextMenuPopulator getPopulator() { | 230 public ContextMenuPopulator getPopulator() { |
232 return mPopulator; | 231 return mPopulator; |
233 } | 232 } |
234 | 233 |
| 234 private native WebContents nativeGetJavaWebContents(long nativeContextMenuHe
lper); |
235 private native void nativeOnStartDownload( | 235 private native void nativeOnStartDownload( |
236 long nativeContextMenuHelper, boolean isLink, boolean isDataReductio
nProxyEnabled); | 236 long nativeContextMenuHelper, boolean isLink, boolean isDataReductio
nProxyEnabled); |
237 private native void nativeSearchForImage(long nativeContextMenuHelper); | 237 private native void nativeSearchForImage(long nativeContextMenuHelper); |
238 private native void nativeShareImage(long nativeContextMenuHelper); | 238 private native void nativeRetrieveImage( |
| 239 long nativeContextMenuHelper, Callback<byte[]> callback, int maxSize
Px); |
239 private native void nativeOnContextMenuClosed(long nativeContextMenuHelper); | 240 private native void nativeOnContextMenuClosed(long nativeContextMenuHelper); |
240 private native void nativeRetrieveHeaderThumbnail(long nativeContextMenuHelp
er, int maxSizePx); | |
241 } | 241 } |
OLD | NEW |