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