MenuItemWrapperICS.java revision 89208232f3b5d1451408d787872504a190bc7ee0
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.v7.internal.view.menu;
18
19import android.content.Intent;
20import android.graphics.drawable.Drawable;
21import android.support.v4.internal.view.SupportMenuItem;
22import android.support.v4.view.ActionProvider;
23import android.support.v4.view.MenuItemCompat;
24import android.view.ContextMenu;
25import android.view.MenuItem;
26import android.view.SubMenu;
27import android.view.View;
28
29class MenuItemWrapperICS extends BaseMenuWrapper<android.view.MenuItem> implements SupportMenuItem {
30    private final boolean mEmulateProviderVisibilityOverride;
31    // Tracks the last requested visibility
32    private boolean mLastRequestVisible;
33
34    MenuItemWrapperICS(android.view.MenuItem object, boolean emulateProviderVisibilityOverride) {
35        super(object);
36        mLastRequestVisible = object.isVisible();
37        mEmulateProviderVisibilityOverride = emulateProviderVisibilityOverride;
38    }
39
40    MenuItemWrapperICS(android.view.MenuItem object) {
41        this(object, true);
42    }
43
44    @Override
45    public int getItemId() {
46        return mWrappedObject.getItemId();
47    }
48
49    @Override
50    public int getGroupId() {
51        return mWrappedObject.getGroupId();
52    }
53
54    @Override
55    public int getOrder() {
56        return mWrappedObject.getOrder();
57    }
58
59    @Override
60    public MenuItem setTitle(CharSequence title) {
61        mWrappedObject.setTitle(title);
62        return this;
63    }
64
65    @Override
66    public MenuItem setTitle(int title) {
67        mWrappedObject.setTitle(title);
68        return this;
69    }
70
71    @Override
72    public CharSequence getTitle() {
73        return mWrappedObject.getTitle();
74    }
75
76    @Override
77    public MenuItem setTitleCondensed(CharSequence title) {
78        mWrappedObject.setTitleCondensed(title);
79        return this;
80    }
81
82    @Override
83    public CharSequence getTitleCondensed() {
84        return mWrappedObject.getTitleCondensed();
85    }
86
87    @Override
88    public MenuItem setIcon(Drawable icon) {
89        mWrappedObject.setIcon(icon);
90        return this;
91    }
92
93    @Override
94    public MenuItem setIcon(int iconRes) {
95        mWrappedObject.setIcon(iconRes);
96        return this;
97    }
98
99    @Override
100    public Drawable getIcon() {
101        return mWrappedObject.getIcon();
102    }
103
104    @Override
105    public MenuItem setIntent(Intent intent) {
106        mWrappedObject.setIntent(intent);
107        return this;
108    }
109
110    @Override
111    public Intent getIntent() {
112        return mWrappedObject.getIntent();
113    }
114
115    @Override
116    public MenuItem setShortcut(char numericChar, char alphaChar) {
117        mWrappedObject.setShortcut(numericChar, alphaChar);
118        return this;
119    }
120
121    @Override
122    public MenuItem setNumericShortcut(char numericChar) {
123        mWrappedObject.setNumericShortcut(numericChar);
124        return this;
125    }
126
127    @Override
128    public char getNumericShortcut() {
129        return mWrappedObject.getNumericShortcut();
130    }
131
132    @Override
133    public MenuItem setAlphabeticShortcut(char alphaChar) {
134        mWrappedObject.setAlphabeticShortcut(alphaChar);
135        return this;
136    }
137
138    @Override
139    public char getAlphabeticShortcut() {
140        return mWrappedObject.getAlphabeticShortcut();
141    }
142
143    @Override
144    public MenuItem setCheckable(boolean checkable) {
145        mWrappedObject.setCheckable(checkable);
146        return this;
147    }
148
149    @Override
150    public boolean isCheckable() {
151        return mWrappedObject.isCheckable();
152    }
153
154    @Override
155    public MenuItem setChecked(boolean checked) {
156        mWrappedObject.setChecked(checked);
157        return this;
158    }
159
160    @Override
161    public boolean isChecked() {
162        return mWrappedObject.isChecked();
163    }
164
165    @Override
166    public MenuItem setVisible(boolean visible) {
167        if (mEmulateProviderVisibilityOverride) {
168            mLastRequestVisible = visible;
169            // If we need to be visible, we need to check whether the ActionProvider overrides it
170            if (checkActionProviderOverrideVisibility()) {
171                return this;
172            }
173        }
174        return wrappedSetVisible(visible);
175    }
176
177    @Override
178    public boolean isVisible() {
179        return mWrappedObject.isVisible();
180    }
181
182    @Override
183    public MenuItem setEnabled(boolean enabled) {
184        mWrappedObject.setEnabled(enabled);
185        return this;
186    }
187
188    @Override
189    public boolean isEnabled() {
190        return mWrappedObject.isEnabled();
191    }
192
193    @Override
194    public boolean hasSubMenu() {
195        return mWrappedObject.hasSubMenu();
196    }
197
198    @Override
199    public SubMenu getSubMenu() {
200        return getSubMenuWrapper(mWrappedObject.getSubMenu());
201    }
202
203    @Override
204    public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
205        mWrappedObject.setOnMenuItemClickListener(menuItemClickListener != null ?
206                new OnMenuItemClickListenerWrapper(menuItemClickListener) : null);
207        return this;
208    }
209
210    @Override
211    public ContextMenu.ContextMenuInfo getMenuInfo() {
212        return mWrappedObject.getMenuInfo();
213    }
214
215    @Override
216    public void setShowAsAction(int actionEnum) {
217        mWrappedObject.setShowAsAction(actionEnum);
218    }
219
220    @Override
221    public MenuItem setShowAsActionFlags(int actionEnum) {
222        mWrappedObject.setShowAsActionFlags(actionEnum);
223        return this;
224    }
225
226    @Override
227    public MenuItem setActionView(View view) {
228        mWrappedObject.setActionView(view);
229        return this;
230    }
231
232    @Override
233    public MenuItem setActionView(int resId) {
234        mWrappedObject.setActionView(resId);
235        return this;
236    }
237
238    @Override
239    public View getActionView() {
240        return mWrappedObject.getActionView();
241    }
242
243    @Override
244    public MenuItem setActionProvider(android.view.ActionProvider provider) {
245        mWrappedObject.setActionProvider(provider);
246        if (provider != null && mEmulateProviderVisibilityOverride) {
247            checkActionProviderOverrideVisibility();
248        }
249        return this;
250    }
251
252    @Override
253    public android.view.ActionProvider getActionProvider() {
254        return mWrappedObject.getActionProvider();
255    }
256
257    @Override
258    public boolean expandActionView() {
259        return mWrappedObject.expandActionView();
260    }
261
262    @Override
263    public boolean collapseActionView() {
264        return mWrappedObject.collapseActionView();
265    }
266
267    @Override
268    public boolean isActionViewExpanded() {
269        return mWrappedObject.isActionViewExpanded();
270    }
271
272    @Override
273    public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {
274        mWrappedObject.setOnActionExpandListener(listener);
275        return this;
276    }
277
278    @Override
279    public SupportMenuItem setSupportOnActionExpandListener(
280            MenuItemCompat.OnActionExpandListener listener) {
281        mWrappedObject.setOnActionExpandListener(listener != null ?
282                new OnActionExpandListenerWrapper(listener) : null);
283        return null;
284    }
285
286    @Override
287    public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
288        mWrappedObject.setActionProvider(actionProvider != null ?
289                createActionProviderWrapper(actionProvider) : null);
290        return this;
291    }
292
293    @Override
294    public ActionProvider getSupportActionProvider() {
295        ActionProviderWrapper providerWrapper =
296                (ActionProviderWrapper) mWrappedObject.getActionProvider();
297        return providerWrapper != null ? providerWrapper.mInner : null;
298    }
299
300    ActionProviderWrapper createActionProviderWrapper(ActionProvider provider) {
301        return new ActionProviderWrapper(provider);
302    }
303
304    /**
305     * @return true if the ActionProvider has overriden the visibility
306     */
307    final boolean checkActionProviderOverrideVisibility() {
308        if (mLastRequestVisible) {
309            ActionProvider provider = getSupportActionProvider();
310            if (provider != null && provider.overridesItemVisibility() && !provider.isVisible()) {
311                wrappedSetVisible(false);
312                return true;
313            }
314        }
315        return false;
316    }
317
318    final MenuItem wrappedSetVisible(boolean visible) {
319        return mWrappedObject.setVisible(visible);
320    }
321
322    private class OnMenuItemClickListenerWrapper extends BaseWrapper<OnMenuItemClickListener>
323            implements android.view.MenuItem.OnMenuItemClickListener {
324
325        OnMenuItemClickListenerWrapper(OnMenuItemClickListener object) {
326            super(object);
327        }
328
329        @Override
330        public boolean onMenuItemClick(android.view.MenuItem item) {
331            return mWrappedObject.onMenuItemClick(getMenuItemWrapper(item));
332        }
333    }
334
335    private class OnActionExpandListenerWrapper extends BaseWrapper<MenuItemCompat.OnActionExpandListener>
336            implements android.view.MenuItem.OnActionExpandListener {
337
338        OnActionExpandListenerWrapper(MenuItemCompat.OnActionExpandListener object) {
339            super(object);
340        }
341
342        @Override
343        public boolean onMenuItemActionExpand(android.view.MenuItem item) {
344            return mWrappedObject.onMenuItemActionExpand(getMenuItemWrapper(item));
345        }
346
347        @Override
348        public boolean onMenuItemActionCollapse(android.view.MenuItem item) {
349            return mWrappedObject.onMenuItemActionCollapse(getMenuItemWrapper(item));
350        }
351    }
352
353    class ActionProviderWrapper extends android.view.ActionProvider {
354        final ActionProvider mInner;
355
356        public ActionProviderWrapper(ActionProvider inner) {
357            super(inner.getContext());
358            mInner = inner;
359
360            if (mEmulateProviderVisibilityOverride) {
361                mInner.setVisibilityListener(new ActionProvider.VisibilityListener() {
362                    @Override
363                    public void onActionProviderVisibilityChanged(boolean isVisible) {
364                        if (mInner.overridesItemVisibility() && mLastRequestVisible) {
365                            wrappedSetVisible(isVisible);
366                        }
367                    }
368                });
369            }
370        }
371
372        @Override
373        public View onCreateActionView() {
374            if (mEmulateProviderVisibilityOverride) {
375                // This is a convenient place to hook in and check if we need to override the
376                // visibility after being created.
377                checkActionProviderOverrideVisibility();
378            }
379            return mInner.onCreateActionView();
380        }
381
382        @Override
383        public boolean onPerformDefaultAction() {
384            return mInner.onPerformDefaultAction();
385        }
386
387        @Override
388        public boolean hasSubMenu() {
389            return mInner.hasSubMenu();
390        }
391
392        @Override
393        public void onPrepareSubMenu(android.view.SubMenu subMenu) {
394            mInner.onPrepareSubMenu(getSubMenuWrapper(subMenu));
395        }
396    }
397}
398