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