ActionBarImplICS.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.app;
18
19import android.app.Activity;
20import android.content.Context;
21import android.graphics.drawable.Drawable;
22import android.support.v4.app.FragmentTransaction;
23import android.util.Log;
24import android.view.View;
25import android.widget.SpinnerAdapter;
26
27import java.lang.ref.WeakReference;
28import java.util.ArrayList;
29
30class ActionBarImplICS extends ActionBar {
31
32    final Activity mActivity;
33    final Callback mCallback;
34    final android.app.ActionBar mActionBar;
35
36    private ArrayList<WeakReference<OnMenuVisibilityListenerWrapper>> mAddedMenuVisWrappers =
37            new ArrayList<WeakReference<OnMenuVisibilityListenerWrapper>>();
38
39    public ActionBarImplICS(Activity activity, Callback callback) {
40        mActivity = activity;
41        mCallback = callback;
42        mActionBar = activity.getActionBar();
43    }
44
45    private OnMenuVisibilityListenerWrapper findAndRemoveMenuVisWrapper(
46            OnMenuVisibilityListener compatListener) {
47        for (int i = 0; i < mAddedMenuVisWrappers.size(); i++) {
48            OnMenuVisibilityListenerWrapper wrapper = mAddedMenuVisWrappers.get(i).get();
49            if (wrapper == null) {
50                mAddedMenuVisWrappers.remove(i--);
51            } else if (wrapper.mWrappedListener == compatListener) {
52                mAddedMenuVisWrappers.remove(i);
53                return wrapper;
54            }
55        }
56        return null;
57    }
58
59    @Override
60    public void setCustomView(View view) {
61        mActionBar.setCustomView(view);
62    }
63
64    @Override
65    public void setCustomView(View view, LayoutParams layoutParams) {
66        android.app.ActionBar.LayoutParams lp =
67                new android.app.ActionBar.LayoutParams(layoutParams);
68        lp.gravity = layoutParams.gravity;
69
70        mActionBar.setCustomView(view, lp);
71    }
72
73    @Override
74    public void setCustomView(int resId) {
75        mActionBar.setCustomView(resId);
76    }
77
78    @Override
79    public void setIcon(int resId) {
80        mActionBar.setIcon(resId);
81    }
82
83    @Override
84    public void setIcon(Drawable icon) {
85        mActionBar.setIcon(icon);
86    }
87
88    @Override
89    public void setLogo(int resId) {
90        mActionBar.setLogo(resId);
91    }
92
93    @Override
94    public void setLogo(Drawable logo) {
95        mActionBar.setLogo(logo);
96    }
97
98    @Override
99    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
100        mActionBar.setListNavigationCallbacks(adapter,
101                callback != null ? new OnNavigationListenerWrapper(callback) : null);
102    }
103
104    @Override
105    public void setSelectedNavigationItem(int position) {
106        mActionBar.setSelectedNavigationItem(position);
107    }
108
109    @Override
110    public int getSelectedNavigationIndex() {
111        return mActionBar.getSelectedNavigationIndex();
112    }
113
114    @Override
115    public int getNavigationItemCount() {
116        return mActionBar.getNavigationItemCount();
117    }
118
119    @Override
120    public void setTitle(CharSequence title) {
121        mActionBar.setTitle(title);
122    }
123
124    @Override
125    public void setTitle(int resId) {
126        mActionBar.setTitle(resId);
127    }
128
129    @Override
130    public void setSubtitle(CharSequence subtitle) {
131        mActionBar.setSubtitle(subtitle);
132    }
133
134    @Override
135    public void setSubtitle(int resId) {
136        mActionBar.setSubtitle(resId);
137    }
138
139    @Override
140    public void setDisplayOptions(int options) {
141        mActionBar.setDisplayOptions(options);
142    }
143
144    @Override
145    public void setDisplayOptions(int options, int mask) {
146        mActionBar.setDisplayOptions(options, mask);
147    }
148
149    @Override
150    public void setDisplayUseLogoEnabled(boolean useLogo) {
151        mActionBar.setDisplayUseLogoEnabled(useLogo);
152    }
153
154    @Override
155    public void setDisplayShowHomeEnabled(boolean showHome) {
156        mActionBar.setDisplayShowHomeEnabled(showHome);
157    }
158
159    @Override
160    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
161        mActionBar.setDisplayHomeAsUpEnabled(showHomeAsUp);
162    }
163
164    @Override
165    public void setDisplayShowTitleEnabled(boolean showTitle) {
166        mActionBar.setDisplayShowTitleEnabled(showTitle);
167    }
168
169    @Override
170    public void setDisplayShowCustomEnabled(boolean showCustom) {
171        mActionBar.setDisplayShowCustomEnabled(showCustom);
172    }
173
174    @Override
175    public void setBackgroundDrawable(Drawable d) {
176        mActionBar.setBackgroundDrawable(d);
177    }
178
179    @Override
180    public View getCustomView() {
181        return mActionBar.getCustomView();
182    }
183
184    @Override
185    public CharSequence getTitle() {
186        return mActionBar.getTitle();
187    }
188
189    @Override
190    public CharSequence getSubtitle() {
191        return mActionBar.getSubtitle();
192    }
193
194    @Override
195    public int getNavigationMode() {
196        return mActionBar.getNavigationMode();
197    }
198
199    @Override
200    public void setNavigationMode(int mode) {
201        mActionBar.setNavigationMode(mode);
202    }
203
204    @Override
205    public int getDisplayOptions() {
206        return mActionBar.getDisplayOptions();
207    }
208
209    @Override
210    public Tab newTab() {
211        final android.app.ActionBar.Tab realTab = mActionBar.newTab();
212        final TabWrapper result = new TabWrapper(realTab);
213        realTab.setTag(result);
214        return result;
215    }
216
217    @Override
218    public void addTab(Tab tab) {
219        mActionBar.addTab(((TabWrapper) tab).mWrappedTab);
220    }
221
222    @Override
223    public void addTab(Tab tab, boolean setSelected) {
224        mActionBar.addTab(((TabWrapper) tab).mWrappedTab, setSelected);
225    }
226
227    @Override
228    public void addTab(Tab tab, int position) {
229        mActionBar.addTab(((TabWrapper) tab).mWrappedTab, position);
230    }
231
232    @Override
233    public void addTab(Tab tab, int position, boolean setSelected) {
234        mActionBar.addTab(((TabWrapper) tab).mWrappedTab, position, setSelected);
235    }
236
237    @Override
238    public void removeTab(Tab tab) {
239        mActionBar.removeTab(((TabWrapper) tab).mWrappedTab);
240    }
241
242    @Override
243    public void removeTabAt(int position) {
244        mActionBar.removeTabAt(position);
245    }
246
247    @Override
248    public void removeAllTabs() {
249        mActionBar.removeAllTabs();
250    }
251
252    @Override
253    public void selectTab(Tab tab) {
254        mActionBar.selectTab(((TabWrapper) tab).mWrappedTab);
255    }
256
257    @Override
258    public Tab getSelectedTab() {
259        return (Tab) mActionBar.getSelectedTab().getTag();
260    }
261
262    @Override
263    public Tab getTabAt(int index) {
264        return (Tab) mActionBar.getTabAt(index).getTag();
265    }
266
267    @Override
268    public int getTabCount() {
269        return mActionBar.getTabCount();
270    }
271
272    @Override
273    public Context getThemedContext() {
274        return mActionBar.getThemedContext();
275    }
276
277    @Override
278    public int getHeight() {
279        return mActionBar.getHeight();
280    }
281
282    @Override
283    public void show() {
284        mActionBar.show();
285    }
286
287    @Override
288    public void hide() {
289        mActionBar.hide();
290    }
291
292    @Override
293    public boolean isShowing() {
294        return mActionBar.isShowing();
295    }
296
297    @Override
298    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
299        if (listener != null) {
300            OnMenuVisibilityListenerWrapper w = new OnMenuVisibilityListenerWrapper(listener);
301            mAddedMenuVisWrappers.add(new WeakReference<OnMenuVisibilityListenerWrapper>(w));
302            mActionBar.addOnMenuVisibilityListener(w);
303        }
304    }
305
306    @Override
307    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
308        OnMenuVisibilityListenerWrapper l = findAndRemoveMenuVisWrapper(listener);
309        mActionBar.removeOnMenuVisibilityListener(l);
310    }
311
312    static class OnNavigationListenerWrapper implements android.app.ActionBar.OnNavigationListener {
313
314        private final OnNavigationListener mWrappedListener;
315
316        public OnNavigationListenerWrapper(OnNavigationListener l) {
317            mWrappedListener = l;
318        }
319
320        @Override
321        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
322            return mWrappedListener.onNavigationItemSelected(itemPosition, itemId);
323        }
324
325    }
326
327    static class OnMenuVisibilityListenerWrapper implements
328            android.app.ActionBar.OnMenuVisibilityListener {
329
330        final OnMenuVisibilityListener mWrappedListener;
331
332        public OnMenuVisibilityListenerWrapper(OnMenuVisibilityListener l) {
333            mWrappedListener = l;
334        }
335
336        @Override
337        public void onMenuVisibilityChanged(boolean isVisible) {
338            mWrappedListener.onMenuVisibilityChanged(isVisible);
339        }
340
341    }
342
343    class TabWrapper extends ActionBar.Tab implements android.app.ActionBar.TabListener {
344
345        final android.app.ActionBar.Tab mWrappedTab;
346        private Object mTag;
347        private FragmentTransaction mActiveTransaction;
348        private CharSequence mContentDescription;
349        private TabListener mTabListener;
350
351        public TabWrapper(android.app.ActionBar.Tab tab) {
352            mWrappedTab = tab;
353        }
354
355        @Override
356        public int getPosition() {
357            return mWrappedTab.getPosition();
358        }
359
360        @Override
361        public Drawable getIcon() {
362            return mWrappedTab.getIcon();
363        }
364
365        @Override
366        public CharSequence getText() {
367            return mWrappedTab.getText();
368        }
369
370        @Override
371        public Tab setIcon(Drawable icon) {
372            mWrappedTab.setIcon(icon);
373            return this;
374        }
375
376        @Override
377        public Tab setIcon(int resId) {
378            mWrappedTab.setIcon(resId);
379            return this;
380        }
381
382        @Override
383        public Tab setText(CharSequence text) {
384            mWrappedTab.setText(text);
385            return this;
386        }
387
388        @Override
389        public Tab setText(int resId) {
390            mWrappedTab.setText(resId);
391            return this;
392        }
393
394        @Override
395        public Tab setCustomView(View view) {
396            mWrappedTab.setCustomView(view);
397            return this;
398        }
399
400        @Override
401        public Tab setCustomView(int layoutResId) {
402            mWrappedTab.setCustomView(layoutResId);
403            return this;
404        }
405
406        @Override
407        public View getCustomView() {
408            return mWrappedTab.getCustomView();
409        }
410
411        @Override
412        public Tab setTag(Object obj) {
413            mTag = obj;
414            return this;
415        }
416
417        @Override
418        public Object getTag() {
419            return mTag;
420        }
421
422        @Override
423        public Tab setTabListener(TabListener listener) {
424            mTabListener = listener;
425            mWrappedTab.setTabListener(listener != null ? this : null);
426            return this;
427        }
428
429        @Override
430        public void select() {
431            mWrappedTab.select();
432        }
433
434        @Override
435        public Tab setContentDescription(int resId) {
436            mContentDescription = mActivity.getText(resId);
437            return this;
438        }
439
440        @Override
441        public Tab setContentDescription(CharSequence contentDesc) {
442            mContentDescription = contentDesc;
443            return this;
444        }
445
446        @Override
447        public CharSequence getContentDescription() {
448            return mContentDescription;
449        }
450
451        @Override
452        public void onTabSelected(android.app.ActionBar.Tab tab,
453                android.app.FragmentTransaction ft) {
454            mTabListener.onTabSelected(this, ft != null ? getActiveTransaction() : null);
455            commitActiveTransaction();
456        }
457
458        @Override
459        public void onTabUnselected(android.app.ActionBar.Tab tab,
460                android.app.FragmentTransaction ft) {
461            mTabListener.onTabUnselected(this, ft != null ? getActiveTransaction() : null);
462        }
463
464        @Override
465        public void onTabReselected(android.app.ActionBar.Tab tab,
466                android.app.FragmentTransaction ft) {
467            mTabListener.onTabReselected(this, ft != null ? getActiveTransaction() : null);
468            commitActiveTransaction();
469        }
470
471        private FragmentTransaction getActiveTransaction() {
472            if (mActiveTransaction == null) {
473                mActiveTransaction = mCallback.getSupportFragmentManager().beginTransaction()
474                        .disallowAddToBackStack();
475            }
476            return mActiveTransaction;
477        }
478
479        private void commitActiveTransaction() {
480            if (mActiveTransaction != null && !mActiveTransaction.isEmpty()) {
481                mActiveTransaction.commit();
482            }
483            mActiveTransaction = null;
484        }
485    }
486}
487