1e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes/*
2e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Copyright (C) 2012 The Android Open Source Project
3e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
4e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * you may not use this file except in compliance with the License.
6e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * You may obtain a copy of the License at
7e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
8e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
10e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Unless required by applicable law or agreed to in writing, software
11e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * See the License for the specific language governing permissions and
14e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * limitations under the License.
15e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes */
16e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.view.menu;
18e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
1989208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.content.Intent;
2089208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.graphics.drawable.Drawable;
21d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banesimport android.support.v4.internal.view.SupportMenuItem;
22d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banesimport android.support.v4.view.ActionProvider;
2389208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.support.v4.view.MenuItemCompat;
242e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banesimport android.support.v7.view.CollapsibleActionView;
25592df2e7552ba6902c9750ab8453850fc9e30334Chris Banesimport android.util.Log;
2689208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.view.ContextMenu;
2730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem;
2889208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.view.SubMenu;
29d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banesimport android.view.View;
302e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banesimport android.widget.FrameLayout;
31e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
32592df2e7552ba6902c9750ab8453850fc9e30334Chris Banesimport java.lang.reflect.Method;
33592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes
34592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes/**
35592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes * @hide
36592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes */
37592df2e7552ba6902c9750ab8453850fc9e30334Chris Banespublic class MenuItemWrapperICS extends BaseMenuWrapper<android.view.MenuItem> implements SupportMenuItem {
38592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes    static final String LOG_TAG = "MenuItemWrapper";
39592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes
40a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    private final boolean mEmulateProviderVisibilityOverride;
41a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    // Tracks the last requested visibility
42a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    private boolean mLastRequestVisible;
43a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes
44592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes    // Reflection Method to call setExclusiveCheckable
45592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes    private Method mSetExclusiveCheckableMethod;
46592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes
47a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    MenuItemWrapperICS(android.view.MenuItem object, boolean emulateProviderVisibilityOverride) {
48e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        super(object);
49a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        mLastRequestVisible = object.isVisible();
50a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        mEmulateProviderVisibilityOverride = emulateProviderVisibilityOverride;
51a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    }
52a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes
53a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    MenuItemWrapperICS(android.view.MenuItem object) {
54a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        this(object, true);
55a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    }
56a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes
57a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    @Override
5889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public int getItemId() {
5989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getItemId();
6089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
6189208232f3b5d1451408d787872504a190bc7ee0Chris Banes
6289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
6389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public int getGroupId() {
6489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getGroupId();
6589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
6689208232f3b5d1451408d787872504a190bc7ee0Chris Banes
6789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
6889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public int getOrder() {
6989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getOrder();
7089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
7189208232f3b5d1451408d787872504a190bc7ee0Chris Banes
7289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
7389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setTitle(CharSequence title) {
7489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setTitle(title);
7589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
7689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
7789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
7889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
7989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setTitle(int title) {
8089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setTitle(title);
8189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
8289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
8389208232f3b5d1451408d787872504a190bc7ee0Chris Banes
8489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
8589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public CharSequence getTitle() {
8689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getTitle();
8789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
8889208232f3b5d1451408d787872504a190bc7ee0Chris Banes
8989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
9089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setTitleCondensed(CharSequence title) {
9189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setTitleCondensed(title);
9289208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
9389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
9489208232f3b5d1451408d787872504a190bc7ee0Chris Banes
9589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
9689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public CharSequence getTitleCondensed() {
9789208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getTitleCondensed();
9889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
9989208232f3b5d1451408d787872504a190bc7ee0Chris Banes
10089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
10189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setIcon(Drawable icon) {
10289208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setIcon(icon);
10389208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
10489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
10589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
10689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
10789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setIcon(int iconRes) {
10889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setIcon(iconRes);
10989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
11089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
11189208232f3b5d1451408d787872504a190bc7ee0Chris Banes
11289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
11389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public Drawable getIcon() {
11489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getIcon();
11589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
11689208232f3b5d1451408d787872504a190bc7ee0Chris Banes
11789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
11889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setIntent(Intent intent) {
11989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setIntent(intent);
12089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
12189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
12289208232f3b5d1451408d787872504a190bc7ee0Chris Banes
12389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
12489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public Intent getIntent() {
12589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getIntent();
12689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
12789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
12889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
12989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setShortcut(char numericChar, char alphaChar) {
13089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setShortcut(numericChar, alphaChar);
13189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
13289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
13389208232f3b5d1451408d787872504a190bc7ee0Chris Banes
13489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
13589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setNumericShortcut(char numericChar) {
13689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setNumericShortcut(numericChar);
13789208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
13889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
13989208232f3b5d1451408d787872504a190bc7ee0Chris Banes
14089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
14189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public char getNumericShortcut() {
14289208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getNumericShortcut();
14389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
14489208232f3b5d1451408d787872504a190bc7ee0Chris Banes
14589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
14689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setAlphabeticShortcut(char alphaChar) {
14789208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setAlphabeticShortcut(alphaChar);
14889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
14989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
15089208232f3b5d1451408d787872504a190bc7ee0Chris Banes
15189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
15289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public char getAlphabeticShortcut() {
15389208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getAlphabeticShortcut();
15489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
15589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
15689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
15789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setCheckable(boolean checkable) {
15889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setCheckable(checkable);
15989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
16089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
16189208232f3b5d1451408d787872504a190bc7ee0Chris Banes
16289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
16389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public boolean isCheckable() {
16489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.isCheckable();
16589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
16689208232f3b5d1451408d787872504a190bc7ee0Chris Banes
16789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
16889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setChecked(boolean checked) {
16989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setChecked(checked);
17089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
17189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
17289208232f3b5d1451408d787872504a190bc7ee0Chris Banes
17389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
17489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public boolean isChecked() {
17589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.isChecked();
17689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
17789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
17889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
179a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    public MenuItem setVisible(boolean visible) {
180a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        if (mEmulateProviderVisibilityOverride) {
181a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            mLastRequestVisible = visible;
182a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            // If we need to be visible, we need to check whether the ActionProvider overrides it
183a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            if (checkActionProviderOverrideVisibility()) {
184a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                return this;
185a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            }
186a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        }
187a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        return wrappedSetVisible(visible);
188e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
189e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
190e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    @Override
19189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public boolean isVisible() {
19289208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.isVisible();
19389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
19489208232f3b5d1451408d787872504a190bc7ee0Chris Banes
19589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
19689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setEnabled(boolean enabled) {
19789208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setEnabled(enabled);
19889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
19989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
20089208232f3b5d1451408d787872504a190bc7ee0Chris Banes
20189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
20289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public boolean isEnabled() {
20389208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.isEnabled();
20489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
20589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
20689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
20789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public boolean hasSubMenu() {
20889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.hasSubMenu();
20989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
21089208232f3b5d1451408d787872504a190bc7ee0Chris Banes
21189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
21289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public SubMenu getSubMenu() {
21389208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return getSubMenuWrapper(mWrappedObject.getSubMenu());
21489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
21589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
21689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
21789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
21889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setOnMenuItemClickListener(menuItemClickListener != null ?
21989208232f3b5d1451408d787872504a190bc7ee0Chris Banes                new OnMenuItemClickListenerWrapper(menuItemClickListener) : null);
22089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
22189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
22289208232f3b5d1451408d787872504a190bc7ee0Chris Banes
22389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
22489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public ContextMenu.ContextMenuInfo getMenuInfo() {
22589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return mWrappedObject.getMenuInfo();
22689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
22789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
22889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
22989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public void setShowAsAction(int actionEnum) {
23089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setShowAsAction(actionEnum);
23189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
23289208232f3b5d1451408d787872504a190bc7ee0Chris Banes
23389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
23489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setShowAsActionFlags(int actionEnum) {
23589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setShowAsActionFlags(actionEnum);
23689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
23789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
23889208232f3b5d1451408d787872504a190bc7ee0Chris Banes
23989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
24089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setActionView(View view) {
2412e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        if (view instanceof CollapsibleActionView) {
2422e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            view = new CollapsibleActionViewWrapper(view);
2432e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
24489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setActionView(view);
24589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
24689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
24789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
24889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
24989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public MenuItem setActionView(int resId) {
2502e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        // Make framework menu item inflate the view
25189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setActionView(resId);
2522e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes
2532e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        View actionView = mWrappedObject.getActionView();
2542e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        if (actionView instanceof CollapsibleActionView) {
2552e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            // If the inflated Action View is support-collapsible, wrap it
2562e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            mWrappedObject.setActionView(new CollapsibleActionViewWrapper(actionView));
2572e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
25889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
25989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
26089208232f3b5d1451408d787872504a190bc7ee0Chris Banes
26189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
26289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public View getActionView() {
2632e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        View actionView = mWrappedObject.getActionView();
2642e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        if (actionView instanceof CollapsibleActionViewWrapper) {
2652e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            return ((CollapsibleActionViewWrapper) actionView).getWrappedView();
2662e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
2672e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        return actionView;
26889208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
26989208232f3b5d1451408d787872504a190bc7ee0Chris Banes
27089208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
27130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public MenuItem setActionProvider(android.view.ActionProvider provider) {
27230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        mWrappedObject.setActionProvider(provider);
273a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        if (provider != null && mEmulateProviderVisibilityOverride) {
274a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            checkActionProviderOverrideVisibility();
275a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        }
27630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return this;
27730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    }
27830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell
27930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    @Override
28030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public android.view.ActionProvider getActionProvider() {
28130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mWrappedObject.getActionProvider();
28230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    }
28330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell
28430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    @Override
285e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    public boolean expandActionView() {
286e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        return mWrappedObject.expandActionView();
287e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
288e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
289e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    @Override
290e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    public boolean collapseActionView() {
291e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        return mWrappedObject.collapseActionView();
292e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
293e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
294e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    @Override
295e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    public boolean isActionViewExpanded() {
296e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        return mWrappedObject.isActionViewExpanded();
297e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
298e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
299e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    @Override
300e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {
30189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        mWrappedObject.setOnActionExpandListener(listener);
30289208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return this;
30389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
30489208232f3b5d1451408d787872504a190bc7ee0Chris Banes
30589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    @Override
30689208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public SupportMenuItem setSupportOnActionExpandListener(
30789208232f3b5d1451408d787872504a190bc7ee0Chris Banes            MenuItemCompat.OnActionExpandListener listener) {
3086e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown        mWrappedObject.setOnActionExpandListener(listener != null ?
3096e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown                new OnActionExpandListenerWrapper(listener) : null);
31089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        return null;
311e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
312e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
313d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    @Override
314d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
315d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        mWrappedObject.setActionProvider(actionProvider != null ?
316d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes                createActionProviderWrapper(actionProvider) : null);
317d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        return this;
318d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    }
319d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
320d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    @Override
321d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    public ActionProvider getSupportActionProvider() {
322d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        ActionProviderWrapper providerWrapper =
323a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                (ActionProviderWrapper) mWrappedObject.getActionProvider();
324a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        return providerWrapper != null ? providerWrapper.mInner : null;
325d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    }
326d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
327592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes    public void setExclusiveCheckable(boolean checkable) {
328592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes        try {
329592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes            if (mSetExclusiveCheckableMethod == null) {
330592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes                mSetExclusiveCheckableMethod = mWrappedObject.getClass()
331592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes                        .getDeclaredMethod("setExclusiveCheckable", Boolean.TYPE);
332592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes            }
333592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes            mSetExclusiveCheckableMethod.invoke(mWrappedObject, checkable);
334592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes        } catch (Exception e) {
335592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes            Log.w(LOG_TAG, "Error while calling setExclusiveCheckable", e);
336592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes        }
337592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes    }
338592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes
339d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    ActionProviderWrapper createActionProviderWrapper(ActionProvider provider) {
340d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        return new ActionProviderWrapper(provider);
341d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    }
342d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
343a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    /**
344a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes     * @return true if the ActionProvider has overriden the visibility
345a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes     */
346a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    final boolean checkActionProviderOverrideVisibility() {
347a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        if (mLastRequestVisible) {
348a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            ActionProvider provider = getSupportActionProvider();
349a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            if (provider != null && provider.overridesItemVisibility() && !provider.isVisible()) {
350a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                wrappedSetVisible(false);
351a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                return true;
352a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            }
353a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        }
354a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        return false;
355a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    }
356a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes
357a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    final MenuItem wrappedSetVisible(boolean visible) {
358a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes        return mWrappedObject.setVisible(visible);
359a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes    }
360a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes
36189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    private class OnMenuItemClickListenerWrapper extends BaseWrapper<OnMenuItemClickListener>
36289208232f3b5d1451408d787872504a190bc7ee0Chris Banes            implements android.view.MenuItem.OnMenuItemClickListener {
36389208232f3b5d1451408d787872504a190bc7ee0Chris Banes
36489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        OnMenuItemClickListenerWrapper(OnMenuItemClickListener object) {
36589208232f3b5d1451408d787872504a190bc7ee0Chris Banes            super(object);
36689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        }
36789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
36889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        @Override
36989208232f3b5d1451408d787872504a190bc7ee0Chris Banes        public boolean onMenuItemClick(android.view.MenuItem item) {
37089208232f3b5d1451408d787872504a190bc7ee0Chris Banes            return mWrappedObject.onMenuItemClick(getMenuItemWrapper(item));
37189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        }
37289208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
37389208232f3b5d1451408d787872504a190bc7ee0Chris Banes
37489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    private class OnActionExpandListenerWrapper extends BaseWrapper<MenuItemCompat.OnActionExpandListener>
375e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            implements android.view.MenuItem.OnActionExpandListener {
376e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
37789208232f3b5d1451408d787872504a190bc7ee0Chris Banes        OnActionExpandListenerWrapper(MenuItemCompat.OnActionExpandListener object) {
378e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            super(object);
379e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
380e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
381e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        @Override
382e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        public boolean onMenuItemActionExpand(android.view.MenuItem item) {
383e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return mWrappedObject.onMenuItemActionExpand(getMenuItemWrapper(item));
384e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
385e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
386e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        @Override
387e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        public boolean onMenuItemActionCollapse(android.view.MenuItem item) {
388e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return mWrappedObject.onMenuItemActionCollapse(getMenuItemWrapper(item));
389e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
390e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
391d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
392d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    class ActionProviderWrapper extends android.view.ActionProvider {
393d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        final ActionProvider mInner;
394d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
395d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        public ActionProviderWrapper(ActionProvider inner) {
396d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes            super(inner.getContext());
397d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes            mInner = inner;
398a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes
399a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            if (mEmulateProviderVisibilityOverride) {
400a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                mInner.setVisibilityListener(new ActionProvider.VisibilityListener() {
401a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                    @Override
402a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                    public void onActionProviderVisibilityChanged(boolean isVisible) {
403a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                        if (mInner.overridesItemVisibility() && mLastRequestVisible) {
404a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                            wrappedSetVisible(isVisible);
405a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                        }
406a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                    }
407a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                });
408a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            }
409d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        }
410d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
411d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        @Override
412d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        public View onCreateActionView() {
413a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            if (mEmulateProviderVisibilityOverride) {
414a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                // This is a convenient place to hook in and check if we need to override the
415a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                // visibility after being created.
416a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes                checkActionProviderOverrideVisibility();
417a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes            }
418d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes            return mInner.onCreateActionView();
419d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        }
420d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
421d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        @Override
422d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        public boolean onPerformDefaultAction() {
423d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes            return mInner.onPerformDefaultAction();
424d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        }
425d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
426d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        @Override
427d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        public boolean hasSubMenu() {
428d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes            return mInner.hasSubMenu();
429d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        }
430d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes
431d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        @Override
432d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        public void onPrepareSubMenu(android.view.SubMenu subMenu) {
433d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes            mInner.onPrepareSubMenu(getSubMenuWrapper(subMenu));
434d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes        }
435d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes    }
4362e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes
4372e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes    static class CollapsibleActionViewWrapper extends FrameLayout
4382e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            implements android.view.CollapsibleActionView {
4392e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        final CollapsibleActionView mWrappedView;
4402e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes
4412e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        CollapsibleActionViewWrapper(View actionView) {
4422e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            super(actionView.getContext());
4432e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            mWrappedView = (CollapsibleActionView) actionView;
4442e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            addView(actionView);
4452e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
4462e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes
4472e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        @Override
4482e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        public void onActionViewExpanded() {
4492e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            mWrappedView.onActionViewExpanded();
4502e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
4512e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes
4522e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        @Override
4532e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        public void onActionViewCollapsed() {
4542e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            mWrappedView.onActionViewCollapsed();
4552e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
4562e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes
4572e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        View getWrappedView() {
4582e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes            return (View) mWrappedView;
4592e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes        }
4602e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes    }
461e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes}
462