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

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

Issue 2775373002: Add a Share Icon to Tabular Context Menu (Closed)
Patch Set: Fixed more tests! Created 3 years, 8 months 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
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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.Dialog; 8 import android.app.Dialog;
8 import android.content.Context;
9 import android.content.DialogInterface; 9 import android.content.DialogInterface;
10 import android.content.res.Resources; 10 import android.content.res.Resources;
11 import android.graphics.Bitmap; 11 import android.graphics.Bitmap;
12 import android.graphics.Canvas; 12 import android.graphics.Canvas;
13 import android.graphics.Shader; 13 import android.graphics.Shader;
14 import android.graphics.drawable.BitmapDrawable; 14 import android.graphics.drawable.BitmapDrawable;
15 import android.graphics.drawable.Drawable; 15 import android.graphics.drawable.Drawable;
16 import android.support.design.widget.TabLayout; 16 import android.support.design.widget.TabLayout;
17 import android.support.v4.view.ViewPager; 17 import android.support.v4.view.ViewPager;
18 import android.support.v7.app.AlertDialog; 18 import android.support.v7.app.AlertDialog;
(...skipping 17 matching lines...) Expand all
36 import java.util.List; 36 import java.util.List;
37 37
38 /** 38 /**
39 * A custom dialog that separates each group into separate tabs. It uses a dialo g instead. 39 * A custom dialog that separates each group into separate tabs. It uses a dialo g instead.
40 */ 40 */
41 public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl ickListener { 41 public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl ickListener {
42 private Dialog mDialog; 42 private Dialog mDialog;
43 private Callback<Integer> mCallback; 43 private Callback<Integer> mCallback;
44 private int mMenuItemHeight; 44 private int mMenuItemHeight;
45 private ImageView mHeaderImageView; 45 private ImageView mHeaderImageView;
46 private Runnable mOnShareItemClicked;
47
48 public TabularContextMenuUi(Runnable onShareItemClicked) {
49 mOnShareItemClicked = onShareItemClicked;
50 }
46 51
47 @Override 52 @Override
48 public void displayMenu(Context context, ContextMenuParams params, 53 public void displayMenu(Activity activity, ContextMenuParams params,
49 List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked, 54 List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked,
50 final Runnable onMenuShown, final Runnable onMenuClosed) { 55 final Runnable onMenuShown, final Runnable onMenuClosed) {
51 mCallback = onItemClicked; 56 mCallback = onItemClicked;
52 mDialog = createDialog(context, params, items); 57 mDialog = createDialog(activity, params, items);
53 mDialog.getWindow().setBackgroundDrawable(ApiCompatibilityUtils.getDrawa ble( 58 mDialog.getWindow().setBackgroundDrawable(ApiCompatibilityUtils.getDrawa ble(
54 context.getResources(), R.drawable.bg_find_toolbar_popup)); 59 activity.getResources(), R.drawable.bg_find_toolbar_popup));
55 60
56 mDialog.setOnShowListener(new DialogInterface.OnShowListener() { 61 mDialog.setOnShowListener(new DialogInterface.OnShowListener() {
57 @Override 62 @Override
58 public void onShow(DialogInterface dialogInterface) { 63 public void onShow(DialogInterface dialogInterface) {
59 onMenuShown.run(); 64 onMenuShown.run();
60 } 65 }
61 }); 66 });
62 67
63 mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 68 mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
64 @Override 69 @Override
65 public void onDismiss(DialogInterface dialogInterface) { 70 public void onDismiss(DialogInterface dialogInterface) {
66 onMenuClosed.run(); 71 onMenuClosed.run();
67 } 72 }
68 }); 73 });
69 74
70 mDialog.show(); 75 mDialog.show();
71 } 76 }
72 77
73 /** 78 /**
74 * Returns the fully complete dialog based off the params and the itemGroups . 79 * Returns the fully complete dialog based off the params and the itemGroups .
75 * @param context Used to inflate the dialog. 80 * @param activity Used to inflate the dialog.
76 * @param params Used to get the header title. 81 * @param params Used to get the header title.
77 * @param itemGroups If there is more than one group it will create a paged view. 82 * @param itemGroups If there is more than one group it will create a paged view.
78 * @return Returns a final dialog that does not have a background can be dis played using 83 * @return Returns a final dialog that does not have a background can be dis played using
79 * {@link AlertDialog#show()}. 84 * {@link AlertDialog#show()}.
80 */ 85 */
81 private Dialog createDialog(Context context, ContextMenuParams params, 86 private Dialog createDialog(Activity activity, ContextMenuParams params,
82 List<Pair<Integer, List<ContextMenuItem>>> itemGroups) { 87 List<Pair<Integer, List<ContextMenuItem>>> itemGroups) {
83 Dialog dialog = new Dialog(context); 88 Dialog dialog = new Dialog(activity);
84 dialog.setContentView(createPagerView(context, params, itemGroups)); 89 dialog.setContentView(createPagerView(activity, params, itemGroups));
85 return dialog; 90 return dialog;
86 } 91 }
87 92
88 /** 93 /**
89 * Creates the view of a context menu. Based off the Context Type, it'll adj ust the list of 94 * Creates the view of a context menu. Based off the Context Type, it'll adj ust the list of
90 * items and display only the ones that'll be on that specific group. 95 * items and display only the ones that'll be on that specific group.
91 * @param context Used to get the resources of an item. 96 * @param activity Used to get the resources of an item.
92 * @param params used to create the header text. 97 * @param params used to create the header text.
93 * @param items A set of Items to display in a context menu. Filtered based off the type. 98 * @param items A set of Items to display in a context menu. Filtered based off the type.
94 * @param isImage Whether or not the view should have an image layout or not . 99 * @param isImage Whether or not the view should have an image layout or not .
95 * @param maxCount The maximum amount of {@link ContextMenuItem}s that could exist in this view 100 * @param maxCount The maximum amount of {@link ContextMenuItem}s that could exist in this view
96 * or any other views calculated in the context menu. Used t o estimate the size 101 * or any other views calculated in the context menu. Used t o estimate the size
97 * of the list. 102 * of the list.
98 * @return Returns a filled LinearLayout with all the context menu items. 103 * @return Returns a filled LinearLayout with all the context menu items.
99 */ 104 */
100 @VisibleForTesting 105 @VisibleForTesting
101 ViewGroup createContextMenuPageUi(Context context, ContextMenuParams params, 106 ViewGroup createContextMenuPageUi(Activity activity, ContextMenuParams param s,
102 List<ContextMenuItem> items, boolean isImage, int maxCount) { 107 List<ContextMenuItem> items, boolean isImage, int maxCount) {
103 ViewGroup baseLayout = (ViewGroup) LayoutInflater.from(context).inflate( 108 ViewGroup baseLayout = (ViewGroup) LayoutInflater.from(activity).inflate (
104 R.layout.tabular_context_menu_page, null); 109 R.layout.tabular_context_menu_page, null);
105 ListView listView = (ListView) baseLayout.findViewById(R.id.selectable_i tems); 110 ListView listView = (ListView) baseLayout.findViewById(R.id.selectable_i tems);
106 111
107 if (isImage) { 112 if (isImage) {
108 displayImageHeader(baseLayout, params, context.getResources()); 113 displayImageHeader(baseLayout, params, activity.getResources());
109 } else { 114 } else {
110 displayHeaderIfVisibleItems(params, baseLayout); 115 displayHeaderIfVisibleItems(params, baseLayout);
111 } 116 }
112 117
113 // Set the list adapter and get the height to display it appropriately i n a dialog. 118 // Set the list adapter and get the height to display it appropriately i n a dialog.
114 TabularContextMenuListAdapter listAdapter = 119 TabularContextMenuListAdapter listAdapter =
115 new TabularContextMenuListAdapter(items, context); 120 new TabularContextMenuListAdapter(items, activity, mOnShareItemC licked);
116 ViewGroup.LayoutParams layoutParams = listView.getLayoutParams(); 121 ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
117 layoutParams.height = measureApproximateListViewHeight(listView, listAda pter, maxCount); 122 layoutParams.height = measureApproximateListViewHeight(listView, listAda pter, maxCount);
118 listView.setLayoutParams(layoutParams); 123 listView.setLayoutParams(layoutParams);
119 listView.setAdapter(listAdapter); 124 listView.setAdapter(listAdapter);
120 listView.setOnItemClickListener(this); 125 listView.setOnItemClickListener(this);
121 126
122 return baseLayout; 127 return baseLayout;
123 } 128 }
124 129
125 private void displayHeaderIfVisibleItems(ContextMenuParams params, ViewGroup baseLayout) { 130 private void displayHeaderIfVisibleItems(ContextMenuParams params, ViewGroup baseLayout) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 View view = listAdapter.getView(0, null, listView); 204 View view = listAdapter.getView(0, null, listView);
200 view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UN SPECIFIED), 205 view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UN SPECIFIED),
201 View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECI FIED)); 206 View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECI FIED));
202 mMenuItemHeight = view.getMeasuredHeight(); 207 mMenuItemHeight = view.getMeasuredHeight();
203 } 208 }
204 return totalHeight + mMenuItemHeight * maxCount; 209 return totalHeight + mMenuItemHeight * maxCount;
205 } 210 }
206 211
207 /** 212 /**
208 * Creates a ViewPageAdapter based off the given list of views. 213 * Creates a ViewPageAdapter based off the given list of views.
209 * @param context Used to inflate the new ViewPager 214 * @param activity Used to inflate the new ViewPager
210 * @param params Used to get the header text. 215 * @param params Used to get the header text.
211 * @param itemGroups The list of views to put into the ViewPager. The string is the title of the 216 * @param itemGroups The list of views to put into the ViewPager. The string is the title of the
212 * tab 217 * tab
213 * @return Returns a complete tabular context menu view. 218 * @return Returns a complete tabular context menu view.
214 */ 219 */
215 @VisibleForTesting 220 @VisibleForTesting
216 View createPagerView(Context context, ContextMenuParams params, 221 View createPagerView(Activity activity, ContextMenuParams params,
217 List<Pair<Integer, List<ContextMenuItem>>> itemGroups) { 222 List<Pair<Integer, List<ContextMenuItem>>> itemGroups) {
218 View view = LayoutInflater.from(context).inflate(R.layout.tabular_contex t_menu, null); 223 View view = LayoutInflater.from(activity).inflate(R.layout.tabular_conte xt_menu, null);
219 224
220 List<Pair<String, ViewGroup>> viewGroups = new ArrayList<>(); 225 List<Pair<String, ViewGroup>> viewGroups = new ArrayList<>();
221 int maxCount = 0; 226 int maxCount = 0;
222 for (int i = 0; i < itemGroups.size(); i++) { 227 for (int i = 0; i < itemGroups.size(); i++) {
223 Pair<Integer, List<ContextMenuItem>> itemGroup = itemGroups.get(i); 228 Pair<Integer, List<ContextMenuItem>> itemGroup = itemGroups.get(i);
224 maxCount = Math.max(maxCount, itemGroup.second.size()); 229 maxCount = Math.max(maxCount, itemGroup.second.size());
225 } 230 }
226 for (int i = 0; i < itemGroups.size(); i++) { 231 for (int i = 0; i < itemGroups.size(); i++) {
227 Pair<Integer, List<ContextMenuItem>> itemGroup = itemGroups.get(i); 232 Pair<Integer, List<ContextMenuItem>> itemGroup = itemGroups.get(i);
228 // TODO(tedchoc): Pass the ContextMenuGroup identifier to determine if it's an image. 233 // TODO(tedchoc): Pass the ContextMenuGroup identifier to determine if it's an image.
229 boolean isImageTab = itemGroup.first == R.string.contextmenu_image_t itle; 234 boolean isImageTab = itemGroup.first == R.string.contextmenu_image_t itle;
230 viewGroups.add(new Pair<>(context.getString(itemGroup.first), 235 viewGroups.add(new Pair<>(activity.getString(itemGroup.first),
231 createContextMenuPageUi( 236 createContextMenuPageUi(
232 context, params, itemGroup.second, isImageTab, maxCo unt))); 237 activity, params, itemGroup.second, isImageTab, maxC ount)));
233 } 238 }
234 TabularContextMenuViewPager pager = 239 TabularContextMenuViewPager pager =
235 (TabularContextMenuViewPager) view.findViewById(R.id.custom_page r); 240 (TabularContextMenuViewPager) view.findViewById(R.id.custom_page r);
236 pager.setAdapter(new TabularContextMenuPagerAdapter(viewGroups)); 241 pager.setAdapter(new TabularContextMenuPagerAdapter(viewGroups));
237 242
238 TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); 243 TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
239 if (itemGroups.size() <= 1) { 244 if (itemGroups.size() <= 1) {
240 tabLayout.setVisibility(View.GONE); 245 tabLayout.setVisibility(View.GONE);
241 } 246 }
242 tabLayout.setupWithViewPager((ViewPager) view.findViewById(R.id.custom_p ager)); 247 tabLayout.setupWithViewPager((ViewPager) view.findViewById(R.id.custom_p ager));
(...skipping 10 matching lines...) Expand all
253 mHeaderImageView.setImageBitmap(bitmap); 258 mHeaderImageView.setImageBitmap(bitmap);
254 } 259 }
255 } 260 }
256 261
257 @Override 262 @Override
258 public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 263 public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
259 mDialog.dismiss(); 264 mDialog.dismiss();
260 mCallback.onResult((int) id); 265 mCallback.onResult((int) id);
261 } 266 }
262 } 267 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698