1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/*
2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2011 The Android Open Source Project
3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License.
6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at
7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software
11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and
14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License.
15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.view.menu;
18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context;
20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.os.Parcelable;
21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup;
22bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
23bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/**
2420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * A MenuPresenter is responsible for building views for a Menu object. It takes over some
2520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * responsibility from the old style monolithic MenuBuilder class.
2689208232f3b5d1451408d787872504a190bc7ee0Chris Banes *
2789208232f3b5d1451408d787872504a190bc7ee0Chris Banes * @hide
28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic interface MenuPresenter {
3020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
3120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
3220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Called by menu implementation to notify another component of open/close events.
3389208232f3b5d1451408d787872504a190bc7ee0Chris Banes     *
3489208232f3b5d1451408d787872504a190bc7ee0Chris Banes     * @hide
3520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
3620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public interface Callback {
3720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
3820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        /**
3920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         * Called when a menu is closing.
4020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         */
4120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing);
4220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        /**
4420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         * Called when a submenu opens. Useful for notifying the application of menu state so that
4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         * it does not attempt to hide the action bar while a submenu is open or similar.
4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         *
4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         * @param subMenu Submenu currently being opened
4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         * @return true if the Callback will handle presenting the submenu, false if the presenter
4920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         *         should attempt to do so.
5020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns         */
5120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public boolean onOpenSubMenu(MenuBuilder subMenu);
5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Initialize this presenter for the given context and menu. This method is called by
5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * MenuBuilder when a presenter is added. See
5720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * {@link MenuBuilder#addMenuPresenter(MenuPresenter)}
5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
5920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param context Context for this presenter; used for view creation and resource management
6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param menu    Menu to host
6120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
6220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void initForMenu(Context context, MenuBuilder menu);
6320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    /**
6530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell     * Retrieve a MenuView to display the menu specified in
6630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell     * {@link #initForMenu(Context, MenuBuilder)}.
6720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param root Intended parent of the MenuView.
6920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return A freshly created MenuView.
7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public MenuView getMenuView(ViewGroup root);
7220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
7420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Update the menu UI in response to a change. Called by MenuBuilder during the normal course of
7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * operation.
7620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param cleared true if the menu was entirely cleared
7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void updateMenuView(boolean cleared);
8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Set a callback object that will be notified of menu events related to this specific
8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * presentation.
8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param cb Callback that will be notified of future events
8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setCallback(Callback cb);
8820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Called by Menu implementations to indicate that a submenu item has been selected. An active
9120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Callback should be notified, and if applicable the presenter should present the submenu.
9220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
9320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param subMenu SubMenu being opened
9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if the the event was handled, false otherwise.
9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onSubMenuSelected(SubMenuBuilder subMenu);
9720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
9820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
9920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Called by Menu implementations to indicate that a menu or submenu is closing. Presenter
10020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * implementations should close the representation of the menu indicated as necessary and notify
10120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * a registered callback.
10220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
10320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param menu               Menu or submenu that is closing.
10420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param allMenusAreClosing True if all associated menus are closing.
105bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell     */
106bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing);
107bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
108bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    /**
10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Called by Menu implementations to flag items that will be shown as actions.
11020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
11120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if this presenter changed the action status of any items.
11220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
11320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean flagActionItems();
11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
11620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Called when a menu item with a collapsable action view should expand its action view.
11720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
11820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param menu Menu containing the item to be expanded
11920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param item Item to be expanded
12020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if this presenter expanded the action view, false otherwise.
12120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
12220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item);
12320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
12420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
12520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Called when a menu item with a collapsable action view should collapse its action view.
12620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
12720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param menu Menu containing the item to be collapsed
12820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param item Item to be collapsed
12920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if this presenter collapsed the action view, false otherwise.
13020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
13120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item);
13220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
13320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
13420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Returns an ID for determining how to save/restore instance state.
13520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
13620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return a valid ID value.
13720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
13820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public int getId();
13920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
14020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Returns a Parcelable describing the current state of the presenter. It will be passed to the
14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * {@link #onRestoreInstanceState(Parcelable)} method of the presenter sharing the same ID
14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * later.
14420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
14520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return The saved instance state
14620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
14720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public Parcelable onSaveInstanceState();
14820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
14920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
15020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Supplies the previously saved instance state to be restored.
151bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell     *
15220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param state The previously saved instance state
153bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell     */
15420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onRestoreInstanceState(Parcelable state);
155bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell}
156