14be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell/*
24be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * Copyright (C) 2010 The Android Open Source Project
34be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell *
44be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
54be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * you may not use this file except in compliance with the License.
64be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * You may obtain a copy of the License at
74be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell *
84be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
94be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell *
104be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * Unless required by applicable law or agreed to in writing, software
114be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
124be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * See the License for the specific language governing permissions and
144be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * limitations under the License.
154be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell */
164be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
174be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellpackage android.widget;
184be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
194be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport com.android.internal.view.menu.MenuBuilder;
204be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport com.android.internal.view.menu.MenuPopupHelper;
2142b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powellimport com.android.internal.view.menu.MenuPresenter;
224be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport com.android.internal.view.menu.SubMenuBuilder;
234be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
244be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport android.content.Context;
2554c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powellimport android.view.Gravity;
264be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport android.view.Menu;
274be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport android.view.MenuInflater;
284be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport android.view.MenuItem;
294be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powellimport android.view.View;
301955a5b531f03dec90f285b590ef62e3d632783cAlan Viveretteimport android.view.View.OnTouchListener;
311955a5b531f03dec90f285b590ef62e3d632783cAlan Viveretteimport android.widget.ListPopupWindow.ForwardingListener;
324be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
334be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell/**
344be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * A PopupMenu displays a {@link Menu} in a modal popup window anchored to a {@link View}.
354be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * The popup will appear below the anchor view if there is room, or above it if there is not.
364be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * If the IME is visible the popup will not overlap it until it is touched. Touching outside
374be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell * of the popup will dismiss it.
384be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell */
3942b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powellpublic class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback {
404be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    private Context mContext;
414be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    private MenuBuilder mMenu;
424be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    private View mAnchor;
434be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    private MenuPopupHelper mPopup;
444be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    private OnMenuItemClickListener mMenuItemClickListener;
4542b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    private OnDismissListener mDismissListener;
461955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette    private OnTouchListener mDragListener;
4742b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell
4842b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    /**
4942b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * Callback interface used to notify the application that the menu has closed.
5042b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     */
5142b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    public interface OnDismissListener {
5242b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        /**
5342b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell         * Called when the associated menu has been dismissed.
5442b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell         *
5542b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell         * @param menu The PopupMenu that was dismissed.
5642b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell         */
5742b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        public void onDismiss(PopupMenu menu);
5842b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    }
594be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
604be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
614be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * Construct a new PopupMenu.
624be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     *
634be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @param context Context for the PopupMenu.
644be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @param anchor Anchor view for this popup. The popup will appear below the anchor if there
654be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     *               is room, or above it if there is not.
664be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
674be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public PopupMenu(Context context, View anchor) {
6854c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell        this(context, anchor, Gravity.NO_GRAVITY);
6954c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell    }
7054c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell
7154c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell    /**
7254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     * Construct a new PopupMenu.
7354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     *
7454c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     * @param context Context for the PopupMenu.
7554c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     * @param anchor Anchor view for this popup. The popup will appear below the anchor if there
7654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     *               is room, or above it if there is not.
7754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     * @param gravity The {@link Gravity} value for aligning the popup with its anchor
7854c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell     */
7954c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell    public PopupMenu(Context context, View anchor, int gravity) {
804be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        // TODO Theme?
814be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mContext = context;
824be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mMenu = new MenuBuilder(context);
834be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mMenu.setCallback(this);
844be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mAnchor = anchor;
854be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mPopup = new MenuPopupHelper(context, mMenu, anchor);
8654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell        mPopup.setGravity(gravity);
8742b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        mPopup.setCallback(this);
884be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
894be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
904be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
911955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * Returns an {@link OnTouchListener} that can be added to the anchor view
921955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * to implement drag-to-open behavior.
931955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * <p>
941955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * When the listener is set on a view, touching that view and dragging
951955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * outside of its bounds will open the popup window. Lifting will select the
961955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * currently touched list item.
971955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * <p>
981955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * Example usage:
993f9832d3c7b30bf4dc8ed9e5123b02daca96c878Alan Viverette     * <pre>
1003f9832d3c7b30bf4dc8ed9e5123b02daca96c878Alan Viverette     * PopupMenu myPopup = new PopupMenu(context, myAnchor);
1013f9832d3c7b30bf4dc8ed9e5123b02daca96c878Alan Viverette     * myAnchor.setOnTouchListener(myPopup.getDragToOpenListener());
1023f9832d3c7b30bf4dc8ed9e5123b02daca96c878Alan Viverette     * </pre>
1031955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     *
1041955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     * @return a touch listener that controls drag-to-open behavior
1051955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette     */
1061955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette    public OnTouchListener getDragToOpenListener() {
1071955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette        if (mDragListener == null) {
1081955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette            mDragListener = new ForwardingListener(mAnchor) {
1091955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette                @Override
11099d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                protected boolean onForwardingStarted() {
11199d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                    show();
11299d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                    return true;
11399d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                }
11499d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette
11599d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                @Override
11699d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                protected boolean onForwardingStopped() {
11799d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                    dismiss();
11899d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                    return true;
11999d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                }
12099d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette
12199d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                @Override
1221955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette                public ListPopupWindow getPopup() {
12399d72497d30ad3109c987348f4bf8494c1f93299Alan Viverette                    // This will be null until show() is called.
1241955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette                    return mPopup.getPopup();
1251955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette                }
1261955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette            };
1271955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette        }
1281955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette
1291955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette        return mDragListener;
1301955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette    }
1311955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette
1321955a5b531f03dec90f285b590ef62e3d632783cAlan Viverette    /**
1334be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @return the {@link Menu} associated with this popup. Populate the returned Menu with
1344be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * items before calling {@link #show()}.
1354be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     *
1364be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @see #show()
1374be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @see #getMenuInflater()
1384be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
1394be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public Menu getMenu() {
1404be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        return mMenu;
1414be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
1424be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
1434be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
1444be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @return a {@link MenuInflater} that can be used to inflate menu items from XML into the
1454be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * menu returned by {@link #getMenu()}.
1464be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     *
1474be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @see #getMenu()
1484be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
1494be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public MenuInflater getMenuInflater() {
1504be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        return new MenuInflater(mContext);
1514be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
1524be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
1534be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
15442b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * Inflate a menu resource into this PopupMenu. This is equivalent to calling
15542b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * popupMenu.getMenuInflater().inflate(menuRes, popupMenu.getMenu()).
15642b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * @param menuRes Menu resource to inflate
15742b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     */
15842b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    public void inflate(int menuRes) {
15942b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        getMenuInflater().inflate(menuRes, mMenu);
16042b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    }
16142b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell
16242b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    /**
1634be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * Show the menu popup anchored to the view specified during construction.
1644be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @see #dismiss()
1654be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
1664be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public void show() {
1674be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mPopup.show();
1684be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
1694be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
1704be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
1714be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * Dismiss the menu popup.
1724be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @see #show()
1734be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
1744be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public void dismiss() {
1754be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mPopup.dismiss();
1764be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
1774be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
17842b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    /**
17942b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * Set a listener that will be notified when the user selects an item from the menu.
18042b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     *
18142b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * @param listener Listener to notify
18242b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     */
1834be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
1844be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        mMenuItemClickListener = listener;
1854be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
1864be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
1874be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
18842b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * Set a listener that will be notified when this menu is dismissed.
18942b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     *
19042b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     * @param listener Listener to notify
19142b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell     */
19242b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    public void setOnDismissListener(OnDismissListener listener) {
19342b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        mDismissListener = listener;
19442b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    }
19542b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell
19642b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    /**
1974be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @hide
1984be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
1994be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
2004be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        if (mMenuItemClickListener != null) {
2014be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell            return mMenuItemClickListener.onMenuItemClick(item);
2024be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        }
2034be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        return false;
2044be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
2054be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
2064be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
2074be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @hide
2084be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
2094be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
21042b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        if (mDismissListener != null) {
21142b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell            mDismissListener.onDismiss(this);
21242b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        }
2134be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
2144be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
2154be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
2164be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @hide
2174be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
21842b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell    public boolean onOpenSubMenu(MenuBuilder subMenu) {
219823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell        if (subMenu == null) return false;
220823f074a73cfc23c40a7b576c71daa096ee9ed6aAdam Powell
2214be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        if (!subMenu.hasVisibleItems()) {
2224be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell            return true;
2234be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        }
2244be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
2254be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        // Current menu will be dismissed by the normal helper, submenu will be shown in its place.
2264be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        new MenuPopupHelper(mContext, subMenu, mAnchor).show();
2274be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        return true;
2284be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
2294be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
2304be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
2314be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @hide
2324be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
2334be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public void onCloseSubMenu(SubMenuBuilder menu) {
2344be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
2354be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
2364be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
2374be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * @hide
2384be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
2394be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public void onMenuModeChange(MenuBuilder menu) {
2404be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
2414be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell
2424be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    /**
2434be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * Interface responsible for receiving menu item click events if the items themselves
2444be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     * do not have individual item click listeners.
2454be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell     */
2464be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    public interface OnMenuItemClickListener {
2474be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        /**
2484be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell         * This method will be invoked when a menu item is clicked if the item itself did
2494be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell         * not already handle the event.
2504be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell         *
2514be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell         * @param item {@link MenuItem} that was clicked
2524be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell         * @return <code>true</code> if the event was handled, <code>false</code> otherwise.
2534be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell         */
2544be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        public boolean onMenuItemClick(MenuItem item);
2554be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell    }
2564be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell}
257