package android.support.v7.internal.view.menu; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build.VERSION; import android.os.IBinder; import android.support.v4.internal.view.SupportContextMenu; import android.util.EventLog; import android.view.View; import java.lang.reflect.Method; public class ContextMenuBuilder extends MenuBuilder implements SupportContextMenu { private ContextMenuInfo mContextMenuInfo; private ContextMenuListener mListener; public ContextMenuBuilder(Context context, ContextMenuListener listener) { super(context); mListener = listener; } public ContextMenuInfo getContextMenuInfo() { return mContextMenuInfo; } protected ContextMenuInfo getContextMenuInfo(View view) { if (view instanceof ContextMenuInfoGetter) { return ((ContextMenuInfoGetter) view).getContextMenuInfo(); } ContextMenuInfo menuInfo = null; try { Method method = View.class.getDeclaredMethod("getContextMenuInfo"); method.setAccessible(true); menuInfo = (ContextMenuInfo) method.invoke(view); } catch (Exception e) { } return menuInfo; } public ContextMenuListener getContextMenuListener() { return mListener; } public void setContextMenuListener(ContextMenuListener listener) { mListener = listener; } @Override public SupportContextMenu setHeaderIcon(Drawable icon) { return (SupportContextMenu) super.setHeaderIconInt(icon); } @Override public SupportContextMenu setHeaderIcon(int iconRes) { return (SupportContextMenu) super.setHeaderIconInt(iconRes); } @Override public SupportContextMenu setHeaderTitle(CharSequence title) { return (SupportContextMenu) super.setHeaderTitleInt(title); } @Override public SupportContextMenu setHeaderTitle(int titleRes) { return (SupportContextMenu) super.setHeaderTitleInt(titleRes); } @Override public SupportContextMenu setHeaderView(View view) { return (SupportContextMenu) super.setHeaderViewInt(view); } @SuppressLint("NewApi") public MenuDialogHelper show(View originalView, IBinder token) { if (mListener == null) { throw new IllegalStateException( "Cannot show context menu without reference on ContextMenuListener"); } mContextMenuInfo = getContextMenuInfo(originalView); mListener.onCreateContextMenu(this, originalView, mContextMenuInfo); if (getVisibleItems().size() > 0) { if (VERSION.SDK_INT >= 8) { EventLog.writeEvent(50001, 1); } MenuDialogHelper helper = new MenuDialogHelper(this); helper.show(token); return helper; } return null; } public static interface ContextMenuInfoGetter { public ContextMenuInfo getContextMenuInfo(); } }