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