| Index: chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java
|
| index 09428c07607022ac3b53855c70553f103e64cdfe..7a7e5c125a29017108dab2dbfb3e6060d42b70d0 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java
|
| @@ -5,7 +5,6 @@
|
| package org.chromium.chrome.browser.contextmenu;
|
|
|
| import android.app.Activity;
|
| -import android.app.Dialog;
|
| import android.content.DialogInterface;
|
| import android.content.res.Resources;
|
| import android.graphics.Bitmap;
|
| @@ -14,7 +13,6 @@ import android.graphics.Shader;
|
| import android.graphics.drawable.BitmapDrawable;
|
| import android.graphics.drawable.Drawable;
|
| import android.support.design.widget.TabLayout;
|
| -import android.support.v4.view.ViewPager;
|
| import android.support.v7.app.AlertDialog;
|
| import android.text.TextUtils;
|
| import android.util.Pair;
|
| @@ -31,6 +29,8 @@ import org.chromium.base.ApiCompatibilityUtils;
|
| import org.chromium.base.Callback;
|
| import org.chromium.base.VisibleForTesting;
|
| import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.widget.ContextMenuDialog;
|
| +import org.chromium.content.browser.RenderCoordinates;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| @@ -39,71 +39,88 @@ import java.util.List;
|
| * A custom dialog that separates each group into separate tabs. It uses a dialog instead.
|
| */
|
| public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemClickListener {
|
| - private Dialog mDialog;
|
| + private ContextMenuDialog mContextMenuDialog;
|
| private Callback<Integer> mCallback;
|
| private int mMenuItemHeight;
|
| private ImageView mHeaderImageView;
|
| private Runnable mOnShareItemClicked;
|
| + private View mPagerView;
|
| + private RenderCoordinates mRenderCoordinates;
|
|
|
| public TabularContextMenuUi(Runnable onShareItemClicked) {
|
| mOnShareItemClicked = onShareItemClicked;
|
| }
|
|
|
| @Override
|
| - public void displayMenu(Activity activity, ContextMenuParams params,
|
| + public void displayMenu(final Activity activity, ContextMenuParams params,
|
| List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked,
|
| final Runnable onMenuShown, final Runnable onMenuClosed) {
|
| mCallback = onItemClicked;
|
| - mDialog = createDialog(activity, params, items);
|
|
|
| - mDialog.getWindow().setBackgroundDrawable(ApiCompatibilityUtils.getDrawable(
|
| - activity.getResources(), R.drawable.white_with_rounded_corners));
|
| + float density = Resources.getSystem().getDisplayMetrics().density;
|
| + final float touchPointXPx = params.getTriggeringTouchXDp() * density;
|
| + final float touchPointYPx = params.getTriggeringTouchYDp() * density;
|
|
|
| - mDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
| + mContextMenuDialog =
|
| + createContextMenuDialog(activity, params, items, touchPointXPx, touchPointYPx);
|
| +
|
| + mContextMenuDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
| @Override
|
| public void onShow(DialogInterface dialogInterface) {
|
| onMenuShown.run();
|
| }
|
| });
|
|
|
| - mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
| + mContextMenuDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
| @Override
|
| public void onDismiss(DialogInterface dialogInterface) {
|
| onMenuClosed.run();
|
| }
|
| });
|
|
|
| - mDialog.show();
|
| + mContextMenuDialog.show();
|
| }
|
|
|
| /**
|
| * Returns the fully complete dialog based off the params and the itemGroups.
|
| + *
|
| * @param activity Used to inflate the dialog.
|
| * @param params Used to get the header title.
|
| * @param itemGroups If there is more than one group it will create a paged view.
|
| + * @param touchPointYPx The x-coordinate of the touch that triggered the context menu.
|
| + * @param touchPointXPx The y-coordinate of the touch that triggered the context menu.
|
| * @return Returns a final dialog that does not have a background can be displayed using
|
| * {@link AlertDialog#show()}.
|
| */
|
| - private Dialog createDialog(Activity activity, ContextMenuParams params,
|
| - List<Pair<Integer, List<ContextMenuItem>>> itemGroups) {
|
| - Dialog dialog = new Dialog(activity);
|
| - dialog.setContentView(createPagerView(activity, params, itemGroups));
|
| + private ContextMenuDialog createContextMenuDialog(Activity activity, ContextMenuParams params,
|
| + List<Pair<Integer, List<ContextMenuItem>>> itemGroups, float touchPointXPx,
|
| + float touchPointYPx) {
|
| + View view = LayoutInflater.from(activity).inflate(R.layout.tabular_context_menu, null);
|
| +
|
| + mPagerView = initPagerView(activity, params, itemGroups,
|
| + (TabularContextMenuViewPager) view.findViewById(R.id.custom_pager));
|
| +
|
| + final ContextMenuDialog dialog = new ContextMenuDialog(activity, R.style.DialogWhenLarge,
|
| + touchPointXPx, touchPointYPx, mPagerView, mRenderCoordinates);
|
| + dialog.setContentView(view);
|
| +
|
| return dialog;
|
| }
|
|
|
| /**
|
| * Creates a ViewPageAdapter based off the given list of views.
|
| - * @param activity Used to inflate the new ViewPager
|
| + *
|
| + * @param activity Used to inflate the new ViewPager.
|
| * @param params Used to get the header text.
|
| * @param itemGroups The list of views to put into the ViewPager. The string is the title of the
|
| - * tab
|
| + * tab.
|
| + * @param viewPager The {@link TabularContextMenuViewPager} to initialize.
|
| * @return Returns a complete tabular context menu view.
|
| */
|
| @VisibleForTesting
|
| - View createPagerView(Activity activity, ContextMenuParams params,
|
| - List<Pair<Integer, List<ContextMenuItem>>> itemGroups) {
|
| - View view = LayoutInflater.from(activity).inflate(R.layout.tabular_context_menu, null);
|
| -
|
| + View initPagerView(Activity activity, ContextMenuParams params,
|
| + List<Pair<Integer, List<ContextMenuItem>>> itemGroups,
|
| + TabularContextMenuViewPager viewPager) {
|
| List<Pair<String, ViewGroup>> viewGroups = new ArrayList<>();
|
| int maxCount = 0;
|
| for (int i = 0; i < itemGroups.size(); i++) {
|
| @@ -118,30 +135,23 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl
|
| createContextMenuPageUi(
|
| activity, params, itemGroup.second, isImageTab, maxCount)));
|
| }
|
| - if (itemGroups.size() == 1) {
|
| - viewGroups.get(0)
|
| - .second.getChildAt(0)
|
| - .findViewById(R.id.context_header_layout)
|
| - .setBackgroundResource(R.color.google_grey_100);
|
| - }
|
| -
|
| - TabularContextMenuViewPager pager =
|
| - (TabularContextMenuViewPager) view.findViewById(R.id.custom_pager);
|
| - pager.setAdapter(new TabularContextMenuPagerAdapter(viewGroups));
|
|
|
| - TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
|
| + viewPager.setAdapter(new TabularContextMenuPagerAdapter(viewGroups));
|
| + TabLayout tabLayout = (TabLayout) viewPager.findViewById(R.id.tab_layout);
|
| if (itemGroups.size() <= 1) {
|
| tabLayout.setVisibility(View.GONE);
|
| } else {
|
| - tabLayout.setupWithViewPager((ViewPager) view.findViewById(R.id.custom_pager));
|
| + tabLayout.setBackgroundResource(R.drawable.grey_with_top_rounded_corners);
|
| + tabLayout.setupWithViewPager(viewPager);
|
| }
|
|
|
| - return view;
|
| + return viewPager;
|
| }
|
|
|
| /**
|
| * Creates the view of a context menu. Based off the Context Type, it'll adjust the list of
|
| * items and display only the ones that'll be on that specific group.
|
| + *
|
| * @param activity Used to get the resources of an item.
|
| * @param params used to create the header text.
|
| * @param items A set of Items to display in a context menu. Filtered based off the type.
|
| @@ -172,7 +182,7 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl
|
| @Override
|
| public void run() {
|
| mOnShareItemClicked.run();
|
| - mDialog.dismiss();
|
| + mContextMenuDialog.dismiss();
|
| }
|
| };
|
| TabularContextMenuListAdapter listAdapter =
|
| @@ -245,6 +255,7 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl
|
| * To save time measuring the height, this method gets an item if the height has not been
|
| * previous measured and multiplies it by count of the total amount of items. It is fine if the
|
| * height too small as the ListView will scroll through the other values.
|
| + *
|
| * @param listView The ListView to measure the surrounding padding.
|
| * @param listAdapter The adapter which contains the items within the list.
|
| * @return Returns the combined height of the padding of the ListView and the approximate height
|
| @@ -263,8 +274,8 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl
|
| }
|
|
|
| /**
|
| - * When an thumbnail is retrieved for the header of an image, this will set the header to
|
| - * that particular bitmap.
|
| + * When an thumbnail is retrieved for the header of an image, this will set the header to that
|
| + * particular bitmap.
|
| */
|
| public void onImageThumbnailRetrieved(Bitmap bitmap) {
|
| if (mHeaderImageView != null) {
|
| @@ -274,7 +285,15 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl
|
|
|
| @Override
|
| public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
|
| - mDialog.dismiss();
|
| + mContextMenuDialog.dismiss();
|
| mCallback.onResult((int) id);
|
| }
|
| +
|
| + /**
|
| + * Gives this class access to the render coordinates to allow access to the total size of the
|
| + * toolbar and tab strip.
|
| + */
|
| + public void setRenderCoordinates(RenderCoordinates renderCoordinates) {
|
| + mRenderCoordinates = renderCoordinates;
|
| + }
|
| }
|
|
|