From 380ac197b655b8d7ec1842ec177a3539afd2e718 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 15 Dec 2011 12:48:57 +0100 Subject: [PATCH] Import of the external ActionBarSherlock project used in Transdroid. --- .../JakeWharton-ActionBarSherlock/.gitignore | 19 + .../CHANGELOG.md | 279 +++ .../JakeWharton-ActionBarSherlock/LICENSE.txt | 202 ++ .../JakeWharton-ActionBarSherlock/README.md | 55 + .../library/.classpath | 8 + .../library/.project | 33 + .../.settings/org.eclipse.jdt.core.prefs | 12 + .../library/AndroidManifest.xml | 13 + .../library/README.md | 15 + .../v4/app/ActionBar$LayoutParams.class | Bin 0 -> 1552 bytes .../ActionBar$OnMenuVisibilityListener.class | Bin 0 -> 284 bytes .../app/ActionBar$OnNavigationListener.class | Bin 0 -> 278 bytes .../support/v4/app/ActionBar$Tab.class | Bin 0 -> 1403 bytes .../v4/app/ActionBar$TabListener.class | Bin 0 -> 437 bytes .../android/support/v4/app/ActionBar.class | Bin 0 -> 3401 bytes .../support/v4/app/BackStackRecord$Op.class | Bin 0 -> 665 bytes .../support/v4/app/BackStackRecord.class | Bin 0 -> 13908 bytes .../support/v4/app/BackStackState$1.class | Bin 0 -> 1168 bytes .../support/v4/app/BackStackState.class | Bin 0 -> 5000 bytes .../support/v4/app/DialogFragment.class | Bin 0 -> 7113 bytes .../app/Fragment$InstantiationException.class | Bin 0 -> 677 bytes .../v4/app/Fragment$SavedState$1.class | Bin 0 -> 1273 bytes .../support/v4/app/Fragment$SavedState.class | Bin 0 -> 1593 bytes .../android/support/v4/app/Fragment.class | Bin 0 -> 17938 bytes .../support/v4/app/FragmentActivity$1.class | Bin 0 -> 1461 bytes .../support/v4/app/FragmentActivity$2.class | Bin 0 -> 1127 bytes .../support/v4/app/FragmentActivity$3.class | Bin 0 -> 1060 bytes .../v4/app/FragmentActivity$FragmentTag.class | Bin 0 -> 701 bytes ...ivity$HoneycombInvalidateOptionsMenu.class | Bin 0 -> 770 bytes ...ntActivity$NonConfigurationInstances.class | Bin 0 -> 899 bytes ...ntActivity$OverridePendingTransition.class | Bin 0 -> 687 bytes .../support/v4/app/FragmentActivity.class | Bin 0 -> 24964 bytes .../app/FragmentManager$BackStackEntry.class | Bin 0 -> 424 bytes ...ntManager$OnBackStackChangedListener.class | Bin 0 -> 300 bytes .../support/v4/app/FragmentManager.class | Bin 0 -> 2175 bytes .../v4/app/FragmentManagerImpl$1.class | Bin 0 -> 706 bytes .../v4/app/FragmentManagerImpl$2.class | Bin 0 -> 1126 bytes .../v4/app/FragmentManagerImpl$3.class | Bin 0 -> 1270 bytes .../v4/app/FragmentManagerImpl$4.class | Bin 0 -> 1213 bytes .../v4/app/FragmentManagerImpl$5.class | Bin 0 -> 1417 bytes .../support/v4/app/FragmentManagerImpl.class | Bin 0 -> 37744 bytes .../v4/app/FragmentManagerState$1.class | Bin 0 -> 1204 bytes .../support/v4/app/FragmentManagerState.class | Bin 0 -> 1683 bytes .../support/v4/app/FragmentPagerAdapter.class | Bin 0 -> 4176 bytes .../support/v4/app/FragmentState$1.class | Bin 0 -> 1155 bytes .../support/v4/app/FragmentState.class | Bin 0 -> 3730 bytes .../v4/app/FragmentStatePagerAdapter.class | Bin 0 -> 5999 bytes .../support/v4/app/FragmentTransaction.class | Bin 0 -> 1768 bytes .../support/v4/app/HCSparseArray.class | Bin 0 -> 4985 bytes .../support/v4/app/ListFragment$1.class | Bin 0 -> 775 bytes .../support/v4/app/ListFragment$2.class | Bin 0 -> 1262 bytes .../android/support/v4/app/ListFragment.class | Bin 0 -> 7126 bytes .../app/LoaderManager$LoaderCallbacks.class | Bin 0 -> 718 bytes .../support/v4/app/LoaderManager.class | Bin 0 -> 1192 bytes .../v4/app/LoaderManagerImpl$LoaderInfo.class | Bin 0 -> 8778 bytes .../support/v4/app/LoaderManagerImpl.class | Bin 0 -> 9984 bytes .../v4/app/NoSaveStateFrameLayout.class | Bin 0 -> 1836 bytes .../v4/app/SuperNotCalledException.class | Bin 0 -> 484 bytes .../SupportActivity$InternalCallbacks.class | Bin 0 -> 731 bytes .../support/v4/app/SupportActivity.class | Bin 0 -> 11453 bytes .../v4/content/AsyncTaskLoader$LoadTask.class | Bin 0 -> 2161 bytes .../support/v4/content/AsyncTaskLoader.class | Bin 0 -> 4772 bytes .../support/v4/content/CursorLoader.class | Bin 0 -> 5415 bytes .../Loader$ForceLoadContentObserver.class | Bin 0 -> 875 bytes .../Loader$OnLoadCompleteListener.class | Bin 0 -> 442 bytes .../android/support/v4/content/Loader.class | Bin 0 -> 5642 bytes .../os/ParcelableCompat$CompatCreator.class | Bin 0 -> 1594 bytes .../support/v4/os/ParcelableCompat.class | Bin 0 -> 1297 bytes .../os/ParcelableCompatCreatorCallbacks.class | Bin 0 -> 442 bytes .../ParcelableCompatCreatorHoneycombMR2.class | Bin 0 -> 1781 bytes ...celableCompatCreatorHoneycombMR2Stub.class | Bin 0 -> 1106 bytes .../android/support/v4/util/DebugUtils.class | Bin 0 -> 1255 bytes .../android/support/v4/util/LogWriter.class | Bin 0 -> 1332 bytes .../android/support/v4/util/LruCache.class | Bin 0 -> 6156 bytes .../android/support/v4/util/TimeUtils.class | Bin 0 -> 4069 bytes .../support/v4/view/ActionMode$Callback.class | Bin 0 -> 525 bytes .../android/support/v4/view/ActionMode.class | Bin 0 -> 815 bytes .../android/support/v4/view/Menu.class | Bin 0 -> 678 bytes .../MenuInflater$ActionBarMenuState.class | Bin 0 -> 7734 bytes ...ater$InflatedOnMenuItemClickListener.class | Bin 0 -> 2331 bytes .../support/v4/view/MenuInflater.class | Bin 0 -> 5195 bytes .../MenuItem$OnMenuItemClickListener.class | Bin 0 -> 846 bytes .../android/support/v4/view/MenuItem.class | Bin 0 -> 1468 bytes ...entCompat$BaseMotionEventVersionImpl.class | Bin 0 -> 1146 bytes ...tCompat$EclairMotionEventVersionImpl.class | Bin 0 -> 1199 bytes ...onEventCompat$MotionEventVersionImpl.class | Bin 0 -> 411 bytes .../support/v4/view/MotionEventCompat.class | Bin 0 -> 2098 bytes .../v4/view/MotionEventCompatEclair.class | Bin 0 -> 896 bytes .../view/PagerAdapter$DataSetObserver.class | Bin 0 -> 269 bytes .../support/v4/view/PagerAdapter.class | Bin 0 -> 1621 bytes .../android/support/v4/view/SubMenu.class | Bin 0 -> 551 bytes ...ompat$BaseVelocityTrackerVersionImpl.class | Bin 0 -> 978 bytes ...$HoneycombVelocityTrackerVersionImpl.class | Bin 0 -> 1015 bytes ...kerCompat$VelocityTrackerVersionImpl.class | Bin 0 -> 368 bytes .../v4/view/VelocityTrackerCompat.class | Bin 0 -> 1359 bytes .../view/VelocityTrackerCompatHoneycomb.class | Bin 0 -> 694 bytes ...pat$BaseViewConfigurationVersionImpl.class | Bin 0 -> 903 bytes ...at$FroyoViewConfigurationVersionImpl.class | Bin 0 -> 901 bytes ...nCompat$ViewConfigurationVersionImpl.class | Bin 0 -> 368 bytes .../v4/view/ViewConfigurationCompat.class | Bin 0 -> 1268 bytes .../view/ViewConfigurationCompatFroyo.class | Bin 0 -> 579 bytes .../v4/view/ViewPager$DataSetObserver.class | Bin 0 -> 909 bytes .../support/v4/view/ViewPager$ItemInfo.class | Bin 0 -> 484 bytes .../view/ViewPager$OnPageChangeListener.class | Bin 0 -> 338 bytes .../v4/view/ViewPager$SavedState$1.class | Bin 0 -> 1385 bytes .../v4/view/ViewPager$SavedState.class | Bin 0 -> 2595 bytes ...ViewPager$SimpleOnPageChangeListener.class | Bin 0 -> 911 bytes .../android/support/v4/view/ViewPager.class | Bin 0 -> 16076 bytes .../android/support/v4/view/Window.class | Bin 0 -> 661 bytes .../widget/CursorAdapter$ChangeObserver.class | Bin 0 -> 882 bytes .../CursorAdapter$MyDataSetObserver.class | Bin 0 -> 1040 bytes .../support/v4/widget/CursorAdapter.class | Bin 0 -> 6958 bytes .../CursorFilter$CursorFilterClient.class | Bin 0 -> 521 bytes .../support/v4/widget/CursorFilter.class | Bin 0 -> 1919 bytes .../v4/widget/ResourceCursorAdapter.class | Bin 0 -> 2200 bytes ...ursorAdapter$CursorToStringConverter.class | Bin 0 -> 357 bytes .../SimpleCursorAdapter$ViewBinder.class | Bin 0 -> 325 bytes .../v4/widget/SimpleCursorAdapter.class | Bin 0 -> 5895 bytes .../com/actionbarsherlock/R$attr.class | Bin 0 -> 2467 bytes .../com/actionbarsherlock/R$color.class | Bin 0 -> 632 bytes .../com/actionbarsherlock/R$drawable.class | Bin 0 -> 2922 bytes .../classes/com/actionbarsherlock/R$id.class | Bin 0 -> 1733 bytes .../com/actionbarsherlock/R$integer.class | Bin 0 -> 478 bytes .../com/actionbarsherlock/R$layout.class | Bin 0 -> 1133 bytes .../com/actionbarsherlock/R$string.class | Bin 0 -> 473 bytes .../com/actionbarsherlock/R$style.class | Bin 0 -> 2485 bytes .../com/actionbarsherlock/R$styleable.class | Bin 0 -> 3132 bytes .../bin/classes/com/actionbarsherlock/R.class | Bin 0 -> 768 bytes .../internal/app/ActionBarImpl.class | Bin 0 -> 12946 bytes .../app/ActionBarWrapper$Impl$1.class | Bin 0 -> 2870 bytes .../app/ActionBarWrapper$Impl$2.class | Bin 0 -> 1335 bytes .../app/ActionBarWrapper$Impl$3.class | Bin 0 -> 1408 bytes ...ionBarWrapper$Impl$ActionModeWrapper.class | Bin 0 -> 2471 bytes .../app/ActionBarWrapper$Impl$TabImpl.class | Bin 0 -> 3930 bytes .../internal/app/ActionBarWrapper$Impl.class | Bin 0 -> 12486 bytes .../internal/app/ActionBarWrapper.class | Bin 0 -> 892 bytes .../internal/view/menu/ActionMenuItem$1.class | Bin 0 -> 1292 bytes .../internal/view/menu/ActionMenuItem.class | Bin 0 -> 8361 bytes .../view/menu/ActionMenuItemView.class | Bin 0 -> 5425 bytes .../view/menu/MenuBuilder$Callback.class | Bin 0 -> 376 bytes .../internal/view/menu/MenuBuilder.class | Bin 0 -> 12892 bytes .../view/menu/MenuInflaterWrapper.class | Bin 0 -> 946 bytes .../internal/view/menu/MenuItemImpl$1.class | Bin 0 -> 1277 bytes .../internal/view/menu/MenuItemImpl$2.class | Bin 0 -> 1365 bytes .../internal/view/menu/MenuItemImpl$3.class | Bin 0 -> 1401 bytes .../MenuItemImpl$NativeMenuItemView.class | Bin 0 -> 2954 bytes .../internal/view/menu/MenuItemImpl.class | Bin 0 -> 17657 bytes .../MenuItemWrapper$HoneycombMenuItem.class | Bin 0 -> 1236 bytes .../internal/view/menu/MenuItemWrapper.class | Bin 0 -> 7399 bytes .../view/menu/MenuView$ItemView.class | Bin 0 -> 748 bytes .../internal/view/menu/MenuView.class | Bin 0 -> 394 bytes .../internal/view/menu/MenuWrapper.class | Bin 0 -> 5613 bytes .../internal/view/menu/SubMenuBuilder.class | Bin 0 -> 4176 bytes .../internal/view/menu/SubMenuWrapper.class | Bin 0 -> 2888 bytes .../internal/widget/ActionBarContainer.class | Bin 0 -> 1213 bytes .../internal/widget/ActionBarView$1.class | Bin 0 -> 1840 bytes .../internal/widget/ActionBarView$2.class | Bin 0 -> 1268 bytes .../widget/ActionBarView$TabImpl$1.class | Bin 0 -> 856 bytes .../widget/ActionBarView$TabImpl.class | Bin 0 -> 6866 bytes .../internal/widget/ActionBarView.class | Bin 0 -> 14963 bytes .../internal/widget/ScrollingTextView.class | Bin 0 -> 1286 bytes .../library/bin/com_actionbarsherlock.jar | Bin 0 -> 166 bytes .../abs__cab_background_holo_dark.9.png | Bin 0 -> 2877 bytes .../abs__cab_background_holo_light.9.png | Bin 0 -> 2990 bytes .../abs__cab_ic_close_focused_holo.png | Bin 0 -> 1039 bytes .../abs__cab_ic_close_normal_holo.png | Bin 0 -> 749 bytes .../abs__cab_ic_close_pressed_holo.png | Bin 0 -> 1129 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 799 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 799 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 231 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 198 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 198 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 198 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 203 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 204 bytes .../abs__spinner_default_holo_dark.9.png | Bin 0 -> 309 bytes .../abs__spinner_default_holo_light.9.png | Bin 0 -> 309 bytes .../abs__spinner_disabled_holo_dark.9.png | Bin 0 -> 314 bytes .../abs__spinner_disabled_holo_light.9.png | Bin 0 -> 314 bytes .../abs__spinner_focused_holo_dark.9.png | Bin 0 -> 329 bytes .../abs__spinner_focused_holo_light.9.png | Bin 0 -> 476 bytes .../abs__spinner_pressed_holo_dark.9.png | Bin 0 -> 462 bytes .../abs__spinner_pressed_holo_light.9.png | Bin 0 -> 493 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 225 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 160 bytes ...s__tab_selected_pressed_focused_holo.9.png | Bin 0 -> 525 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 254 bytes .../abs__tab_unselected_focused_holo.9.png | Bin 0 -> 224 bytes .../abs__tab_unselected_holo.9.png | Bin 0 -> 150 bytes ..._tab_unselected_pressed_focused_holo.9.png | Bin 0 -> 540 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 255 bytes .../abs__cab_background_holo_dark.9.png | Bin 0 -> 1764 bytes .../abs__cab_background_holo_light.9.png | Bin 0 -> 1813 bytes .../abs__cab_ic_close_focused_holo.png | Bin 0 -> 732 bytes .../abs__cab_ic_close_normal_holo.png | Bin 0 -> 520 bytes .../abs__cab_ic_close_pressed_holo.png | Bin 0 -> 803 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 607 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 607 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 232 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 189 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 189 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 192 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 190 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 191 bytes .../abs__spinner_default_holo_dark.9.png | Bin 0 -> 280 bytes .../abs__spinner_default_holo_light.9.png | Bin 0 -> 278 bytes .../abs__spinner_disabled_holo_dark.9.png | Bin 0 -> 300 bytes .../abs__spinner_disabled_holo_light.9.png | Bin 0 -> 300 bytes .../abs__spinner_focused_holo_dark.9.png | Bin 0 -> 328 bytes .../abs__spinner_focused_holo_light.9.png | Bin 0 -> 479 bytes .../abs__spinner_pressed_holo_dark.9.png | Bin 0 -> 386 bytes .../abs__spinner_pressed_holo_light.9.png | Bin 0 -> 448 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 210 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 157 bytes ...s__tab_selected_pressed_focused_holo.9.png | Bin 0 -> 442 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 217 bytes .../abs__tab_unselected_focused_holo.9.png | Bin 0 -> 219 bytes .../abs__tab_unselected_holo.9.png | Bin 0 -> 148 bytes ..._tab_unselected_pressed_focused_holo.9.png | Bin 0 -> 452 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 220 bytes .../abs__action_item_divider.9.png | Bin 0 -> 132 bytes .../abs__action_item_divider.9.png | Bin 0 -> 132 bytes .../library/checkstyle.xml | 115 + .../library/default.properties | 3 + .../library/gen/com/actionbarsherlock/R.java | 940 ++++++++ .../library/pom.xml | 83 + .../library/project.properties | 12 + .../library/res/color/abs__item_bg.xml | 14 + .../res/color/abs__tab_text_color_dark.xml | 8 + .../res/color/abs__tab_text_color_light.xml | 8 + .../abs__cab_background_holo_dark.9.png | Bin 0 -> 3307 bytes .../abs__cab_background_holo_light.9.png | Bin 0 -> 3494 bytes .../abs__cab_ic_close_focused_holo.png | Bin 0 -> 1292 bytes .../abs__cab_ic_close_normal_holo.png | Bin 0 -> 957 bytes .../abs__cab_ic_close_pressed_holo.png | Bin 0 -> 1749 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 938 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 975 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 1098 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 1060 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 1061 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 1060 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 189 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 189 bytes .../abs__spinner_default_holo_dark.9.png | Bin 0 -> 378 bytes .../abs__spinner_default_holo_light.9.png | Bin 0 -> 378 bytes .../abs__spinner_disabled_holo_dark.9.png | Bin 0 -> 382 bytes .../abs__spinner_disabled_holo_light.9.png | Bin 0 -> 382 bytes .../abs__spinner_focused_holo_dark.9.png | Bin 0 -> 396 bytes .../abs__spinner_focused_holo_light.9.png | Bin 0 -> 532 bytes .../abs__spinner_pressed_holo_dark.9.png | Bin 0 -> 530 bytes .../abs__spinner_pressed_holo_light.9.png | Bin 0 -> 536 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 218 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 159 bytes ...s__tab_selected_pressed_focused_holo.9.png | Bin 0 -> 522 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 271 bytes .../abs__tab_unselected_focused_holo.9.png | Bin 0 -> 216 bytes .../abs__tab_unselected_holo.9.png | Bin 0 -> 147 bytes ..._tab_unselected_pressed_focused_holo.9.png | Bin 0 -> 536 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 265 bytes .../abs__cab_background_holo_dark.9.png | Bin 0 -> 1993 bytes .../abs__cab_background_holo_light.9.png | Bin 0 -> 2062 bytes .../abs__cab_ic_close_focused_holo.png | Bin 0 -> 906 bytes .../abs__cab_ic_close_normal_holo.png | Bin 0 -> 705 bytes .../abs__cab_ic_close_pressed_holo.png | Bin 0 -> 1226 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 709 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 728 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 1092 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 1049 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 1057 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 1053 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 172 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 171 bytes .../abs__spinner_default_holo_dark.9.png | Bin 0 -> 302 bytes .../abs__spinner_default_holo_light.9.png | Bin 0 -> 301 bytes .../abs__spinner_disabled_holo_dark.9.png | Bin 0 -> 331 bytes .../abs__spinner_disabled_holo_light.9.png | Bin 0 -> 331 bytes .../abs__spinner_focused_holo_dark.9.png | Bin 0 -> 352 bytes .../abs__spinner_focused_holo_light.9.png | Bin 0 -> 499 bytes .../abs__spinner_pressed_holo_dark.9.png | Bin 0 -> 420 bytes .../abs__spinner_pressed_holo_light.9.png | Bin 0 -> 457 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 203 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 144 bytes ...s__tab_selected_pressed_focused_holo.9.png | Bin 0 -> 454 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 231 bytes .../abs__tab_unselected_focused_holo.9.png | Bin 0 -> 196 bytes .../abs__tab_unselected_holo.9.png | Bin 0 -> 128 bytes ..._tab_unselected_pressed_focused_holo.9.png | Bin 0 -> 459 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 223 bytes .../abs__action_item_divider.9.png | Bin 0 -> 80 bytes .../abs__action_item_divider.9.png | Bin 0 -> 134 bytes .../res/drawable/abs__cab_ic_close_holo.xml | 23 + .../abs__item_background_holo_dark.xml | 29 + .../abs__item_background_holo_light.xml | 29 + ...lector_background_transition_holo_dark.xml | 20 + ...ector_background_transition_holo_light.xml | 20 + .../abs__spinner_background_holo_dark.xml | 25 + .../abs__spinner_background_holo_light.xml | 25 + .../res/drawable/abs__tab_indicator_holo.xml | 34 + .../res/layout-large-land/abs__action_bar.xml | 20 + .../abs__screen_action_bar.xml | 24 + .../abs__screen_action_bar_overlay.xml | 25 + .../res/layout-xlarge/abs__action_bar.xml | 20 + .../layout-xlarge/abs__screen_action_bar.xml | 24 + .../abs__screen_action_bar_overlay.xml | 25 + .../library/res/layout/abs__action_bar.xml | 110 + .../res/layout/abs__action_bar_home.xml | 37 + .../res/layout/abs__action_bar_inline.xml | 118 + .../layout/abs__action_bar_item_layout.xml | 52 + .../res/layout/abs__action_bar_tab_layout.xml | 53 + .../res/layout/abs__action_bar_title_item.xml | 44 + .../res/layout/abs__screen_action_bar.xml | 47 + .../layout/abs__screen_action_bar_inline.xml | 48 + .../abs__screen_action_bar_inline_overlay.xml | 49 + .../layout/abs__screen_action_bar_overlay.xml | 48 + .../library/res/layout/abs__screen_simple.xml | 43 + .../res/layout/abs__simple_spinner_item.xml | 26 + .../res/values-land/abs__constants.xml | 5 + .../library/res/values-v11/abs__styles.xml | 187 ++ .../library/res/values-v13/abs__styles.xml | 11 + .../library/res/values/abs__attrs.xml | 60 + .../library/res/values/abs__constants.xml | 7 + .../library/res/values/abs__styles.xml | 224 ++ .../src/android/support/v4/app/ActionBar.java | 807 +++++++ .../support/v4/app/BackStackRecord.java | 721 ++++++ .../support/v4/app/DialogFragment.java | 396 ++++ .../src/android/support/v4/app/Fragment.java | 1339 ++++++++++++ .../support/v4/app/FragmentActivity.java | 1213 +++++++++++ .../support/v4/app/FragmentManager.java | 1923 +++++++++++++++++ .../support/v4/app/FragmentPagerAdapter.java | 135 ++ .../v4/app/FragmentStatePagerAdapter.java | 168 ++ .../support/v4/app/FragmentTransaction.java | 262 +++ .../android/support/v4/app/HCSparseArray.java | 360 +++ .../android/support/v4/app/ListFragment.java | 375 ++++ .../android/support/v4/app/LoaderManager.java | 803 +++++++ .../v4/app/NoSaveStateFrameLayout.java | 63 + .../v4/app/SuperNotCalledException.java | 27 + .../support/v4/app/SupportActivity.java | 295 +++ .../support/v4/content/AsyncTaskLoader.java | 287 +++ .../support/v4/content/CursorLoader.java | 215 ++ .../android/support/v4/content/Loader.java | 358 +++ .../support/v4/os/ParcelableCompat.java | 48 + .../os/ParcelableCompatCreatorCallbacks.java | 24 + .../v4/os/ParcelableCompatHoneycombMR2.java | 46 + .../android/support/v4/util/DebugUtils.java | 40 + .../android/support/v4/util/LogWriter.java | 72 + .../src/android/support/v4/util/LruCache.java | 323 +++ .../android/support/v4/util/TimeUtils.java | 172 ++ .../android/support/v4/view/ActionMode.java | 188 ++ .../src/android/support/v4/view/Menu.java | 33 + .../android/support/v4/view/MenuInflater.java | 464 ++++ .../src/android/support/v4/view/MenuItem.java | 187 ++ .../support/v4/view/MotionEventCompat.java | 180 ++ .../v4/view/MotionEventCompatEclair.java | 37 + .../android/support/v4/view/PagerAdapter.java | 138 ++ .../src/android/support/v4/view/SubMenu.java | 30 + .../v4/view/VelocityTrackerCompat.java | 92 + .../view/VelocityTrackerCompatHoneycomb.java | 31 + .../v4/view/ViewConfigurationCompat.java | 74 + .../v4/view/ViewConfigurationCompatFroyo.java | 28 + .../android/support/v4/view/ViewPager.java | 996 +++++++++ .../src/android/support/v4/view/Window.java | 88 + .../support/v4/widget/CursorAdapter.java | 484 +++++ .../support/v4/widget/CursorFilter.java | 71 + .../v4/widget/ResourceCursorAdapter.java | 131 ++ .../v4/widget/SimpleCursorAdapter.java | 398 ++++ .../internal/app/ActionBarImpl.java | 422 ++++ .../internal/app/ActionBarWrapper.java | 581 +++++ .../internal/view/menu/ActionMenuItem.java | 255 +++ .../view/menu/ActionMenuItemView.java | 149 ++ .../internal/view/menu/MenuBuilder.java | 408 ++++ .../view/menu/MenuInflaterWrapper.java | 21 + .../internal/view/menu/MenuItemImpl.java | 663 ++++++ .../internal/view/menu/MenuItemWrapper.java | 315 +++ .../internal/view/menu/MenuView.java | 143 ++ .../internal/view/menu/MenuWrapper.java | 156 ++ .../internal/view/menu/SubMenuBuilder.java | 119 + .../internal/view/menu/SubMenuWrapper.java | 82 + .../internal/widget/ActionBarContainer.java | 35 + .../internal/widget/ActionBarView.java | 690 ++++++ .../internal/widget/ScrollingTextView.java | 51 + .../JakeWharton-ActionBarSherlock/pom.xml | 213 ++ .../update-version.py | 40 + 382 files changed, 21796 insertions(+) create mode 100644 external/JakeWharton-ActionBarSherlock/.gitignore create mode 100644 external/JakeWharton-ActionBarSherlock/CHANGELOG.md create mode 100644 external/JakeWharton-ActionBarSherlock/LICENSE.txt create mode 100644 external/JakeWharton-ActionBarSherlock/README.md create mode 100644 external/JakeWharton-ActionBarSherlock/library/.classpath create mode 100644 external/JakeWharton-ActionBarSherlock/library/.project create mode 100644 external/JakeWharton-ActionBarSherlock/library/.settings/org.eclipse.jdt.core.prefs create mode 100644 external/JakeWharton-ActionBarSherlock/library/AndroidManifest.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/README.md create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$LayoutParams.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$OnMenuVisibilityListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$OnNavigationListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$Tab.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$TabListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/BackStackRecord$Op.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/BackStackRecord.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/BackStackState$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/BackStackState.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/DialogFragment.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$InstantiationException.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$SavedState$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$SavedState.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$3.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$FragmentTag.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$HoneycombInvalidateOptionsMenu.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$NonConfigurationInstances.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$OverridePendingTransition.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager$BackStackEntry.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager$OnBackStackChangedListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$3.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$4.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$5.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerState$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerState.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentPagerAdapter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentState$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentState.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentStatePagerAdapter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentTransaction.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/HCSparseArray.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment$2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManager$LoaderCallbacks.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManager.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManagerImpl$LoaderInfo.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManagerImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/NoSaveStateFrameLayout.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/SuperNotCalledException.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/SupportActivity$InternalCallbacks.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/SupportActivity.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/AsyncTaskLoader$LoadTask.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/AsyncTaskLoader.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/CursorLoader.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/Loader$ForceLoadContentObserver.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/Loader$OnLoadCompleteListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/Loader.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompat$CompatCreator.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompat.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorCallbacks.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorHoneycombMR2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorHoneycombMR2Stub.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/util/DebugUtils.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/util/LogWriter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/util/LruCache.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/util/TimeUtils.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ActionMode$Callback.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ActionMode.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/Menu.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater$ActionBarMenuState.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater$InflatedOnMenuItemClickListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuItem$OnMenuItemClickListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuItem.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$BaseMotionEventVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$EclairMotionEventVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$MotionEventVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompatEclair.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/PagerAdapter$DataSetObserver.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/PagerAdapter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/SubMenu.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat$BaseVelocityTrackerVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat$HoneycombVelocityTrackerVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat$VelocityTrackerVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompatHoneycomb.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$BaseViewConfigurationVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$FroyoViewConfigurationVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$ViewConfigurationVersionImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompatFroyo.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$DataSetObserver.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$ItemInfo.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$OnPageChangeListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SavedState$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SavedState.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SimpleOnPageChangeListener.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/Window.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter$ChangeObserver.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter$MyDataSetObserver.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorFilter$CursorFilterClient.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorFilter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/ResourceCursorAdapter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter$CursorToStringConverter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter$ViewBinder.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$attr.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$color.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$drawable.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$id.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$integer.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$layout.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$string.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$style.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$styleable.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$3.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$ActionModeWrapper.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$TabImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItem$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItem.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuBuilder$Callback.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuBuilder.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$3.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$NativeMenuItemView.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemWrapper$HoneycombMenuItem.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuView$ItemView.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuView.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuWrapper.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarContainer.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView$2.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView$TabImpl$1.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView$TabImpl.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ScrollingTextView.class create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/com_actionbarsherlock.jar create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_background_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_background_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_focused_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_normal_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_pressed_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_default_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_default_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_focused_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_focused_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_background_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_background_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_focused_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_normal_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_pressed_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_default_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_default_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_focused_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_focused_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-nodpi-v11/abs__action_item_divider.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-nodpi/abs__action_item_divider.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/checkstyle.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/default.properties create mode 100644 external/JakeWharton-ActionBarSherlock/library/gen/com/actionbarsherlock/R.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/pom.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/project.properties create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/color/abs__item_bg.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_dark.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_light.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_focused_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_normal_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_pressed_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_default_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_default_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_focused_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_focused_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_ic_close_focused_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_ic_close_normal_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_ic_close_pressed_holo.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_default_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_default_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_disabled_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_disabled_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_focused_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_focused_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_pressed_holo_dark.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_pressed_holo_light.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_focused_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-nodpi-v11/abs__action_item_divider.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable-nodpi/abs__action_item_divider.9.png create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__cab_ic_close_holo.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_dark.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_light.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__tab_indicator_holo.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__action_bar.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar_overlay.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__action_bar.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_home.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_inline.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_item_layout.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_tab_layout.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline_overlay.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_simple.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/layout/abs__simple_spinner_item.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/values-land/abs__constants.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/values-v11/abs__styles.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/values-v13/abs__styles.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/values/abs__attrs.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/values/abs__constants.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/res/values/abs__styles.xml create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ActionBar.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/BackStackRecord.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/DialogFragment.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/Fragment.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentActivity.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentManager.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentPagerAdapter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentStatePagerAdapter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentTransaction.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/HCSparseArray.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ListFragment.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/LoaderManager.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/NoSaveStateFrameLayout.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SuperNotCalledException.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SupportActivity.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/AsyncTaskLoader.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/CursorLoader.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/Loader.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompat.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatCreatorCallbacks.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatHoneycombMR2.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/DebugUtils.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LogWriter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LruCache.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/TimeUtils.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ActionMode.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Menu.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuInflater.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuItem.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompat.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompatEclair.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/PagerAdapter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/SubMenu.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompat.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompatHoneycomb.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompat.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompatFroyo.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewPager.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Window.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorAdapter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorFilter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/ResourceCursorAdapter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/SimpleCursorAdapter.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java create mode 100644 external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTextView.java create mode 100644 external/JakeWharton-ActionBarSherlock/pom.xml create mode 100755 external/JakeWharton-ActionBarSherlock/update-version.py diff --git a/external/JakeWharton-ActionBarSherlock/.gitignore b/external/JakeWharton-ActionBarSherlock/.gitignore new file mode 100644 index 00000000..fb211339 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/.gitignore @@ -0,0 +1,19 @@ +#Android generated +bin +gen + +#Eclipse +.project +.classpath +.settings + +#IntelliJ IDEA +.idea +*.iml + +#Maven +target +release.properties +pom.xml.* + +website/_site diff --git a/external/JakeWharton-ActionBarSherlock/CHANGELOG.md b/external/JakeWharton-ActionBarSherlock/CHANGELOG.md new file mode 100644 index 00000000..5fd4fe28 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/CHANGELOG.md @@ -0,0 +1,279 @@ +Change Log +=============================================================================== + +Version 3.3.0 *(2011-10-11)* +---------------------------- + + * Tabs are now displayed below the action bar on all medium-screen devices and + portrait large-screen devices. + * Fix: Dialog fragments no longer throw an `IllegalStateException` when being + used as a regular fragment (i.e., not as a popup). See + [StackOverflow](http://stackoverflow.com/questions/5637894/dialogfragments-with-devices-api-level-11/7560686#7560686) + for more information. + * Fix: Popping a fragment off of the back stack now properly assigns its parent + activity. + * Fix: An activity result no longer causes a `NullPointerException` when the + target fragment no longer exists. + * Fix: Action item dividers are now properly initially hidden when their + associated action items are as well. + + +Version 3.2.3 *(2011-09-16)* +---------------------------- + + * Fix: Fragments in a `ViewPager` that contributed items to the options menu + were caught in a race condition causing inconsistent results when a new page + was selected. This regression was introduced in version 3.2.2. + + +Version 3.2.2 *(2011-09-15)* +---------------------------- + + * Fix: Side-effects related to using `FragmentMapActivity` due to how it was + referencing resources from the main library. + * Fix: Fragments adjacent to the currently selected fragment in a `ViewPager` + no longer receive context menu events. + * Fix: Eliminate exception when inflating context menus on 3.0+ when using + `getMenuInflater()`. + * Fix: `ViewPager` now determines whether or not an activity menu invalidation + is required independently of whether or not fragments were created or + destroyed. This should fix an edge case where an activity with a `ViewPager` + containing only two fragments would not get its menu properly invalidated. + + +Version 3.2.1 *(2011-09-12)* +---------------------------- + + * Fix: Action mode API incorrectly using the native `Menu` and `MenuItem` + classes causing an easy pitfall for `ClassCastExceptions`. + * Fix: Large action bar backgrounds increasing the size beyond that alloted in + the theme. + + +Version 3.2.0 *(2011-09-05)* +---------------------------- + + * Added support for `MapView` and the Google APIs through the use of + `FragmentMapActivity`. If you are using a map within a fragment you must + ensure it is always attached to an activity which extends from this new base + class. + + Since supporting maps requires compiling against the Google APIs, this + functionality is implemented in the form of a plugin which is to be used + alongside the normal library. You can choose to add it as an additional + library project or by including it as a `.jar`. Maven users may simply + include the additional dependency (artifactId: `plugin-maps`). + * Fix: Fragments adjacent to the currently selected fragment in a `ViewPager` + no longer contribute to the activity menu. + * `ActionBar.Tab` has been changed from an interface to an abstract class to + mirror its native counterpart. + + +Version 3.1.3 *(2011-08-14)* +---------------------------- + + * Renamed all resources to be prefixed with `abs__` to avoid conflicts when + including in your project. + * Fix: Action bar background being set on two views causing artifacts to remain + on screen when the action bar was hidden. + * Fix: Incorrect sub-menu item being selected by default when the sub-menu was + triggered from the native options menu on pre-3.0. + * Fix: `MenuItem.setVisible` now properly updates the associated action item and + native menu item visible state. + * Fix: Adding items to a menu now honors its ordering and category. + * Fix: Fragment options item selected callback now uses the proper version of + `MenuItem`. + + +Version 3.1.2 *(2011-08-07)* +---------------------------- + + * Fix: `MenuItem.getMenuInfo()` was throwing runtime exception. Will now just + return `null`. + * Fix: Dragging over a `WebView` contained in a `ViewPager` would not register. + * Fix: Inflation of context menu incorrectly being handled by the custom menu + inflater for the library. + + +Version 3.1.1 *(2011-07-31)* +---------------------------- + + * Fix: `MenuItem.getSubMenu` now returns a support instance rather than a + native instance. + * Fix: Fragment methods `onAttach` and `onInflate` incorrectly regressed to use + `Activity` instead of a `FragmentActivity` in their method signatures. + * Fix: Retained fragments not being re-attached on pre-3.0 when attached to + `android.R.id.content` upon activity recreation. + * Fix: `onPrepareOptionsMenu` not dispatched to fragments. This still will only + occur if the activity method returns true (which is the default). + * Fix: `Menu.findItem` not returning `null` when the item was not found on + Android 3.0+. + + +Version 3.1.0 *(2011-07-22)* +---------------------------- + +Due to shortcomings in the Android theming system, a small change must be made +in how this library handles themes. If you were using a custom style for +`actionBarStyle` you must now specify its attributes in the root of the theme +and prefix them with 'ab'. + +You can see an example of this in the `SherlockCustom` theme in +`samples/demos/res/values/styles.xml`. + + * Library now uses the `r3` version of the compatibility library for its base. + * `actionBarStyle` is no longer a valid theme attribute (see note above). + * Added the demo project included with the new compatibility library under + `samples/demos/` and merged in the old 'featuredemo'. + * Dividers are now shown on pre-3.0 devices between all action items. + * `Window.FEATURE_ACTION_BAR_OVERLAY` is now honored on pre-3.0 devices. + * Inflation of XML menu resources will now honor `android:actionLayout` and + `android:actionViewClass` attributes. + * Buttons for displaying the determinate and indeterminate progress bars have + been added to the feature toggle demo. + * Added support for indeterminate progress bar. Due to the `final` modifier on + the native type, you must use `setIndeterminateProgressBarVisibility(Boolean)` + and pass `Boolean.TRUE` or `Boolean.FALSE`. + * Fix: `MenuBuilder#removeItem(int)` and `MenuBuilder#findItem(int)` throwing + `IndexOutOfBoundsException`s when the item was not found. + * Fix: Theme attributes for home item data (e.g., icon, logo) will not be + overwritten by the special `MenuItem` instance for home. + * Fix: Native strings can now be specified for an XML menu `` in + `android:title` and `android:titleCondensed`. + * `Window.FEATURE_ENABLE_ACTION_BAR_WATSON_TEXT` is now + `Window.FEATURE_ACTION_BAR_ITEM_TEXT`. + * `Widget.Sherlock.Spinner.DropDown.ActionBar` and + `Widget.Sherlock.Light.Spinner.DropDown.ActionBar` styles are now + `Widget.Sherlock.Spinner` and `Widget.Sherlock.Light.Spinner`, respectively. + * `Widget.Sherlock.ActionBarView_TabXXX` styles are now + `Widget.Sherlock.ActionBar.TabXXX`. + + +Version 3.0.3 *(2011-07-17)* +---------------------------- + +This version is a hotfix for incompatibilities introduced with the SDKs for +3.1 r2 and 3.2 r1. Due to unavoidable changes in the underlying SDK, the library +must now be compiled against API level 13. + + * `actionModeStyle` and `actionModePopupWindowStyle` are no longer valid theme + attributes. + + +Version 3.0.2 *(2011-06-23)* +---------------------------- + + * Sub-menus for action items are now shown in a list dialog. + * Moved certain classes to the `com.actionbarsherlock.internal` package which + were not meant for public consumption. Despite being given `public` scope in + this new package, these classes should **NOT** be used under any circumstances + as their API can be considered highly volatile and is subject to change often + and without warning. + + +Version 3.0.1 *(2011-06-08)* +---------------------------- + + * Fix: `onOptionsItemSelected()` not being called in fragments if the activity + version returns `false`. + * Fix: `onCreateOptionsMenu()` not being called in fragments on Android 3.0+. + * New: Enable action item text display on pre-Android 3.0 by calling + `requestWindowFeature` with `Window.FEATURE_ENABLE_ACTION_BAR_WATSON_TEXT`. + * Fix: `setCustomView()` no longer automatically enables the custom view on + pre-3.0. You must call `setDisplayShowCustomEnabled()` in order to display + the view. + + +Version 3.0.0 *(2011-06-05)* +---------------------------- + +The API has been rewritten to mimic that of the native action bar. As a result, +usage now only requires changing a few imports to use the support versions +of classes and calling `getSupportActionBar()`. See the README for more info. + +The rewrite necessitated tight interaction with the +[compatibility library](http://android-developers.blogspot.com/2011/03/fragments-for-all.html) +to the point where its sources are now included. You are no longer required to +have the standalone `.jar` file. + +Also included is a default custom action bar for use by default on pre-3.0 +devices. This custom implementation is based off of Johan Nilsson's +[Android-ActionBar](https://github.com/johannilsson/android-actionbar) and the +[work that I have done](https://github.com/johannilsson/android-actionbar/pull/25) +on it. + +More details are available at http://actionbarsherlock.com + + +Version 2.1.1 *(2011-03-21)* +---------------------------- + +**No changes to library code.** + + * Moved library to the root of the repository. + * Added `samples/dependencies.py` script to automatically download the needed + dependencies for the sample projects. + + +Version 2.1.0 *(2011-03-21)* +---------------------------- + +**WARNING**: The +[Android Compatibility Library (v4)](http://android-developers.blogspot.com/2011/03/fragments-for-all.html) +is now required. + + * Added `ActionBarSherlock.Activity`, `ActionBarSherlock.FragmentActivity`, + and `ActionBarSherlock.ListActivity` for extension by implementing + activities, the latter of which is deprecated. This affords a much tighter + integration and allows for the use of other new features listed below. + * New API method: `layout(Fragment)` will use the fragment argument as the + content to the activity. + * New API method: `menu(int)` allows for the inflation of menu XMLs from a + resource. For the non-native implementation, the XML can be inflated to a + custom Menu which can then be applied appropriately to the third-party + action bar. Sub-menus are also supported. Third-party action bar handlers + should implement `ActionBarSherlock.HasMenu` for this functionality. *This + feature requires that activities extend from one of the provided activity + base classes.* + * New API method: `homeAsUp(boolean)`. This mimics the native method + `setDisplayHomeAsUpEnalbed` on the native action bar. Third-party action bar + handlers should implement `ActionBarSherlock.HasHomeAsUp` for this + functionality. + * New API method: `useLogo(boolean)` will trigger the action bar to hide the + application icon/home button and title and show a larger logo representing + the application. Third-party action bar handlers should implement + `ActionBarSherlock.HasLogo` for this functionality. + * New API method: `listNavigation(SpinnerAdapter, OnNavigationListener)`. Tells + the action bar to use drop-down style navigation with the specified list of + items and callback listener. Third-party action bar handlers should + implement `ActionBarSherlock.HasListNavigation` for this functionality. + * Javadocs are now available at + [jakewharton.github.com/ActionBarSherlock](http://jakewharton.github.com/ActionBarSherlock/). + * A standalone JAR is now available via the + [GitHub downloads page](https://github.com/JakeWharton/ActionBarSherlock/downloads) + or in my + [personal maven repository](http://r.jakewharton.com/maven/) + as `com.jakewharton:android-actionbarsherlock:2.1.0`. + + +Version 2.0.1 *(2011-03-11)* +---------------------------- + + * Use `Class.forName()` for detection of native action bar. This provides + compatability all the way back to Android 1.5. + + +Version 2.0.0 *(2011-03-09)* +---------------------------- +Complete rewrite! + + * New and better API. + * More sane logic and attachment to activity. + * Extensible via generics. Implement any ActionBar or roll your own with + minimal effort. + * Now a library project for easy inclusion in applications. + + +Version 1.0.0 *(2011-03-07)* +---------------------------- +Initial release. diff --git a/external/JakeWharton-ActionBarSherlock/LICENSE.txt b/external/JakeWharton-ActionBarSherlock/LICENSE.txt new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/external/JakeWharton-ActionBarSherlock/README.md b/external/JakeWharton-ActionBarSherlock/README.md new file mode 100644 index 00000000..75a94a00 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/README.md @@ -0,0 +1,55 @@ +Action Bar Sherlock +=================== + +ActionBarSherlock is an extension of the [compatibility library][1] designed +to facilitate the use of the action bar design pattern across all versions of +Android through a single API. + +The class will automatically use the [native ActionBar][2] implementation on +Android 3.0 or later. For previous versions which do not include ActionBar, a +custom action bar implementation will automatically be wrapped around the +layout. Support for this goes all the way back to Android 1.6. + +Try out the sample applications on the Android Market: [Feature Demos][4], +[Shakespeare][5], and [Styled Action Bar][6]. + +**See http://actionbarsherlock.com for more information.** + +![Example Image][3] + + + +Developed By +============ + +* Jake Wharton - + + + +License +======= + + Copyright 2011 Jake Wharton + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + + + [1]: http://android-developers.blogspot.com/2011/03/fragments-for-all.html + [2]: http://developer.android.com/guide/topics/ui/actionbar.html + [3]: http://actionbarsherlock.com/static/feature.png + [4]: https://market.android.com/details?id=com.actionbarsherlock.sample.demos + [5]: https://market.android.com/details?id=com.actionbarsherlock.sample.shakespeare + [6]: https://market.android.com/details?id=com.actionbarsherlock.sample.styledactionbar diff --git a/external/JakeWharton-ActionBarSherlock/library/.classpath b/external/JakeWharton-ActionBarSherlock/library/.classpath new file mode 100644 index 00000000..a4763d1e --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/.project b/external/JakeWharton-ActionBarSherlock/library/.project new file mode 100644 index 00000000..c513f6fd --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/.project @@ -0,0 +1,33 @@ + + + com_actionbarsherlock + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/external/JakeWharton-ActionBarSherlock/library/.settings/org.eclipse.jdt.core.prefs b/external/JakeWharton-ActionBarSherlock/library/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..df27f3ee --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Tue Nov 01 09:28:45 CET 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/external/JakeWharton-ActionBarSherlock/library/AndroidManifest.xml b/external/JakeWharton-ActionBarSherlock/library/AndroidManifest.xml new file mode 100644 index 00000000..83e3d30d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/README.md b/external/JakeWharton-ActionBarSherlock/library/README.md new file mode 100644 index 00000000..4b22e6fe --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/README.md @@ -0,0 +1,15 @@ +ActionBarSherlock Library +========================= + +This folder contains the main library which should be linked against as an +Android library project in your application. + +For more information see the "Including In Your Project" section of the +[download page][1]. + + + + + + + [1]: http://actionbarsherlock.com/download.html diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$LayoutParams.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$LayoutParams.class new file mode 100644 index 0000000000000000000000000000000000000000..38ac50244167de35537f147fb9f272859e5971ac GIT binary patch literal 1552 zcma)5T~8B16g|@x7TOi0MHC7O0@`kYRYZBf7?DI$QV3d7jh~se8#<=!Hrv@EKg&eZ z#0P(XKgxJ#yKE~I;brE|?7iolIrr}GKR% z&taHWuH99McNkW?&$*fd9iBy1eve_LTYhOn$pq5TbUe30UCCTn**gS*afYJHFf4{P zoMHQ?h9O?`SzZd&|B-MUSHAETXVCMuZMj=@-fUVll@AzZFPj1?>ZQ=|h++P;=s#LC zJZ6~apGcE=e(Ett&56=KMzf(tgd&Y14MVgJ(`gM6ihw~Q(nkCnMG;)1HBLLQOEr5K zp-As!VHDTtq!7jegx7?x7<41I)JD>X{J?k@XT<-uPs}?=;FXUx+sO~G6!rve`uI9- zVbWJbV|NZeJ>5pSFMct=KezyYhQ6y;>bOmjdNECFfd7Hi#C-h q9srknKocQofcH0flZYIlrN0hlM?V%Zq0rm)w}i?@XC@MJnFvDT6Et{P5o!zN t&1VU>R@e|#LgybMq5TUoAQ1BYUw}Mr5rOY=2;a4Yve$~=@KC4)nD1VS@@3Q&Y?BZ*T3>8*CqjlCBY5eWUHdjZ5}OeO#T literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$Tab.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$Tab.class new file mode 100644 index 0000000000000000000000000000000000000000..29f068a3e57628b8427b514bc71f471f220ecaeb GIT binary patch literal 1403 zcma)6U2hUW6g^Wu7AVk)tsnKPRjg2Jx7I${##m`gHrYTE2(M;XCa}$R7k3xxZ}7># zVtg?1!5`p{GTs@se5j#I!k(F%d(PZBGk1Rd{_zvQ0S+}RF_gL6^*y_*2gAX@^Fw`f zsPn-6KGChksZSLE09tG3KN+yQ{ zR`Vz#LsDVi4j8u0ICUQ}6nY}84TI3TXxrkFVZBnFP)8KeWtj3b$}=p_CFz-rp3et; z+Y0oq&o5~b32Kn5E9Wdx`a%3o^f8**Q1u!KB)bA-SbB=H#q6_pay>=8{Tl*H7|cdSflX%!q( z^5XT8+R1m#fHLrxUcX59x8l9i%H%lwjzA2@CnKhj^j_Ut>({A gQCN-gtJqP6KUd#fydW&mwix!XpUmPV;j47^5BF$q#{d8T literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$TabListener.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar$TabListener.class new file mode 100644 index 0000000000000000000000000000000000000000..ec759be1ab2a61cc1edd4d75be0ec5b0d1e767cd GIT binary patch literal 437 zcma)&%}N6?6ot=i>%{5LwDt*HbfF*y#9db^6of*-w(f6dLYXoqLz4F4T=)P!lr%F+ zbtCO2hZ|0E&iy{W-ai1`VJOfb+_289$usG;WofLJyL-uHDIZdw8~w<3wBXe=cV1~_ z1zLo`hIcFr)@wOiZB*(BeWQcxMLAW3S!IOf)%28)$N#w|me+4e`-Nrgxb8B(ekJtk zr1>G|J9(*pliPE%wW*rqg(4(}HEyfcgzmErdps5FoN@v^!swKq0)4{eF(;uJFc3O_ qkVS-W9e@MP0PhSDDv07o&nra(aecPY2|5gO7YPQfIJ`}85yg9@0(r;) literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ActionBar.class new file mode 100644 index 0000000000000000000000000000000000000000..92af3459f8d5092b6af6241bbf7a46e64b601751 GIT binary patch literal 3401 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 Dw7dkX literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/BackStackState.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/BackStackState.class new file mode 100644 index 0000000000000000000000000000000000000000..514e97fed9c266c5ca0f10f041635ca044284455 GIT binary patch literal 5000 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 Q$Ujf(@K2s_4E6l?Ka_6;bpQYW literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/DialogFragment.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/DialogFragment.class new file mode 100644 index 0000000000000000000000000000000000000000..ad38a4d329ff69dd05e0fc85f02d8d12dd7c9b9d GIT binary patch literal 7113 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$InstantiationException.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$InstantiationException.class new file mode 100644 index 0000000000000000000000000000000000000000..52a2f24df7e3832a52d766d2e0959d10c044dd30 GIT binary patch literal 677 zcmbVK+e#xr5Iq%>%o-E#x7F2M!3TAh9S{*A;)8L6Bf*DNv#@V%(!`cY&(PhY{+3UI zh#%m8_#0xici08Nm+m^%r%s*j>YKaEYXHlb4Ui+O3f(q|YKJyU)5N&&WF-`78rF^I zbftFlk+x1~r-W09{&m)psSg6=2~)@7M1-->o$zV)FD(#mZRmKGYXx_izj-KoCGytJq;HVOG!(v~Ikpuda~ z2HvgSKQhUwIE>{(^*}>uxtnzlrP=pM!f+#Lv1!5989ycS?nqg}TH|AHRVDOvZO4oM zb1_1pB{IvM$KD*i-jPt+OES}vb>;04_|A}G_ z?2~^6&lLp}c@G%n@QEX~fj(Z#oQas_dBM{69~Y>cKad7_EioCijUq)DV*KrqhGC2_ e;sT6fj75AjjtOSxFv%!~&)m}2`$p54LGL}}Gqb$_ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$SavedState$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$SavedState$1.class new file mode 100644 index 0000000000000000000000000000000000000000..681b097b903b2b3d1965a74b43576c2251aeb002 GIT binary patch literal 1273 zcma)5>uwT36#fpkEh`mDE!twO7i@uE)@zKRAt6K(61*gsCdMCTfC=4(?vmN1MxRRm zw24L^z=txP;j&NCmJ(iB2Yl;)uY5KyKxrYWKgw&BZ5mrw)UF&u0NVa_gF~a%;$Mvi?LbYX2w0bgE zRZ{q_BE$M(yFaK3Orh*aHkcku~KWkJu3^`2Zx~Tq*>2{|7D^SSA$bXJR6a6`gN}uzOMT z#_n@biqQlLs$;jO&Jpw9Qm=Ll=wt=kgpfs2S#(Gz@6~y&s=S)6Sgkm zRG1+(>UYTmVIzSQmI#?)#3}C?le-D5VvS%n-2o3o&DLFAoD9~U_94WZcGnU9K(X$_ zzoCL$f`n(sYCllVk!qR8Ao;>+_gv3*x-X@F=ynK+y5mSSthV$F6bUPnhW-_jV2o$k zz%HjhF}ftM&N_HFxXlF%^NRAr(~BpbPjTKoW=Z2!59KDdSVs6^0eN0)T<0hX*p9{dZU=i@Bwb(r{s3X{C9wbi literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$SavedState.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment$SavedState.class new file mode 100644 index 0000000000000000000000000000000000000000..0a5c7892762e1001df135ba291898a7adf4c6dde GIT binary patch literal 1593 zcmah}+fox*6kR((nuG=s6b8HyG-?RZh~lUd#7h*5GG0n3s(d^oM{I4nQ{5fr5BwTm zre?${t@67Ec6SGby57V`cwr? z?Wzq|3;MU>or1B(o{YO4ujT5Rz^XsHe`oEpdc&7S0HcbPeepwT-hlC&=@t zT8UaVL}|7sYqy9zN+?^H{T?ORV`B~#!EmUfJ=B7!(!Qbu8OQsfx6(rBzZ+{8Ozg8? zFvR9;zJ8?IvGEqJQ1>qlVB5EJ*bJNvUH83+V?p29DJ#VIJ8&Ys<|n*l`<1OLiGeq4 z{Dn!uV7#YmRUe@vp34hYZ4y=pnqT!h9HM2%%+OGG6fYWW0(-^tbP#)_Lko8WCx1E; z(@ovkF=LiYk%jx5v~Kb~-D22#Baa#OTbAEL$gsEBcDy*TpPd;h8a1` z$Q8!SXYeCNp1;TFzc}^}|7I}3=PL%gi+p`SN>AmFM2! z_>cRic@Y(mlbLw`c#@5iIAwq+ZJL6FzmB4iV!mMxnNdhEcQ8ZP%4dw0|HJXm7&NcS z4$d2SU7F* z#w8#Ya5dFb;oGRpWZ#-+%-U}vQi)mYWHn_G{E2If7>ggK)#T=k?j2m;H7L&|$ULuy t%X_5edQx+!rBZWP#7$;ruoTnZ!fn2%SlS(yUhg+I%{?shtVbB<=Nro`Vf6q2 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/Fragment.class new file mode 100644 index 0000000000000000000000000000000000000000..4be715bea4cfc533f78de7485915af512b1401e1 GIT binary patch literal 17938 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$1.class new file mode 100644 index 0000000000000000000000000000000000000000..52b78e660ff5f0938778d7ad87ffabf2bdf24e68 GIT binary patch literal 1461 zcma)*YfsZq7{~vI4Z3bs1_EBVc$=^dq=1Md7!xEAn+)Gzc)`0vdmP2?bZNTWHYOhW>_9Jcxj!IUT|fbd#=MHk@TfonI#=@LD`k9%5feuxTE1V z!_tubFmMY~45My`!YqbjT|_mXJ0dvblGjDRV3w_ulYu?{$JlB#y&aXuf`M7gF=%1L zgGe|G?1Y+c2ZCx~$WxRzl%%KlGv&Ww3@l=aA=gN)r_#>#*fJPI>^6n^ zyV}DXAjG7;IAs-U*}w{(Qf`eN&Pp0>2nrpPkYOw69+DETFJJRuH;TA@CLGn7H3O?k zHTfgI71-jyRZ^MmhV1Hn^_;gkiE3Zko*%lhekh_dpW0|xQi@>D<6$U54OCpw|e*Dx|zkNdEJXEbI>Y``YHlT@jyNBuH*ju%<| E56^H#@c;k- literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$2.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$2.class new file mode 100644 index 0000000000000000000000000000000000000000..385aa868859807f3b6865c362a3830f87189b923 GIT binary patch literal 1127 zcma)5*-jHt82(OM7&;zS*;G{23SEFg#kI!75Qt4E7-}%#?l5!Gj?R{uDaxgZ(HJ$x zOP_$mD@`gSUibh$l<_}hig*Q+oSA?9&i60#`_Io`07@upNHFAtYX+WW7Q?3RdqGs( zSu6_QFRlcl?npO!XhhbI742q98d3~Hop3KKJ|fwc0Yi7xu)@qdfvtAjC!m!n>AvM! z(F2B=?5VSIn+&NX&y;B}oZ;v~w~i!wIW+V!B(o}@f7Np3TGQEPA&3$Uz&unr4!0kj%&y;aMRn6!nSvnpKi)-DM}NV z;+RI3L3cXir4G!T)PbsSso0?6_;y)G9y1yW4EYnd9?RmGRpaS1td(b$k-(~%0Q z$T5!v>XLjZjmOe8Ew`>V&U1+vjgzWM;s(cA43qAJb%x<1y2mv2U0Rh6~(ubr3`JWvZkY>;|rlaB&`Z%50d<%LD7rvmNq~t!X>|yfIczqwaBWdpG9(wYH1C$h%BovjYHrdy- z0B=Zsi#fc*0^XyH4_LuRRPYIF_}r#B+P-of^r3y4Y=&go$xN8tMEom) z|G*c)5AeYs;ExjT#Pmf3Ll$Od@11+jy>sr}pTEBU0Pp}CA#w~gVY<$$E>B0pp>-J_ z?{G03@?9r-18K5nNv6gsdlzqq$TO6W#aM7HOpm|r9LppNQDAtI*Z~(5X-!ACv@e~u z$q82`lg7u^`YMg@Q#I`w%V`kku`()q%CJ?P z8C5%A$Tw|Q7Qt{fLWso@0xU%+qRbFfeZW#%8To27=t%cQbhKosv~42vfpE&(Q)k{6 z&9FIZ@_3tyu2|zGXk~J+FE!~Wy9`Iw_B;YM{*`$m^=XPm?XZL^xEA6n!^Vu#Mp(vm zhV^P|7JkyxHD{j(eF_qJ0gttUcg1#>1wz%WqCp;aND&+eZE#8@vBe*;lA9yb60 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$FragmentTag.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$FragmentTag.class new file mode 100644 index 0000000000000000000000000000000000000000..b990bb0dcc089be128c79b73a664ceda42b99f08 GIT binary patch literal 701 zcmbVJT}vB56g@Yak2OY(tFdbRtU{{~U9j~@Db#=<1oNN-f)6s;4C%;bHtbFU{;X1} zP)dJ5pY#ujch;`Wqc{(jxo7S<_ntd{AAbD-u!rpua)eJpcjHKP{bV>8M6vNlpM5bH z_{Xv6^`$mn1EWUDTyJNU(-PrOIy?t4_*|w%KLtUkJcCB`Y$4C;9tNS(%6uU>A9h-Vd_C$)hb0^v?rgZ9 zVDdr*1r!N04W;Gju-}pKx#)zF;5DK^ge?&(oBsoghpB2A4&GL_|H(s%x z148*M8peSs?vy$!dqg@?aJkeUl^-v^ls~W2@!wzy@2kE6Vfi?3-^( zD8XfP!Y&SF&L_um>v3ufgc5PjpMbz%%H{iFp7{g6m{z!gH`5QKy(MU50_MNxX**sFAlvuoKKSN&PN z6o~^rfFFgJZIcjjfD5v;9 z^KX?__8pF53%fHiLf$BJNqKU3RVgAfwX5zC+3o{-e^wA zN+mC&JD?R{9UDF#5tb)RGjNDaJZ6Y18Vh?Ov`n3>tXQMtgsX}190+UE6tmTEOTnob z<*{rlC*$g$1AOU*LkK%s%lt4EMIj3xJA@aLlK!y)gss2t01m)&=G_83{&>FZ`|L$* ziS69}SJbX=;ebyE!#lw}{txdSu)WV-4G*xuH!k=MQ@P;!{tXr@H(2{k5HJMq6KdY+ a3`reN@RS2QY~7yE@SJVHB!q43V)GYV@y0&@ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$NonConfigurationInstances.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$NonConfigurationInstances.class new file mode 100644 index 0000000000000000000000000000000000000000..36b241f5a3e6fef022581f644e90c0db8496b2d1 GIT binary patch literal 899 zcma)4U279T6g`usNgJcBsnOQ&2eH)$SHuS;p%4~I1KSEl`hK%J-AvicE;F-%{wcvH z!3TeUKT5o_jU`k=`!ILz_qq3Se*OOO6Tmw>Z=xnJAf1?8C4nuAA~!CWy$`4;f&)Y8 zRBAVfoti0k{^B^-VXjYAS{iaH*F$X`=~&t(>H?c*G@~FRod%!AXEJsIYcwwv=tNh; zJ&wl{l_f@Mfvt;p=~NaRlARn;!3palm1=UOkpdt8&FC*Q9XX?P+FS5kOwrr-eNN}Q zSb^?BpMf!S9x3ZM=fnT}{pgzGRPCEtPKh+!{N=Lz!*EoPv9dyBw9hw6TnZmmfJdY$ zm1a0CvTBY-Uuos`1y=T6oe0#!JdrJ|pxee>bObgcrR8xs9ZU0t#u*>A6Xh{wCuEej z=gzvDDBdMpHsZ~R!Hc#=d1+#KpgdgnYUvx#3W4@eYiYuato3YqDzJOa-T#tOU}q^U z@fLgvW_q39DjF<-Cf3-y&RPvEmbcKpv~RP02OF36CTsAg<9~~_fPe2N`4taX_su-mHg>A`!%9BFWByxJ`4c?D_8&^o{zCu& literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$OverridePendingTransition.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity$OverridePendingTransition.class new file mode 100644 index 0000000000000000000000000000000000000000..1d3c90a00d8c2c4bfac64b0edb4a8b6692f2acca GIT binary patch literal 687 zcmbtSTT22#6#m9l*EYMETH56)NPTD{>d6Q~Fbv5c@qKg$8(U{(c3tRa^-|D7KcF8K zowY29q=y(dXTCG%_MJ1YZ_h6Pj<9PY#&FJ+qdn=^{&+OD7roG}=sa)%*a z^BiHpz(N`cBpFtkQi-eauq$+%cU{4dX?i{GcDR-i{xrseTj?{@n*VOJNKux=v5keybX^++R&9L0O{#=(#%H5w7)6#twZL;m+_4AzY|);&>| z5&zuJp&vw3Wk@%a61wJc-xt1#ZHE16YkzEw8lAg09D;U3Ujc~Gp`8#m3E89>=|trT zsfWq4MKXGZae+m;r#~D>FA+*%87pLof=?)A6l_)u;}NUh;TF|^(LmC;oJnCKj}3B< SVRIr2D3Z1)1;ZA0P<#g*9IfU6 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentActivity.class new file mode 100644 index 0000000000000000000000000000000000000000..c360c9e8fe4714bb18027d87da1930286b814cb4 GIT binary patch literal 24964 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 D62o%& literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager$OnBackStackChangedListener.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager$OnBackStackChangedListener.class new file mode 100644 index 0000000000000000000000000000000000000000..9485a1abd677e010d5bc719d6352f5f76dd7c228 GIT binary patch literal 300 zcma)%!D<3g3`K9W&Qz;V#FgtJcGCyaA5cLkw73x5$C)sW9p4P^J^eTret;iUj4msJ zo0~wAdrwY(ha-RyIx%X5G27IYd20Nws!A8k{?l+(nVI8kD>nSFpF literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManager.class new file mode 100644 index 0000000000000000000000000000000000000000..a836c0e6e39684d83bc26a17234aa865e099bd36 GIT binary patch literal 2175 zcma)8ZEqVz5Pmjsa<$_&ZAwF9C{4jFP6|1o4KHoyTijMRRp)_2Qwi@kTc z+l%OTeh>%=BtGy1_)&2hnp-$18Y0I3zRgsTiC z@w0FfE%t@-r1FPMlRnY)f`a%_D(@sa^|uZgEmxe0QIP9bMl}z(&#+k;a;mK(GFqJm zs~84hox4A^H4O~chNn)yFFZ+nP{?E8oiyp=Hz>ThienBKN%Li2=u<=6N=I)S0a0w& zpaQ#kX1hjv52hd_E9~+pIMH;2d)}TpU2eRldKX?x##$&5G3-oRapm(-swoGnk?03U z;`~z#3t^&9a?RijEC;b&Pn6da)wB7VRM5uw0ueVr-klD4n#x#-`H?t5cFgT}1(iu! z4toPL=d_#2#aC_g<>p8Q43rCz>L5BN^%-$_S(NeX4f-LnO6` zsxQydn5Jk+sI=oWMK|$Vflu9o?o6)oVy%07F>GTSjYir>NLv2c||GN{V^EY$1sF#{o1}m7uJk2b6b7pV>*XTFB zE;KICicOM{oLm1B#ox@4OEjhmpd2mISUf&}%eaE{@uU7stCSg%vjmrZmg$@7yi0Nv z_77bDl@@0(fc<4GYzglf`1f(c$PaMS$W`(+HG3=DU&V*n{G)8YoXu|=c?TaGS;3l- z>$q#=Cz<>d8)k0fGb2Bze*h`|J=`Zh^Vr0f6i6DxJ(7l-((m|cz)gXI0eeh3yCZ>o hi!BrALo+_YcO*;1Pz?=i6Yvg!?at@nkbF9y{|^kbRl@)P literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c397bf4cc1b771dfda987b70c6f7346a4b07172c GIT binary patch literal 706 zcmb7CT}#|R6g_vdH72Gt-TGPE>cc+RZ85b76)J*=g0O0-vVw23$*_)OCt;F^KSj_# zQP39p;1BRe74PVR#U~xO+}tyB?mcrRH~;=#1Ne$L7d66Xp%as-Br2*r&rBJeEJY&E zqfH}veW}ZBp+!%ct$v<17hTi|;juUoQ7UvV+U*|8xO6c@Xgr`lE3HL0m4u=4NEOX5 zJf;2gG2fZDqO>Yk3DNv>h#xzI`g)c~4}_NiTnzhgFdD!^NO0!ufzh_oa;NHdrP;q% z*=T36NISwPTMxjxl}=cA#{A|YOLt7AeN1B7#T23S^lJxriy8J&p33-#)QQr)wYXH7 zW)-abkl^oSm5Jr1veu40dY}dCKi_Uc$7xnDd0Uo8SwaZ5w3cQ)6-6Nn%&{{L#|uyx zT7&pksBw7k86DxTWv(saw?17VX#K&fUw3C-TkLL!*>r{m*8y`Z`UYd13F8O{UA}R) rdtU1j!Ea0)JZeJc7^aK=ns|dI4&E`XhWGfuxz0`kvm92QZOH2u3s$9k literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$2.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$2.class new file mode 100644 index 0000000000000000000000000000000000000000..b51bb622e917cd0b6ba39db7e8b469a234fcf769 GIT binary patch literal 1126 zcmb7DU2hUW6g?NPD|EGh*lJO$7Aqf>t>{A&8WU}7B%zv!sflj`Oz75ScC!p5{wAY| zNv+Wbe}F&Ac&A_>5E8n{?Cd=|=bU?I?)>@t>o+(wwuNekzT0+s{UGo|?F^ne zA_$y=P;|Od=|iDJM~1a-;N>b7Vua+07zoD`s^h$Ap2(KAutZ3Y(YJl2MAMUmC4KDn zay#r&U)-k3yggUB`WeB=UxZjVBEaLQn``xAt z-wm@&*Zr38jzs91cm&2w>V)zI{BspfJsS2^9Ba5~;Rd0&c-c1AktM{t&s*9ZxcU=e zZt;!bS^ZyGUB+!}Shz#jnqxS{uyGgn2$_!5HKk>!gtsp|uPIs|x#+!oVP4r&I=LBk zHGxe$u#h9{E|$xzhK(&eBqTVySFGX5kgz(DlizbjIJ>Q(V55iEBY;}okuaf@(<`xJ?uA^(0#mcC$} lzD~$yN3v0Dvrq(&Q06(tTkqg8f2A2S7UtRHR;&%25Di0D@;eNP zvfq?RFidh-7&WVF97&|i>N>|5cnWdc;26g=Lp*1KCaSKI?>g@ODJ# z8o#%hFdbo7xlzcQTLquPlC{@*N( z;Q=06SYTKPkDT5E#8i#kJ3 zmHa1Stofa=Avay~CNcvrYsu)F^z%kFJU=3RZ%MuDH#yeuf`Rvwn{?0MF!JLSrDRz4 zL=;JC_2f_kF-PK!)3}0oI&E|fq-~?>V@sN*KZO{Laa^Ta6SUeOKS4HAC>|hPSUiAT zm^mQ#JEp!J-@Zw6>Ntub*e~27pHno&;5P1%WthQq4{w{e&DnfmpWtZhVj_*iCPfl!F!62Lj%9H>yV;#K@n@L; zMj!kEJ{bK&#yhlzri27GxjS=b=A8R6XMXKmW67DzT0%7P7wH^cDhAJ z1c9?1idI`Hy(5%p$*|H6yj;;joFR1}y29~iMl5l#`L}$ z_kDh2nw6W2^RrZ_mJ8De<@ny9);zUj2R zMXEFwc2oj$n743;!M=ExI2Lf1n$v#S&~De&pBc_=Nv(Ia|4)|2k;9^e`wWZc1RO$e zJV2g$)RMZQv<#K-%EI&NqVb7}-pm)yD|?71cLrTb!p5?NC5DZQ<#LvT;~`cUl9b(R z;_zh1Fg1{qA36PXiZ+K;jy0?^qys=7pIueko@ z-4~dTK5VPNKkKq^vMt+)X@)*wh rA#(N`^X$(6`9hyOhDSsY literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$5.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerImpl$5.class new file mode 100644 index 0000000000000000000000000000000000000000..88ac3ad11c5c8a9d3f3f0ef9d7f526fa71fa8f30 GIT binary patch literal 1417 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

v*A@YXUt%$H`f`KhAq4%0OpoF1%ET_Pi9PrdcA@ z*aC}ArO!0Z6!83hq)Tx;itV;pNR96i!uv#L(-9rjHWd6CT4**18{YusZ56g$O?~x1 z9Hn}j@GQ#C$T03a@0r5UgV{m~KSHEbDKvdMKM;Yd_i@*rvtUJyFg1q|PWGxkqR54P4Ia*xJyguqJ`2F-i~w z`g&NPjDAGQL!q|x@mQ8U7Pk>O7K(>v=2!@=rt)uz7CxIZ?PW%N57A(Ah5TQ8Ko{Y) zS&fP-&m{O|pGL2d1wc^IV%{m_l^)-x$L$q8p?WCl!rq2sYm~Y$#6RW7*?O#3(0pJy4lO^$NEp@9-lWSs(Tz7n&)nw0r~_A=M*xQ=J(*u=7}50t1kU$$JJl zl3mGhiP+Vibd!Un69ad(&yg4uceb4fKAdf^+K|KtP+7fr11&LEpw8O`>e?Ao(bF_~ z97B=pZW^IZ+#~3<2Rsc(0o9ft_VQt2avAuK%y7ei84;57{wLv_Cm7kQz+G5M49$d>SHgX zJo{7{W-q5wdj*|hp9Z_S5_WYJRokc2nf7XGu+N}Pb|sx>uc0gLD!SILrt5LN8DsCU zH_)SYE&arEc%+u~;XVsX2DiFm-iRP3`a6Nl{Yh~L?li;wLqM4NrNRQC5|ihZ%nwy%+S z_O-IezD|y{ua~9vc6qYBLzde&z;^DCHTF$1Zr?07+qcM__O0?>^gC$ZCZDu-%V+Jo z`Q#)OWcu3wx|-U^9*!dme_3N5hGDi2t?MG6QiH zGSBGZ;@Dd+lc)Pm^a`xZ*$~vTa$OU`pnt#tIQ5Bw!o75D!k0JiLEHPOr+t8W+m9ys z>)8RBk=tI5h&oJt^u#(V!W7UrtO5>@&Gk}O^2ABSWcFi_@5jxg97u8ji2v;m`m}I{ zDcCLfnQLY!Ky0s9Cg$+~{0ZiHiqh<-ljd^6xlZqHE~~4#4q+}t1@_OnoNIM=b2(kj z^&IAU9&^3WcUH&>*qxn9Oxzr?U4io!zS{m0X6Jfm+wT)HXbu$ZKagYpkzD&d>SwIbVGxB z9slMuXb5R=Em+0@HrG0UWd)qJ?awSTX~}+5>crsqI|IkhZVwEQV*ug-v7GLqw&Ui78R)Hb_s&u?vC8CjRaMH^^6_(#iAV zf=W>Ip4~4q$klv;*0NK!{zojn(WhKrTFM@t3Y-{)FZ*!I( z<*O?V2P}#P8y&Ua&z&(>EV>wF70eYo+`zn%$6zGu({M`t3SY?KrJ|;peaQjO(l`^3 zoyat3Zh*2~tS|AHNUs7CK7d@Pa8|>jHiyqyCNKk&zEy&qeQo%ci!1Xli?85cnx34a zp*ENDaSV?#lzuvoY3!wM%(=cZ95fz*++qQeWrg_Sgd%L6BdORKMN`pM?u<2b^A1oJ zhICu#(@mmYg{dV0{R~47g|EXp*3iSl9_NS1!wE6Q7t_o26+VVfVia4yxgLI{Z2eAP zNR!HG1|iP~;mk!+61ero1*rAFi{kows6Em5wX+F_aDo#cXU^xG@#HusLU<-X%_hJEQSJCp2aPjZ&a73uxf$v79+H)+xjHbCl9_$EzXrZ2Zg+jhP`D z6GJreI-@bnN8@^wTzOkktB*#hhsIP!gSV$-rsR8Q^zoR2sKu1VGE;W6COlKTM7#vdc&H5G}hwE@<|80Vr z)c;;wk2g|**LHCoh+|h{zloyUXLzrugb7dYl_79(dS$3dxgDiw6;$MO8seM*-?Nem zohlmbRD%U;0e+1E-8*xeU@FnsiyN;|jshrH{ZsgqcZjfUg}`mg5P|tnZ*tQ-yo}|9o(ez4Nils4102tYJ1Y(0=PE;?#U-2QX1JSbw956AdA(4e*Et;??QL`*Jr$|{G)$=3%-{4 WUX4F+s_#PyT#9}`=Ie*-l>Z0rzant} literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerState$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentManagerState$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2d09bff6562035c222e6a9d9dd32ef1653397df5 GIT binary patch literal 1204 zcmb7DTW=CU6#h=RY(W%CTeM=mV#`I{RDChjCY4A+Le&J*#Q5R>BV7WsWOk|1U!^Z? zqR}7Vk20R&vaN^-ZZdo3%$)O`?_B2RudhD&w__npNOi@ruzNyv?3c~1Z21)Ee_Zpof#_GGT2 zrSM%%i0(Sd@%IR!eBqD~uDER(M+g@Zu&_)>)*U5Z4Es%~UmH(Cy6(0_?@(yR=##^+ zf8=-syFLxK5brXxZW$)Bs@?vW9^qL&KnX~f3&Gg}$Yl$wgwlU-i6f15lX8ZTnH!&r zv*akkYCz5Bpk+kA$6kt?)K5T7)f^-E%&1X{kooo*TVB+uU*-gc}K@uwodS zkaJCLC$NF5gm}Xpa`&r_Y2n(;7(FnqgjmDrDB%w^o4orQF32fJ{QM~G2G@(EyvMCi zK3A=t>p7}(ApIk^O-R&~lDg6po+mvEMZ)^DhkwK*Sd#(9O)f)-SA-vrSv<6?#d!CK zC7ILWDdJyvvxEfy<19gKg!%F!>xr=uE+NSp4=YvWegHE zPV{~RkQp0I0N5OtafR>66n+Brgr$LsWWOUl3)4LZ6A54<$l@9(wa<(;Coo$KVql`h z(h085;INI!hws^EV^kQE#hFj`1h@X_!}Yi`^3LJzNN!=9WtiUukmr?VDq5|8fHm4gz3g7=YP;KP7mWYOFFwFT z6XR!plyUC1yA%QvH)-$P*|}%VoSC`5|9t-m-~#3~LN3 zFfJZS(19VQ;JvXL9RI(PAq*zM1EG}JWGRZ{7}jutFuqGdesN+riPIWR5&8o65KTt{ zNp3Pj)kZFTs7o{Fy5a+2a+}yHt+0&Aa&c>GW;OIEiO%TYor-%-M+WB!z0Cjx+iSsh zCX(fX^1YxVidYnrDy2(=lL5yq_1@fY8gzB|s*XL-xpOU>(7%mXoSG>chHEX$ykmPj zU|a@n3vTqi?_G;icADcu7}_S`Y#~`vY24D0!)>m4^GuseqirJ+s;YDfj^5F67c)V) z4FS3mWd`TgV16E<>vdIBm>a1PTy$1=q-QKO(F0pE^4V(U1)dvxKog zxJ@*Ia`DyBnm?Rp;X3%&g-*VhxKR8LRRn)!J$XH(dYpas@jin6?AwDr#M#o%mWymt z&z>I`c=ip0UvTIXzeX^^|Gf+jGNF-y7(K+O|AkFzl0pE^lpY#rmjkXl1Jm0ri$HB2b$Mc;aP4OcdT401A{ zMGmsWll=t4R6>HD`T+-C{)GN7r#vZ6?-{SL+pJ*q|9#)u9)N(o6KwE2b%Y_@hmTkm3mL`4kxz c_fg;kB6#2vdx#>haejZqDbICB`9AZXzon9ct^fc4 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentPagerAdapter.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentPagerAdapter.class new file mode 100644 index 0000000000000000000000000000000000000000..d88d08a5ea465512456049324628525b1a7d8d92 GIT binary patch literal 4176 zcmbVPYjYb{8Geqnwrpi{bCWc(9g_wpSh5{aNT_QEH?b49qK@O%j@%eZyOxgSjip_6 zwQ_7qDHKY}9SVV#Yq_w%IbkAHh){RWbu!@;^*Dri1O?IM7;J|j~ z1lrGEn7m9iVkt(*5ZG642wpTSg-l>@W*b0J27x3E?=4T&oCU|Qsz%;5ZA)Od)!~S= zLSCLRs%`^x?&N3LWRrLp#?T#=5n@{;mh^JdX9+?pc=&VHEenN~Q)Cz|Hx?5gRb z7g>S6@}-J;s$P^NLC7*9BfHHB2UX_FcHUR1@<>AH#zBe0B2ct%C`kC=-C9r zI;mp{=T-F?YqF93vqstTV|EL@pvV=yX&n#ZA(~k+twQ6}Dqv92H98WS&!gTjz%jzr0s_WRBewn1g7&LQlJR9*uP$j9H@@YYb z^g>vWeh52kuZXsem*9xN9@|n@=4FY6CK-i8j6#SgqIwPGI7$M&;nxpzaUB+H#*-z% zF~w2~WdltKtl=ruCfO$rM)SI9iB4w?nAKIk`zTH|9qX#pI`Ve8Y`UsmHgs&_O9DM| zL*{F)oRe0812YnA_Dc5Qr8vIax&nf!mn~OHU3eN_(eW(4%BEI6$I-WLx|<&|Ip_VW zKtpnT7oNj6;`sW`&FYR5I-XZUJr*?E8pVw#$eQ`Z~3g zV7`A#$G7nve+DQ;%I{&#h8e{C+O2@D98`TUe6=oN24{CPqU}?M) zzvb1-Q~i5&@DCi-(fn?x-cf-v`I?T`@hA2f*Y@S_tfD{*L8(}&vD40ZAvXjP^LCBF znKso0BH5TA(aXR|1zo#`9a!BDk+%>gQ;>?Iw<;hi+ov9q;G~{`L?C zkb;H*bm2ISo}iI5l?~w&{Bp=wgh9%vza+oyfzWtQ!!V!eX`BqqP6TE<(y^P!gfqgKvIOx!UL9 zhjWfR9wCo;hH(M?SR}s3B6w3xys0MMRDf3{!wQPjcbM1a5N`}ZCEzN|0OdbOM5Ezs zFM%9;71}#okKSg&ajE0#ZR`(r#H{>1%yo9eL;fDtu8iD5MI~jgN=m-<62@ndW;KAe zJL#=1Ji#P=l8Bd?YI#Pgz-UO`^Hvy!WwO29t|R)a)bDiM~Ls6cp-3hj`&pP*sGja$BRR+ zpbsS+|=>MJK;SaacB?T@EW7)Y;SU>D81#;x$!?9N&qPU literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentState$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentState$1.class new file mode 100644 index 0000000000000000000000000000000000000000..25f3a6807c5d07edce72bf13404d5d881880581d GIT binary patch literal 1155 zcma)5TW=Ck5dMbS7TgM@7OhyXNVym{US15fNkb$d!D@nO()e_M6S@uTlCw*Vz8W9= zH~P{h8vOzODB~P1OGPBz&&6)l6``b?dkMY1jh>#afN4a*#@`i(ft93t#3Q8Hf;4$Kpg-J>hh%SFK~&_6@`cTT=wrvtA3;mOatx$y`-Q z;k$|u+p!(n-z9_##REd5>ULxTVO%m{V1ItN=q19ywnS~X(4czJ~&@#y^IO5qKxP4S7Y%eU^n7_bE0)$&8QdrYeb*+UV zcTH^KIw8??hkU~|TVK=abVeTP974QlcOBsm75fhV#R*gdQqRxHPT*cDa+hT$UpVca z>)B5CrSy;74#BKDj#Sm2@I2`mC=oWM_w-jWf-xCO+-BinUQzxR^x{$EQ=E5C*pmKQ zIz!?sZ$dEnonQ-mM1-BIyfeo^xQry9c-pYWZw>IAfpu*BJJN^cGhF$?hcQTOl=Nu? zkQoO}05}|1agF_?TRnk###Tc`vp$PfLaYTxtC%x7?g}ajdm1^d+OJ>`2WAA+6J6N@;h*FRe%rRfX>9HI9z1c*U|!AG+OnYt=5U3s#IY4DPM(y9q$FlFH4Ek1U*; zQ`lYCUI#}{&bO_g;#0R{-YI!ju;SC%6SvkLs=vO;(Iz+9VOrfhR46;16AUY~_Vz6j zpj@TMwCz^dm&AQ5BR!9#@c{N}Jc#?4nIU7V11t}XyKxVZo+k9OEAEo*FGLC6HeD%L z3zu#Otml}y?twH#R#)$9KgdVWavesjLa*I zM{tn%bAME5+t+Q6OHJZ9q>;kr4jjgj6dq%uZi9+O2hy_fi0sK~bV3W86?Rx-OZ0YF z*b$Ab5j!I6n8qD)l){*>Cp5aEy(fe{sc~n-o)mUQV;j0fd4@>~E;uaJeYe9f$~*PX zvq=?pG(fLcoq>4)iz$3X;m#!3`fH6R1-LZJvKXP1#sZ$!ID==1r-<_&8l5rXmgA<9SS*e0=vHWPyr#~JMg%K%3xgpEinY27KZUQY2R(vDqY7fWwHjA@Vr^G%bIHfX`WD6GRgKHwm`q#MBx;3w z)?hE=I(b6}4&!+Z8!s>o4HOHUo*aZ3nWFZUAiL(oxJx!j<^O{1VOVnH%NnoXRkkvN zi^qCfZ@zC)YW#JLuS3gNowKW)f_72D`liOW@NI?d1edjD`<_+KS>^H)%YscXv?jo& z%r+&d=Z4(`;Z1xuh3~L^lLGyJZD@QCZ}HxtcS$ADs{=RpD$$y;JgdZ8%3Us-Vex&9 zAK)EcpS^p(IP>C8* z;qHbL_34mh;-u?;rtuzr&a2q$iRwh!{>I{o^na=GD^mnUpJ@>zzt;E-ew!FcX2<%O z6^{;canWTq$)@vVt3<%l^OY5TR7^PXO|d1x<$&A+Oite8_kd|XyPCqE74A>cU5`aB zr{wyTn>xCP*`7C44Ibv8XyxA~$jIh(!Ox^Fxd#m81z;#Azo8uYhH};$${}wkr@NsX z>!grDXej3o=}x&$dB#qzTd)i5+aNk!`^j`P@q9 zz)nixbsqf?_L(=})(7#W*uY2B6%(iXKSgi^1dN6_vM)4SOl#Jm7 z#&HT0#>*X%PvlQ?FTKN;2?js&==ogax!MzZ?k1kk8@FqC%D7GX9#U-|psm%oZ{&2} zP`Y0O_38dPJ%+K4XE-&SWjHZCCt&#VhII?RHWq@w0{o9m4ZsK5%^G_Q=ITZ)%lHtvl|I%)W-Q3tr0pZ zdA`>F2};+oS;)tH%w9*Akb%$ODAZ8t=W0cPvO$sm16MTf`Bk_$n9ledsDf}2ep@bc) zc2Zl~(ivbtgEjnAD3SYx(4nMcWByo7M`Jo3>rXc6O*QeeHM}qO&XG1sHtNJx4v@QxiSp2*ocE)ITY%9R1&_nay%rf|p5ewGz0 z#oEeJH87%=~cKauX@$scgEe%Ri@|1_fCo6Ou_+B*IV2XK$4 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentStatePagerAdapter.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/FragmentStatePagerAdapter.class new file mode 100644 index 0000000000000000000000000000000000000000..c87a5a8dc32e25a5012d2c9eaa4f6a6129fc8594 GIT binary patch literal 5999 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 dcqm3;&I1D|z~Alv|G+@8|$7?EW zx7CVI4;U? zRRYUh^#4+M_;~Jlaf(CJzWK)h=GyBF3b)O@J!>tctaN z4KRey-GkynKbu$&G187w?PoBk%f^vVe= zD+888CbQ);YL|R`a3&WrnM(ZZr6%KpJ}-)-)V9V=an2=X_$s#NFhrj8-gpyug3TY z@@p}kL7t8A>&QoAJcoQN#>bIQ#P|)El9LkhxE3&?ibxQL7r(*O*YF54xXJ?o%)m`t zGhGF^1-C&?`a5tp!r2JtLY&8GE#>pj<@exz$R9-bFv3R>DiJQgVyO2RmO^|2%OR=} ouE5ifuSR;$U@he9k$fGVhkPUA8xem2FT?#;5;2D&u0yc-2eyLKssI20 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/HCSparseArray.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/HCSparseArray.class new file mode 100644 index 0000000000000000000000000000000000000000..17f7dda806088722af7f0eec323a39bccc9b1776 GIT binary patch literal 4985 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment$1.class new file mode 100644 index 0000000000000000000000000000000000000000..52f16c749d5a7af40803fcae7e8e7e5703c6d30e GIT binary patch literal 775 zcma)4TTc^F5dNkutX)^xE?U4FDn)8dTq``7V2p-HVp26h)A!TeV>x7dw%JShT_&gr z5BvaslyRn1Av|@H$?SYH^Udx2{&RW;;3b|os1P=ljkDCmVP1~MX;y@joluR(VbA2n zex`;aZHrddL5<)asfh{`WryMC!I6#%2aAN@0zD|LRf9wm7K=lZw_Y%PZw~%lPIzss zDc%s;?YT0Z_6fDUG}d(xZg_BT%|#VU9_sK3)wTpI^^Db@%F#e)U(fprdTFGRzRHZ) zGq5Jj61L_k-0E_()vUC2tYFQ-Dq&-e2|e7wUBbdh)=F6WU+UPzLtRX_-8cGp*TsFT zJ9t1?`A2&t#KS{8A~e6HQJKpWlJ{<+OmaSA^J0M$_JmVf*@pWiEwf1P8#z$p@_nDn z33*-bZIq@5{#d8C6*7a2dVMf3MgU#O*x$ z0k885H@{C~8iGwdlHEnXw#PYwF5?z!!fp67mbV-!zMyjg?*z@6`iXm2*|yQZ&Ly^B Z##Y5+&aYqtE!H(Y6|l)7eF`&we*r7ewl4qx literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment$2.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/ListFragment$2.class new file mode 100644 index 0000000000000000000000000000000000000000..3248fbd2bca496d28c24397d1898ca69712ce43b GIT binary patch literal 1262 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManager$LoaderCallbacks.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManager$LoaderCallbacks.class new file mode 100644 index 0000000000000000000000000000000000000000..6b2567c612634c141cae9e6ca6ce3570a2c080c7 GIT binary patch literal 718 zcmbVK+fKqz5S#_2g51Q*7Z3w6p^4!^E#W~32?@qTjPHkbgT>~wIc@nkAN&A6%6LkF zAiOj_&Sqz4cW1tTKED9m;>tjd&=t~AzU!D_90b0K%w^XUL10dN;jnrVQp{O3Q#25s zHxu?pXyAxYUx=kJJt61j^K8L(M5y|5pjbql_7m<~5ygrL{r}GCy$-Fu9;P=-b{e_T4d2-z+_f?+G1))SYQGUW8K|kQ7EcJ3 zRGifdhpgXpongR=c$1+qRZ3(^Q$JQVk6cfGtntUdPI3sL)f+w>-qb%V5z1pJSq(f9 zhOGU*AT&2d?wEFv6hdt;D+K}}uM-F4b!v`L(Adx@hZBv9C~fhn#${BtxT<-zRcC$8 PI736@gh4pRWuf>Bocz*R literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManager.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManager.class new file mode 100644 index 0000000000000000000000000000000000000000..57cf523b7ecd1ddbe38407722b4b109b7f77541e GIT binary patch literal 1192 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 L?Kvt33XA>^V5=^O literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManagerImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/LoaderManagerImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b5bea027b9b51ad86726ff53a606fe9217c25139 GIT binary patch literal 9984 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/NoSaveStateFrameLayout.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/app/NoSaveStateFrameLayout.class new file mode 100644 index 0000000000000000000000000000000000000000..d62e1f0d29086b2c38d30b1c24109f588a75cdfd GIT binary patch literal 1836 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 RM!+|zw#EK0e*vD!s4D;f literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/AsyncTaskLoader$LoadTask.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/content/AsyncTaskLoader$LoadTask.class new file mode 100644 index 0000000000000000000000000000000000000000..4002e2e74bc581f2c6eaf260e506389d42657207 GIT binary patch literal 2161 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompat$CompatCreator.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompat$CompatCreator.class new file mode 100644 index 0000000000000000000000000000000000000000..826fc72cd64f74da8fa43158628f3f1704f958cd GIT binary patch literal 1594 zcmbW1TW=CU6vzJqlx<<#B3i80+FG&YV!K+gF;aF%<15E1HWtYq@HT6?z zqA~Ts58#I~o?+Q7l%_E}u)~=%=ltf}=Fi_>zX9xGPeX*E#O;oB%#Pvqdp$>b#!1O= zT;na5ZDH}2C8|!h$Gxn-RHfjaBQ?YrQpfy+8y2^Zj5n=g(e^aN8CC;-V@|R|Lxx1R z$}OwK+n-#9XZ7Ip)%2ltXjx{MJ2a1M?)9Z$crm4${YIl)Az$%*(>A>dLpe94r*gi@ z@N!yf{~pRktmK&Bm~Gp1`ns%K7@m zKBN0BUwV?tnZz3IX;`P&r)w=8E7)MDTm~4qN!8-6TX%Rz$jfgScbz_s5LGVB(s@h_ zv$pvBN=kmpkjd5ZA4XjJ!$d)9N->Nnuj2tWsX<)x3pr&qnxw-4;lNZ~uyk=?cU0CG z>ido7lfEmHTa&j`?G(&yP&B<}+d>Y47p{iK1P;<1M(4Ms7CsdvhRxv6)nm>uKlaRE zojN~CzZv?a)Bw;rM~_zoYDO51h))0gop~&frbTju)28O*1W_5a$eob8I^e!1--@djz9U^^XSf^1SCV~l zoNR#H2vHA-I^8BqdPUR+=afznnJRh6*&1-(k*qjL#aTH+E;51H9>F9-OcDhY$1qB# fFi||DZv@-JMDD;KIZZn=c!b@!dVZeZDQ5ox?PQfN literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompat.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompat.class new file mode 100644 index 0000000000000000000000000000000000000000..4ec17250085309ae72c3935c2c423d1a8b7a8f56 GIT binary patch literal 1297 zcmbVMU2hUW6g`(x7AO>KEw)(HDpo-4YVCt@DG#DXBBiEFFnuz^vZ-5_U9!8>@N@hJ z>WfAbe}F&Aco&woG)4&z^KobHoO@@^x%2Dy_n!c^@km05uqmvLV;ddW?e}`NI98P;M zI8ha**%sP+S1F!GoVav8aO6NS)i|<**LOJgLAm*)e(@2M%B<1L&8AZMUkW3q7?!aj z;WA-${6w7a)4pML@~!6wYHh!fKn7O`lKSk`+ghVZpjsSjxGEt_*d3qxH_gGdU)q*F z(Clt|?_gW?`t1bPks>S@mg@=2GlZv0xJKBS4mCg0PyilB4mW&xY!H-LpHA`B7Goie zcqBYNC3318o+*HknN;MUH&*5DjF=h(|T8HSI#I80#;QDhlw{TzA*H*t$S^4v!8{FU2mZE|DuBnP|0 d(+~PX42i$N=pUXYWF`Or literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorCallbacks.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorCallbacks.class new file mode 100644 index 0000000000000000000000000000000000000000..ce10a0a006441475d130173b3bdac6d80f5ebc59 GIT binary patch literal 442 zcmb7A%}T>S7@V!zwDtGo8wlye1rZNM3KA#?0fpw~=}WSd)NM9=yQ%nU9(({Fs<>&j z3KhiT%s1Z*Gw;jSHvktn4$u*}qN-q17Sc9#ZP>}hr8HJP5a&u$rd4d_HMy7-Im0n& zol*W|1MCW%%xFPUQ#F?V>a`(g}^9GzA`q(QS$v7YqB;mR49&yKlrs} zB+#Ff(~4ZfNq@{|%9j9vXmauzx4C!`-8%BdSKROJLtHH+qI!(B<#E{z84@~ZMZNcztM3~K5 ztyCtgWe=txLN%nQ%Yol;6_%!iiQ}rkHSpN=^5(9Creyt!^UVLQ!$4{hVn3i$Vnn1AAZ7^ zZc_ciG@Zu7pq&SsVj`&;-gRP_`Nt6$#!T^P+qU^J!*p&p|1Pr7zp@0QNJlS8D=Kox zllC0_GwF%#(k0!uy3`MLbSbcfv%MiIlT}#~hPRuwr-MA@!KuMCNYxJM6oEL@UDKrY zAv=k16s$8$1?3Dg*}DjlO7z+d=IQFh>A65pR^A{QQ`8M(NFzbt8L0H_&s@Yfc^YKL zXiOJ=V4_g`j_g;m;1g>T3f*$HmO@r7)kIZ1nfr3j-MGOD;u9tO#%dh4W5GD@Dskmrua^PUi8 z6h6<&P@bH}Gw-h(;E^nMu}rwb7)eSYW5Hv5L$-`8BO{wTK`}NE*h(a@Oh}l)J*@Tx cCVeunI5c|4aKBf&2lRWBsh5R*h)2oPU(}AbtN;K2 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorHoneycombMR2Stub.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/os/ParcelableCompatCreatorHoneycombMR2Stub.class new file mode 100644 index 0000000000000000000000000000000000000000..d6e1485d3b59cb572a40376e96e01f51d94542ac GIT binary patch literal 1106 zcmbtT%Wl&^6g@WyaqR|L0uAL+punPKfu)KC;4~~O5J=%65>@JQ?2O73XC|^ImGW1x zLIQ~o;G+MmZSn4V*-;Rfg%=@kgq1iR5$aX}ooIP{a>_=4)o_GJN$%wG1 zbYX?IN?5M7yYX*;vBT7V{2+^AZFXx?@sH+i3jT5?Btazx%=Y3-PGLhH0TCZj`zY|n{V z(nJV)X3R=|shkGa&#L~U+#k6?5*n|ymU*0sqL77$JA}1En$MMlhjqfrxhVv1rW@P^ ze--|fK!q275w<>biai)J_Cll&3)gi`@aE@X*^K? literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/util/DebugUtils.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/util/DebugUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..dd0c34dd97cbc8f1d49656ee48518cd78a09d191 GIT binary patch literal 1255 zcmah|%Tg0T6g^D>1Ct4a@P5ln@*;zX&mbs4B$&V=5VlT|HW?fysmu%o<+te8wVOz} zaH&=PgFj+fmbWudNu(@i(LH@1=bk?I_V?ePzW`W8T0#fIoMskl6}_lhPPJO8+3MMv z>e#xWZu7iTI-);If|nt1qMd1~p_wK1Ab-LOHbd9CZtC_1gC`WuF?f@eBA4MokAhBg zG4!Q%lkYpHd0soz@&;!JrYi-_$Z0iQoUe>tyR2Ib3+eweNf1Qd(T!rZOjMJGW?6?? zi6I_J|4lE^V#(Sy-7Ia1L|#jTbKU4Cx~5|oG6patVUS^@3D6dGBGSFKv*W|3jJ zwUir~2>-K|kYh~2I3^gnOWdW*Fc4}@Y1|_rV+u18rb)LZm4-{fEzC0bDL<>9Rt>(d zosyV?Z6H@vWXxkx!a`faT%Us5SfZO4+$`DUM%PlJXjnl+;7f!rkOf3c!7}0uK9bl@ znMHnn@R}qGrNWdlj}--Xu*%S5IeDugF2fKxZ|Fd`8o-*+@E*ftD0wsDx+^js;E{xf z?ZhuEo1ZFp4C;J9FLKk??TcN_DvMbYHCrmWW0?>PpI}o04Q78+$&_jH60a$EDv0~+ z$}T^5bs;4R1`S~FCKkCW4o&)4i_1;Arp+K*Ej?+)a07|Br!hDzMJ>$QTH#Gbt6q)1 zoUJ&u0^iZax~tFYUR=H~6E$Kpny357>*;Fd#}Cr+WUO{@#zbINi2sD5EwSf1=q0(dbL)m zIIgGfW%Qb7+4`ze+H@_?bVE=DqA!d+L$@5g{!c*NT{lVsU90|qZIny;n&(>OQdXdK zcd=&K1=AJiZ#r)rF|1|IDqG&XKrG%Al}&80M$Rdi5h!TW5Jpr$i6=Hf=n&}rvuXo1 zf_8Mt;ET+TuOv3YAiRbUTBX&iA&3@%_EoEFKB?_)o9?=?ZJV+WCvVsrhHFW`@l*A7 ztg681>OVDNH;O0q2vs@4ui02Yb(wqyZY}bkcfvp@GKS<{9~ykBy4o zo2)jeVG0?h+Ge@r?fB}h$b)GOcQC^-dQN?$0^RXu9@z-)VlD*s-f=3>>E>v-2M$)S zhw;A*x2dOW!mqrb;QrlL({|7Kd zfXrV3Mljl7a7;C%3Tb6p-N#sJAf`UgOb27Zj>tPiB&~h4B|oA&7CgkY%{Quuse|u- zev@Ps_5=*^B7w`%f*I19MT{FTz)_F!pN<8;{(Qa0nHFipk?@;JQ@NDiZkoEKh^g>< zla@-fK1>iJNEtv+J>fk)K}>u{IKUiUrA8MPv!p~x$@CDn-eQDSPu;tHjM+_TDvi@a j+}}LsU!Px&lV2j&W%7FTn`X%dXUTvyB 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 E0MquH9RL6T literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ActionMode.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ActionMode.class new file mode 100644 index 0000000000000000000000000000000000000000..a3cc301437d706adacd051b8bfbbd0deb0afd86d GIT binary patch literal 815 zcmah{O>fgc5PjRaaheZO3N6q;X-kk?kg$Zffsl|Tq(~_oQsusOw#^oIUF>!EU7V0O z@B{c!h_|jo0D*GwyqVcIelxrC{m0jD0G{Kqk2QfKX{LFmr(scEU1hlq=P$y!R-eK* ziPf1o$)?JOC$M!P=Q2#CIS=2*7b>v=jaS-e`&wW<9l-bf-<0EHuYinJ4P4 zc8&IyFa69lEYKMmqw*+~MWG5Gj|85sew#rg(=?XJ2P!RG?-1M$ZX3|0$E~3C8HGea z+<5W@&Chh!(4uw6Kp$<|&NYG9g)V$w$8Q)dq{k|IZO0eu!+ngj|HMg}|bjDzY2dQqK# z7ZED0$p}k?ZWVmtgHXnimYJ6V3VlWf_Vm;e2#YH?zqBYh)h#n8m63rHm z7|%e=3QR*>z|_Icz`+1YCF~5GP?`%$bAxFf23{!52c`L;v;deEWPqp_0?|Nog@Gg! Gg9rd|mcRl4 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater$ActionBarMenuState.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater$ActionBarMenuState.class new file mode 100644 index 0000000000000000000000000000000000000000..a48c351000c02c6ac0341c86f0be6c49bfc0f099 GIT binary patch literal 7734 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 YIv5-7TbPbt=eUn1w4agYomJI81^vt!^Z)<= literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater$InflatedOnMenuItemClickListener.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuInflater$InflatedOnMenuItemClickListener.class new file mode 100644 index 0000000000000000000000000000000000000000..85491c3c0b6bf10731091340cf010690c213bf59 GIT binary patch literal 2331 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 G2L2C)jziG^ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuItem$OnMenuItemClickListener.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuItem$OnMenuItemClickListener.class new file mode 100644 index 0000000000000000000000000000000000000000..a43d6306138a1ff8555bf883598a7d708a940dc5 GIT binary patch literal 846 zcmb7C-%k@k5dNk;diJ~uZJ{XsqKF1ca1+x9BZkB@F(Ik)psCTf?R5hS*WG6CTK_3u zc#%XC{{a6e<6P?@eNgmacYf^5H?!Z&_a9%r0eFH<9|giwX$H>ffk?)qk#(tDF1iu3{yZiQGvl^N7LIKt{h=kpyAf;V>TBK1;dWLEO|KF+2| z2oDU;w-d`GQHhUr!unN=a;-nE$pgYloy9g literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuItem.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MenuItem.class new file mode 100644 index 0000000000000000000000000000000000000000..996d4ee3e4674ef2c5a534dd2f06cae51274f0fb GIT binary patch literal 1468 zcmb7E+iuf95S?uUZqkHa)0T1zv?(r^8VV9f<;60oYAKDSI!b^CqK&gk+`8-FOY(0# z@Bw@jV%D+cBqEY|u*YX-&zZBc-u?aO=Pv*_g?ADx5vWk!^IW^9_~CHqdVw-}uZ(Oq zRxTM2^?=<lR<#*mjJPBQtg?nc>pj{T&7OHxI6$S*VvX;q95&7DHSvR!nFhTp4 ziB?ExtcSJ{)VL5pAR*8#mlL>18`Ssca9~@$((~w8OjJI{A7`1$<%K8@7{`@;N@cN( z7*i&xY*L#j)d+8yH{Gp$95i_H-)oL--PCO#wV6lYds=XQ9}>pl0&+G>t5`kVxg%N2 zwsk8=YubU>Htb1yOtk^^O!gyW++x`bY$Qr}LVJw+$)>h!-;REZg6W2y#m;R}tdy+! zMARfu)H(J^bExk#UxK#;J|^evfBQvXcR?rd&LOaj&mG9YeUM-Uzw>y~m!N=nbqW^| zm!|MN#A{P{9k%d#*nrLGn%IKvIF_Th1G`b&LzcKk_TfPkAHt(3K91v)I9A|kG+v2y up20zc4`W^xjw1XV<60BwmuV1eMN2vr0kSqc{k6t$0=cqv;sYs+>5ABB*3 z0f`4bfR94VI(B5DM#;loW_ISx*)#L!@2}qg9>cLE`;Of|YJ2(-;)IyEnV0HY{ zu^DR5q>|}#hDzJ%GgLdFFY2h^j13EG3>!VE#GCPGAmR^v5D11wFC6lq&ts|W+*wUO z$%LWXTb?vP-Vc2TVz~?pG_Z*MG6k1P)&BbvH>roEsGcZcB zk40M4A(ve|Pit1`^>A6~ZXMTg)4~mgX7T-bhBlhm%0%vx$b@>NlWy7A*6#ZIa2yXs zS89E)lv*_%j)%JW#LZJm#GQaAiAXH$F*rrJrSnCqEY|z~nx)Z03&fe0Nkgp{jRaZi zbaUxs+I#OO>fh;Nz^1*HIrngu?)EeQ=deK*^%NIq*U1NTR_HX0uX-lb#iXz{U6x;Hb?JK3DBI;GiUTn6oA{O0=DJ> cpRNdK;C4pk4tD5lWD4x!F15qNF50!Ve}~-lWB>pF literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$EclairMotionEventVersionImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$EclairMotionEventVersionImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..5a2624dfdd251c1ad15863b0ae9d4a9be9dbd032 GIT binary patch literal 1199 zcma)4+iuf95IvKN-3CM300l}Y0SY87!V==G6(EHMEW$+sMew+Zm$H?!wrnTxQ3#1A z5D$C+ABC8;Qxu}m`eAoxM`zBQ-7~*_|M&^u9`4vE5xPSAaj1MZ8AnkVr|#swJ5lnZ z`#ellsP`vQr=4&ViF9j!7zh>5zgOCS6)K&|*weoJMA&TorJw)DU9auca2DrnoFlk}RpcTZtYVE& zmBtdn#{b(8mZPaApFkeLIgsg*Oy5XoIM^_3&Ji#dUt!$alituZ1lJsF;wpQ=74J-9 z%fWS%sJ#xy@lbY^v0;72(R_;Tni=7~p4Kw%1R_afVxvuH7yb@H<2YOX?K(4~Xo4q* zSC!}AES?>{Epz1ZNhZ7f4YjWvl;H4gWyw99=Ge&rID-|wvGrKv-4s7&blISH8sAa> z%+YN1!>qcQBc|1cc^wxrMhh2li7VLA#f+Ed89OI3UYRnoLyI&vzszZTQkan~Uc`7~ ep7B{h#u9F3T5jPspY`k?TG(b|s%T-yTKWTW(*&RZ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$MotionEventVersionImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat$MotionEventVersionImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..173f1258eb4464faeedc0cbd57aa53e6f80ad101 GIT binary patch literal 411 zcmah_!Ab)$6r5MrZe6R^i$_l$?8Sh1^CA=r0YyO&J;vr)QntyGq^sZN!4L4G#I$u` z_0r25-sDYYn6K}TPXOmQ%+VoSDXYCRT7*SaIUhxRA!@^K;?_mu>~+mHj@-Ob@ubB( zvJdH1&Z{yexmi66U|y!_I0imWU2^SF?}3ghf&k_A%)8egGwLa~uEw literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompat.class new file mode 100644 index 0000000000000000000000000000000000000000..5db33841cae71ba4cd19e442f836e5a8023ce0e6 GIT binary patch literal 2098 zcma)6S#J|p6#lO5c)UzDlZGTfAds|iXmQyK2}|OIOyjMwW8f*8*tc|GGGon*1L^~B zJi=>V+o!5hRjENLYLWT__)&y&$75$OaY&@h^*Q&P?>p;#_x`{C0bD{=LVzKu8V$?T z8Y#QgY?_vn+PRY2(fHF;!E`j!$nJ2%Nt@eE)sYZl7V9re-+Y@>J7@gs3EyIF@i*!YzioM{mu+ZIN*U zHz}8<$4~W~eLCl6bNk7Mw? zK$xM8a9;pSh_#@%U=k7{q>a+=0AeJ^eX>mQpidqmdDth9kUZ*>6C@w=$zvpc;gb{e zJA!c>C&me4+#pWzcX}6-k>4=#7Sj*k;LK~B`yGRCF-O8zB>YV#LCn)Pfe?MG6!Zqh zaG!R50!h*cm<9R|AuuM^o}K}ZB1I>on}LNlI4^(#E>PH2ww>j+0lvmJbRWe92qzKW zWwI8|(S?8T?I`x1|JeiZ!ews*L~#w*U4ZYp0Jl7VxBy6uJs*kuybm$t_TnWa^NLts z`k>-nC>m=omOErE(v0uo+`@@}u^7ZYR6CttT!`_unFm1*xZ|~e#=j5P@~2?G_5n+K zV6+N-z;Z$S)l;WGJ_AN;)CWxY6m0iUumILv@;nN3o~4nPLJ?)E@ElS6K+#XrxlZR2 Iot1Fp1NVBsQUCw| literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompatEclair.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/MotionEventCompatEclair.class new file mode 100644 index 0000000000000000000000000000000000000000..21a8f5a78f84580d16dfe75b662b2d7c8e4621c7 GIT binary patch literal 896 zcmb7?-)>St5XQd&3WBGFQpJ{*iqKlx3r{p&S>sJp5)#^)*pPa;aMpGk*d>PreJEq% zO`CY(1NczJS^k*j1Z=!GJF~Mhzx{UR{QCXlCxBPjOCd(^g$_ca0)H^<_f2U1(QALC zPB)i)TKVVc3y%<=VWp zV304|3{eJ8jDH94l-!r(eTqGwExE|SEgpPlCx#5K?ig6dLtec}0^4QYrMXdAj=17C zoE>AEJlMQJ?kjtDtBd36!XyKaQQ&h&e!^Vt9`|N0rx@jw7I3zvoD#O@>3RAsqNjWh Tr!t>YjdH60fN; literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/PagerAdapter$DataSetObserver.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/PagerAdapter$DataSetObserver.class new file mode 100644 index 0000000000000000000000000000000000000000..47e863e1cfb6ed84656ab3f5d987c99d270ef031 GIT binary patch literal 269 zcma)%y$ZrW5QOLai$+C#2McXH5MMwP!Ae1}-E0 zzqvoIHvm&~15^}dWMZ2qv3BR8$gS7qOqU5?^p=in=P?zY?Qlt+cI-EiV_UKfP*doq zRFclf9Q7tj`QXLM%_q4yiO;b@bu`{9guDD~54=h;Rv3I&PhKqwowYG+7a2LnE{gF~la_xt*JtZ|0ks`+e}^Cx9u;x4>c;;;!vU$4>i|a#?yR zU7b!>9q~H7!ncLDVDqvPUJIHS61%+0(glb<`tgG1WXyXQM#U5E8AQVMsKnn$S}H2w9e`L;!aSPLuOee_85|9 znPyYDlav!^n=O3h$^F1Fb*AHKKMmUIF@c&#R)S40nCWRGmEO(=d9QqNH0z48%NQ zKzfI!lSdRBw`@Skl(_HbB)5eZbbvaixmc;!*^_KA50anLE$w!ta<=wsW1HEb@fUV0 z7{+60Mz{?Vm}DfY*?rjZsy_QrWI_Qj(MVcfd**x+MiOJcyo!FZX1Ipybn4)b>93PxCj&n>fd_(@L15!LU^3M~25|!x1;1GX8Nw|CGK||s zCXq58BN(lL&5*Q6XIY>0iK8;!7_{EtZ5_=r7`pm9bvANz(`4OOUt+ot38I5uxks!Xu+!F?Pg9)M!6Y?>;tU8Lnp; Z#(mQa3lGTK!Ym$=j8fDI`p<OKD4Z+`04+E?7c{OO7BQQW1wB?oP5wQ-vfrkNz76K7fxxIH}tp zB%~bd^{!^eGrM2kAD;lOaLO@YIG1UtvN#k)mFJl%MSU&mm{!88{3l8)j$H<8DQhVb znMUH-Us6zV>@%EgT7TmictoXJ(i_9fzL;+?f9V_U2IVkJ3MwB-hNRpeOBo*QZC9jZ zzKDZDgi5ZYpOCmS59fbsqg*r3Y_|_=x)tyemkBXA_Pld^yO7GG_lnYhdi~n@dDVkt zxas_~lWMBHh`83Z9?8hdDizRu+^8EHgO`m)y$6OJefIQHhk92WLo_=(z{teIHjXhd Wah*?b)aI7KS%uZ|kQzpJZ z!h=7+A4NF3?Ha^NF!5pLoHKLIcW&R$>#H9C_ORigKxm1mYqaWmNk5LYvEE?c8z}k3 zYs*jv%6>gIBKRy#L-%4~>+eJ&@BFl-NtBNKUK~0o5vI?@KzN~uPQ4GEa~W6%6~g;} z%k%dfgvwhLDSJpLZf>;+rH1axDvEgI!odV#s-+@%)bDkqIToEz5^60Sh_Ee;O6}2O z$)2f%aP(g%a6oWRrTvuGPgvjlm0;Xl5B#lW6;Cni;2B{lpVBy27t@%_x^5C2JKPIl z`F?!DWUN(WrSZE2@`nYUm$WX)qqEX!{$QT@(J0WRN_?6Ho= zth+-8Ji!!O%va3tod!2prf}u$3)H@`ay$5S7Q8xi7zMK{=CLpWe2ztqAfDwoz@@u@ c+YbaRU^y#gh1&*dS&B8h;+D%;L%lL_1I_31UjP6A literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat$HoneycombVelocityTrackerVersionImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat$HoneycombVelocityTrackerVersionImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..44516a8e788eac2a32e0ae57ab7092f32376097f GIT binary patch literal 1015 zcmb7CT~8B16g{^eyHHkvii(I>fd@XKn-DcI7+)}iO&X1XH2OH*PH=ELvzeXN@TW+8 z()i#H@JAW%ZfR318u~CZ_s-mV?zwl)&tKnv0NBH(j}qaX&>d@3C(L?jYOD+UPs6^F zpTm|+Osw4bi52lDX%9>{6>js$Xn7u+ZhPXnC2gjRj=E{$qe56X6MYdTLZ60j+h;O% zK0LzFbjAK%gW$bXTDez*^44~XP&qIiSwk6f0es95=9@~(H@$9K+7r=EB%$6ku}E6N zs@%W4thkRVBOEuUV|I-(>=S}h>D~{UAgphVs$4bU{b>8JhFiGpV~Oy5DncVZ0T!@G z@ZI3o2y6eZNtjKI(oWi_L!f9t`ooZP&Sy2iN{(4OHa#25LzNG6Wf<{?Jf7sg&JdB- zte8Y(naq4VB0Qd|8^Xq@p@}+UI{TZ%*drQXY4EDD*2}zD6zt8i74k`ZR(HOl_JxfS z0^Ysiat}Ay4h8|ZiFx)|%~<3;PkznOIh?n<`VI99w#Kuc71@nJ#ASAldyp*E+%oP3N(t?8gq7wZw6aBKx)N=i>)SUd}%#zBG zqQvCv)FS8n+=9ds6*SSX)S}|d{5;Rxf*f`R7Dfhvti-ZJ{hY+SbbbG%tkmQZMh2er z)RG98Hbw>|4Ih||*sQVk)O3UBiA3n(3eGPrN=|jl%t>Wrkb;S$I7|;@F;JstULMe` zIf=!^sm1IJJd6ywFx!aoAExn0K4fEHU}Rthh8+U~6VR`$3_t-O%?_d&m>4*~BqswG QkmdraWMtrG;AP_g0ON9P4gdfE literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/VelocityTrackerCompat.class new file mode 100644 index 0000000000000000000000000000000000000000..9f8f3d29be222ea228b1a1e9e4e4facc9b031972 GIT binary patch literal 1359 zcmb7DU31bv6g>-+@DT*5l-g=-0Ts|TTI*9gIzw%zQA({ajP=C{VW*~sgh>KUe~wSS zIb(h3XlMKZ{wT+rK%CkSrabK4+|BMe=k7iG`_Io`0G9DoK!9OUG1``?wI#dP?V6S& z^;e|6#y?3-uA8dn95yUP{m89#v(r@^0U?IefznqbT`~5hoz?+Y9fpv+{kqEVvN{%8 z;S5KUTefBza;K}WGDOx?T{AT28AGsGY7)u1+2&Eikq{sEmeA&-YzsZ-qhut znuu#iG6?k-uineG1_P4?TxZzz4_v9#!j@_9L)GlGE>{^t3X>vkAi@w{^TbBMFePFF zVFA+&V_rx_vH2*vEG8L}Rn6eFUZ=&ahSJhGL%M3Jir!Q#&CQ34iMm6b+g7?>9z)PQ z8*)BqHiI;tF6xH3&z-lvG=^O9AHqd$S(QthapZAVK!IUvyo>i)hR!?X3K8>Ipw2o2 zPcqDnR>2VMnwsHoOKuNJ*z>_%bq_?8T)bG_>{%+`)ZDwA@pt@Z{3X}(1R)y+y#-yd zZEg#AM32F*&37Tm8~TvsjqWEy{t6~LFX_~cV1fJ=r1wnk!8ILyg%E*2gNmoDi2%*O z{1IZQ_-CX}klH&&`a3dTkT^k>lADx#qdh^)(3~a&ph5`i$Y29^2zi!PT%21pLI`AB zmy_#<91=xFe<{FE_<9Cn z*W;fWY{Na=r~h;SMI=2CYT_keq~iE1nKw78OW3RbZ@L45)0E~a)j(LUd{bqq zJE(1**qFkMg=xY{+BFO6U>viotimM(%OvX|tp44AQ0!ME%=3TDyuiGym6c@jEdS;y|H;F* I81yZF0#o0aGynhq literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$BaseViewConfigurationVersionImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$BaseViewConfigurationVersionImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..eadf554dbf40206244bc7e572cc91661afa9a25d GIT binary patch literal 903 zcmb7CTT2^36#h1Jdzv+O1QDPMe1 z@S#7TKdSWX#)x2O^kL3r<~#eH{m%LG_x3k{kJz!0Bb*663XK{$Q4$0ujGgHxXR73d zGhov;`j_&OP{hjUwwVMX-uo&d`RHvR!-yfBN#I*35LVB{R5-rSp7UdPF5TEdiO_v6 z*Z+73r7udW_>_=8I2;fPZ8MS;q3~*P>P;B8%R`xc-zr!~B8lwpB@qzm) JvTv5k{{U_4`;Y(t literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$FroyoViewConfigurationVersionImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$FroyoViewConfigurationVersionImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..5e97dd5f9911a9e319bf61218655507d3cbf8d64 GIT binary patch literal 901 zcmb7CT~8B16g{_J3w0GJSgTaQ$V0)v8q*hp@udk#lSUgUwaT-O&Cf>B|O_luN z4cT;zK2t$zMWT%Em`Nm(y%TFL&D`Tq+L$rjNfbIL5!NrnRCuA#f%k26A^pTbh0t5J z*#GJfDxZ~B$rnPgwLc`3I%X`ZDB_6=2P=fNp3?GbIvGhj5Tj5MYCYqNa44+G@`uY( za;{=Rf9dWPN^wkR1TyJ!O*#H90;Pk2N&WMFXd=S9*58VcD}KD+tzr|;9c&TWOKO)l z=VBcjER>%QlCZm|BB9zhsrBWF%Jgc^4PdqfN7;A@ZdYq*JE4eU89Qhayd}FNyj`f` zV{QDiZ`cKI0G~3ib%77hp0ibsJod!Cd~k#6b^h$Kt>l-7c*?Om1K=6fIOD~|2HTAM ziGB86`TZ?wR~!@={D=G@C)a0y2QouZ$BUfS$nh`nihYeygl)X$zRK+1R91ciyzBlG literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$ViewConfigurationVersionImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat$ViewConfigurationVersionImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..71dd24c09b22c32bc948762fbc1803b2acb1e9e6 GIT binary patch literal 368 zcmb7=K}!QM5QX2gwOeZij~;r{gI*dCZypzf1;N5f@6+8hrld(ovg?2I;1BReiBUm> z_TuF|m>GEAoA-~`Hvl&{EifQFux*3Wt%#lXE+o<4ieAeXvC2|9yV0r(oV2s0+j&lx zd-IhHF|VtgHw8w7vn}^53|l20*IU^n!nu;EZrI3n$x2)G$3qc+T8;t2F#j-n?t6qhzyQU! PPH>!knlCanX5+~x%_(tw literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompat.class new file mode 100644 index 0000000000000000000000000000000000000000..117b8643b4217260ff5d5ba7057c1d8bf206a52d GIT binary patch literal 1268 zcmb7DO>fgc5Pg%RahkX^w1fmG(2oF3ftsRTpcRJ(Dy*hyAyFhwXyYuYi{p)KCy1ZJ zi3=CXp@K^M0Dcr=>@*dkr5}f#@$AmLH{N;s>-UeJ03KsWLyTYux8*6jW%#{rS9yWa zUpD%-{9rWLl$HC=ZudM9*vc)dPFDmP5`^ro=nKOUZrj*u?n)~lB+Sk23ZYuLAYSnp zPeXb>)0v&FvqDI%T8{17!81a9zSLl%vTDguWH6>dClrQ!$~V?}w$my$Uc9cETU8yG zFiy~F&o|zh)jEMp4VMY8h6U&R;o`cdKC08YOe2d)9aoSdBv+$mM?tu%V+2VJ1;X}4 zIoE_QPp8adk}zJeU0LmQn$oL_rXvXx6=eyhAv`;b4>!kZfw10hif$CA5f5tTld)`@`b|*Tf zF~bwEBGD42kI?_q2_aomJ8-Fqs>9FK1jeVh66XobK;$_!DY@4i_?3^Equpp3}601cp1?T5Yo7dd(ruP fWJ_3JKg&&Ja32pDG0$j=+*+2s!G4bYqh#t2v&&M- literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompatFroyo.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewConfigurationCompatFroyo.class new file mode 100644 index 0000000000000000000000000000000000000000..7af6b45925cca1790bb6abe90bffc42fb62c601d GIT binary patch literal 579 zcmbVJOG^S#6#kA{lar;{%UXodMq4xx(#B{b2!d3gxWCTa#w+98VVp7gPi@*1wCD%) zqoOm@3qcB6-1GX*^SiHa&o2N@v1cGdXb9g4wQ{U!90WRytXadFDS2xRShTc%que+Y zk;7lACZXcWsK;%kb1huuyL}zoqn@V& z!cpzJ>EbJ!^^S=RY#JyN4!#yxoLj&;w$fuee7l{JMX3HYfnfG@9NMz25(*A~WBMc^ z8CCEU{xl%NkEvweV9R1nN#ytmD-S7bvP@v0f>oA@ZH)O|vTR)drAC literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$DataSetObserver.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$DataSetObserver.class new file mode 100644 index 0000000000000000000000000000000000000000..7ed9fb4a4a75316470c818614dd8e1f0b03e67bb GIT binary patch literal 909 zcmbV~-%1-n6vn@^8+YTnjays)R&8y9BoSO|gExvGk%ADapagn3$qu@b?uOY-`dmU= zp%;CCK7?Q&L_DL51|=w7?980mGr#%HH|O8gpT7XsQLi27Y zKa@ZGCJzVVSgO*lNX4N{_gjfneW`5Z2;Qma3%?_xV}HMOD%+_Ii%=T|y8-P4qMJVE z5v=qiOiF8nVq+NKPR%B#Z-r5qZWETv&&aPd3AuV4$Wahpxv-IUU}D_GC_I8$)(PW{ zFp^(;-&;~0iB?AvCK_>DbeckiI?gt8S}5W3)7L&Ujb(drlsQ>HVc%rnU>dVFW(Z49 zmhECrt1Se#Z;=rQ-=1T^3*=Us4%@Y$O>zj%Vcb(~`6blO6z<+)RW|{_-HRfr>K&0J zGO_WIP#RXxU>~sS4>}7U_)e3*5s>HUm*Pe>VQ3M&JH}CsBZFtBy7CKd^&EvWjtso! z(c&DK7ntC+tJi$$4c_uhn1q)RHh9+m^3|Vke`D(YyraqHC2aHm03(0P@W3kGWsGIc lG?`&lSI#kiPZ(67RT@~l8Q*hdV5Y&9Eum=TnKO+djBA_*;D!JI literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$ItemInfo.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$ItemInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..051c1153d9cec3f075d394c05976ff33d9a72436 GIT binary patch literal 484 zcma)2Jxc>Y5Pg%cOU{_Y_-&(6ea4W{r?uVJ2 zhWgQXs1Q06F&9B1^fTZ${Eb8SN&P&?K}YrRDW(I+XTa3=>J{MkW@?Kv-=fHtc%s6zgFNnHkkcld=uNKe*uZxaBlzr literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$OnPageChangeListener.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$OnPageChangeListener.class new file mode 100644 index 0000000000000000000000000000000000000000..e5b993775c3693b1ad1f4eec3e0914255146197d GIT binary patch literal 338 zcmah_K}rKb5Uft(u32NuAqTI5hj?*7#18}l3qpj2+$XzD+%U|9naTP$4?e(0i9L&` z2f<4fbXQSb{r>U#2H*~}90S6GwvBgfqr&lUa6YQ;UUeq;?6o-vwhEW*?#=GZoA+jCzyJRH4Zs>!4U7?1h1*h|-Lm}d{=TOI ztM}OI+48{J;b~j6rOMSsPqylT2xRV|fjD7$PxOT42)Av$YV65oU?4$wG6c!2r5d7z*80BI1SN!?-LU1wrd9)gjl|?Lx@+rmNXH=r6deY5K=YUl`p%U zhE%UL4k2Chn!?!;%GUN^Gal^PjP{^5gvUP=m03?ybCO%i>-5-S1B~`f)xt^znWdpN>(nUy`NaLz5#vEbgBE-0wW423}jToMY;kr8^f5Q9-VT1`+ z9&9QlJ`mRO)xx_7=UhtpE`9ru?~AI0jf)UJMX29lWfO!uNlasgFc(rexr|dTxg;{U zNigePm-}wZ*6lJC_429?B23opwkv|J;={wga}84&6>fAVuMdkG*?Hv+?!449x9NDk z?Y3XYVApFAl2zB0Dr_(58z`~r|F(*j8@*9vxl%D6z3)mGo}$80IJb z8AFn1lUL9W#QE?t+sVEYrjTNbp9f}m)&S4hC#EC5ApK^!bc`z>+3KStbQJvz5wd-+ z0fNpjk82^SiR-w*5u~qafclhIW`Oa`SESDZ{t5x-`VJA`IBwxKXnK>$Eev3mIH@LQ z6qid!$esaWC#{Y1a8L$!2SJOxqjM*UnIqgA8N<5ohtZ2z3fDXeyvF%q0!1EaMoD8C LD_kdCV*dUBuQO9W literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SavedState.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SavedState.class new file mode 100644 index 0000000000000000000000000000000000000000..b0d4faefa9cffde737d4b8baa49bb76eed98677a GIT binary patch literal 2595 zcma)7Yf~F#6n+jAHf$FPX`wgTQp7d{N_w+iLeUb7pimGH#Y^=i*@i7)H*PjithL^6 zKfvFiqXfpz_|+Ld`bj@{`B0tFAE1u+^S+yGLK7V_!|rn4bDnd~^PbBWe}DQJfYW$i zLmi=C*eTbsQn6e(Qd*(DZ%Z4^_Ti_58o@A#PSIBMWHA~K$*SsfY3V42WTviBz}7f3ZqarnyOb_`_k zB9CDnvMJR8Jp1@I2aq%1Az|M76*C*+(_ZzhP} z`{fj7t!DnNLknw#unVm$X=BMbmdRhsErjPcuxAr{KgOYtSW<^0QZCWyXQuimG}D*p zQYS2u)3}H+#JUotG1|9*?y{{erSugV=xb%y;cKA>ce6I@;~2-nJt7Be5o>|{$$a)j z`#Lw!+ZX)=eFdD5?=zhR+*3vm%be*OG}52S>zUm=EDzdU^u#oi<@|?fXBm6@WT(_$?((sUBI&+vaZjJ@BcQM=m%cu zKca_jEB}&f#tZy+;BwK|2gTeXlBehUKgZ5!0Sg5zPDD9JdmVkzzWxH-b)1RzuVY2# zTCZ;5FyATY7iRKT_V*jw=yzWIf1sQG#Busd`StTI`;FjQG4F_M6^?q1@xq{g_~Pp| rkcI&bFR6T9R?i!Fh2P!G>rK3dHyUN1y@|KkI?QtUtH(Qd4^969*$$D5 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SimpleOnPageChangeListener.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager$SimpleOnPageChangeListener.class new file mode 100644 index 0000000000000000000000000000000000000000..688762e29b98125c018db2eae7f0e6264a09167b GIT binary patch literal 911 zcmah{K~Gab5dNmT_R(64R6#^VF&rufUt)j@giDhqFKH}EP4C-wfhEh^=Iyrnk34wM zgE8UY58y``XSW5F(DbmgJKyen^Ucg&|GxSK;62{NC=iZBHq4D0CU!g;ncO9ly=0=~ zr=-W`M4ZWdr>ibUT6Qw;HP1zMCfmw7naMmxM0j)|CL+;{C!PL<9Jm-I!ogzR`xptO zBb6z4Ojv5X?Gd7;8OjQl@Sutq%Y>D-%H)UfWnbnWMPExoy=?|U_e8F|KLaCot}NlW zy;#Tm`VI*-6YA~`a-+2zvc5*zO1-k>k+I4tlMyK8hc|BL^wdhnV2kkNfABw{BXk;m=^ehq=U)5}?)53S>IAmbvi#;H8E&Y0Ks6dP8kZ^N{-mUh-b&L`7`jb*aqCwz!MsKeblHbN~PV literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/view/ViewPager.class new file mode 100644 index 0000000000000000000000000000000000000000..8a785e537cd19c9e1b9210b64cd3e5316d2b0091 GIT binary patch literal 16076 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 W>sZdwE4gMJH`oRoAzsW)cz*$|-_Mc& literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter$MyDataSetObserver.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter$MyDataSetObserver.class new file mode 100644 index 0000000000000000000000000000000000000000..95ad265782aa086294937a13244ed4ec319786f4 GIT binary patch literal 1040 zcmbtST~8B16g_vlcI~>f3!>sTN`bZ**BD+5#zbpONUA+jEB06av+gF|>EbZin8M`^FyO-vT` zSEF|-Zp$pH_e`3Yr?Kc}(v)Ame=ahyA+y)5RGPjt9$dow5FYbqOQbS76Gg~p+bS(T zAXFQ};D6*=W6)!zRrZ8%uQD;J+9bI3B$fpbE(AD-ypJ5F0(dAAaupj;YA7vV^>$m* zyb-OAB+N9DP0?uzqpUx8bZyauwMmnYkB6HmB)YyWbX&#+T*4I(mkG-g&LF@Xt`huR zJI|)*sF*-+edf6y;D+sIRwtR-8mcl#M3_qSy6#(m$Yg8*w*$;uz}zXoND!et`IP@- zBGsnP$}Ctt&U0%UNzZJ`7wSlaQ_FULNAv|DSl3#bdPk(GWHF}4R*?H*U3r@+46WRJ zbKzKeelM`M%AUj4udVFyv5(*bdk#u`<~auR4I$qHdxwu{%&;X~L~+3IjHB&eSo;Xy z-NUT4pK$Gjr)Vpn@7&T4l<4OOUwF)S^Y47QW4>Ew`F=6q0rMS>^Kro*?hNW%;`;0a e^0k$H+&y6#?aofXLHX!h#1dPp1MzAs!}$aAAo(`{ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorAdapter.class new file mode 100644 index 0000000000000000000000000000000000000000..0cf4dc414617f95b9b76cbc8f051b7b40358c360 GIT binary patch literal 6958 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 MarE(0_fDDrfA%0#DF6Tf literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorFilter$CursorFilterClient.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorFilter$CursorFilterClient.class new file mode 100644 index 0000000000000000000000000000000000000000..981f7e1fc7d43b31e62040bb15bbc325836b2383 GIT binary patch literal 521 zcmaJ;!A`d_du*hIY;ZZXgzAp66LBWxCqc8T&@$@ojaksDYr_#1`zgqi9pqNun+&> eF+jb<2AU-vpye4A9G2%1+8&#J(zk|gt^NacmYP`r literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorFilter.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/CursorFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..d57d2ce7586973e3f9568de60b28b0971ec2f0c7 GIT binary patch literal 1919 zcmbtV-EJF27(HXV+1OsYtwWNgDYT?%YCCpJe?loPX&aY7AWa2{EOEKEhj`0oH_Yw^ z@eaHO;({BH8dU)aan%c+2@q#?*NzjEs0gk0XJ)?d%=ylonf>GMUw#8{8=o3T2`pG{ zPkDB);fH&Bo(dZKcN^c>y&V}eTA}hiwPrhkR0c8vlY`hKARZDhc3X}u-9VtZF$g&u zZhjOyPHqZ}J+NInSP@t${|}r>TOiZ&dNPMJ@+J(J0_k$4orOTr#5s%!oZqlrxf$+u zq}sMRjua?ucwNhBTguk$q%#xrZC~JZ>F64|i4>Dv&)t_Q_+0v-6Ks21fwJ8lfm(Uv zxwUUK9LwElJnKA{-Jn?+>1y>YwI#m}rQ4NF1JeT215JBYV0A2CCM%Q23}y{n7Pvo% z_|K}FxPmt+M?&_9=AEOOPfU9{TY2r6+YeLu?!>BXLpoa@v0i}Ct?IpXQxEFRD z+wUiO3p_ei$Jd&n($*`sV&Wkl31qcQNgcE0qZL0{iOyLy(ZUk}v)kwPk%P1=XPA|z zLDqA6gV5ZT7pktLfoRZ+ac}IVC2b8tue+{PEywbGy%eR@iWiWpzT~}lfWpsgrEs3lVw8E48D+*+aDjbOaWpQX#1``~K~%x( z4NNAOs|jYY`T~W;-!XNFODX)s=onYW1N9NS;t;Qhw{Vr?88Ux6!TXVUn)PyocZj(Z zp8kr3FJ7X&S$l=adhHMufdka*wFBJx0fl;6Hv}7XJ#9KFXO2bdpGzKhNqQO6c$ZV$ zV`2BPg!k$52N9)eJlT-aGUJy?C66jI?vcy{=I|b~(#!%(r2az1z?6Z7EOVR0iN*ac zAzszQ5AlJ(X6*%Ty~3=1)xXDt9?;*BNRLy{;>T=D5sSwZxJ7e4Av=jY?G4E)RdM$6Ct^Y1eHG^C1kNDbdkO5u4j3C zsnq_WRw^L%L)FjyQB}|E;>9>@gpjqK*PV0EJ@?N2_rJgX2Ji?k3?u|h%c**g*Y$^z*P+3;kA?y3S~TfU?0x-8pGd#@(f9LH6bvR$VsFkCvY4lT20 zIs4}29dbynyH%M+7e3A)jRAqj@mxMYr56HsGcb_Sv*8T7k?O%H6{-bt?b;Wrq;U@u z2F3+OTH zteCOrc1Os%7DAm^R+V(DT$L0s?Euz@znGgbfmap6``Li#* z6H?u|C7sQX&XT6{_;z#%A<)g2w$HQ}jyx*!i3#k+s}mbpbP$w^#(CkneuJfTrH1rD zF^&89I)frs==Gwe*>m!j(szLDT!+GRSArhINyGB^-UUYA_ZHG%jWWDepV2J1)09fj zS{;q=I3Fl7!h?3xOM@)C;+0O7-VU1Kb6Xevy_VsXcDJaTMsk|ZrHdW53km(KIZNn= z9*lfL91U8e(MO96SHMU7QrydOyu;5!l0RUoFu!n){z745=M;md7%I#UjGSTYAKX91 z^dGcH;8Xq&1lCW8v5bCv#fI<{pK-qsqTqAPa78@KB2PbhHb?73Fe_l5Of;hh{MY_} z;k|B-Ir<+;o@3#L3`*<~KakB!X8l#bU@63j7~~=bxrjlIJT(LQ!xwl+-fc(wLftm4~1`|o0X3|{NQy@ii8JiCZvmEN`gRAHP&by-L0VE33gI|=ZIL#rr; fRFE?^GOS;ZHQ0&uE3tly!P*FFUf}yczvur0U`hHM literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter$CursorToStringConverter.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter$CursorToStringConverter.class new file mode 100644 index 0000000000000000000000000000000000000000..d2a80115b737c71b4f3c6d0fdaf516af8abe02cf GIT binary patch literal 357 zcma)2%SyyR5UgG`an}{S=?8ewgAS;-JxOpuSnv>kpf}URS>jBbnZ$qd;0O3o;%Eq7 z6uk6{s_L$O|9E`^aEbjK6T&T9?VZsobZzT=RQjzNm!xoweeNhC`5$V~=n?Zu^%%!qFcNGXh~NJr1Dc Xbq86hCdj|zE~Y8Z5+a?7c{cq7ZhCB4 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter$ViewBinder.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter$ViewBinder.class new file mode 100644 index 0000000000000000000000000000000000000000..e2516ae3c5014c847a31b24de60a07830aa917f5 GIT binary patch literal 325 zcma)&!Ab)`42J(y-Lbi>Aw0CCf>{_y!x!2muq=~7D50>jJ zaWr?beRRP}EOAIU+i=Uqb6A^~009-$#Ui;Cowz9 zczU@Y3}#gmSMub%?w|j0#dSwj(li8#6VEA0Dse)%+N1tuMoGVR3IgFk9|MpYJ3^sV S59N0}Mql$lCv*qHqW=X61zx`Z literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/android/support/v4/widget/SimpleCursorAdapter.class new file mode 100644 index 0000000000000000000000000000000000000000..8229913c868a544eb762f73a37c6e7522cd9a91e GIT binary patch literal 5895 zcmbtY`+HO69sj&(nvzptJGa25Wf!6mTLNRQ+)iIHf2BAdZA_#`q}-m1lv~OW$3)snq|CuYJ~5m$H>A@U%dkjq zUZANARA~=^x%)CBrXO`^*0B&R0^RQgVCSF@0!wsw;ge6TIy89X)1^A*V}YMfAsuaa zAGseT?Y74yu#PImNz)c=NuG11x)WhRP57uZP z&zBT))={EkEtmF!9_tAi--$5Vku*cb;4FN zsN+MptwfNTWJ=A^ z*pEB#VGVZ*EG(_qKD^hATRIF3Gki&HU((1kk{5N96RQS${TRWh26}fvNr0NtF@|v_ zJ@;=jQe3e3yzPZL?Z;juHQaR`0DDeH3hYqYq>P^JqXO+6Wo+9Zd&?0yB8QNb>3g>f zhO#Y%`OZNvXpKLV$cI?3Lq^DtAx!9)1as75WV2?P*|DG z#tkbJH`1YDGc=r;NRQ-0!v{D@eN}pRf1Ngd*=kX1@6e*Rr?%-K%afzFPf?ip0rp~Jab`Rf_$)ya- zsRKMLI8LgpNpwQJN;4i9)1%DQwz4p(Dvc1g;yXINiB#Lv0X!w;xQ9^H~E&uQznOi3p>o@cALT{aZSIB$F~A-KIWKVk~X@x94__=Q8^= zEMVQv?=!MCE3CNhW>pb$rM(it&vd+vpD^5WCVN3se4O77#Sf{nv+|X--Y_R%l2L_mPhp3!c^HBP+xPK67uBTQl(R@k|m5%W9hV+Q$1E|v`WU5r7`5i!8 z`6cRsTOJnq%M^ym~mcnD+qx9-|~F zXL&f%x^f0hVb?JP!@>GvSQ-wxk6{_FGg$r#m$>kLUYDrlH&A_)C)o8Ay8$iOh)a2B zT*3Kuwm4jdcD_+CE=LCy%BN03b*ZN?BFdoU=psb78e7So^$PAPUM0Av`L6NaCcyT6O2VR>4ug!tih9bN+2VNU&cm%`W1AK(aq{KBg zQ1Lec)d_Sqd=%IAxOrWAs=J=I)jb~h(xcUNd#CVBB&Y?vtEO>%k1yyui%06Z{XzFx zEDpMZzLh}_=T6`TH@f`+|5Hd7M{aVVryyx-79Q2*R)?mXlwohTb z933c*4#?44rw~4gUAsvH>JOhA zmVT~Ne!c_Ed_F)!?_ogQi$y%+1aTj|ct7cRfb@QhM0^~p@gVx~N%oUZk?x0ZCmu!| zhj14jXNbI!AZ)R z$5@$%qtxpo<%`(Bx;Wz@vKN(uG_Vv?9u1FZ*rZ`SUk>pyi2&!)z=>3 zgPkKXIDqGrjk>*{V51-xpXG>*?sZ%(E%byV$8c>a!~AOWW!iT{NocZHIV^d|;ylU_ z@++hu>prfLSrmwL9mnI-`0^C=ZSwgm(|GO`E&>T@zzYTEHmb$1bL0)W;7w-9TS`^f z7UHN1khmAs?f||?+FV@ir7OQpIg&vBEVfz03tleahgShhKbNUu73rGBOO{ILGJ_vVxORF|6(HK7iObO_IMOh&Wla_%<9K{5mU(QIA7=>Td3L#Km3U3=d5iq z&VPYl7Ib9!F6nFucggO%QZ{00`&Cg{DQ0XJ-o}{OMRs=cbTx!#v8RlU7Ds1GK_}%Z kUS!;~sES!feedwi#jN~2@6x%aiRBOcHF7=gfAskN2hNzVf&c&j literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$attr.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$attr.class new file mode 100644 index 0000000000000000000000000000000000000000..ba86c9df1d1c4ad8a6694ac09dc24c9210801eed GIT binary patch literal 2467 zcmaKuS#T6Z7{~uZNJ2t~B%MGK?)y>+APPzZa)<<$B$5yn5A59?HUpcPb!Ijp2!eRv zfd`_XqJkh^sEDm)X_Zu2>VsDK?1K+J_~@hWmfzRC3yYTS!~W;@_1E{md*-LVzP=1# zB|fXfI0w^H!Emce#a`eiRTvGqVKzwZY27wo#c^1P@eb;Cs}a?jReq+mH@VwQ#SVl@ zcBs^zOc><-v;(KxL9iu&WRtm~kLieq=UPo>kIpK(C-5twEY{8&$GcyF-Ons>o}?g?6h| zvOk}Uy_h?p5f@>=-5VEDDphj8mebtLQ%PZsU2W>8-`i*UHmgrOz{?sI+Ni&hM&Uwi za%rrj$zpCkjsw4t+hB9M!XVcbj25GX7I-~7O0%17_Ey)=bGz-ioU20Rr_2=1_=-iH zL6$eAu~31Quha@tuZBCbL3C{=P5&tD3e~7e@-nvAlHL(F+?5SRuNm4DTh^cReBTXu zON*cG;v{kjv+ImW5`TBR5NK z=K*rv(plDydOmf~UfehbO{Ed`6iI|OPh&S%^# zFv;RV#;pRi7N;}z3DjAf%-AnbZ*c+Rpn$YEkMSOX28+#%_X#vwoXWUUV6w#~#-zX$ zi!F?#kiayH4r44Z-6AcLgHeGQ7AqL{3Cy%O zf$@OAEQ?i)hXiI@oXGf?z#NO!j86*8wI~>$7MN$Tobjl@e2bFt1%U+?YZ+e>SZJ}H z@fCqZ7Hb$^6I$C^^$8S<)zZ(I}bFD7nul+0H2W%_teoC^^h1S<5JS z$|#x1D7nZe*~cjP#wZ!aC^^L_S;Q!L!zh`;D7nEX*}y36zfszFqqO5jX{$-c(RFYG zmeD%40?r{){(Uc(YpjqrYOInsYpj;HXxu8>G;WjYH8#i&jZS&H#zwhGqg!s#NXQNPzB}a=JIF>7>=tnP|jvx(Qa%5ne-)Hp#&)=VtTL|J1CMy zJBF|kIc!0UKJ3SK9HNrr*ol)=dI}y+!^b&9Wd6OlfCIRQ!}tP6@D+~Y8yv&8IDsE1 z^GBS)&p3}?@F9Mstl#iCey6NIa2bE%JGy1xHKV01;Dcm$gLZ_zgeYFV^h>;dbvhL$ bXsZaDK+Rq-4SZz&KgK7d)u#GITtds=4H^!( literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$color.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$color.class new file mode 100644 index 0000000000000000000000000000000000000000..bd4ef40253ed4341257d4ad67224a8bbfffba149 GIT binary patch literal 632 zcmaJ;O-~y!5Pi-j8wg87me26f&=OGLz^Yt9y&#Z~B9H)aU3ndoIBeF^?gsV7Z$ddB zao`8=f7-$YF?Nu+6nvQHH=cR+8$Z6>KLFUlMi~W$6`}h97rD|&#M7)R(^!kE;It`p ztkW`z3{yRR&4ZXHo!}(uNs%*nJj%jQ<+2|}9R_y9P; xXUyOa7HtJcgnYkA282emv~`E&cL~=fM=jo{0AJCt0;@KD!*{}pZC}GW>aXi6fMfsw literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$drawable.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$drawable.class new file mode 100644 index 0000000000000000000000000000000000000000..3a0a03e959b7a9a7a22d20679f5eaeb150d079f0 GIT binary patch literal 2922 zcmb7`*>@C06vn^GPAEtyLiU}-fI=jwsKfa={fp#aGWHLN6 z#=e$@zY!T?O!>*IfWF2>MJdO%sE;A7YQ6}falLEbSjtBnu1m&Lz@ZF3X zM2VN#AGw9Z<1_-T(;21%O#brH(*t1?PdS0DUorE+*h^+Ici7A{x!8Sq-<=i5Qa#(v zsJ!Yvo^5t(c0e%&uPX49{H*12VLK2+;dr{^E}Pd5mJby7x_ge%V#$%2;lvB*aHF`q zyL{|~iEj*2z7OmE-=t!xbj0@Xt+_X^Z(igI4{u_|C51lCH_qRyZ&c#T9o zW0k@65)F*i25*!!#|GCJyh);wvDV%xQV-ih_ zjRv<%G&9aOxKm;gqcpfjLNP8dc)!GA#)SqSlxSgWGWdwZ62@kOjzlZtB7-@JHb!M| zT%w(EvB3ip9gHmorzAQVml!-K(Z$$mFp=nHY%_RBqKC2F;Nud#j2#A_lIUaXG*Xi>L|}02a_{sF0*$+(LhO2*eN&)r=Nj{Z7m!=bJ-R7y=xvzP<2!-2 zIdTa!lzt&#Ep=Z_zbRIbeaY?g-#lY;tK@I1WNfSCXscvptK?y;WL~S}TB~GNtK?Iw zWKgT*Osix`tK>ziWJ0UtKC5IqtK>JUWHhVfFso!OtK=!GWG1WRBCBK{tK=K2WEiXD z6su$rtKENx>iCd+kCat39|0=Ae{aXWw!=&c#cQveWwHnb_ zr>@nwPF=5YgW8}ms&3Y}MQzl$P2H|>hq_baE_JuYR&|fYHnl_JUbRbOx7w?5pL#%J zpL$5+VU^K%RAn_>1hD|B2)ZL zSJ@@HgZ@Dat+7MUuP{-CrJ@=`qK3R%ixE+W^`ai5q5&J}vfL~hu~p2+4k58eEWkdo z5E;>goM?tG79kW0iCByyq6J6A5*!z;I3e0_Qncfg=)h^wi8G=L=R`NoiymAMz4%e| z;b+m0U&R0};!k{LJEfgB&kr90hDpsa)UNskU(76}&VI>LBnRM2d}R}SZ9l)k1=2=4 K{abvGj(-7?Bg#+! literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$id.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$id.class new file mode 100644 index 0000000000000000000000000000000000000000..35be7e2d2c7fd29a6781639587b89454a012f7a2 GIT binary patch literal 1733 zcmZ{kYgb!E6o%hTAR%G6O`%*$TNT;@Eu_#3ZAqz!VzKlh1=Mb#n zVaaR66~9r9%8&DFW5HGit%RN(Z`aFLy>L5!zqI3*6GFFFii<^;Q{*H9tq_KeM2qDp zOuQiUd4BNdT-+=rK~nVz{YR$`;_5%~nBY)K`XO(j!_JnQaT3)CSxc3u#`Ss+$Hl#d zSFg+RT{aff8_{;dkGWcp3nYH6__D^qHxdeXnZqOrB>q0H*=dtPZ?{+t;{S2NGlX_K z&*PUj#KXh#E?FY3dd7a-taF;|dokXSp%lIwZSgVEVbrL3RYESVM0-mI2W=O)ZO@sN z;kvuS4A*sOnP%*-M%xizn4I2vU@xq_P_71HkSq{V;}e^N)+Jsi^|TekSrE=Cv>`1x zBsi&%aX2VArO@thK=7hM)}a!-q>yuXLh!0Whr@2c>k7(YhhRaW(_vQdmO_`qPQkYn zx*Z-9d`F?jVXxqAgqv7qt@10n*Q}NN#=2LMN26DxvRB>o8iDXZFkP?)=a9k^g>Nv*CMT7E zJ9A|9)sK9hTkK)fY?S@wKuV|Arsc(R1FeMoc9*JN9Q$zwKM)39QH9VFY+;6XoZ^2h zBfNL+B_3s^iL7$>Smm~{%Kc)M8^tPjh*fS4tK1V-xf!f-7g%Nct+MY{*>J1uv{km) zDtl{{O|{ByT4fupvVT_DIIHZKRkq41dt{Z(vC6JkWjk0~_%*zNQ9kb&Kqpz{?^k`s z;H(}un9%19F6e24yq+!^p3$}T{8%E-QY_d8zg$yVDC4( z&9C@(m-`PihBi8b9GyisokJguV~8ejiYB>B&SRV|V2Y+NOVgO6JPLFXi!_5}n#CQu zga>pP8*~Ma=qiddhb_8>fUYB?8;EHh`&7Uax{2qsfS>6WexXr(ZFj&+ODDRkLY`GF mt8MakeEaVf(-J&LQSJkLho`o{GyD5Jp0nm``V0Jsp??60gFOlW literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$integer.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/R$integer.class new file mode 100644 index 0000000000000000000000000000000000000000..5c923d9050c7f9743848fcf04c112e2653f99031 GIT binary patch literal 478 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 YTx2dYSD35JHRc9$li6f$Gj~z{1{NB@ZU6uP literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f051263dbf7ac834a2ae3699172bcd59d72d2a2c GIT binary patch literal 12946 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$1.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..6fb70845dfe872d6ae15a4ff8317636e866d2a87 GIT binary patch literal 2870 zcmb_eU31%15Ixs+t;P|JNxw)_N>WT>J8sp`6iS^IS|=$kc3Vj6lJHTkWlf_*mOPST z=nONwzymz+(!aqAGju}e3_pM$#jsaWBu8-?V#thh^|8BW_w2cQ_1E8j{0ZP~s1gzk z*Ho*maMjfKDnBZp1w)B?L)wQn!|GL%EauseEO|EV*q}?^$$<0y*wLw!TGssw;n!vbU7Ebo3%*UZgwVO7FehC74yG#5b!YRljpCM3MUaCOk2GA41J z;V4&C&GAI{@IUms5SFc4v`tJ`sfhI(x17N^a-x54FuLi zs$#J)d7r_(hg66ok^)yln!`Udiy`+k|-<2_ks|?eTVLZhsUb)Z^s=Fqm zjQL16ml#_Ai*9<5#e7}%XO+P3>h9C>FmB)j3GXvZ_32X|4;eQ_Z6_=!SLQ|uh&622q~c3fh1 z622l`95B!NePa;0;wytr#wgjK>6oAcGfBTANMy6(1O>9A;{2rVnj`cZhD>i?p{wgi zkR>ouoOzC8#nN+Ri(44|l^!Kh1O%gy!irCE2S;uw=t8%FJ$BgPkX_>^8!!!&Ou-bgG-q8-cQoE*k$sd zxsNLWn2nTYpN|361$b#2?O^2=*~Pp~{k2_ImOF4{1%& lWN%=Fu8P#s5?1kfdWf#R@YZv93{EGWkb(FcC+j9M{{Y3zArAlm literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$2.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$2.class new file mode 100644 index 0000000000000000000000000000000000000000..c93b8394928168379d31e7c123018d394864ccab GIT binary patch literal 1335 zcmbtU+iuf95IviuF-Z(DfnFe7N->b6C8mJ~prsN-AXQ2z2o$8gZR}OE#aTzT6TxR8 zQ6YHX1NbP!tVxg>DH3umt!KtNb98p*tbhIf@e@D`Edv>br*1HGxEsqr^?4W#MCb?Z zM@Onygo^tPAB~*n$@U8#eh4WPp}jvG`8L((7_4JH;f~MMk#o>L7H(`H&(P$`3j^t$ zF1HUBbD4EcB%9`L;f8_h z3{O%|z{C|?Whlrf(ThG1J7g%n3&x= zT49;EhZ;kbd){IJ@72yYYI9%FO=$Z(ibP~!lTJ75-Kjgsu(pVWfhNQHtZI?w4Lo3Y zn4%dpTz&DePAbgOT0+LMv@8LuqD4u+l?<&COxit9-ZP4`WXp}s6I^I)oxo~*L*+}7 zxJ>V2Qb1E>U93>73n?9|SR>1{1g21J%1po;Utv|hqng1S40}T`Zxfi6zo}Cg&FJQo n^(}(UU<0?w=3wJ4>f~*Zzk~+1@&!`v{lwaEuuTLsA$tA*3tn}7 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$3.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$3.class new file mode 100644 index 0000000000000000000000000000000000000000..eb6961565d7c5b5173d1cbf4e4a0296056548661 GIT binary patch literal 1408 zcmbVM-%ry}6#i~ERv85*FhLNVSY-^P>L40H6I?VI8DKJl(YL$yW?bmnroGI6iWd`! z(FY%W@Q*T{+YA(=iFQkS&h5SDJHNhjzkUDw1;7KWn=lw2yJ64au99KU;c;>xVn1|` z92qDP2i$jf6ggYz_A?&8j%g`kyV;9;yKW-SP&(v&?)W_DI(wZ%;VKgah8hpNIF#N+ zb9*n?<$c-Z+FMH|N(3TiD5wLO*!L-xR@PuP7_2_`ZI}Cghr34%4_jv;B*#${#>(lh z{X;YaRM?b(R8JXHHG4c6y)W%EYxN!TyLL~52WuqL%ce`=B=w#_iwR@C7g9u2Z9w!`Dt6)&XD zzx+E_S2aJWQqKd|C(NL`Bh*3YnW!>6%1Sp2H7qmCCPHZ%|0H!|z(1^Bk;Gi(6Xxous5gs8Ju#*x&nl>#ikJP2b#VL;jm-1LBw%Q16$w+eG zpW(591sjGAG-2q#0v0e#yMP5O;BR3#N4kF9ktZ_@3(Hqm=lk97o^$W{^`Gy40I-60 zQb-6~sk<%1tOvI1Y@43HV|h)t{+?kwf#o@7(=gj@V?F$Q!St?q^lEweN~_(>N3$Dl z!;;e}Bn1{sr{TGF!|*%pw(AAP?y9kCTOUXWhYO@zWtSHCFc3Ii?F#BV=8KbsXp2Wo}wQx#I_Jt46gEm?;#8)5Fsx#yza#K|DkYlVZbi zIs)?pv1*YyqLjj;0;>mXJM`6}aDz4S1o488>sUY`#!|@EkjEmIXh~qUU+a(-25>R6 z(rd-J(KP8C3lt9U+>IpfhCsfXytwUkLp3bpDR#0Vu-12?p5o!Ovc)c-#8#)s>Skv< zume6wC&=cz=B{ZpP3NXj-Z8yR>-~=9)UB`v%e>v_D*FHECg?i#3)!uj3ie9ZGUG1&$0`4+F_C@%o07g-WEoq@#?B0^^?L zR~iDMA~07NwV6os5^E?f?e`LJY?Okd1~&bQj;pxHreEU`LB?eYwN1C<)vZf5=W|Bw zT+5tY0lnflmRD|?zHj*{ydiM*fa5x{4W{s>z^VVBraW^S6`1ZfIe85*Pwi%mnsfp= z?mjfiaqpr34E-jd(f27DU8e|+%P#IiUtGFPgOj&0eT$|NI6}`HlJxwDo*$F!6CA>) zxQ}M$BN=8eOK$|gQCdcXqhqvCg2vP+qzn z;MO4-E5nTWuSgepjMn`kR=0Jw4shc>P&b|9z~UuCvrD^(d+J_>t=I zQ!In-w`8nS_PKVGoXe#>Jf}i_rep9+2$_unXe=1Yh|$+}s{sP;qw&cW(sl zGG3IpN*s>dT~Tqr5$^X9xGFY69Ce5|9Jza0#r;9JKS$uY?x@Yg;mF;qD()}B{XGJ= d8M;egE4%=&qelNZ%J4P1&2Q1A6Eu1o+P}fQ1aklY literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$TabImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl$TabImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..fb1d9850da6ae8d476cb53f360363ff7721e492d GIT binary patch literal 3930 zcmbtWTUQfT6#h;ChlCM91zN$1mO?-!w%V%13kafVBUqu>+KU~+2!lx`&P+gizu2q4 zppSj(iw|vAp_hmLfc})Owhw*jOVxg7CYcOjh%UNV;mn!Y`#byc?Y+-$_kZ~nz%#g` zAR;iFF>?tm;}~XsRj@+8=vH3KCbU8!G2(tcqgj_NZgs0Cl`CX>rnOnQ zDySFe(eiVaY0M?;VxeGKPGafET1_b}5X<>c0z>J|9-S0u%8eFn$IQ(b`m(@|bou-x z?i2DQWg2p+jG3o#{?~chzhGqS#GIuqYqMEBF;;q@cr=$bY)8-QmcXE|Qp=&TJeBKn z)7rei_Vl8*q$RRiem*fdyQpUz*N$oZrX%oJ;N$3mW=-igih4eyQ)J5tBX2mT1Wv{` zAC>+Y+A(U*=`qxyO+_o(1?uAcGg0tx6%E)Tuq|!m^@(C`R=1dvtS)UfGg@{=vkbW} zy{vZ@3|rvLrmZQ{Lk8BP7x^QwbzXOZnQM#p`=PGnP8z&dg@Q%_g&JNSdjqmHGAWgx zQV~UrG@5f%-B_ez=*NBq0|Li3OFtC{(C1+@TBBw$??}`^6$u;?XyloEKf;Xn z$5R#eYB4DpV?iEKa9E(Fnn5a_#dD+x*`j5cleTz(Mp3Hld^_Ddo+c-DOe>916s{mhokcq>TKCiYBNu z*F|GV>?BIHORnTu6KnYaBd}=@DeU7piRBy zURGs&m4=F!@rpnzs9i+DCc%2=oOzMGb#A)p)85XEP(g(3Fc$V5Sm~TCprE1aekOoS|>b`g4(` z$3t1wLt#zGXU9VT>&)3jFO{G-o(?^qMB| z=*f26fgGE1vpa6cG1%rau5`;8lxLF%sXVU)qgl4Kt(Q6M+K{ zla=%?r-Y;k>=b-1aCj3#ip3%?W{fb=Hx8b^eGKy2Vg>>Sv?f{yRFi{NqoZ+1`k1NHcmv-dCT;=6WF8lC9k zj(XV5(>Z?d1oo6L6Yd^p82AC*-%`kflVZT%E{y6vH+LQ#ivKc( z_c+Dw)4vDw=^lDT#67j!LoS)zNRyKo;<+(Op5RjiCyB+OO?4q!BK&j;r$f9NuJTGK zpX;B$MhVO+6Ib!?-(a!r^M*t-1 zXLJ&WN+6RYkfd0Lo0Xq%@n=kPPKi}qSwZ(e#U>B36K$f)h4i@A;d8A6Z@Li|n1ogW zKTT)}u1M~#2iuDVu`d9o_+ScVnQBSg4CcbXde&LiN3i$?U^;o=ftB5!AYY_q?G?AL z(d|_%u3$a(LF^QR0ql0)&~_9`Uf+NfX6W!bLl4u?BLT3W*EXAiG}J*c3~X#2*l~gl zZ2-2!9wEV&{bXd2Rlnc#{*zNuis_c6HLc@Oh^Rp j;{&ey$jdr>h>z=|xXty`Em7VUKf@Pn2fTCQOT_*ITBeaj literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/app/ActionBarWrapper$Impl.class new file mode 100644 index 0000000000000000000000000000000000000000..91967609a5fa3158a9cc75aca34e95949f8502e0 GIT binary patch literal 12486 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItem.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItem.class new file mode 100644 index 0000000000000000000000000000000000000000..909156f5f950d75df11e5dcfb4c38d88683b1505 GIT binary patch literal 8361 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.class new file mode 100644 index 0000000000000000000000000000000000000000..e196a9a7ab9f2f00191c147dc1b96e06d02aa9f9 GIT binary patch literal 5425 zcmbVQdwdkt75;8slif@pfJ7jGKmn7DvRVa&fDjjE%gJ87 z=qgUro}C}ydjky$3oJKVEI8TZekZ%f_LAG}oaH&=cAs^yQ1%QoDXckT8-gy#OCuA_ z3X7{Iv@`nqRyUP%GNXM?$+KO%s9@&Pd25e-dD-&{uEM;&>Yl(Y{Z+R1D755v*ay7o z(z%nD%ExeJs$B94I$DMKlUHskTKOPQ!p8DdauhD<`@dqAaMSs*98sF{8=Y|{D={tT z+iQ(m$(-fxNfzzlT-U_F7B{~atvT*Um;`V2CSkZ&%w(EZ^S7ntUGfyPgW@dG;}lvJbE7bH95c- zmSCxY=aGe}Q@4Go#VAZH!*Ycge#!V6>h}&x1S&1ubP6|J3YR`7ZqmYYqZne?9ig)) zlNd)mI>p`!6G>b^{z|rYQdKOEoH%9e=+ri6?cpGd=>>Na^-vl~yTdGH23FtMH6Zp@ znrs^v#c&B$8@QB3b}FKrtcf*3(==trOYlrn9eG+ zcc#0-a6?~v3~W%CbE;a75$|#nF~s9oj}_wC6(%-KvMl;F@B)RiC*f2JU0|*>(E>A$ z%|6UkCaxBkwkUv%?gR#|Vc?U1YWjd+Z8y=1X>n}D3WYfHa)m3JW|R$`gFclzP3*w6 z;`L6k$)By*Nuk=+m1@x68a0C`l_#~dt^or#QZJ`z7jf*ykVrG5FuSv+S!^BJYiFb= z#dF)l49t`??J+R|N1>HHeZVO>Lr%`|4r(oEnU9*tA+K;2!wY<@UDm*KQprZP+RKCn zy&$JM$UYNA+1^@x9l#soVoRziu4lpP)_%{*j9z7p>AoPb>^E@$;t&0!7oA-vha~Lo zqlu!OD_Gf$PH8M>9TcKpYU1WHAH*8TZjO*)2zL^*dEBwXd)=tnbr+@c<;i z4#yJ>bkqv<1S-VlX1v|RJMbXclPzRdg!?WNFUCb|qMna2r$!hjKu}_G>^WA>xrw%V zI?w!&sZDkdg)V}5zljfssA9~dKF+h^%?C|f?EDlI_%pof-A77O_k;mp-IFNjo<52bs0-b^l1A=w-^R z(ZXqX z3qhw&&2|>MTwWCFoUDO=C|o%8!c%lmpP6Qh+fpe-#7umWldZ*U(e*(zyd7f zD6@00h#&$sF97R91L3$g(S6>dSUiDqC*#efv-33GB7bFw7Z32nasu77F34R0@(o08 zAaW~_7fj&1M52Q8Bk*Y&Y`%8Sq=Vvc!ru@YXblat1_lU+3$dJg8{`TXn7WhCJcqD3 zF@cK{iAS-jf}W?a{up`_kMUmxDS5k5zukNcX}(SK?G}04r{8WphHZSijc@xSCzqg^ zuuEucDHF1cJS;~i&cy}%y^N7=qFds)>6;H6S8^o^TpJ=Ql7)qdjtLBiHystcQ0#Nu zB^EgjMi$#C58!p~ z$B-53hbOQ%GUKyeKRbk<4VQ@(c=oygew5%Mm-db$FzSz@v8{PsVm_f0 z^D7t={CbEKXX;F@p}u>l=(P-Eowngis6DjNj*@&Js6qiCpK%jZKCyzB_tXWq_vx`J0#aOeHO=XIn;yxdk_!RtBpwl&i) zStpZwk7Aj8l)3)ORr=%nkWem)qDbgQv56#ZrW(?8?n+X+1slbxi zf=fY!ZOGsan&2dNypc1X;H7Auwn6nGO?ty#4d^$L#sE;^YhmTB)awBidFgK)t6_)#)e`i2g|7#_;T!)O zqI?R7Zw3(G!ncDE*3%2AiIcpzsfLeQFTSH8xB=hA_ZYB}8(08Vt?4;Z5EXpC`#4%; z%5?mwst3QF_+9a49u|k#C~o1wc$jD0tu=1X2_v6_pW%$c^oA@ zbqx>6Zw>#qYcQYxx{&{0oWagJrri0 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuBuilder$Callback.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuBuilder$Callback.class new file mode 100644 index 0000000000000000000000000000000000000000..166256452ff83efadfe0302147cf1e2e32e64830 GIT binary patch literal 376 zcmbV|!Ab)`5Jan^?j|up$TxV_$I-6y;H^|368DmjJ&HxT&q@D9$RB; z3D@M--W}|VB+XiEK1oe@xmlhPHe0f*gEzH`?SAh= zQr+|q>liV+-4KRr-v%vD#!5!|2YYwGBa9Z#Ntj!XQDTWp!t@jxLjU-DK_HyvE&<9l WT%gEX59P1+G01b69T^RyV(Uj4 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuBuilder.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..0608b2173a6022567efb32749d0d6da9763c87d5 GIT binary patch literal 12892 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 P9r%`m{5$b?(w+DJXNy>s literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..63d60934ceb88fe521a3fefece0c396f0ad2609f GIT binary patch literal 946 zcmbtSU2hUW6g>mj6)oD9lOku?Na(z`~^On zXia=D`s$A|o`KDZrhPE(CbRd>J@=k_&)pwCzkCJo8224y1h)Nf>`6b?p&82P=s-n5 z=pTC8#40i}@Q$^bd1Ga!-X4#hc@s!RUPp2=QIUh3Kuwxa6zb6ex{MMijsNuP{d2)x zft77-bi5<*w3*`kke!&=+qK`5xSIy%jV)L2wgv*Z-EgD|$fD@Nfh(|eeyP?V4}nz| z7qB8w?rWo-Psc+Qy^_N~39R=+Uj_piY3nDKx%faI3GDR$M>o#u%m+J(sb4zM-?Iw1 z<0a9Vq!;=NY&LsoTB-yUa8MI?@=v`byDXrJx{EDb<07VJ#tjQpnyoWvtiCr~T)`$= zvK_uultlC>zx4z*&Pd|VupdkRa8FJWDGU4IH1gFmZN;uGuQF-r;ahnu@rX;x@{i?0 z?51dCXgj#bGf(dYeH$;fAAClk-T8#lhdHRsb9EldGqJ$8h&A5bT)=UO1?^MB1}?Lh zwJIdA}DjULv*X^C;dIQJ}p; zN2)|biU-a}iuX<^)X?eD%S}Y+hVO!E%R-i+e85NC3Ah?KyZr;Qi+{m*cZ`D-VX%BLPvW%=8PMBBJ(He~rS4rLq{v4mv{*BCaZYQBvX ztTGh1=ZQG3wze3esn6i_4ci;`4I`fpW#EgbUBnHnS*ZRGqyL7maTB+wEd!Alnj0p$ z_0!jLQXW*z66!V@Xc9A}8tFq~3Nh$4nSQDUhSiCu%8--F7atgy%TV0Y!^jgaq+#9s z$>r9K42hf1l^5t(szFyI``Tx)T}ArZ4tN|3qGRbF;nBfSRWx#7<+33>T?`o-1r*6U zOMef@HlAXm`5AWO3+6tiG4sZk&X{Z$3uN1rW4z~Zp1uqhP#L4Vp~xBXRhr*$k)iPk z_E#(}9^v{CYOnqv&ZSWu!%2}h2s?uoU1~sl_Ys)GHKdJ~KTCgq30)nU*AFP^eQp5zrgtzJJ*bZ!G$<8kNw@eg2 z9{d6RDC3>wLwz7%H<_KCyZ4?sbMHO#^Vjzu02Z+9ppRi$L|u=IL`AyAW7Cmw7>ONE z=|skwhu)r&@4c?nskcfmKapL(yBk&(9OM{E+kB6EA=hnht+g#h;vmoPnCl>pRN#q- zP;}xwS3Hc`zJ+|pg{-XU)ig|0qZ2718=(?AO=ZYa#tiwSqfBLvh&6j+wn7k3lvc@8 zB2w)UqqfPAYea!8fZ@Cg2j`0D$B>HxN(}u~>oC+*TE0rVEg5g{Rwx-pnvvk)CXba} z9~yJ^Kn#z1qf%L*138h-vcxc5ZJv_c6@RO?If$zmb#RSg;uLom*X@a%K$)&GrigJ& zIJm*E)Km6d+{7e9feRsxsmw1k#61_`>=|26Tedr&r78?$yi&w%OgX6hPj~+d;bIzh zC@pQ7*p|1g~h%xBozvOhNZHAZOdQjE1;#3h;;F5}7}N}D`$WGl~nLz$ue3GP>njqT&s_&%y{ z|3F?KI>0*e*r4Dy8EpL^^bnRna2NNot;(2%mysxA4)YY-PnV=U!hI~#oTD-VOEgBv OHb4q{khj-E_WTB!0(i~< literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$3.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$3.class new file mode 100644 index 0000000000000000000000000000000000000000..7c87b7fdf6b9255da1afe10b0e97dadfe6d8925f GIT binary patch literal 1401 zcmbVM+iuf95IyUdn53pj18qsTh2lakZ5>i7KmlGVDk7!u01BdSjg&@AY{G43~6VKw7SHIy79&B83$l859^&6$#CCgv(!!hdu7Uv3d??D0DpA za=Ml;UMvPuabo?9H7W=}|`=Tf{x!VPZeMNJv>?#aGXxoJ}!<-gc=) z_Z=$;c%Z>#D95QzQlDWxftiLT!)k0l^AyTd?kV~gDfzstejs0vwJ%TT%OFelOSF1Q zdx^`{>L<`^TPIkqog)7^0$!#u8yS!&N)uOTuahCcv5GaCi5#v@T^&G;u!Y(eEPqGw zUHuf-zT&2WPlQw;y``nKvKM(;J3~)B0R`NFLH8+aM)S?+FeghIDj-CJj literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$NativeMenuItemView.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl$NativeMenuItemView.class new file mode 100644 index 0000000000000000000000000000000000000000..921acb8f6c1d76d6f323756b17904ff96a7b68e3 GIT binary patch literal 2954 zcmbVNTUQ%Z6#mW-2uX(0QfZNR!HR8w+O#URlwPc%*tC>hz@V|W$>fv_Br`BG3DWk( z2Yv9#wQT=|54x7dRUiBT{wSAwpP5`>B`jgF!kO7~_P4)pU(WgG-@pC_@DW}_p$XhD zol4p;eao>6hU=B2TXxL#v}OC!wT*JRX34E|McUQ$ZTgq>WhGnLD3321zEzVAQ;s%8 z5fM1NX4H&y*|1mBcM5CL^rPq#xVWzv3^vYz_(7nz!p{Q77Yw`TI#w~D)CfH*(09qQ zE&qzZXsXMeiJU+r;}m5aJs8jt!y$p5)I=@@;;bWzeu2RS%a)7PN7UbS$Udf85M1+PB$W?5r*(YFo(ap#l%%=N z&g^wT#|(Sv+|0bbOACzyOKAriMEhrs1~i*Lbqo zti)f}F^@0EgW|S(9BZY#bMy)%2}Qj3Ruu_yTK?lQ%bqPgSI|@z-A;6K8BXJ zH>i>#D=@s_%BRxxGLBu8wkM0KW(h1K7sZ$Kz0qchcjLU^^saC#y8P(r<`w3%WoD=s5YZH0ue2k; z>LVMp6@{VmGuZp08nCv}|X^z;thCt1`I}ZoLaVf;S#Pq^@fE%% zB*CX<7sPxA#7#nUyC6OY5$Uk+g7~llVvP{Dx*$Fd5$X2pggEsYPdXqzC&U+B5KR;b zNkHOhh5Ntk literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuItemImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..abee77571a18f807ebbd7dc84e26ffa519dab5a1 GIT binary patch literal 17657 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 HJKFyTdqkvs literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuView$ItemView.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuView$ItemView.class new file mode 100644 index 0000000000000000000000000000000000000000..04602bbe02f325ace9cb8ff7cb8c1bbda021defd GIT binary patch literal 748 zcmbVK%We}f6g}=ElS~pQkCsPyY>=32YQYY&LQ{}N3StqIMRtzol5sonq_)#Yd>RWr zfR94h&Qx8OjgRlS@5i6NzkUOFkJkzI7(U8o#f5aL(FT?MD`BQ|wIMBO98#v<@Us?+no5R)Y#z9Q z=kki=WuSK^Q4A)*ex|I7n!XpNRb!mo_(2?I^E|jGo-Jgf8Qx|Sp-a=Kk}r)|S4vu5 z8nF#=`FZ<^WemN~r?{3dYKD_r&$yDnM#JN^p&w*y-sqCFrLygEKO4;%dbVn|c9%Sz zHX9@9iwZpqZ`OGhX5m{bv?i0+!dkKkUNXG9)82Mfc5iN@!@#ib?+h6DD>+05;aU=O zBleI+>|+pd*y6nw@3(k_2T}hJk0L(Cal{imiTE@i_V6se&vEK8^_dx7;8myh53|+G Ax&QzG literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuView.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuView.class new file mode 100644 index 0000000000000000000000000000000000000000..a42593fe2fee18b226b2346a7e000020183e9192 GIT binary patch literal 394 zcmb7=%}xR_6opR#85jXEzJiNkW1~x5DT&D>8W$#*xGOU^aIw=doem^EnhPJmhce!h z@Bl1&|C;uE_x%2S{{Xnbd4i6@bx~K^6oG5EG`?Arw{`KM*#+{>SiNQ1>55#dpCv4$ zOVCr8Zp_wbYurk|EH_jHg_Io!HkQ9g;Wm3Z>f?u&ZAtzvpDh$7?PqBM&DS#X

_@ zdz@daD7>*N>)pNM%0%Wyp_|QeQGcylU(h34Q6C>zuOg}KOgTXx(VPT>eI6o}n+{I*afGqtR9;NvO#8!scbji2 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuWrapper.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/MenuWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..74af99bff793301a21dc649eb08e70091f47ee47 GIT binary patch literal 5613 zcmbtY`&V3775)y)Fk!d^LIpw~Hqka6Aa>G*J}fb5q@hj<#FT^<`q0a82{+8EcV-}| zt+llewN)GKL+krlA5~jz$r@eDAN|3<$>s9f=bjnnac3N3STN_Fd-k{Y{`TYS$v^-7 z*S`a}6W1f?P?$<)({VdlaI=|J+skh_UMid1jJuhF<7Mnre9LvV<7p>TjL-AWBc7eh zIbH-Ih5pO-mK{&onM?6=tCyW*A%ZT2F*~#7W!<%SzL?8py+V9z%Eu6Kg>c&cylJj{ zPAibjX@#y6ZpJN~R2Yf{ydPgu2+d^IoG3ccYoQx^6*^<%OWmL~79!ZA&^PC1oP}a~ z)$uOat0_leU@n`qQ%knz%Cp%F6*k;yx`6rL{X<#mqJ-Q5cMk2Utw=?6oz8 z6S28nvSv1HZ_#cK(W9KpvG_BAkWVLuKj z+|h=0l_+VGqBww0NB};ma3CO5`jCVxTyP5#gZ<6?SBS+D{MQB#;z>+Q9#=S6Csb>m zLgbQ{E#?xWUL}}TF8Pp$aMoLMJcT{ltcM+Dz^$=%b>AVn?-YltByM6YdV?LNagq^v-)j(CY#P>Gd#Cor=97?D*0P}?}JP? z+fVFD)S57!kWk%c;U3&e@>zT-A^qkCpjrbIy7M_F>8`s;nmn?LUT2TQQ#&AORqvCr znW0`!*_VjZpDh*^4XmUkxAyNs*BY)6C3lO(Rli3~w^0}MRcnM{)j+Ym!#7xoY8y(jYoqwwjRi9EIUZhSsNA?_$ADZqC~|eIrG%!Aqo^%{6DGn>mHD zl1&S)C<#-sbA|WahMiw>^DeJ8lis`$SHzs0g)}k>y>5PSgEw)qSa`^}sxTT$)EdRz zGh1u})4p86!c$NRK0BBMcLk$ zcM4i$X2VHt`a?liEU~iUOMk<{EBG2M)prKFP;&Q}TH&*EC7CMb-7PZFSB5&15gfTv z2;}2@$HKSqI(c)-?<%KFfW+3fEWDvlZTUfCe295|+wlrl=QZ1*m;wBOh410}Ofom` zzo*N2_i38J5bGZMQwu-BkE0xael9t^B&%P_>S0;^T2>3P`i-p4$m(~JK5<#SC)ui3 zf0X;?xa_?zE4}w;SsjtR4`nq%au>5jFX_y>a-a80hcw;lb{TDOm`6ML8|LqTjAEQI zZ{fNd0@A~$S#5=$_T7|ad29u^bJn4@C{2SX*?77oIl)VNc=LxMiL{=^dw3P$TS zhQFI$4of`9-AHI8Jkm878QD|9r@QeUUsZ?rKCSj~U!+3daD~9(3W38F0*5h;6I3ht z_8FYiW7zmXn_sve7E3 zBgGPxlqumch26dq)zMmHeq7Mn{ALiXGy`7Z!6;8QqC85JGUnZ z?!f%fe_*e4gQILL@A8YYWJ;&*dcJi}u!Nt~xQBe%N*<3Psmrp5r`O=nmvzco==c{7 zL~!Z;2)~9Y>E}j!Rd)IfjhS>guni=&KEK0OH?)*#0~{O-<`h4x*v<0dpbgbExDm(+ zM+k#()^K8JPL7t4?`*(GSNU&M{I^il_K440*rrw`BSawXSP4%z;(ASReO?7us$Fn7 zUl`nrta0fMy}rE%OZalA!QgETJmDX#7~ESixYrm=7_CCCM$RZk#SB$S8|g7=@vgNxn8`6Z)#_I@hz@|2#!fc%|cCXFoxGU8??O2`gl!i@#~{HKgwDxd{=8xGF&yo zezOt#bz)!puh?%JY))eayFP&LH1ho>`F^Vj-#;Xvlof|J16WsPKWQwpcQjT_1M5G{ zv2NKQOz8#zi2IY-pCy>Iovfdx`SV}mO0xX zGr5CzTgmV{PJ;~f{I-=0zkCJB{Jxb8|D(mo)bJ-f{Gqj6psqi)mKhJyHAr0_w3a*6 R;1~J(OH&!1{zyl9=RYJ6^o{@k literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..d5dbf340363fc8d32878831b8caec7565b9d7099 GIT binary patch literal 4176 zcmbtWZBrXn6n-uQ0!b(oq?W!|tOP@7*-~i%LtA-iOEh31G__R4WpjnK$!^?i0Dpr2 zMrSOY(HZ^jk8(Ws?k1arWScF+z`eVBpXZ$OoR`bL|NZ$lfV=oHj4pT`U!dp?66)bo(L0 zuZc|6Yt1Bm3|mxrETM(#=&5LI(&D#s97HS;`zZVbi{#Sp`__RdY^`oS<9Ll}Kx z_dyK(h%gLhbc1hJiu>H!QTGd+&SXqYE#y>77tij?kbS6^85TQ_v9VG}!m!lq#AX<4 zD1F3T1KVX7IN)}D-7F-g zI`_M-NQKix<2U>di>xW#ZUQ0G)#k0F5>hV>5JtTsk-I}1q#CFvQ`W#ALF3h;@WVJVS5U+|xa z2<8~#f~W)c!ot06PLScu>XE7xRO3L|t{ApnL0WzA%cpO>V(v5?ZXyywwV>`Mn`Y>C6aP?5N zvi#=?H#B~Zf}l}oJM5S1yl5b&Zjwi&3Z4Qvx&jzBy-JXGf_Qr_cS3@OVWgHEkCxg- zD{$3vGQiNC5HgL`XHp(^Yd#gBsg{Z15oQ@C>Q6P7V->(~$4BC7wVbi>OxXB>A=Lr6 zz3J)JO18DS6T=!F(;euKYj1Fj=2ruItt*9a-^38dq!7+K)y&lZcqKZElwR`u@o8m` z^o*R}3!*88rvZtYy{l$bM5D$qk6E$P#E#e_S+ink{E03)You{Z&WL`*ES>JA-yU?) z58aaV|52B?BWb-(@1uy(-vN5c)B6yuL&@p4xRAW{1{agJ-(ci-i5R87!}9x0;+i0Q z9D|s|C3>H9aQG0H>4_LHhAYG>c2~(_m)u<=jPQi6HrL`ZeG%XKlYiji)l=N?Ohx2} zB!Q=;iA&DGnu&gVjGNNLC*+J1fI_P<+9T+GqfHlt*S+%P14$!dr2{Sv4N!{UEO?|D zywVc`k!P6^A^=@6~y5QTy}M8rhdwjv~1 z@17;xCBj#22=C#(B%}g!2_I74goly8u<&yD^S4;~ho0)y-K*n@)SQddoTIYsm`iKJ zRrQOeRL5KgZMc@PB4ebf+A-JbHe9Q&UNpx#<|?(}dV;6YuXUtdt~uE=e%eWq_9yzny<$IGCQMC_y`POyKs{+c-cm8(v0%PV|$Mb`q bo%z=ByaUrRo_&8iE#qmAq3H8+zVZJ7x$|%i literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..2d31cb25e07ec2c8201a133cc5ea143b6bd6d06f GIT binary patch literal 2888 zcmb7_i&EQ06o&r=gTcrU0wEC6CM1OVLZgJz05zeZkPxTNrGc8hzqId_hPaXBeZS_5R=f=bYX3zyJOH4}b;y97m79Qpv9BM#(j8YtL|M z2hyq7rC)W^a;0M#75&JR$9h#-b$z?O_mrNyj&XP>oj76wi(QM)DEkGj8CKb`&9Yvr zA0FC{s~;_TOZlq^3{;!pM4>TTx$(zy0{yF|Wx8tuQ>pMN>7qbv!!FANdXdyHh+%<= zz-0E8OBV+ra6v;H0|Fxj(~{5X)jjF#7<&~daIs*Qj7rgPOn&zVWA1@j6Idy9U5B$p zq!i*cudI|z-8!b)3QVTb;n@fbl`7J39!sMv9f96dx;TVsd=kf1f$^{+X_&+mt+FrO zyeq2$vu*HT?YR&lVe0T2dvbzN?Vw)habexxdDQOpqyufg?Ry(H4+cuXf{9+s#dd0Bz^^F6= z*_OZ6rB#w$7HC<+mskHZrHUt>cc+Zhos9^-d`v1T`0%kp`plSCzF^N%$=!aPS$I9f>14N~BQbdH{JbdRGK zY~uk(FZozp<7kH!YF?3}w7{jXqe90-;I)PcT;}L4?+B&(fg@5Sw(Yu8l8;R8_So6$ zJmyO|cmbCf0L^KIoxHp`R5=eVshqUMDmr%!Pw40)H33lYdKu&9u<$HI{0 zaw!bCM9Ad`mBa@>fFDXdvt1UX@x^R1JC`%R^FRMHKYxAy0pKB445Szy+g{h=wvwLP=6(+Lr;tlh*%wvdUmY zr5scFQ;DeS)fJG&FhiD;PRdtJ0teMIR6Mt-n_-JXwe5xW{_7q&#V~v6Mo)?(Ytz#% zM~AER-68UA%0w19ovdo&CMFnCqDMVT(hb~WC~hfkA8hi&*b>uoFOzE2f{8he%8I^> zu|TM6P0rMI>pN-WK;aocx3FfSjs{7h=vN}Jh1=n-+VJc!;BDzhbwd5FHFevI>hC90 z*z!UuenaZEO$@%nl@Gkfu|P@E^sK2yT{O+IG&hi^afnvW=`=-uqp`%!QTR;L6pAz! zqU|DG8KDp4Qxt|#jM0iNU>qfaXqXwpngr9y2)2BV@^#oa!AcQqz8^LK)7TrRP%5Sy z6Jy`eS|=|zzF_hc#m3S(rcaSgpJmQyJ00oGQLt8dskNNo%b39|o!^S0**Hz9S26uX zOwViV{QC%b)q*Oip1Fd}C)hj|BP_#h+=*#UOsh1iUoqLJenh@>_Y< zT3#M}^udp^?3vs^gesHN*7nTyoIc%srhonZ{sX`~oPlCwF|4G!LYUcQur~a% zh=JjJ0#WqG(TfWS#4yOvo7N5&3a%8}wZoDKUhaF^;QIBpDXE z=u83=xW>@W9Y=&=D$5|d>`yz%uvV@5fwJq1Hm_DYx=iiJZC-aPTr0VytlT+FVLFQI zq^wp2{|g|28%Qx+_K$!cl`unJnu`6J)Wd@c3HWN8XzSv15h_+i;6o3TfEv-<`AXflR9Okbp;tF&k{yX%V_#6 z4;@H5#fyF|aKv-hT#IAVVor|zwMNyqa;N@7c>J-@84 z=!&`ctqwar4KJze4gG$nI$>(c_3U+}0=HCCq9{}@uem4klBUpx$HP#BQBdKgT2QBn zg<hfOKCr<-J$`6J_tFzXoOaKVwSpe{1M$r4XCyLT zFz}I9Js8q^=8HakfMHrE=#1VS!6>~ME@F&4E|J}X%LeTOEJSFX%zQ%PE3W*+NYk1a zv%X={!Yd7L8TbK1MG~M-8lnG z!aWgqzI)(ErA45)=N!uRuF%d_gm}z@rWA+yvV{agdY|{X<8ig??6mfUt1ToMR=8>h zzHB>vLOKzAM^!!P9@J&1g%SZnQt!zyzd_OKV}!3TO!v8$cYQkKYt3+}K8zVnDeY8` zmk61BAeGdQ7@il#iuGUWVv`|J_1j_!40ARtOd9W;jVYv3h-2QyG!_`*1p}R{OC_H5 zIxP{r;4M!uWa_@ly(SN&84o5CCNm88#yM-gO!u|?<76{r3!}4-N>M2`EnHz(7$%H& zyHRcXQol)I3Ck9)GHi}f6&owK#xTiUSA=1{%+MV#?*t{eGMQfC^Py9e96JE&5s;r9Yp zJe5%$PxQvRX$mU$6Xkk-DAn$^(0hK{Xkne<{=b@>mg*>QPfO3)(mIf>o)!(ED>Wk^ zyQZjjsvZwR5n8xIQX3X=R9=dEs@JegnvBysfmk|iL<*!cMxyi&h|xO@n^tGYdr0Fr z*}2l{5oSwkM@W}GBJ(Z+o~Lgr+Q7*EK$ga4Bf)V27s*l^;_`sXB_cz#mUZo!r}*9e`%QGFwC=2;Ge|&3yb(2v1gAN2JFOzTPP5JG1|ozX-kRR7*?@H VHbH>faLCKh+ypjIPMUsfgc5Pjn~F?9`Tn-EI*ECfhE!h#;dhadu}lA(uIxo_-Mvh8LUt=;r@aVZi9 z#F-z37(2O;a-x=YXJ=>T`R$we_51q|059<*fJbu2m!7Tnu#*<^XY6X9sg2G!d7Ba zp+~~0(qCTs#Z={lx5=g6G9UzY!I04DB^US)`lApnTo2GDY+eXQ=->vwiRC&H6GFS! zPga!~1h`2UT!LqaZQP1*yOgJqOU-fJus70PjmbJOkwg8U^d;jqS)^|BLxDW0*uR2en$BVno-Ws3w*b>|N z({BjBR^f>EuuStd;B)XQ`_Uo^*U)5-XAqmbmjFYyCFJ_Eb8P*@_BnP|VOj{ib_LT} sq%L8&2zPLo0cyC%5FYc~W$Ux%zyn@89I5jRJZ!A-T^Em;Sjm>ZKk@C+V*mgE literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView$TabImpl.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView$TabImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..32cc3752cade46fe285134b2ad8aa8699c68dd5a GIT binary patch literal 6866 zcmbtZXWYF;o!K+1()-*dy+4K(w~n zTJ51dl-lC0J!q}AUaWZ3+RL`~zU+P5`@UPN(&wF--JNWf7=a&|nQz|vecof1r(SsE zaRAFyjRCFD8A~T4RxIbFQ&B6E9kMftbZlqDN#*QJ%1T6bJMlp~7g^_0bXl2x$KKuA zXGMFG!wCab3awTuo=H3LNOoj+IGxEwcCCn5!^0&Gp;nj_OE|Hey-qe~r|gWvyxs!e zE=r8JVmG9^gG8MQ;bc*>;Fa!|1|#1KkS86k=Hv zVB!>bOspP+b^Au(j94_xj5}nN^ z>S2ma=bP9fI%^9$4P2lwy^OigrG)oF6O%Amcwb|}65c5V-hr6gzzoC$RepQ-^#|IQ zNU=>!K?A{_8*;L2Ek{z-h2A3V(1S1M48xbP6KN~H-pLLV#bHFT(?kL+sYz0=Lrx;z zogPWCWZB>d?>?kW4C5lcXM+2ktP^z-PHqp4V|$G6)NLVR(mL8>&^{R|f~rzt2Q$|2kQ2*B;u&kV zw8F@G|AvzK@Ol%M<1&s9G8bNWPv@kwj?CvU-iVzBt_*aa3dJW>mk8LdHt}Y>g_S{p zZe<)xW5!I1Fy4l14P2wpQ2x%u+wl(a+ZT;k2`0B`U%qALWr(!n4xD_{okwrS2Tkn9 zhZq$r?zRzWA!A!B+ZC}dcqJuE!h>Y2L^%#3kJiRM++*US_!wa&nq`eDfqLP@Oc3j( zb8^-fog2qwDWV5VJSZKYsFZm~k7Qz8L#i`gN+#1DmU#)G$&xh_0_f3&hAlc#T!PQ7 zG^>sZrEG@j=ngO6QZG^xA2;!+1Z8tj+o-}hI+sMp6QbjjvONV_%xE2wPH)AUaX1=x zj3>CjO8R@Va8b2P#)+n_yRD*HQSEiEm45 zsU1mqMoVCjQn#^(6;9tm2_OL?#!~$C=MK;EX1e!7 zT-a{~ypJoi2lucS_3{tGb&DkEPbTidEegFQf5+)lFTu;dir|m%BfTWJw0^tj8;wV7PUp^@^Y^C<%DzN>!}GtPeqGataL z`*@&nJpYE}rEWl2PoV*FD*swA$7g7s*p zMJSKX16afJH63}Zlk5GMmB(p9%G)#ZIOhrU9YDW-@M`y9>j7-@4+h+W=mEq_mM!4d z6Z9NZ>A9%W^DtMpqC?Ne3cV1g=r;80b`0tc*Xl;kMr_BRYyS|27y`w6E;ha=Pm@MG zSx=+ldF;3qM%8{)g;w#ozj+^O8*1e-j}#BK1rIX9!2=_-AJq-Dd1S@PkQ={7#s_){ z8uU`k(aW$*FGsgt5wL2#Z&d?UAcqlJvy0rPqjvIIb%@_F+JNFJZ=mlG&%G!9?Nb{J zY#nv9Rq^vJdWaH=RP4tJyK%Aa<8pc^Ue}4mbY;)IBGNUqMqcQZu3@G}Uw5HicQdN%F<+m8g}jgG(_Q7WJq5nSZ@3b4=I)t9*$DL}FfLw>`efuK3ihtF#XK%T4X9b+AE;`2#kqXQ=lrwLv$jp7- zXAVYoTOK!-^KTCDmmwK^RT94-nD<6hiH zIU=tRvQhGy^SFPEyd33?97f&&KPH^jzI|(a`wZ!Wd&da71l9V|fH0$IoPmSv&te>R zi%P<77$fX*3cKPk!X9Ch7hxRXzObOD+vw?IW8_^$Pp=Nh3r4QsDHn-K@|cNFjFEQ@ zv4?UixzzYX6b!s(>LM-eG``GTd`8#hBf+j zoT2Xw7=5Onp*GCJk2pF!T-Kwi1)PRU;`zQEG8m|$wP78B@-tuS0v~lX9Sq3NOV#Z*bkfWw z6JtxBJf5k<^ULvg9>uRK@%(0dp5Kk(A?SWT9?xB<$n(eXdHy^`4`c9`@px{=-zxF^ zeSDsZw*B+4JdF3h-KhTu|K;^$u4y4Wi|4B9_-XPip0BCH3+UpG$Db&bQXw?)|E!d% R;+4OvscN>s8RX-?{{wEvl?ea< literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView.class b/external/JakeWharton-ActionBarSherlock/library/bin/classes/com/actionbarsherlock/internal/widget/ActionBarView.class new file mode 100644 index 0000000000000000000000000000000000000000..f4dac869f5b5791dfdf6c54a47f7f10172584fbd GIT binary patch literal 14963 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/com_actionbarsherlock.jar b/external/JakeWharton-ActionBarSherlock/library/bin/com_actionbarsherlock.jar new file mode 100644 index 0000000000000000000000000000000000000000..760887c06f3efeed6e901f2363d6231166c7c58f GIT binary patch literal 166 zcmWIWW@Zs#-~htsB~A7WNI-;vg~8V~#8KDN&rRRg(a+P(H8@1i*X`da28PE^nHU1R v**VsR|%n0B=Sn5e9@=$Z{aFPysHJ1H4(;Kq?u5&<#j?fwchux(pl( literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_background_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_background_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..26816ae48446cf07d34a891dbc1539d1206f2489 GIT binary patch literal 2877 zcma)8c{J2*8-9Lcni)hUOCgLg-Z94VzR|*{8IElVp-|K$`%>XWNSYzCujLhGDM}?x zStDyic7-fi%f2gX%*;2=`M&f0_nq%P=f0l%x}WF1?&r@d($vI2fKP%C03bj$)HMeH zVsPtoC;VkM%dP)c@NkENxDR$mO*pBo;6KUb(7%&={5ML3RHy*( zvNO>?!)2)NJNP1YS3Dzmk zeWiZwNN8J>yCE}M){cge&%iWG<*1fbm#D6ctJ(Z@m8hfj?J^?{bT1zj3clc(Tjxr$ z3MF;SwpKQcG<*GmL(BE<&RA3iW)THF2soNI@y2J7xO64Dsv!a83&)@#<1p7Mb*!yC zoCN?#Kq*c z{`VTQ0B|q7<0>?Ml>#+}!Xsl0|>eBYDRKGN;yI7y;I0WIzB0p?et_>O9n7 za-~mR3+?*)yY81S>Pbg^ZH?cV#f=0qdhBk+N)7X1&!_-3jZxaPa{7we++D3M1w6Xc zcdF|dx**qIX;7Y2;ZaO06ynUYoH7Zc2O&e}JD%ao1|0hWs?4jSv+0Di`7Vl;q4&oX zn_P*$vg`TIt-2bsE+G?j&4EN{y6y9n$<5qz=9CV1*t-=@YQo^*ofzDhLhe#xA+4#_ z=J>DF=^DHBmZ-wXu$$c|>zu$+A6DAbiI>QT4^P0V^t4f2a#(Ux$f+1i?R%xgpJGt7 zwpP4IeAx2~nn8J*#pjEPbw&>j9su^xL5-4(Ii?1O1~)Z4DY|;yL0Vj+H7U%gw)fO; zV|T<2bkzjNcid9Wc9`>tbu5CJ{S^hy_n{5WYB+xdt>v5{-3)DpWpjJ@V8^#e_b-a1 zCVZXx_XsZu;utIxW{P;dxHe@j%Sx-Gvr?zGX%xqTLMPe2uBKZ)ZQ}R}`)!_?Ii<$E zuMSmMj9*b^SS|+oz6ur~OLj(poPB9{xnN6m?Hox|RXOl4SBqvbD$Hf`2x-r|6OPQ- zyjs5`zbK_vpj3b8Pca6~zEkL=8L3y5x<@b9UrQp@sxCH0NUK4}lG;D(t=ApDQRK*6 zPYK(R+ZHvaNF7rV2e;W<+9ODY&7B%C6E*kWxQ8v5XZo@?#Bz&TjQCvcE-POw?XguN zb;pGgi)7=FK!!{=rG^2kUhbKHEA zf|sq%>i*N4a#A=a?2#NWuByfZt<8RWzG;=D5o&{2heNTqP5F4l9;>|2;@7+b}ErRO@TibKd?NwD0`}gkablW zTQT=*SP|Cwj-C%z%_)|T^ZmMo`VVR_aQdD5m!lqdo2J`nepkBo)w{F5#U;PHzqDG8 zLzaPxE>^4W!KLj}Fjgj5lP#rp^+((S=Fy%}SzOQ)wgf|Z>wq5aO`wx8&MOlmBF6u+LQwE6ruI@p zU308WhvLA(r`$ipFdUD2u-Qn4mF9Hu;mR(wm1uCf6n$#;OuR9?@EYYoKzTv$n)XaB zAaCK+MaZ2xVu05@>GD!yQvZ$n#RVZg+8^Um}&Ca1=LLD8p>85M44hD8oEw0 z6+telV^KZ+pS~OEWv#WoKa3j^XAX4wm_yIoT4iUKeo{r9IYRnS8Z=7GvA)q(^`>H2 zF!<90xeXz9S1!q5O>Hk*Qy)}T2IPEZtkZS9k)iV@%=s8_@S zpTa7E{YeriI*M4v^dIdkBr?w6W`&V5l~z}+51HI+OFqSkfBv;*%Ol29MH~_eA|J@w z8>+2|`191p8~bccDkvyd>-d4p9{Rh!J((m24R>0W=v_4A^zl+WYAg>6oFjrle6S;? z@m~7xs{s|rOf|m=B|>w|cxFDWYLtaU(XfD%bQNLRwor-)u|a+eR01tVS&1fbJY<9V zVeMPz1LA$Z;KdJ3iV%8Eb4AzpC0^I=o879u^%hZm`oR;qr>H02j;whfl46gCrNOSL?#4L7MByZi;|81ZG z(u8XxCZC14S+ezg7-tWm@pGN{M~@RMOqtfw8wD=NKy9`rq@bR{!MiP?6g5y)>w!*F znTZL0_XB(Hy5v6HZ!*+z(!!?BDDxnMu|5sCmfSh02NPo4f=i40uISBe<%rluojguu zC+vL+4AE-L<-5Q}S@X^oHgK5dN`CZlTg!Nn` zi88~4%_qHO!qBfP*BrM`z|J1WaHx<1ZiL501X^w9!~DF&lb}4|l|&-Rmyg}ad~48u zvHs_q3Q`2!4B+y7txOPd0}r=5jE1cqwbh2-_ikM4Dt+AbNk-&45md5%JHxZoBWRkx z!c_+iH$&1xJO+a6$l-Q+^A^yQ2M+8@ddi4!_@-mH&MwtNO}@OcITPyp^kTp?i!wj5 z!sh9~DZ-``S%#qKVRH}m4lz8o)Vf0W9HPog3abcf-9!1?AzL5lhlDivb_n{l25Wkb zd&djRq#|Jl%LTAc@%_0QpDvSS-6*es3&OQHyv*I3O_JcuIIrK;XeCOzm_h*RL~pn#+2RDJ z=aJ~S00CVz^DaG4n{u{~XG z2m&?fSdiw)%134W0hALr^~)b&wCh!@jDJ*c{n2fHM)yQ1Dt}`AJ-iS5o4?${D31qV zeBoK*tJiq%j(0OvNdlUa@3hOg&Itx3w0@SUe0D5uId(@!}1_7%vvibF*zj z>mFSXjP`L=j~W0a%r;HLl=TfiLl!1KgJ1xRM+4joY3x{)c6DUtdo;HL-e`m7nla&- zuY9YI$mS=wok)1rVN=qV-3+W^h%Ub-_z$*y=l7mOj4C{h;7} xAi8qa9)E^=H>w1g-s7l^*}ued+5a2IN9lvn$6xsB`)}`#Q1wi7U+dV0{0ouL1H}LU literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_background_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_background_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..db78cc217a110e9557d3dd6813620e6152bca6b2 GIT binary patch literal 2990 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 CI6dV6 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_focused_holo.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_focused_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..abcc8eb1e11eb40d8e54d083e7deb6e1fcfac724 GIT binary patch literal 1039 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_V2lay32_B-XPy~FGzo$9nAy$1 z@GU6`@(X5QWMPvsG}ac8;gS<)Qa9pr?f8-;p|#{y08iV$|6fy+!d= zm1|9ybv++`&yZZRTFJoUL6-ZE>nbH*fReJ4IU;y4;$t=6rK5htrMO zs=wE-Ta+m(s3YBV&-zTK&AILdc6m+Nvcn(jfbsm!)5S5w{udFf11axr~j$w)QpI<&{pTG zf?>hG4^Q~>Bj9*MEpx;DO$iOhIFi>a^E6*HC;ymS_QA-`YEg!a+{evtWoJ3osON87 zCn0j8N#H%(ie5TP2C9_IcBOpnm&==+b>ZmxwYr2>7(lt z!&RQ|C`wMA{BmpSpKWt=AKbZd^Y63o7Vpp2seZd?VG;6E`AL6l#n(MozRp|X<9X(g ze}=KwF6krlUuFCC?UbAHL)~GF6tXJh<%qrdKjGxi)uaRh+Fjnl|t3zI~;a-)V2Eu-|Ym z*Z&=FI;;Glzq20Ke||Zkx8lLGQ$_Mi8`i)2AN>3IS5{{ED4C#^|Nnt0kHOQ`&t;uc GLK6Uc!saIc literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_normal_holo.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_normal_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0df90d8faadc02ec898f15ea4ebba8fb3cf4485 GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_VB`+)32_B-XPy~Fpb$9C5iSV~ zj>wWAzhDNjtdG{cPgT-LK)ceR>=0$Q55^E7t6U(_Id=(m06T%YJwb2E$i zcRpHjzy8I9Gme+puJ)U{Kc*g17u3G;WxZ`0!QsB5HLSIhwksTc62EcZ!THP9&O5*0ywO!fv+V{GKmRfNr4sz#=O>eRS>O+$ zU$SDR9d~Vg-dM|@W`DseW^46XK-fL%r^H{+KO3~~%$*l{@jA!r!aByf*hylqUfud^ zenfQ7Ug3Z9c5U{V^L?SmSJm&mIZ;ivztXqO*Z3ECX1kNmj(>1z)2^)5n9o_EKXKcmn*94`%zaEk?7H_!-no0iMf=I#-xE)GGryNt)ED}-{L$Qf v`wnv4Ke+ARVw=+Cs=K$|Js9s1e@(xrQt^ZJQnzcsh+^<`^>bP0l+XkKxVBuH literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_pressed_holo.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__cab_ic_close_pressed_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..e689d42c74e43facf8098ef5d3a6e0fa8934ef65 GIT binary patch literal 1129 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_VC)R=32_B-|C0#ryK<^bK+W}RW$e?M;7C55Gzlghf{g{#-&Z)q#nnlS5nKKz~`xn{MJfyaZaweAmoWN%pR zcK>IN=|)cdyLp=z-}zazb)n0x`D)HL=W;mRn60|`_xh~$%hxS*S(KR}DySpfbh*BpK!NtdLTU?h1X>ygz1qqpa zk(w2>bd|_bW!IHn>`(R6)5=b6DlZp~t4NmnHfQedTFdQ!-W_{dwQl)3k)!KozB;k{ z@`1-wKbGXA-S|AyVQT8Dm3FUE_ZK`WR&oBA>1(Yl+g=p^?4j}f2Y-J=1^nRRJ-w!@ zV1 zXO}h8{Z;N9ui4MMUXr=_NX?&?KNk!>J3bQqy;x3?b%j)NvP_$uv3=vJ_(CpWNz2Jc ze0|Rw*mv*oFYMEnjNjK)QR`gi=POcR^i2HSPuEAmLh+sNGyX(e`jPr1eA0(om1~Xm zU(5DNV%q0FKTv1q!9P_sXE*k$uzj9==HHx}mVUJaBU-huwqHWP^f6-|eYaSN^!UV~^3t zU4^}8eP-A0&3th8`^ry$5By56E;6^!{-J+&z2L8z(d{`dd)j|b`@N##uIu^wt^RT4 YTI&mdKI;Vst01p9b`~Uy| literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f54eb18716a974ad9a437e471d881661847ec557 GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^DnJ~zOda63Y3x{ zzhDLiCJQGAdrL-}-mcCGvW@k%bv13ioOvw`tvMV)9WqAkR$|pnQ7O$O{BG)1)&_y> z`O@K%+y$Ae${y}&ENMl&Qeh?{f@MiMj`CU+LdBKkA#4HH4$Nj?V65|WaSZV|{x;-h z&>;tbGcFTC7eyvD_#9Ah+7bBi*l)3;%wPZiKRWm5rkaAV`KEuTta_XC{mYrYR8@}& z5A+!s-e_JCKmU+_f5DrXAy&4tPjR&Qh|HLMK5g?kCpH%MO^Fw$TIQcT|5=8yHAx|` zZK+X>KD$d)pUo7#Fo`~~=#Q$4!ed$07tFiFCB|{LTh72^Xhw>Sa`e? zwuAFRLK6%%Z$x6|ZT?bdk&1A9PU7jnlXXn*o1EFIw@4j@nf4}46 z%ldf=^P?LH-VT+&-gLFut^R*pZ&JcNkv+VcRdbDM4A}JD_>SfM_`%W?Yx}Cv?z{SA z@fuV8jSn3ju2t|+`S^I%?;GtOW^bLLaB%-2YuPTvztcXIg0cdGr>mdKI;Vst0GPk9 A{{R30 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__ic_ab_back_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..96d8887317759f7176737265f398ba1427cfeb1a GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^DnJ~xW+toQiwz0mpuBOeGGq0tgHHRapL&m7xO02pmDy6xE-%Y*B+8~fU zUpicpyC9QQ*~49pC9Q~8D$GPguq;W(QC_P;sJOB`ge~COf!PcUjCGzajv*e$--g@_ zI^-a5#$`h2qR6BMp92a`I|4r*`z>~q`Ro7xN9P{hR8tT(-}LX4Rc~{?e>u~as_HS} zfj%R{8_g@?=O6O#FL*OE#L9N|DULQDkr}hkr)@sx#Kz*jDe>Y|%lwn)Kg%$-CMg8A zEj6mqXLpI}vzek7CebGr{ZVyMcr2?LG|gm$P_EZ|SC<$iKx<^R;)Ck;wOKHRo(W$xqiSotd;=Xl=}BUVU#93y+uL z*5t|A?Ylg;I!ij4Z$DbpvBkIV&M!XyprYN?S8D6)Pxz^cmM@sx!x#D3YMHXEW5F5M z1-q+@yzcUzJNNU~m6NT@C+~VPSt(kw>)`6RnJo6Z%X3Bc?7UiRAaqRT-Iosc?{{2$ zSwBx zUSq1i@u9=RwF*8eA0My!eWU%u?5#5t4(>l>E!(B|ciN{?P*z~@boFyt=akR{0Bjr^ A1^@s6 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1820612c36e2439b5bee54d80412d65356d42b52 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^oIq^A!3HD`KM5!WQXzQ-A;}C(Odtt-fCVVY3dG_- zECIxfXc)*v6??t5Ag!j{~8pVYE3UAE-6f9-2G(Oxa7P?J>|A%asy4fXad^*)}}JaNV<9)_fa;!CGh Rzjp;$=jrO_vd$@?2>`WeGXMYp literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..28ef2237520f451378b0cc3c335ec06a067dc2be GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^oIq^A!3HD`KM5!WQXzQ-A;}C(Odtt-fCVVY3dG_- zECIxfFg%kX?LQ2|#6UDt+j>bLt?TLH7-Dfc`Op9V_RNY0PE7b#ucqkg!{gEr=(@Pe oO|(}_D%50E$E_}j&XuPa-ivdDxw-W}18QXOboFyt=akR{08@4-&j0`b literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..80509cdfd1eb3cf9e79aa805b6d3b5c729ea10f2 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^oIq^A!3HD`KM5!WQXzQ-A;}C(Odtt-fCVVY3dG_- zECIxfFr2t-=YJT6iGgUDL>&zvt?TLH7-Dfc`Op9V_RNY0Hr0qbD=E7A@VGPtx-RZ= o6YbTK3N=~PajQ$BbLA<9ykrhp6^`}0fEpP*UHx3vIVCg!0I@_UZ~y=R literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f4e44a97955a56918ba39be998ea78b4cd3843 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^oIq^A!3HD`KM5!WQXzQ-A;}C(Odtt-fCVVY3dG_- zECIxfFzm~a_8*2}Vj%jwWye<_t?TLH7-Dfc`Op9V_RNY0PE7cAfBFO^H8!OKD;5R1 oF79#@?bVVBb;)(@ITDh}@cJnSm-E;2Aj=p$UHx3vIVCg!0FE6hA^-pY literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1289628fa2bc01b3ec2e7c38c3d6c8107a99af GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^qCjlV!3HGx6`GF$sgS&akYolXCQcw5AK(T`@&K_M z5X(0J2@nPX#s(k(!a#t+PU{r-3luZ*ba4!cIQ;g^Mn(n!h65Xlb{^){+ptlUJtbuI m_HS>PSB7X!^;#N)p!QmQ`N;Uo$Sd9mWTdC7pUXO@geCyw(J2Q2 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..233da8e3aa1cffcc8ee5fd218b7ef1674e7dbaff GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^qCjlV!3HGx6`GF$sgS&akYolXCQcw5AK(T`@&K_M z5X;Mh2p|RmMqKQ54W&_4sa{Lr)R$KbZpRqstURz*6J)-ptDnm{r-UW|UMVQ2 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_default_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ed820cbbb4fc5c24d50c085efd165b4be2814bc1 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^xj<~o!3HFkmpxwyq(brvLXsJnm^guK7?1-p%z+rB zj2$Wn5|amFAs`lpieaM|fr4OsBlVI6kUhuK#WAGf*4xV)c@H@VxLiESDiD0)sGrQ_ zOB_ot9usqA?Rz6E_a$!ECDzZSp$G#D9Lnv#<#ku;Nx#vJircU|qh82o%YlSNtZc%% z1~W1m54v#ks6{0hTx4qQ6q7)cnw@WJJtL#I{^sgc+a&Y5#l(0(1}99reQ)9J`Oki? gH9U5li{Zf18pbI>mTMWacpE^{p00i_>zopr0NsX9s{jB1 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_default_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8d42e32d91ff695de934fdf250bdec44270ae12a GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^xj<~o!3HFkmpxwyq(brvLXsJnm^guK7?1-p%z+rB zj2$Wn5|amFAs`lpieaM|fr4OsBlVI6kUhuK#WAGf*4xV)c@H@VxLiESDscJuGe4Qh zmpGON9{=jX+V@6S?n~URORS$uLlFiRIF#Fe%j>SxlYXNc6}Mq`M!k^FmIDckSlNVi z4Q6CC9(3X6QHx42xX9GpDJFp?H9OzddPYWZ{ms>@wn^r9i;3}o3{IGK``*Ic^Pl}( hYk2H97sG+2HH@#{N~Y^CRjmO@d%F6$taD0e0sx46QL_L5 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_disabled_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fc08574ccee68cf3a2a041e7f9982a04f682a765 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^IY4Z~!3HFoU&LDhsgS&akYolXCQcw52IPPYGav>j z17Q#ViOB=85D*IkF)qLelmKG~)u3HK_Cik=$B>F!Z?Ej;JnSIia`7Yo9BCPeDZ7}y z#vi=)&?=QSLJI@1zT zH?nAVt42iX96Xi887AhvVH1+nq$gR|&L-JT^6}K$UlYC|H_6v?Ui6-~-a1{ZASZuV pd-+yk&qt&4bj z17Q#ViOB=85D*IkF)qLelmKG~)u3HK_Cik=$B>F!Z?Ej;JnSIia`7Yo9BCPeDZ3iq z?q}Kh&?=QSLJI@1zT zH?nAVt42iX96Xi887AhvVH1+nq$gR|&L-JT^6}K$UlYC|H_6v?Ui6-~-a1{ZASZuV pd-+yk&qt&4bj z17Q#ViOB=85D*IkF)qLelmKG~)u3HK_6AQE$B>F!Z*OemJ!HV(a*_FB@CF9wfX$4| z20-MiRpvQ&ZUW;a!Pf43*}6M-=$rc?Oun%u@l@rzocwwFdrUd5iN033!Is1sCg#0i zQ$*9$qe5$RrX{3qWYO+cjfm7acnVo6=VruqmG$w*ye2hgig$kXDT;rTr@ux+3~2U& zZEv3OwQ1&mUh};0=e=X`Ni%QW|CPM%TIAIXCWZuCdF>=^MZZ#yJs@Xzy85}Sb4q9e E067<06aWAK literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_focused_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b17ba12f4dc9dc51a19bb64749a0aec41de98c1e GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^IY4Z~!3HFoU&LDhsgS&akYolXCQcw52IPPYGav>j z17Q#ViOB=85D*IkF)qLelmKG~)u3HKrn9GuV@SoVx3?U%SrR1AuTX#Hv5(eSYzO_gm|?KDPhwt-LEa zLB(?t9DPxK$Z>1wy4R5ln0_4ycG)AnX79$ZhNTOanm@2oikscadHl+)2!`MTuRb&# zjFNc0t$L3^$qu84)5&w~Wn}uYQZ|Sk`z7&ZRp5QYh(!@>-eRW{P9{m}MCvrFcBgJg z*~l|ZXWGF@M~xyjAxk!R9*>qZfh*#}}iKYWr_ zyZm?2R@*-AN^hOTzj`AcSj#TW>x@3|WrpAV?hfwqh{(D3t+rdQxuX}&CdU14i`<3I z4)^8SK#%>^R<3WCjSaG%w}12gkG0bOUwRx%0Q&dWE8z#nuh`t!c-|Zo=AN#8F6*2U FngG+5ujl{( literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5305fa27076670a03d6edb5ce9b01b8fda2188dc GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^xj<~o!3HFkmpxwyq(brvLXsJnm^guK7?1-p%z+rB zj2$Wn5|amFAs`k8Vn&Cwng3xlhz;X|#6Y-v&!rL|W$NkT7*cWT?Oj7JW=9#fkJ~rj z?r2TW5}vT3V{JlW;?f6_HcjQ9^qkh%wCZH`Ol_SSDl|J{S-_?p^Y>kUFY;gBnEAF( zY5D$j4Z;sNG;Rb$Gp;{S%)I5mk(oUEHWfyRCcLp(BqhF}j4$x&y~Ksjmvp8rnwbGa zYO{c-6Npgw)9!yf_CqPt9e9b_um%U)&3H@wT=JGb-6bb@CE8hEx7&0;{GhjviSV7 aCG!uMMS8S!hXBKofx*+&&t;ucLK6TG5~|Yx literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_pressed_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__spinner_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..db9795b9f187eec576f7677b6e28458d3c60c95c GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^IY4Z~!3HFoU&LDhsgS&akYolXCQcw52IPPYGav>j z17Q#ViOB=85D*IkF(WeeowfcNG9Sdg&iXYLNQHR1IEGZ*dV6PM)}a82wukGZ1n%6K zWGx_GSa|BuHP1JqC7Z8b$-BEtb8gHMXJe7TJ4|!mTw$wXSIug7<6LO?btc3pUJBa+2pWFB(O*@vPm$yH2{%d0uZr4h30PQ|Gt88hT@v*FCQ}) zI7fJXie-Ppvw^|5jdg~h&Vimp#xx#ogXD+?$-_)%B*YSqAxU{&QcW(s{3!KK%-*xj zXRTKLeZH%~^2N`WdOv=}Y>i!WR`;TSnDrUQz5jAGG)uPHS)YkOv%bvk>3{D#TDJ4` z=h&1;`WLc>n{Vzp>9`?c|M6*Q^$thH@~ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e32e685f4a7e7a7ad30c24ac0279243015b2ed11 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^96;>B!3HExhi`cfq(brvLXsJnm^guKe1I7!$qK|^ z`v1%`3=KdGqd^)$d>~+i;q0hC6M$?FPZ!4!kK@U6D%&2~Gc%buy{wwSAk56@5WvVi zX(P`|H6C6bATT~ZA>q)9ra;!kTyCO0S`wiKs~YBUNdzzd_s3p}uSFDS@Jr4YhxQz2 P2U+6j>gTe~DWM4f18g(5 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ec10b59bf73583842fd5a7e005a553330280d9ea GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-X!3HE*OU}jvDT};F)x;)?!V`FPmzOnQ~G6RFUDKn3M#HRBgJ3L+e KT-G@yGywqTRT;tn literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_pressed_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_pressed_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6eea722c6cbda193fc1737a289ec775409964100 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^96;>B!3HExhi`cfq(brvLXsJnm^guKe1I7!$qK|^ z`v1%`AhnDjdR6ycyU_TFzd$rd42E0O(*FXvC7v#hAs)xChFbeE8;Z=CSvq&}6Rv?81{J;NR=404)d-gwJ76!IVkw3qxv;GGisl|7M6&sAOB@d!^q=TE$V9d2-B8 zxrv)SH<)knm5bdT_pbZpkJd9Tuv+=|W=Klc#fWjt<+R(KsX zSbbt$8QZa-+9qAY^D9z3LKn4N`W3Xlt60F0Omph)s`^>bP0l+XkKIM&L& literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..86a18383f3cb2030098ec35b0be5aad3dca70182 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|x!3HGnl&a_fDT};l&t>WfYXqI`*QlP7CA% MPgg&ebxsLQ0LO<-{r~^~ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4206afbc55e9a97290c462ee642e739f70853eb5 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^96;>B!3HExhi`cfq(brvLXsJnm^guKe1I7!$qK|^ z`v1%`3=KdGqd^)$d>~+i;q0hC6M$@YPZ!4!kK@U6D%&2~Gc%buy{wwSAk56@5WvVi zX(P`|H6C6bATT~ZA>q)9ra;!kTyCO0S`wiKs}e#OS8_=NFaP()KU$k%cNpi3_@<)s PAUix={an^LB{Ts5(d;wG literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2ffb0bbc53a8eb2869a907c49af018b88f42fcef GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-a!3HGrH`~quQWkjyA;}C(OdttD0Hy{^|4*Iz zllSe5I-n*=PZ!4!j_b(@4(vTEgX{mLCjdcH=K)Cu_dcc{dLP6tf=u>w^>bP0l+XkK D3nm=V literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_pressed_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_pressed_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8a7493110a4638cb08e0ab0b9e9c5b1f70a026 GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^96;>B!3HExhi`cfq(brvLXsJnm^guKe1I7!$qK|^ z`v1%`AhnDjdS&-M+u(#rKS4A|42Er^?-T*K&7LlfAs)xKhV2eL>>w~lQnS@<0n3RO zja(X?4MGLHEiEkXpb^Ss0MDN$;!R zwAqqucf2njjSI}1-J`;-kr{4cx^wl#z`x(T&n^+`Jm~7#Tl@0L>Sfd3oYm;DH5IzM zhPi^_$vly*i~Edn8(2)uecmsrjyR`wFzj+zT}j^FOX9ab7|%MHnyWcUefP=9k0sWy z-3aNvCb^Y0@{Zuu7R}~|8d@7)xQV%5bvqn!N-(E0)$MEB6q&2OYxTEozA;_tSi(}3 zLt8vgP7@L0N^dr-Og-J`sLb|0DMQCRO(EEHaiP{MgVdsk5@*T(PS1|Famd=6HMcP` rSpDQ>SaQ})#*VSUeEa)<_j5mT@2uY;S9R1t5EN&gu6{1-oD!M<+Z@+` literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..199464b69b045327fdb0de31b8464f406a64edf8 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|x!3HGnl&a_fDT};i%vjGoF_@-Y|_GtS*P^?kvKkFma$HZ=+Y+bl?V@bL8 z%|E|v80Y+AGH3|U?Yp*sW96y?Z;qddZ!5XXzu`fiMZ&%}ODAr=A7Zus;orSB-#t0c z7GH4;^O*8pY~J$r8|hL#mrhI;a4C>DKrkiTs9e%+g@_zRHWVU4fJGPqA%bl<V@10h6~mF`NRdN}f}}t&90}KQhC3u2F&lSg{d3>U`(1D5y+40Be!iYsnix$0 z0JMl+ga815DM#S6x~j4su|0M~*#Z-i0;2#B)cB_pxw|r~4T)$rGm2|)m(?zmM;cp_N-==T(hjpyv z{=6_VCUAIp9ObHso*y)EUp9+LWZVy9_T65oVBbALyOw)R-z+ZY%^xWeGtNJ1qF427 zIw*^6b3W(i2i{V2rn;vt43V@X|o= zzH^ue0=$xbcPhqI=A9Tv%~4YIf=r7TlhziPP6;8srg(`h!+;GN293Hv?WntcE8{O( zquHX6+i{j{_n`;XwwHP_;%6zwBjV8USD|@@X+h=A7ilc`EG4sK(?n{U3bTr-+ND-@ zujTYyJDuS@i9MH|9348Qj<4Ax9!-9lD#YM4k&v9<7^iPhnY_n^uCRRstfNmPZi#plq{N7qQXUwGjs> zF#5?Gvb1hFdU(hiS)NtpdEuYg4OeO85S}!I+9wU4xP$7-csw7)%r5SypVf$9Bydmk zP5d=rKyqr=@r&-x*nRKL$ov8f&*S3qvn_)rwk$x+@7K+zFc3*>jmBMxe>s>*sceZS z^}E?D+DSL<;$U{L*K~!;f%IU~8kp4kU<5O;vNoD+JOj@ci&FvDtJ@(XQHQy#HL5vl z{lG`WYgYU!KkHjZ$_A)NYL-p?N`!f!V7ijh9pa1`z zL`veUAP1e$>>;E4u_bWyO2&$pEc`1zr_GDkWH|UeSY+bP{tu~cdYHU>a(IPx1ksuuX@-dq0%4LI-? zed6m7X*0_|YpumTR0rW!ICK0tY5Tfg+6BCw!Wgw{4kzF6F==wS$&4GKYS#VkOut%K zi;I5aLO=I3S3MHUT*K!duongn(MQG#I1aBp%B8eN-ZFW#mh6M+9xDzAP%ARrR8*@b1z+Tc z$fiZ|_59g_V@{rvEbRV%s5Z2)R?8KPLYaaTU_Fa~MNN2?MdWt8l&r~6gX)*&C<=H;7W1J>EAC;7GD{t-m1Bcg7&*8G ztTCjau>e~w^ZXzSXBo5YnD$~z(}{&(KA*`I3ma97s$K2LagoSGH6)QY4FC3qV471# zq}96pcv+*)2NnzZJ@V?R*iZCe^jk!>Vq)0)=`OSLvXfUEHMyjFK-e-+)tgZl!(AdQ zCGuS!5E?Em8w-Vr&&4HiK%l9ce~T>G%x%DzH+ZMr>K$JlAE1se=&IoWmmgU6>WUm0 z{RSR6w2XAmD8%Y@pvE&hR~vHb2Qw=H+tg`vI_^= zJo6txE*VxWccGr-+cOmI=|x8Y{p$dGffV@h-Ant~AKs}#5(H#jE3)5YaoETW7)`n8;3g0gPqX}GajFgL=Rs=tvmVe{{aVdHKzao literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_background_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_background_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fb30a707d58d82ae6b6734790058382f684556b2 GIT binary patch literal 1813 zcmaJ?dobJi7XSVth=f)mw6*n$*D7fhwd$E_BGGNpt}3de)m^U=T2z~s#A+K<5s%Jo zFR@-Nt3<_8>pePHyGX9avt+j{R#WjzmB>wZ=H5TLLLE8lDv5IRGF<3mgzCii)u^!zjczCe}9;z+h^ho&N)v!rN64uArU#AHRbCP%(c_ z{X1Eq|3&`VfF1xUcRYzFe3K@`m(IpaIjYaP&QeJHFSJSCE06e2Z7A*f*U~)rBliFk zQvb_D75}TD1FN;-1A8pSw?D2K9EE@+|D);y01Oqe1O=1KS~d9{<2J54cT*~wI-JmL z7=B^fW|KW#Slr-RB}wsp%8I_do{Q|Y58)U{1va(oz4sF)Ix1ZI_?*V9?>JASPc|wp zuxrJf8P}qpFCsh3V!PbD5GQ_7iZ_EbF|$(70=0ax9s>%sl!wIyYP4Y;jbqikgO>O(rVnB9|9lK z?ym>V-P;jj2{%?tao5*3@i=OuM1LU0$SBXnv4NQr7$!=975CBNlzA;+WYxPL%1@)} zs9KkyScYxAf05^xgbBxvaxpW9bnzTo05r@lvP5^706ah050W(R*I>SwTy~i(_a8l za=+AOweKqw=OH@#lJS!T_ho}D4)*wssFkdOt6A0U>=oq{Nu0j4Bt^fl;tZDeYg8Y8g3Hs^2t< zSRTs3Za|s-yqo}x&I{@~_WNn!^dHv6m564P(2XOzX(B5e-@QapirkE_+rn+Xv}zbz zDKxU7wY#p~-79F~MWdl)OW5H&*oc|5Rg3P#B1AY!;^;p{hMXBI9&kSEidz=$i6dFj z^lsA9*I)D;selwq*b6k)+O*{7Ex;2Tb@}-uoxarW96HmM5rxjX>fy1DI9gw+KEX)X z#+J;2MD~v|w%A)6YIdrkvk0hH#t(X%b0zpx>dUu-o5d|%5gN<`Fz!BNY6Z-2FD~-P zst`vY4q9l>fj&pz{sUplx}<$R2O;(cPWC7XKmEwe)`3;~L0>O@;;q z43pL-EFkCJDwL6lJAGG*%&Q;i3bGz9V0rRyGa2deWuVcK5P^_Hva{dU{Zv=*VC43- zeRBxs4VA-VDZ!o~*s~aAcpOxz|aH^dJIq$8z_0ZdhiO?krZlgzdjB}#1sI^7< z8)^$=D&@RSUUX&Xtj?SPR!eP7KX}y8(BBK4+uq=P-X&gM>^a4kUjp_g0Ph%xKyp1m zt=S(7?c|)GlkwgmXxsl8j0_lvRCBDF-huNjQJ%Gp6BBzcrZ1v=z9M z)lTN$lVT2i+E1>LCvgPx;^ey_O)A`Pwz>?y=zk}F#Trh7X^vM`ytUGLii=*O)Ngtu zNsnV{q{M&@~X~WECXfHIewZ@x_Oon0H=7?pwNE>P+GgN~U`X{De3K#)u(CK;j*yu2Zd8lC)Q*hH-mLBhfke}- zsJ+m}j=o5b;ux5J8&f*Z6=I1o2cFfPmi&HxbvFpQovc>Z~bmXP2XizoQTn zrjdm#eTT1UuZ-NXl!lvuIJEQDW%eU8R0y%!rx{>&v!qD6RJg{aKajvTAUMZ zOXN*+m|=!h_gaO0vZMvKnTDKkOORr_YE~`R^?C7eG)h2RCyoF7+?E%fkBNKoe)O*t zc~WuM`#KR|{o<`wD^qU{gAM;HH-7R@V>kr~J(uZ}#B&JkK^ePuzGB;GiMQj^L^E!& z^{~5e>OkMcma2IN&o7I3vR}^7Ky@QGqA)*;#RYn55L}$fKt!vxY54#Phmmp1&$U0kZR#ovE c{s)YR6}Q0?ejf@}!qq=po+K|~tvfaK-|0gps{jB1 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_focused_holo.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_focused_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..9e590b1d67b9ce1d44e9e654fc996eef699bf095 GIT binary patch literal 732 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}OsL32_B-XPz0+D6{i&GcXjw zN`m}?8F-ZCIeArB4UG-Bgmu|^inzsRrLgGy|5dW+YciwR`QN2W=1bY0`%`YRY^k7} z&DqKoi%(arS}1FM>Tm5DQL7VkWsc7_5~^6ffI+`ZVQ;U5`Mxs~_(b&gN=pF4+t|~^ zF~s8Z)yXfTnjA#h0uMbiKC>wG))rfpXcO);LAO_IIeP8){;7P%ONEO#h5<@@1M%Mz+kQI`G7f&bzxzA2Il>Tnv`@FotQo?x%mfI zd~CDjBh|3D=QYW}5=XXMJimQHGylfHcXH43T6x&-*?nBq&Rp8zEF(KP&{-~S?hnof zFR~|GRCp|MPqNVdAg{8+=Q*FR9bNjOzszVA!(2V_=Uf{uAKK&gTq&ZfT+ zU3wI<-PUZC+EKSMe^m*HJ0Vz_ZY4HSdL& zo0i{nzGr?^?iz!r^Qqh?%9G|@Dq=V$e0Gjfd1nrPep}a1r%U#H^_)6kUiyDbpGt3y zT=Tzd`7^WE2g(9JCG>YS&ym0RXP(!=KgNr4mHjR2oa*@g7N~GJ?Uc556BU0r>$*OF u?0!zwcl`>L)1Pabww$}`{(s~DPi)5Lcz+rFd|eFm5`(9!pUXO@geCyjFyq+( literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_pressed_holo.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__cab_ic_close_pressed_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..623629418581da26a07e2b5259f5fc26ad4bc677 GIT binary patch literal 803 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0VAKil32_B-{}T z)fLTy50WA5nP(Vgo?+Z^+xOr9zbh`Q&N|C{@Ifk2>ih3E^Uw1GrMBPpUVd45#T7N6 z;H$5vA%fd(d;a_PXZd9%pcKTMH($@sKQFNLmiw~Hipwvny#00&%ys?y@7J@;-ePU_3c_x;TbdoW45wdDI~X0as>;JKYLWr!zv5#FZ8; zSaGB+_6_Tsi2MI#=ZGXSS2EnK|2%i{nKO4?0{>m)Y*m&$>(%RK^*2V;Va@C9UCbUO zzvqd2d{emgI!x-q_5LFbDm+S_&WGnMbd+Cs(a>dPZ z6KHj~jjecI<+USCHZFYK-Z@VMnZrS|T{JgnFd81iefz^^`-v0TYm%Qv|X#T1C zSv!VZ`b_?vzcI>}lcprzGuqFrHOKv;>5})0qb_eg^M2;-N}C(Ul;=IUT~qh4W^av- z`q%K5rDCOf_D+}jx$)yiPQjp>@3}9|*62zI#Q!sWwdkAfPo;(1*e0&}waWhM>Awv8 XK3Yo;Y%`Ju#vX&GtDnm{r-UW|D9gLX literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..56720f338449833385ce058abc91837f9ee53ace GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^5q|OKUgt!9fGs6hfluoz=^pa~y zkY6wZ10xFuJ2zWWO=*KalXrK0n|58Zl0Zdmr&D~peN&Z?qAq7ai*HD_S)+7DoNTK> zVuEnBondH44p)(ns)l=4IWKEq>=nmkpn<q|OKUgt!7}<6#7R=dG9s^pa~y zkY6wZ10xFuJ2zWWO=*KalXrK0n|58Zl0Zdmr&D~peN&Z?qAq7ai*HD_S)+7DoNTK> zVuEnBondH44p)(ns)l=4IWKEq>=nmkpn<Uo`e_llb1a>Tm zGXMj_2Mjs}Q!~HqmXHJrr^%N5?hik{;>ZdXT@?xO`E`K^*;inRXklBLp07O|M~ylp4sfci3#88)yz26*klqyl0uSJ eco{r8#m4Z5ox^O;8fzt>dInEdKbLh*2~7aQP$FOe literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0175fea4d1928f5baba707cf0104de64c8c612 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^Y(T8Q0U`}8Ig^1@NM1omG6NG6CyC9Ikt>Wq87@~1L`Op9V_RMAnHr0qbE17YsvB@NaB!wic e@G^LGij5(Njr}i!K*JTFdInEdKbLh*2~7ZkA0!zopr07eEQCjbBd literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..80cd8e6171f7d64c46eb68a7f5d681b9b16a7876 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp@K&;8Z1|;8ITO0$VLh=eik{OtoIDu?@fE_5w0mQ;U zEFupiKo|%Zaj{=|Uo{5Gt9iOOhIkx*d)knZK|z2)am$JC{wpO*?8?NB&E8zAG1Y5n c(8`cQtZT{`3wAE`bpsjc>FVdQ&MBb@0J5YZCjbBd literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_default_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ff88f7b21d08a61e74608401ebc9f3d206f51d24 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^oPJV49~6~jg`0tLa?;f|d;kX`TT;uw-~@9njXyoVfk+5(+V^XVKsE3h}{?{}+)=g9#q8ji=mSafVn0 z_s+NjLxi literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_default_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9e758667ac958925deb1832645b45461740bb531 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^oPJV49~6~jg`0tLa?;f|d;kX`HP;uw-~@9njXyiSfhE{@J#{3Z|O1T1?m zy!h(E=kfnti^~S%g@>2(#(-_gdHwG6@3%Uq-4`tPINrEUNtaD1Qz@Wk$xMff6VsTF zx>89^O}0;t*S>u*>n= ze1+y4JDYlY73FT-xbxd9`02uvnjoD(;5aoX=>89^O}0;t*S>VCDEt zUa|Vd&Zgd8MY&ry?)>%&e!B3aCP*g`I6j>d{P)a>qVCOtC;E-AWp`RsPTAri74=%P zVvgsfSGAsQGW#0^kEb6|45(FDAO9`4@zIjk+kS0H=N3t?-gU~E{ZrckbEPwmdzZ}p r&&t3M@KUPzs*I(F=Ff z``m-jHDYNwDLY$lItQ9{Fl}OMy8ru#?6y6J-~9K6nBTDScJS}-n;oV(&S`V_TJb&kZ#qNyI^Ud4)f9@8@WZ~pByb*!*n#T&a*RF_(kgZ zlfm!V7F#^k|1SG&fpZKCBg6kRVzopr0R7-(0ssI2 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_focused_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4f093152ff90a20c77b3b032bdf71b1fe69cf63d GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^9zd+Y!3HE_CHKezsgS&akYolXCQcw521I}i6(DAT zVvsmUOcaQDfS4DEaREl41Q_3#vu`Po>E`L;7?N@C?Tn3H%#H$W|Myz+20CAgP)$k} zK5{O6!`97ys*jX8Dw{(zYgvP%qu38cdh99@-~TogEi2NiW?x>W9ip${eNLrv#hGKSUQgFBuV6Y+?tZq&X2tb+lRu_~@9QfCHE(E( z{Zsh+*!2C^^7f7=3?ed@)n5Kra5}O6(^9s%$1N`DJV}vX>zezosr^~Cqi&pz(+T;H ZT-Wx_c(Lr-Wld19d%F6$taD0e0svJfseu3h literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__spinner_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c611451085dfc8d4e3076818c38b7096f4c97f93 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^oPJV49~#EcGUGylVA5F5q^iGi>%t6esbe(CAr7?N@C?JaArLk=Qt5ASPe znTd5xI2Us8mb+$0b^-UhlSgmdi1uD}Bb8lAaZzh*QzcKt3)|)MGVOL4@NC~|Z{t2G zZIacZnwd+w)iqgOB+Gg(RA1Tcnid9aFxNRKZN~+Nl>i9W)I&6A0<;(qxL6EDO@K-Pl#MP3>3?X2`q{rKTl$Lp{;UwutZ%sYc-o#f^>L%x{xanw%diP0=$nnb5Sh<-$Tir`3vvx*h+& z`?33NvN>$|pHV_PD0A}*{xnmdGgcK$7C7+b*{?^e3{#G<748d8=KjN?bWV)BRqUl; zhXad}KqH5X0+V0|ki*Jd6RsSv`M(In0WTW7<31}gT&>%4S+zN4 t+xll4kLoYbY;gP2_~g)yrj7P5xHFywOf_y7}7k{O7> z^#7S>7#e^WMuRkh_&~r2!^a&DoB*;dJzX3_G|nf_scd^_&&*F&6Bu;@ wM0tRK*T8X&mOCp57IGRb^ZWa={y+{pgS8aFVdQ&MBb@ E0D-I>`Tzg` literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_pressed_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_pressed_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e26b4f9514158be53863b197a97ef4c5a16af37e GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqQ!3HF6-q`RPNQLATgd{UCF>wOf_y7}7k{O7> z^#7S>Kx!F5^s4T?cA@bTe}QO_7z}IJMlS_&6+K-XLp08>oxIoA*-@Zn|IG4@+J)Q# zfy}Z2LX5f(#7=l{-sRw%FyWwcfxVr$rcwu{9L6wOyRB}?blhTT#okHqU zb{)Cw_{&UVqR9;QH{p?hcoWjvuymEO_0HbB0my&v!s{QoKr`pS;DkG$Ro;J6<>>T-Jqy3M9 sh&krf`?vGW-?h8`e0*I?y>A`kwWMV`lTt$80|So1)78&qol`;+000%Ce*gdg literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e58bbc6313fd4cf1f857e8abcc61b03340de1d03 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI_!3HER7z;E4DT};p)YFn-ll^r+@9lqG Z|A|4)M=LP0V!15HVoz5;mvv4FO#mV|Ij#Tz literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..32575002ca796c6dc25796a7ebbe0094462e1b4d GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqQ!3HF6-q`RPNQLATgd{UCF>wOf_y7}7k{O7> z^#7S>7#e^WMuRkh_&~r2!^a&DoB*<&JY5_^G|nf_scd^_&&*F&6Bu;@ zM0sAS@$ed-cVKy__5c5W{_xJw-zy#fp+YZzopr0Of}_>;M1& literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-mdpi/abs__tab_unselected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e18ac5dd627f7ef65b5730580797f7f9de50b9fb GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrH!3HFQ?xr>YDT};wOf_y7}7k{O7> z^#7S>Kx!F5^vdpiw!sOLeu8L_7z|Hzc%TL3YJ0jkhG?AcoqXE&hyjDkeV>|Ew*@Ra zE;5S-2(f!5WIs4DQQ2gZhew9u;e+!{b-Fu5Zf;DsnXj^|T8Ux(?e5=`FCWilxV%o` zYvs*6eRBr=^Zc_nf7bqX!X!kRy>{Q7a$&YAr+2M3+TSlGFT8lz{FhEiO(4^iqkW31 zOpI5vRIamjE->?(X0hSQWf`uQvjdb=H6~ij(vWo8Iwvl+VDpoElU$ccW;)Z|7)ozuOwa{%XBof#N#b?F;TKH(7YHKq|x8NY-}6?FMo4`yFR% dYVOpxGpN7h(hgMUTK)uNx2LP0%Q~loCIHyYJq!Q< literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-nodpi-v11/abs__action_item_divider.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-nodpi-v11/abs__action_item_divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b21f8f1f7b5544c8b1abb9c72526d053037ed7 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>le~hEWCkWCkOUzBQ^RPyZ{NNi o4x42_4cwkCjv*Y^lW(N+FfeXn_;lX<`w@^ip00i_>zopr0KJnGkN^Mx literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-nodpi/abs__action_item_divider.9.png b/external/JakeWharton-ActionBarSherlock/library/bin/res/drawable-nodpi/abs__action_item_divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cac34343e2aea495c0c6a297c488e9d6c36de846 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>le~hEWCkWCkOUzBQ^T0HZ{NOx o+lS478n``O978y+C*PRP#=!WLQ8lS|K?TShPgg&ebxsLQ0MwflXaE2J literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/checkstyle.xml b/external/JakeWharton-ActionBarSherlock/library/checkstyle.xml new file mode 100644 index 00000000..87be4031 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/checkstyle.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/default.properties b/external/JakeWharton-ActionBarSherlock/library/default.properties new file mode 100644 index 00000000..3ac5a46b --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/default.properties @@ -0,0 +1,3 @@ +android.library=true +# Project target. +target=android-13 diff --git a/external/JakeWharton-ActionBarSherlock/library/gen/com/actionbarsherlock/R.java b/external/JakeWharton-ActionBarSherlock/library/gen/com/actionbarsherlock/R.java new file mode 100644 index 00000000..52876783 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/gen/com/actionbarsherlock/R.java @@ -0,0 +1,940 @@ +/* AUTO-GENERATED FILE. DO NOT MODIFY. + * + * This class was automatically generated by the + * aapt tool from the resource data it found. It + * should not be modified by hand. + */ + +package com.actionbarsherlock; + +public final class R { + public static final class attr { + /**

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int abBackground=0x7f01001e; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abCustomNavigationLayout=0x7f01001f; + /**

Must be one or more (separated by '|') of the following constant values.

+ ++++ + + + + + +
ConstantValueDescription
useLogo0x1
showHome0x2
homeAsUp0x4
showTitle0x8
showCustom0x10
+ */ + public static int abDisplayOptions=0x7f010016; + /**

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int abDivider=0x7f01001d; + /**

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). + */ + public static int abHeight=0x7f010020; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abHomeAsUpIndicator=0x7f010021; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abHomeLayout=0x7f010022; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abIcon=0x7f01001b; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abIndeterminateProgressStyle=0x7f010024; + /**

Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int abItemPadding=0x7f010026; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abLogo=0x7f01001c; + /**

Must be one of the following constant values.

+ ++++ + + + +
ConstantValueDescription
normal0
listMode1
tabMode2
+ */ + public static int abNavigationMode=0x7f010015; + /**

Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int abProgressBarPadding=0x7f010025; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abProgressBarStyle=0x7f010023; + /**

Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character. +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int abSubtitle=0x7f010018; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abSubtitleTextStyle=0x7f01001a; + /**

Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character. +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int abTitle=0x7f010017; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int abTitleTextStyle=0x7f010019; + /** attr name="actionBarStyle" format="reference" / +

May be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. +

May be one of the following constant values.

+ ++++ + +
ConstantValueDescription
wrap_content0
+ */ + public static int actionBarSize=0x7f010007; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarTabBarStyle=0x7f010003; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarTabStyle=0x7f010002; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarTabTextStyle=0x7f010004; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionButtonStyle=0x7f010001; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionDropDownStyle=0x7f010000; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionHomeButtonStyle=0x7f010006; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionMenuTextAppearance=0x7f010008; + /**

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int actionMenuTextColor=0x7f010009; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModeBackground=0x7f01000b; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModeCloseButtonStyle=0x7f01000a; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModeCloseDrawable=0x7f01000c; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionOverflowButtonStyle=0x7f010005; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionSpinnerItemStyle=0x7f010012; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int dropDownListViewStyle=0x7f01000f; + /**

Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int dropdownListPreferredItemHeight=0x7f010011; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int homeAsUpIndicator=0x7f01000d; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int popupMenuStyle=0x7f010010; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int selectableItemBackground=0x7f01000e; + /**

Must be a boolean value, either "true" or "false". +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int windowActionBar=0x7f010013; + /**

Must be a boolean value, either "true" or "false". +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int windowActionModeOverlay=0x7f010014; + } + public static final class color { + public static int abs__item_bg=0x7f050001; + public static int abs__item_focused=0x7f050000; + public static int abs__tab_text_color_dark=0x7f050002; + public static int abs__tab_text_color_light=0x7f050003; + } + public static final class drawable { + public static int abs__action_item_divider=0x7f020000; + public static int abs__cab_background_holo_dark=0x7f020001; + public static int abs__cab_background_holo_light=0x7f020002; + public static int abs__cab_ic_close_focused_holo=0x7f020003; + public static int abs__cab_ic_close_holo=0x7f020004; + public static int abs__cab_ic_close_normal_holo=0x7f020005; + public static int abs__cab_ic_close_pressed_holo=0x7f020006; + public static int abs__ic_ab_back_holo_dark=0x7f020007; + public static int abs__ic_ab_back_holo_light=0x7f020008; + public static int abs__item_background_holo_dark=0x7f020009; + public static int abs__item_background_holo_light=0x7f02000a; + public static int abs__list_focused_holo=0x7f02000b; + public static int abs__list_longpressed_holo=0x7f02000c; + public static int abs__list_pressed_holo_dark=0x7f02000d; + public static int abs__list_pressed_holo_light=0x7f02000e; + public static int abs__list_selector_background_transition_holo_dark=0x7f02000f; + public static int abs__list_selector_background_transition_holo_light=0x7f020010; + public static int abs__list_selector_disabled_holo_dark=0x7f020011; + public static int abs__list_selector_disabled_holo_light=0x7f020012; + public static int abs__spinner_background_holo_dark=0x7f020013; + public static int abs__spinner_background_holo_light=0x7f020014; + public static int abs__spinner_default_holo_dark=0x7f020015; + public static int abs__spinner_default_holo_light=0x7f020016; + public static int abs__spinner_disabled_holo_dark=0x7f020017; + public static int abs__spinner_disabled_holo_light=0x7f020018; + public static int abs__spinner_focused_holo_dark=0x7f020019; + public static int abs__spinner_focused_holo_light=0x7f02001a; + public static int abs__spinner_pressed_holo_dark=0x7f02001b; + public static int abs__spinner_pressed_holo_light=0x7f02001c; + public static int abs__tab_indicator_holo=0x7f02001d; + public static int abs__tab_selected_focused_holo=0x7f02001e; + public static int abs__tab_selected_holo=0x7f02001f; + public static int abs__tab_selected_pressed_focused_holo=0x7f020020; + public static int abs__tab_selected_pressed_holo=0x7f020021; + public static int abs__tab_unselected_focused_holo=0x7f020022; + public static int abs__tab_unselected_holo=0x7f020023; + public static int abs__tab_unselected_pressed_focused_holo=0x7f020024; + public static int abs__tab_unselected_pressed_holo=0x7f020025; + } + public static final class id { + public static int abs__action_bar=0x7f04001a; + public static int abs__action_bar_container=0x7f040019; + public static int abs__action_bar_subtitle=0x7f040018; + public static int abs__action_bar_title=0x7f040017; + public static int abs__actions=0x7f04000c; + public static int abs__content=0x7f04001b; + public static int abs__custom=0x7f04000f; + public static int abs__home=0x7f04000b; + public static int abs__home_wrapper=0x7f040009; + public static int abs__iprogress=0x7f04000d; + public static int abs__item_custom=0x7f040013; + public static int abs__item_icon=0x7f040011; + public static int abs__item_text=0x7f040012; + public static int abs__nav_list=0x7f04000e; + public static int abs__nav_tabs=0x7f040010; + public static int abs__tab=0x7f040015; + public static int abs__tab_custom=0x7f040016; + public static int abs__tab_icon=0x7f040014; + public static int abs__up=0x7f04000a; + public static int homeAsUp=0x7f040006; + public static int listMode=0x7f040002; + public static int normal=0x7f040001; + public static int showCustom=0x7f040008; + public static int showHome=0x7f040005; + public static int showTitle=0x7f040007; + public static int tabMode=0x7f040003; + public static int useLogo=0x7f040004; + public static int wrap_content=0x7f040000; + } + public static final class integer { + public static int abs__max_action_buttons=0x7f060000; + } + public static final class layout { + public static int abs__action_bar=0x7f030000; + public static int abs__action_bar_home=0x7f030001; + public static int abs__action_bar_inline=0x7f030002; + public static int abs__action_bar_item_layout=0x7f030003; + public static int abs__action_bar_tab_layout=0x7f030004; + public static int abs__action_bar_title_item=0x7f030005; + public static int abs__screen_action_bar=0x7f030006; + public static int abs__screen_action_bar_inline=0x7f030007; + public static int abs__screen_action_bar_inline_overlay=0x7f030008; + public static int abs__screen_action_bar_overlay=0x7f030009; + public static int abs__screen_simple=0x7f03000a; + public static int abs__simple_spinner_item=0x7f03000b; + } + public static final class string { + public static int abs__tab_under_ab_tag=0x7f070000; + } + public static final class style { + public static int Internal_Widget_Sherlock_ActionBar=0x7f08001c; + public static int Internal_Widget_Sherlock_Light_ActionBar=0x7f08001d; + public static int TextAppearance_Widget_Subtitle=0x7f08001b; + public static int TextAppearance_Widget_Title=0x7f08001a; + public static int Theme_Sherlock=0x7f080000; + public static int Theme_Sherlock_Light=0x7f08000d; + public static int Widget_Sherlock_ActionBar_TabBar=0x7f080001; + public static int Widget_Sherlock_ActionBar_TabText=0x7f080003; + public static int Widget_Sherlock_ActionBar_TabView=0x7f080002; + public static int Widget_Sherlock_ActionButton=0x7f080004; + public static int Widget_Sherlock_ActionButton_CloseMode=0x7f080006; + public static int Widget_Sherlock_ActionButton_Home=0x7f080007; + public static int Widget_Sherlock_ActionButton_Overflow=0x7f080008; + public static int Widget_Sherlock_Light_ActionBar_TabBar=0x7f08000e; + public static int Widget_Sherlock_Light_ActionBar_TabText=0x7f080010; + public static int Widget_Sherlock_Light_ActionBar_TabView=0x7f08000f; + public static int Widget_Sherlock_Light_ActionButton=0x7f080011; + public static int Widget_Sherlock_Light_ActionButton_CloseMode=0x7f080016; + public static int Widget_Sherlock_Light_ActionButton_Home=0x7f080012; + public static int Widget_Sherlock_Light_ActionButton_Overflow=0x7f080013; + public static int Widget_Sherlock_Light_ListPopupWindow=0x7f080018; + public static int Widget_Sherlock_Light_ListView_DropDown=0x7f080017; + public static int Widget_Sherlock_Light_PopupMenu=0x7f080019; + public static int Widget_Sherlock_Light_Spinner=0x7f080015; + public static int Widget_Sherlock_Light_TextView_SpinnerItem_ActionBar=0x7f080014; + public static int Widget_Sherlock_ListPopupWindow=0x7f08000a; + public static int Widget_Sherlock_ListView_DropDown=0x7f08000b; + public static int Widget_Sherlock_PopupMenu=0x7f08000c; + public static int Widget_Sherlock_Spinner=0x7f080005; + public static int Widget_Sherlock_TextView_SpinnerItem_ActionBar=0x7f080009; + } + public static final class styleable { + /** Attributes that can be used with a SherlockTheme. +

Includes the following attributes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescription
{@link #SherlockTheme_abBackground com.actionbarsherlock:abBackground}
{@link #SherlockTheme_abCustomNavigationLayout com.actionbarsherlock:abCustomNavigationLayout}
{@link #SherlockTheme_abDisplayOptions com.actionbarsherlock:abDisplayOptions}
{@link #SherlockTheme_abDivider com.actionbarsherlock:abDivider}
{@link #SherlockTheme_abHeight com.actionbarsherlock:abHeight}
{@link #SherlockTheme_abHomeAsUpIndicator com.actionbarsherlock:abHomeAsUpIndicator}
{@link #SherlockTheme_abHomeLayout com.actionbarsherlock:abHomeLayout}
{@link #SherlockTheme_abIcon com.actionbarsherlock:abIcon}
{@link #SherlockTheme_abIndeterminateProgressStyle com.actionbarsherlock:abIndeterminateProgressStyle}
{@link #SherlockTheme_abItemPadding com.actionbarsherlock:abItemPadding}
{@link #SherlockTheme_abLogo com.actionbarsherlock:abLogo}
{@link #SherlockTheme_abNavigationMode com.actionbarsherlock:abNavigationMode}
{@link #SherlockTheme_abProgressBarPadding com.actionbarsherlock:abProgressBarPadding}
{@link #SherlockTheme_abProgressBarStyle com.actionbarsherlock:abProgressBarStyle}
{@link #SherlockTheme_abSubtitle com.actionbarsherlock:abSubtitle}
{@link #SherlockTheme_abSubtitleTextStyle com.actionbarsherlock:abSubtitleTextStyle}
{@link #SherlockTheme_abTitle com.actionbarsherlock:abTitle}
{@link #SherlockTheme_abTitleTextStyle com.actionbarsherlock:abTitleTextStyle}
{@link #SherlockTheme_actionBarSize com.actionbarsherlock:actionBarSize}attr name="actionBarStyle" format="reference" /
{@link #SherlockTheme_actionBarTabBarStyle com.actionbarsherlock:actionBarTabBarStyle}
{@link #SherlockTheme_actionBarTabStyle com.actionbarsherlock:actionBarTabStyle}
{@link #SherlockTheme_actionBarTabTextStyle com.actionbarsherlock:actionBarTabTextStyle}
{@link #SherlockTheme_actionButtonStyle com.actionbarsherlock:actionButtonStyle}
{@link #SherlockTheme_actionDropDownStyle com.actionbarsherlock:actionDropDownStyle}
{@link #SherlockTheme_actionHomeButtonStyle com.actionbarsherlock:actionHomeButtonStyle}
{@link #SherlockTheme_actionMenuTextAppearance com.actionbarsherlock:actionMenuTextAppearance}
{@link #SherlockTheme_actionMenuTextColor com.actionbarsherlock:actionMenuTextColor}
{@link #SherlockTheme_actionModeBackground com.actionbarsherlock:actionModeBackground}
{@link #SherlockTheme_actionModeCloseButtonStyle com.actionbarsherlock:actionModeCloseButtonStyle}
{@link #SherlockTheme_actionModeCloseDrawable com.actionbarsherlock:actionModeCloseDrawable}
{@link #SherlockTheme_actionOverflowButtonStyle com.actionbarsherlock:actionOverflowButtonStyle}
{@link #SherlockTheme_actionSpinnerItemStyle com.actionbarsherlock:actionSpinnerItemStyle}
{@link #SherlockTheme_dropDownListViewStyle com.actionbarsherlock:dropDownListViewStyle}
{@link #SherlockTheme_dropdownListPreferredItemHeight com.actionbarsherlock:dropdownListPreferredItemHeight}
{@link #SherlockTheme_homeAsUpIndicator com.actionbarsherlock:homeAsUpIndicator}
{@link #SherlockTheme_popupMenuStyle com.actionbarsherlock:popupMenuStyle}
{@link #SherlockTheme_selectableItemBackground com.actionbarsherlock:selectableItemBackground}
{@link #SherlockTheme_windowActionBar com.actionbarsherlock:windowActionBar}
{@link #SherlockTheme_windowActionModeOverlay com.actionbarsherlock:windowActionModeOverlay}
+ @see #SherlockTheme_abBackground + @see #SherlockTheme_abCustomNavigationLayout + @see #SherlockTheme_abDisplayOptions + @see #SherlockTheme_abDivider + @see #SherlockTheme_abHeight + @see #SherlockTheme_abHomeAsUpIndicator + @see #SherlockTheme_abHomeLayout + @see #SherlockTheme_abIcon + @see #SherlockTheme_abIndeterminateProgressStyle + @see #SherlockTheme_abItemPadding + @see #SherlockTheme_abLogo + @see #SherlockTheme_abNavigationMode + @see #SherlockTheme_abProgressBarPadding + @see #SherlockTheme_abProgressBarStyle + @see #SherlockTheme_abSubtitle + @see #SherlockTheme_abSubtitleTextStyle + @see #SherlockTheme_abTitle + @see #SherlockTheme_abTitleTextStyle + @see #SherlockTheme_actionBarSize + @see #SherlockTheme_actionBarTabBarStyle + @see #SherlockTheme_actionBarTabStyle + @see #SherlockTheme_actionBarTabTextStyle + @see #SherlockTheme_actionButtonStyle + @see #SherlockTheme_actionDropDownStyle + @see #SherlockTheme_actionHomeButtonStyle + @see #SherlockTheme_actionMenuTextAppearance + @see #SherlockTheme_actionMenuTextColor + @see #SherlockTheme_actionModeBackground + @see #SherlockTheme_actionModeCloseButtonStyle + @see #SherlockTheme_actionModeCloseDrawable + @see #SherlockTheme_actionOverflowButtonStyle + @see #SherlockTheme_actionSpinnerItemStyle + @see #SherlockTheme_dropDownListViewStyle + @see #SherlockTheme_dropdownListPreferredItemHeight + @see #SherlockTheme_homeAsUpIndicator + @see #SherlockTheme_popupMenuStyle + @see #SherlockTheme_selectableItemBackground + @see #SherlockTheme_windowActionBar + @see #SherlockTheme_windowActionModeOverlay + */ + public static final int[] SherlockTheme = { + 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, + 0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007, + 0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b, + 0x7f01000c, 0x7f01000d, 0x7f01000e, 0x7f01000f, + 0x7f010010, 0x7f010011, 0x7f010012, 0x7f010013, + 0x7f010014, 0x7f010015, 0x7f010016, 0x7f010017, + 0x7f010018, 0x7f010019, 0x7f01001a, 0x7f01001b, + 0x7f01001c, 0x7f01001d, 0x7f01001e, 0x7f01001f, + 0x7f010020, 0x7f010021, 0x7f010022, 0x7f010023, + 0x7f010024, 0x7f010025, 0x7f010026 + }; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abBackground} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + @attr name android:abBackground + */ + public static final int SherlockTheme_abBackground = 30; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abCustomNavigationLayout} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abCustomNavigationLayout + */ + public static final int SherlockTheme_abCustomNavigationLayout = 31; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abDisplayOptions} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be one or more (separated by '|') of the following constant values.

+ ++++ + + + + + +
ConstantValueDescription
useLogo0x1
showHome0x2
homeAsUp0x4
showTitle0x8
showCustom0x10
+ @attr name android:abDisplayOptions + */ + public static final int SherlockTheme_abDisplayOptions = 22; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abDivider} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + @attr name android:abDivider + */ + public static final int SherlockTheme_abDivider = 29; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abHeight} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). + @attr name android:abHeight + */ + public static final int SherlockTheme_abHeight = 32; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abHomeAsUpIndicator} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abHomeAsUpIndicator + */ + public static final int SherlockTheme_abHomeAsUpIndicator = 33; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abHomeLayout} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abHomeLayout + */ + public static final int SherlockTheme_abHomeLayout = 34; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abIcon} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abIcon + */ + public static final int SherlockTheme_abIcon = 27; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abIndeterminateProgressStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abIndeterminateProgressStyle + */ + public static final int SherlockTheme_abIndeterminateProgressStyle = 36; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abItemPadding} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:abItemPadding + */ + public static final int SherlockTheme_abItemPadding = 38; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abLogo} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abLogo + */ + public static final int SherlockTheme_abLogo = 28; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abNavigationMode} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be one of the following constant values.

+ ++++ + + + +
ConstantValueDescription
normal0
listMode1
tabMode2
+ @attr name android:abNavigationMode + */ + public static final int SherlockTheme_abNavigationMode = 21; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abProgressBarPadding} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:abProgressBarPadding + */ + public static final int SherlockTheme_abProgressBarPadding = 37; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abProgressBarStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abProgressBarStyle + */ + public static final int SherlockTheme_abProgressBarStyle = 35; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abSubtitle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character. +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:abSubtitle + */ + public static final int SherlockTheme_abSubtitle = 24; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abSubtitleTextStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abSubtitleTextStyle + */ + public static final int SherlockTheme_abSubtitleTextStyle = 26; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abTitle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character. +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:abTitle + */ + public static final int SherlockTheme_abTitle = 23; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#abTitleTextStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:abTitleTextStyle + */ + public static final int SherlockTheme_abTitleTextStyle = 25; + /** +

+ @attr description + attr name="actionBarStyle" format="reference" / + + +

May be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. +

May be one of the following constant values.

+ ++++ + +
ConstantValueDescription
wrap_content0
+

This is a private symbol. + @attr name android:actionBarSize + */ + public static final int SherlockTheme_actionBarSize = 7; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionBarTabBarStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionBarTabBarStyle + */ + public static final int SherlockTheme_actionBarTabBarStyle = 3; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionBarTabStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionBarTabStyle + */ + public static final int SherlockTheme_actionBarTabStyle = 2; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionBarTabTextStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionBarTabTextStyle + */ + public static final int SherlockTheme_actionBarTabTextStyle = 4; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionButtonStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionButtonStyle + */ + public static final int SherlockTheme_actionButtonStyle = 1; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionDropDownStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionDropDownStyle + */ + public static final int SherlockTheme_actionDropDownStyle = 0; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionHomeButtonStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionHomeButtonStyle + */ + public static final int SherlockTheme_actionHomeButtonStyle = 6; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionMenuTextAppearance} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionMenuTextAppearance + */ + public static final int SherlockTheme_actionMenuTextAppearance = 8; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionMenuTextColor} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

May be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". +

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + @attr name android:actionMenuTextColor + */ + public static final int SherlockTheme_actionMenuTextColor = 9; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionModeBackground} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionModeBackground + */ + public static final int SherlockTheme_actionModeBackground = 11; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionModeCloseButtonStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionModeCloseButtonStyle + */ + public static final int SherlockTheme_actionModeCloseButtonStyle = 10; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionModeCloseDrawable} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionModeCloseDrawable + */ + public static final int SherlockTheme_actionModeCloseDrawable = 12; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionOverflowButtonStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionOverflowButtonStyle + */ + public static final int SherlockTheme_actionOverflowButtonStyle = 5; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#actionSpinnerItemStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:actionSpinnerItemStyle + */ + public static final int SherlockTheme_actionSpinnerItemStyle = 18; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#dropDownListViewStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:dropDownListViewStyle + */ + public static final int SherlockTheme_dropDownListViewStyle = 15; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#dropdownListPreferredItemHeight} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp". +Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), +in (inches), mm (millimeters). +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:dropdownListPreferredItemHeight + */ + public static final int SherlockTheme_dropdownListPreferredItemHeight = 17; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#homeAsUpIndicator} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:homeAsUpIndicator + */ + public static final int SherlockTheme_homeAsUpIndicator = 13; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#popupMenuStyle} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:popupMenuStyle + */ + public static final int SherlockTheme_popupMenuStyle = 16; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#selectableItemBackground} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + @attr name android:selectableItemBackground + */ + public static final int SherlockTheme_selectableItemBackground = 14; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#windowActionBar} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a boolean value, either "true" or "false". +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:windowActionBar + */ + public static final int SherlockTheme_windowActionBar = 19; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#windowActionModeOverlay} + attribute's value can be found in the {@link #SherlockTheme} array. + + +

Must be a boolean value, either "true" or "false". +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:windowActionModeOverlay + */ + public static final int SherlockTheme_windowActionModeOverlay = 20; + }; +} diff --git a/external/JakeWharton-ActionBarSherlock/library/pom.xml b/external/JakeWharton-ActionBarSherlock/library/pom.xml new file mode 100644 index 00000000..83c1ed2e --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/pom.xml @@ -0,0 +1,83 @@ + + + + 4.0.0 + + com.actionbarsherlock + library + ActionBarSherlock + apklib + + + com.actionbarsherlock + parent + 3.3.0 + ../pom.xml + + + + + android + android + provided + + + + + src + + + + com.jayway.maven.plugins.android.generation2 + maven-android-plugin + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + ${project.basedir}/checkstyle.xml + + + + verify + + checkstyle + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 + + + package + + attach-artifact + + + + + jar + ${project.build.directory}/${project.build.finalName}.jar + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/project.properties b/external/JakeWharton-ActionBarSherlock/library/project.properties new file mode 100644 index 00000000..05e464d6 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/project.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +android.library=true +# Project target. +target=android-13 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/color/abs__item_bg.xml b/external/JakeWharton-ActionBarSherlock/library/res/color/abs__item_bg.xml new file mode 100644 index 00000000..1a5e2ed2 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/color/abs__item_bg.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_dark.xml b/external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_dark.xml new file mode 100644 index 00000000..ef120df8 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_dark.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_light.xml b/external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_light.xml new file mode 100644 index 00000000..4174d184 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/color/abs__tab_text_color_light.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1a916b3fa658aefb8e1c0b5364a96d1ca4e0ff70 GIT binary patch literal 3307 zcmV

5Q;P)ht&%0ssJDJ#Yj70C02Q2mk=!=D-mE0Kmo0swH+>`Is zQL9(0E7h^~MSH$`=U=1OqTgFjv)yZN)mPKWuc@>Y%Z}&P&mVXzvcvKDT=}3^M{qpL z$|V)`4`E$YQYZ6_Ct-OR;Q=lY{%k}Gg^MH zuGW}ZjI`BgTeF0gJk5EI)aliW8stdCE|qD3s zM?fUspfy8LJ{&H~B_~imIIiij_D@ruC1;fb%8LG5^≥sIk_JB}>^^o^5z%WdNSw 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 R<#YeUTUpqmYLV9y{|}w)s%roM literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_focused_holo.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_focused_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..9d7f9320824e805a66428fb71ee8c464a1c9c0ad GIT binary patch literal 1292 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v_d#0*}aI zAngIhZYQ(tK!Rljj_E)ete@fByPj|c1{MKN7srr{dv9ml&KGwTId1sq2<)l zOJ+Bew%MG~v6W4$v)+9B)0XF%-`~8M`93{8{n?zxOJ3S*w_KXHT-8)+l2q?wfz6ud zck?#N?qxZ{sC9thf~@-;T_u?r>}SLbcR%WAPv)C&rNXs5uyhyDrP!r9(827p>)Gh&)${EOcSnT7$2!;n8P+rNP6lr8;JO^llJ)_>bkr8v7uoEu0;#tqciQ z4A!xf85rfOF~&2l|Lve+s+RTf?4i4iIYQs{GdjMMXPt|hyNN-r^Y!NgzK<)pKDya* z=>y?3*6)RnftpLzHoHpJ#c=o>*6w3=RKJYXG%Nr8OoTXb^gv}`j+*O z;r|gq=dUbjdW)-+wlWKE$u|4IY;ZrriXn%&PIzDRiu(se_Fubn)&GE<^1Y`PkM=t; z@O4D4sK44GaYbOi)vsH;Yc|?gbJoad-IG4RXc+9QV=&9^lE8kBc-QXuT+UjiABP0$ zHTz!u|9y}_YLTn+lAQtCugarR8ecg0p5WTRUU6OMlf;LmJN}D*eY*DuJM)#sA958} znKlYXFs|9uV#QRW`|fw+YQ;yzj1~%M4EGmaVwSh&snLG-JK*Q}3D18YWsniLZ0b^d zY;}8ywdOwKzIl3c&$Bx?n=CH7E|N4$Z2OUqryQ@$@mvcuzPOY9e9o4>zvo}f-6Z~^ zWJ@hij7d$c>k)CLf;Ss>Z(MJ-z%A2$L(C5&;R8CStvhocl{3Dt++){q%He5Wt#RLu zx$fQ{I9R&uIb%#~La!YAy6wYLxlRR!_8;eE9`!G{)ZBke_>lAhzp$VCmi`QMGg~?D zW6KBMXEBd*BcBF_ROQ~{33->YOtyK&q)&4`RG#OYKg(im;?f_o^B(<{h)laYaYx#o z$$dwn4?VXPiZm@es#rI7=}*J%AAS!uHSBobka0~QEilFU*hhAUw`(>r{J*03&tmcB zQ_EjE%BKemhQ zmk*U*er@hl?VloFeOJ6OvYnslIJM2bt;0NN*2*6~4`d&#$tY9rn`g<$$$mjLth9Zb z^D>2xr3y>#_A3AT(kUEtB|K0xJamWrBCZb)yu2KA%$iaOr$RMTRdP`(kYX@0 zFf`CLu+%j+2r)FaGBB|+vD7s%w=ytjxukLvMMG|WN@iLmiUuPq6LTw5sD}Nqz5jt4 wBtbR==ckpFCl;kLIHu$$r7C#lCZ?wbr6#6S7M@JC0V-nfboFyt=akR{02O#C=>Px# literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_normal_holo.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__cab_ic_close_normal_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..641507dfd263e0be919b5c3d33f43662c3492018 GIT binary patch literal 957 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 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7855cda9a8ac11383c8cba9e511cef47da34d7cb GIT binary patch literal 938 zcmeAS@N?(olHy`uVBq!ia0vp^DnJ~5v|}#;DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2z2)9V81ZwN`ba4!cIQ;h7`ED6kiDMuAuf9?F?JO8l z)Zyjl_CZ0TxudIV*P%u0PR`e?2-vJP!L);G-2<7HioigDl&K9Y&1u%VXKV4_z5Hdz zUE{s%`j^h9&U(3hf9(0-{7}95$2O7=N)Vt@CEQ zsC+H7X(Ds{>CX?Q#x0v99$O}#lD=1;d(*xJQlDFV%T*jVy=${|ocCvS&c}+Tl(VVI zJuKPZ-p=#MXIv4u?dcw8M={x-0fDz(*($l*ELP)lNlB0SzS?5`Ij4Z!*K>4_D?}Dw z4nK5K?iEYuwoMtg+map4zP0&f7_!f=;O z@3`-GFV(GeD7E6R+|Feh`E{{>rvGx$D>J@qw|(R>VeOC8$Afmx*>x>C=b+0??|CcL z=8A^jedV`Yd$B_0on_TcMVIz}e4BIWE3+@hrpn7F zeJazUlkePEddbK;_FBU6_vcP{n8g_B-A=eAZ=yT>=>2t94vOnlIB%Wo_q$2U_@Mv3 zEozEZA2xM=npC^!YSb}a`{=cwD~~s)I{W=@%nB*UaZgm?=9|0u>W2I0Z!M7t-jct) z%VyW>$jL{)?aEUE&J=hTfIHjbk!>^ z@x5l%Nw@f~Z1_HR?=C^E^}7_d+FxeOx^a7JeCxd4z3E$RSDq8R`i)C|r@q3D=X=gZ zx}Im=v`zf)qtB}>o0;`1cC8f@Yfv*5ng8=3o14-$TOH2j7MZW@&X?UOdg1V}FLb@~ z`RLdG7n-h%pVcd}{FmLV>W6{JJ!@ILukL-Mep+4*lt>)^r~hTP7Cn)1$Gxo(m`cS; zTq8=Hi&7IyGV}8kLNaqx84L~e4bAlp4bHAP!vs{J3R01hSdwa$3{sZLU}RuusB2)X zYhWH?Xkuk#Vr2qkTUZ$w%xvJ0MbVI(pOTqYiK)Q|szGnlPBowg8ITRZ`DrEPiAAXl njw$&`sS0kHMXBZaMcKs)&cUXITOXSN)iHRw`njxgN@xNANkNij literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c06277341b79ba8c24133b40787307da8cdc2a02 GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^DnJ~5v|}#;DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2z2)9V81Zvyl>Eaj?aro`E)7>(m62~4spEJwvO`rLd zikB&8SRXrxeKdOHbZ}}UOW>LLnmYtsS$n0$wLF}gq&_nBSuJyRQV}*W{O*4O)*GB&Bk|2w#wHF@5#Zi%dtTQfsk zDrwR5uS-s-l+~(6v#d8Ynp$<#HF$#M8`+r(mqkpDud#mL7c$}1&ok4TayI1OdR5gF za^00v$nm=Ae7)t{nL=ijIo|h}(0T0M=IOVyVgwhR>5ki^tyFwMecREaC1Fj^w#k(r zWLdIn-^bPsd)l%bTi5!0nWn7P48&j zeVDadDadyIZ^tvanM|{mf1Y689T5Ee=SkI7mshe(o%OHHy_a>SX?{)%ZE z1U?IW-nDG=GiCEvmsg(F@Q^LPXWz8vW&CcN>|JRK7#*K&*j~Ei=;sT^m%g9fXqNs` zM*CIgw>{B&Rr$8LEids}${smOQ*%GhSLSUw6$e5lynMBL(tMZN!^;+&-E(Z>?6?VB zO&b?4n*UiUe4&^_?Fp9pR~E@33;b@DY3J8FUodb#xZbboOoT(y-R+fszM86buV>Zr z;GH}91dA~L?)&Ad->Uv*=L#t~ej+m2(O^^F@vWiXCOutP8MMFp(8fb?&syI9jm=-r zWU~GEw#~bO4u+f$oc{Uq0$lty6Dx7i&4HR-1pBqbGLgi0A$t zv2#OsSERf*KVP*W;(5DFxvGC|y|3wlNqaZGo;N*NUGCz?&w#-!%A z>t|s|^4E literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e354629abcb251566c9ac0a611406da603b01937 GIT binary patch literal 1098 zcmbVLO=#0#7>?W6uY-vbHoe45hKIHJlC(_|T1VP6uCUJ8RqSwwrODSeZ22+yX1kum zgWv=idXODNMe#OehzAi-P!SIbiXaN!ysGS=UWECjU8je!gMsAx$@@Id`+H$>;%IO8 z{%(RGdedWa7Oy?{WjovPcj@E7BwhwlDvze@BC4n^BqZG~Kr(HrC76Y(zIgf-j1fd@ z(a7adJ~J+Awi#4?n_$&+Fq$A@qg6-M<{%;quw+ieT76lv&j>SQ9tv06#IyHKPj8#QUU_zvlRde3*#A=+X^NM)yU(*y>H$ii8s^L^VGf5_G7n0#1 z2xuSz$Osc;xDe0tBP0tLKm(R$*Z{+e94i7qZax%NbM>N_m6c5`e2PBm*K_D~l7bz@s=FSqDGItx8}!PRg*ibG8>&fU&Jz9IHTJmwm> zDC)dyYYQf{P+E>t_)kzbbTJ_-DUK0XDZzqBlwqPugq0(qa3ah`gpd+#a%_iXl7LT! zc%T4IVHjBv1c{dwhEtN^RD$E#CN^z(NVPQB)HSef0~=9x#EMB5s>pV8wmskMfXT9r zY_DuPWO6D@W>n3v{Ig%4Mzk_?jWbYJT-zk;`4x?A^pz-&eda@eZ^SL}2`MTuKmZ(< z;yHoZ#OnW(Ga5TX`_1uBvox=82m0Hs*2jmf;ei&O7#EMm^y`*YJXW=|Eaj@73coit zMq9;MU2p5&C_V3cd1v4NG5EBlF!FG<V*mgE literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..367c7d9ee09d5279c5230bcbe12bdde2c548a973 GIT binary patch literal 1060 zcmbVL&ui0A9FOY|oem}ZC2iA$)tV-aE39*Lg%wXrlh-zE$&1OG&2|y= zAnu}P&mx}u2Rx`S9D^MMJ?Ql0LGUErh56DS)5F-oK=OX%`}usnKOZeF+#DafIL0u{ zcxBG0(e(^{#ZxEgckA;Noi0jq7|p>=#8y13jcUkpHty`AS%yiq+E)e_}B|5nqg*(abVf2h_Fr6cKrhP^VMsPb)5pYoUMXtprejEw;7_P&4s$X zxoRs8SG>;7#wsQ75V6?UTk|6|E^s|wmF|;kfn$3nWVOKcooZAUSsjOn&GH~^gB)OU zkcU!6mgQ@#2p|xEC_pg{WmOVY0NBC9QMJ%%sWrnKXwg%F>ktyCg3#@D`L4v{uq{AE zQ4$VOOjC<=wBZvgPW#dHkikHa9l8N=vCk%qRuiw20!KaVhu{U(>LIZo4H89DCd5`C zKpqI5m&Dbxjz|stb>m3usJ;;(p@t&79@?}Xt?40{=I(f*#E^QU-U?k>6l=}E_PU3B zQZWh~{lh!1qm~S_EI~!oN+QVRA0raTFHnK-M$4ya^-|Lc>%P zO*Tv@nR>Qdl4Nm+t@shKd>ajQU8+04%Ew|=Jwz74VIAYOVFxUBFu_p=2duu7WviC$ z`pG#dPd{1%h3;MCm?8GqUVc^g2z@gzQ=jDwko$3Ka!Jc;5GX*B%Ce+z1FZ8uITNTe zLed=nG|TXcc3`qSY<+q-93JG;i3#aw?0h;mL&vIKF|>NT-~4@WP)w;Sjx#!T(B7Wd zc|LiGnR+wQdM547n5pxr(<}8~FTR~vJUjpK!P}|r@7n&uclT;v_wrAlm=_*jz5HWq gw^N!}eh)@QCz%g7CeiKjFU4eTE9C{_WohO9AL!>whyVZp literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9eae8f41c82bd6ed7d765660bd2f897999863b02 GIT binary patch literal 1061 zcmbVL&ui0A91m{JF&T=WYzp$0!49$}FG<@pp>?!P;|g}puEU;WY4X~JEqPh;X0sig z2Nef`7sbmCBJ-jk9t02Wpoj-Syy-zf5Rd)?LVf9v>0#_(AbCIX{d_*(pSR}cE{u+x z9$^?}v^cAk>3WpD;_wjt-u^t1r^`4gRLKIala}ElCTrmu0!7DYpfWP7_0{(%%`gLX zyHX|9(nZz84rfF*TO2i?GF=`PD)?H$RF*lg(GiWFlsw)SRXlBta3gIT0pPf{@aaqLz#&atSf1#Pw94V?V5rhf*??(sd~5 zf}rV&l9e@Gko0__kdtJwk1e_ZFSfJ@lUh#uV@EG+r8GOhrQuJE}a;kj>h31KcCUDS}bbWO8BMryWO4{P?s!g zaHQRMbNt=ou`|s0?xEWBx3_m^?+i^1o!H&^e);Xd_SpTMBb(CA51TKJZM7f0e6Sjy p*gAK1G5zV}y{|XG^KD~r7&6mO#-~m_{CG7Q++tx)dzxFi{s*n^Od0?H literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a9131fcbc5b5236c0f5f6e0a1315027f607925e1 GIT binary patch literal 1060 zcmbVL&ui0A9FN-=GB+54u&IZ)3`B8FUXr$H!fI)gW-FLEx_~_{O61)vW#ES=EzVyfRFm^DIydU{~KA-Q;z15Yasfnu-48u&- zmi0PaFVR=LI8ML&pXM~W%#vz@tl<{v+7V*PE^Z=F^X)dOBir46@Bu9{%xKHA8l+*~ zRUPbec51^Ven`;_vsg+(+u1+_G*R0NitP7SM=bE%B6~k)LNnA*$6MZs(Av(54A5Xf;bu?BHJM(RC&JJ?Q&g-!%>?T6h%on zL@`4xGVyjm>?9M!^Fsz5#ZKgf#KQqd8SN(CB1M*Z+7H1GP4kpEhzE(HDdQ76)6^35no3!-ijPrkJkJUOmla>P-;lMQSU__EsDLVV`s}p0jcRl zmj2;f&s8hBQI!NmELTLBF9<@x$cuVDo2%r+yplBvLyohsf(E60L6Hn78G@i2ic*$! zLy!zDSFK30IKm+`%Ex)^fnK9WO}F zX?gn5>L~IaBG-tp4|@4ky)*QUf=qpuvrz8GU6w25LRo+cl%%RGDeM62{!h+$>I|PY z$3M+7yrLbLZckgE9!`e`1$1H}IvU3d(?@iyteRf7lF!ZGCnu#*b=`HxCQjOKr{6!D zxyH=C9%((5eqBD;-P;|5FB0nqb94O0@tZG`&7a_#_O)~?Xk9m#5B8U?JR$Gg?A+tq cotX9s(?cuyC{kcif|*A4j^95`Gq9-KV8B6o6ra`I!Z80pW;7d5zZGhRBg zm{FnhT6Xzih3ZMUGkfBc^kAT_eS7{3zPQ8d#DAm9s(?cuyC{kcif|*Eb3_81S$-+V)J@yPBVWyvqG&GeYz~KYxJdw0eeyIoHJnOEfn# R{sUUY;OXk;vd$@?2>|r{LWckV literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_default_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ac36c068c3da9b9c824794671975d92c8cb4812f GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^`9N&X!3HGXc~6@Tq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg_WfJqdrAMK_h9#8?~%|J;E`*ao0NlWUVRlS_&a9mP<#>XaXMC=ERCX>1H%O=Am z#mtUX+>AEAwT6+syww^g zdi~YJf`mP0{cS+Lg|du9{;thHRm-f5fy`N(4+EJiIM|PAhl}#{m>bk7Vi>B zGy418$@X@hl`NMNhi}5V(@$P|Pg3y=nsGYw8(&G!LnleSDOiXroc;VBhks18oC=f7 z3k?0b%{*@h>tC1Ow`M2rIQpmS+b;9-1>8GLr6lqszq>FW)_r&{BVotOJ|NS#)C4Fx z%Y9Mf!(|m9<_@uo2MV0GcCocdFH1EsxFfK3apS{XuLXG@EPa~vYxSyojm97DROKEn z4GK+vu=x5fJ1y%Mvc5ZQ=1o6Uu#iU_8}TYLf5R#}_gt6%xwpUBR`UbBWqz}EwakL= f@x5vH8KY literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_disabled_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb4bdff00a2313fef46347ffb4ea0530fbc1879 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^c|dH(!3HExUDe|OQY^(zo*^7SP{WbZ0pxQQctjR6 zFmQK*Fr)d&(`y+R7!^ES978JRyuIV=b;Ln}?O{7E#4)N zX7u;FlkM$1D_Jfl4&Q`zr=Ps`o}}U#G~;yUH@=ddhfb1uQ?L+MIQ#iM4*!^FITa?E z7a00=n|a<2*1s;lZ_Q5Lar95uw_WDv3%GZhN=f8Nes^I$to!g@M#7GleL$vfsR>YY zmiwZ{hs!EJ%pGDE4-`0W?P6<_UY2TNa7SS6;>L%&UJLR*So$>S*XmXG8jU~PsmeWE z8WfuTVDa@|c3RdiWPNwq%$t6yU?Gny=M%lu~TYMBM! f<9pNY$D4<%SxdC6eR$dl7=R3(u6{1-oD!M(ZL?81}u3HK)&izSJm2<8Uh)ajQ0b=bC?Oqh9`3dN4vJ2T|1r%BJ|t@#fvJLahJksbsna<*xm~MowW5+ z>1Mlm1;z;xTV`Lsy!q6GM!y#AoRBT|Ub_QjFL}pbBq2SCh^H&!t^zf_gKjTvR!vI?)QK_(hS+iEHQt7Sy%)(V)Py*=6 zjq0h-%VYGXlx(v8Wi?wA7-BV#`otL+X6P>cKX=JKKb^n7C;enjYrLDpmhi_66xg1w KelF{r5}E)&kKX?P literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3b260170c683924ecc009fe9680e3d98ec4de664 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^`9N&X!3HGXc~6@Tq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgE9%yGx5+JPCOm;4IF&?CeQP`MUFAlho=fUusU7;1HAg#jWc*h~oFa2#9m-J7HPexzU_fX?w)y0_>1$$I-gnhGqqU3t5`EVu2fb##3!*89aFY)93H!w2`& znV#f2J~PbjrJ84$g@nQ!%|kPlun?=d_VY)q>Y9CO+K!M}a0OFC_FrFlR!TjF^K13o zTZi8sJ-DWnBitzdV%y>GUn5@&u5k|o_PlR3n%F1o04$aS-i zNoPTz4oLXnrw%p2bpe&GlR3g?*ev#J(RR59RKhB*G)raevz>;2zSPujy;)nCRoBy& zU70_-pz%)Ze6#y;yKgVtc7CZ*!-b0~=XNNRefN)=6s7q6pk#Vi!7>i4gx2f0)I}#B zA6+~9^V}qU_RF)X-TNnRfBF22cH~1gDSvhAzm7*tJ@ij-U7xqdXl7Z>{mGff?F1MM lM1Gs=d|BhRaeutQ{7)haG^%BtUjd_*!PC{xWt~$(695c<>f8VT literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba35d554811207106066427813fcb04219ceca0 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^Ahs6=8<1?uI(iXEu@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTO$c)B=-cyzwKX3N!Jz|;27Jm`Z{+)9fIj;{i;N3<&!`V|J|{B5-A z;!Me$|7>w|K&ao+XnFQk7J`XUo4O4v85%kQ<{q~VH7tofBIkbFfWgQ6*{|@6L0sMH zQYIM}7C1Ju@&04vYT*C4$z_>o`B!zj&#WE%f_zopr0H#GqV*mgE literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ef913cc8e5934d06c04d90547972f2c5ef4179ba GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3HD^x83^;5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDd-^mK6yk(iqNU! w14Yi9OG`fx&=|@MQYSb^i_N2f@$PSi2|ERZALZLD1scZS>FVdQ&MBb@0Gc5ykpKVy literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e968806aed3d191fae9f7b4adacd19697ec317 GIT binary patch literal 522 zcmV+l0`>igP)Y1NsF{aOK#K&;wFc$Z$xU^={HaR;mz@qPDK%u{~pFAqmB${!Ru73zB$v zOMmS5*G~YjT)qxAl30}CAaY~_U{l7aYXLy}_nWO7cDv^-0IXKG!R_Vl*AWc>0YD&y zlwbVr(3w%fr1LE3KXMGr42d)SPC~dCH0k=0Lkpd3GDn5xDltV>3XMdo%uz7^ogn>V@560bfA5((B0S2iz-E2Wt04z_4dP<YpSBT8lrJKTrMg2EfG8n8-eoq$FOo$>0! zRWLIb+6;Zq1UiaIR#Yw8kfWw^tdJRsVhZ)d1(3A|qKRy0Lsz|LbmFrjV#Cj4Yi$bv zjp+jb%#KH6`{j-Vfc54uIz-0n@&4*x9FYElBi5S(kPhjS_j+@{H`$fQ!T=IjPXGV_ M07*qoM6N<$g0^_tDgXcg literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b1fcfe26558d8465c82a517b81f59ed9e15673 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^EI{nV!3HGfEdH7V5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDf5=;`7ZV$r*IiZ$P11p$})OhKon?2O=>a4a`(g11Z2`(U?4Czl=Y zs7cveCa5y&>b{wg4hvQ>?8m-wJO{FI~6V#8L--CZMAo{j@=)i P;~6|%{an^LB{Ts5hF@xd literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..256e8e7302e490535b52dfe719dae0c40c4434ce GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^Ahs6=8<1?uI(iXEu@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTNLdAc};cyzwKX3N*)Akp%$oTpR#k=L<9&I{TXD8zMgNA~i%)Hy|P zNgKs)I{R+({VmP8VvisG(aX{DEcyH9q3KVC1{J;2rP0AWs}+-a9>;xVdGTvzHlOQi z5wUz87_iY6Ik5KcnpK}m?)AU6KeZuu$=z?O^q=n)|J67l-~`YW44$rjF6*2UngCq( BO<@24 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa306aee14b3074962b9eb69f7d66f40b3bbc7b GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c8!3HGtQ{P+w2^2edhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTO4db&7DJBbQD0#AUB zH}C^0-a~%p}r-FEkk`qbJ!z4GNE43s#KK zNDRs@3KsWHgcd0#zy)_t5P&p3Jj$#!qre@_`~aORytx@CS|N~E-DYX7!3q)ywwf#R zi~LF{d_BSz^f=YGK|9ZM0fn=bk}vu+>y{m!nweA@)C183mI|l2t~*ywL~IbQ%zQ@4 zjBbYqbD2|k7rF+l5n4N-Q9@^P4dyB)b11YKCe8!~6qBszTC`ZB>NPgV3`H}Adi(;& z=z(Y=hl8P;erL4fy&+@A?PjoH0D#W)0RU#3jdA!27YP8@x1Y1W&i>rr94*ncBrxA_ awZm^n)5h{@F-;->0000AfL0qBeIx* zfx8og8O=|gUJDdl?djqeV$r*HiZ>UNAy3=>Ev(b^_D(ndz;y3`cLig<=9yzVUhr(= zy=>Op8o=>W-qR~Elp(fRMX9Pys*<=;4p% z$vbwLGM|#MO=eHa>XFT;pUnH0>(<^9#og7CE2b>DEIj#wikm>Z{_L+2#b+FPHd-`X zSTSYOWC67{ot1t(p#@(z{r1}$FW9_q^^vE4D$lIGP?r|boFyt I=akR{08mR~WB>pF literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..38f44ce1cffc73279b3c5af758a2b3007dad6328 GIT binary patch literal 1993 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 HP6@Izc ztfq{xOI)Ec1&|=b^Bq*e2j?aGI!^4pDg*W zdWdV; z9sc!<_r}D3uO7vmuGYH|y!9z(u7^PlKF&LpHDtN{I1z6 zF>|Hsk5{u!>?_{3^~j}JVTJ_)Rqk1l{%ami?dz~9Vz_ch=w`{q%GmC6H#jsmoj4N2 z@FU~so_V|W@hf^V8n`9N+ONG~e&NG8zk6YshqhhuaEk8-btu}R#1_50nfko&3eHM9R6kW9$Y{^opCbpI5SJr{&cyRCY1m);24z9QH0 zYWBqyhwuL}_1ZPr@Td6yr94JPD>4MqXT9A2%3MvNXWB&>hq=Hw6)SO#C~+=IO)SaG z&r=A=%uQu5G}JdV*EcjcyXFiNP=zW;MM`2xs#P*bSt^5(fuW(Ufw8WEd5EEjm63^+ z36O1JWneI~fkPHWLvDUbW?Cht1|z5jy-hpSfEr{#HU#IVm6RtIr7}3C@sOG%WxC literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e2449ddd5d21777baf6aee837281b21f41994353 GIT binary patch literal 1092 zcmbVLO=#0#7|xuGIT;8WX!Q~^*lA7jCFxJXYDt^M71vq1f;)IvntWZunx7@#Y*s~P z=RrLxs6!DC9z~`@5EQ1U;I1AN^y1xvcMKr(M>3$O$=V`XU@P7*|a)hy4U zxx%!hI~J{lHgsUQ7)=n9>A=Trlkv_2cChMVdy6Iu|Rj1vd+8=2X*zv(1^Z z-dxm0gG!$wCj$u+SP*GsVAXA33Q|;uSHk=7nxV*!30h21J5J3Nie%RDAQ_|CsLsY& zG7f0K3yDNxg5+4hGAzdcE(#J7&q*vxb{`6>c}7(#DQZ^>pHfr}Ay;CUMx#MDc-rw6 z7$Ayb$iZ<@Y!UTWY@`KI+aK#ODA3nE(?zCZlOdy4ah6ev!k+GgV7Z0DF0t)*6NOX8 z1e(hLnq@32jH_eqqZ0h<#-7%GdBufH3Hr{mr{j85$9iC#yZwbiL+p)o)-!QYw7TNx z%NDdzUP)2-4{ex+lu^_i4@6GRaBMsYKvIo!N?eF#Vq9Dl)MSriFRaXS8Bs|BmF05) zD5@yR2}K3GnvLZ$e1hv?^R|yPTZcVe6YF-d?7mnj>p=}UUfFT#y$&eW9OU>l$0f6~ zF|wfPrX8Nc^6W&bK+n7Y4b^ijvXfuQ+(Tc;CB?X`%3L>YQ53SWEQ)MW1!6(~R2OUf zPtF+Z3==lTKh4s+!W|fHcUvDHc83Srcw#&}8WSMehsO$6N-hUqDnHxpbU!!HYJa#i zJ|GaI#?_~hNTj{FdhCq-{mS#p7svZ(#Bp^pkTbYrEU~2uu?~!M%rGxL@Zxmm*?jO~}8;@RXUt@A_Hq#H3w}VIKi47{D3on@S O;aul)Gs=_9eCrR$d|CVe literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3483891c57f8d3c34c194b89f4e370e96795896b GIT binary patch literal 1049 zcmbVL&rj1(9IwF;LPFv}65;eLi6qF{zIJQZhKk+V%8WxYmbfEb`?ghRUuhq%a3V$z zMh<#XPa3`Z4|wpx#UmayCdPk26OT&pb*$)taIi`He)RkKe7-*)tt{V|7@ramO0z(T4~f&dW*q`^j*XsON)cs07uu6Y&=Ovt*<9y`^luYf9!5h!s&!4+fy$dH3l zQBjn6APP|61(Anh0V8(s;h#?{j^L!*Q2~s;Xuj zqFA67g=9M!i6IA-;hUycN5&9-WySOmla(P-aNI(Qd~+EsC>YVs|S*A*q=< zOaE}5?`aj&wj`*EMnx3lGK6JY7EQTWs+2@oE!yRr<20-xiDji|Rc%4CAT(`NH5Ai^ zl3guX6-g0uY%NTP6S^qZ^{MU-jLts1^7Zlj>n}fEKAGHm^R(2sc;Ut2=Ipe+%ZxDovrE>m RvCDU}VXaxq=G)5J{Xg>eYW#qt8Qe+F^yE0HVu%mj(usY);`z1Hg1Ik zsu*DD%*5OY33X(ks0#?OGQh$=Kr9R_;hZLgq3VDo`#$_W&+~r1SYEm}Gks&4VVIf5 zg4v|&6n)vL9Q}4GFTc?xPwH*5io2xm#E8*7+(DobIP0j19B+5)BbsBF$*$jOleWF6 zx;WsR%!W&Yh@u&0u9`-UyMYMkpmjgg*dK4-vB38<_EFIm?5Ku%{=#02R`-@#?%sy0 zcx-hZ%%v(N2oP~V8f=D%nriHjSEc*xnrFe#gluT+sZ(ux8Psr$K#>y)u22#{335=9 z%jNQ2APP|61(Anh0hU!sR0RQy9+s-bURQ0J)<}zt^%F*+T*O*EEzdKy9y+4dQ6n2ZudQ^u!G#6wQt zgCL7*Xq}KI`s>EI)=6tOLVOb?csq7!J-V}FFwNb?LYX1;M!g^Vv?$J|iQVl0g`{C> zEd9fIzNZ?dRhOV5>V_zkDiBtzl4zFXqEQq}ifmQJ9Oq$mNt6vkF)cx=LuguxqL)nz zN>;5{H>9#S#x}x)IH8Nix<1t%VQUv+)mn@kg5ws(o8t~x?qPzH9*#h5wFqp-^~3C( zmFF~C6UF`x@~jvKV3=RkKSy7#SCo=&>EbAEMUiW|t|&sqf=XG2>Xr z`FwtG^z{0tKD;S@XBMwqIzF5@oLGyRy$LyYCpmdyJQNPBFAFQj&-wcMqv|X3Wa{b~ X^LhUEudSVfpV`nh>PzNpV{QKrp!-O1 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..236597868257bde1d4aecbe1ff474630a05d9089 GIT binary patch literal 1053 zcmbVLJ!sTW98axEE$yU2>-0$7^pcn4?(#v;n!8-Q15@kuu-8SJOWxguHhD35?WG;G zh>K91MG$oD;NU9i;2@47IOy)`AQS|pzFaTWp>!~iypQ~Uzu*7!;llj2$?*&048u&; zYes{vWAtUmPSbB&dHj_w)1=xWi?~Djc7zz+#cc%YzTHI)WV@SpKA>5K8SQw@7HL`6 zH3$2go!W4TA5t{K%+4jD?W`gK+NkRVCHDKPw=D4761!BepcPh7&#P@kXmM-4>1?e! zs>{w@0kerl34BCskoapstR*FOz^l=Hdd;(7U_w?)?157)YXMYngg}9VIR_RYC<>e) ze1 zLlkq=A{TE4#7=TSJd-gPD0U(*Bpwbx%4oOoIw`T#(}NKF(6SDRgLs%Inle7ILtfw@ z@B3+71M8SH&|f!>w2qsbA>tb-#_N$o>(QCXz%+Nq3#EqC8|_Bq(W2OE26onc6p*@6 zV(A~w^<1rNm{mzoMZGM-q9O>2Srm<8zECcRMKy0K8OKprT@n>JUsX&fRRzH?RaKV_ zQ;^I`p<0$?F~in_nAm}XGF^}A4zcpFSgjHvo8YL4@mkga3q4G5+`}QLEEa%eJ6@2U z)AAfdYoN&6K&}~K9}M!Vc}M6|x7DI<>f$hNRn1p)T~(oC3aXqJ*df;apPcd389r@} zf0`w`q8*rS4_lue4u=N?bYdbp8h39meWPP#)eXIwd};sM-=7;5S6uhx`0wt6A0N+e zpZfHCXL)CT`Pqp#6AE*7bOi1)yUf(yxhLDXm$i*|_sX~6BlC0Z=2ds^{nOsm$cYJN X`{MM^Gt;jxr2|{9&KobvEBF5Z1$0Mr literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..92da2f0dd3711a2ceb843768cafd6b91a2807b43 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg#;uvX%d>fBtxy+SfFGJhTv9Z9>9n%%Tr7{oI+Q@DMao9hQt@O?p#8;eZd15IY| MboFyt=akR{068-?^#A|> literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..42cb6463e4c28c6aeffa315c4fc869867dbb6b7c GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg@oJyIHz9Y|%SiynA|kd)58s-{92FmHki*;@KxND!%;H%=F4ZU(n;yg$GVRgBd(s L{an^LB{Ts54)-;@ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_default_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..99b16056b13960eb95ff81b97f4084763404f1ac GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^-axF)!3HD^c9m`bQY^(zo*^7SP{WbZ0pxQQctjR6 zFmQK*Fr)d&(`$i(7d%}YLoyoQ-g4w?G7xaMs2~0Qf$9^UV|&FvE_gh%;BZrhu;hY8 zFY8a6WvbOXE?|5mp*2_A^U|}ny!V{{IyVaSOiftBlB_DBeK3Mkw(iR+rg$%7kXTcP z#k6a^Uz2!B_1{WnCked@xn+LsMX-i}n1Q~CM0S}*hE157h>480G?!HGRuvHwiR?^` z44rGU0xm@8JUDeI;6lKfjvb8C_dd^P{T?ZK%*!CG32d9r)j|zjwMW7E=e~$M2n70#!PC{xWt~$(69Bh6a`ylL literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_default_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c820e40a1fa53a02e063689af1b0b22cbb71d822 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^-axF)!3HD^c9m`bQY^(zo*^7SP{WbZ0pxQQctjR6 zFmQK*Fr)d&(`$i(=RI8=S(s69?(!#l@=~!ntl!6G)o`&MW17~=l&s6gI`{agmZrYsRA{(5`9EcQX+C`+ osj_#a-R80lU(+Xt73Y3pk(w;wRWoZtAkb?Jp00i_>zopr08EN*F8}}l literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_disabled_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..95d7c86e5b4f6bc9e5bb4351ec954efa8165e71b GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^UO=qH!3HEnRL*JxDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?x1KJJAsLNtZ#i-`IY_iUT(7~j&^5ecSL1j4gY^^2WDlBco*?mB z`m)aR+G$otzD)Y0?fLmd+OHS}2DjJSyx%{F7dYjjA-vG1#YhmyxEyA4Ajyemj-Jy@ zj;|_8Wji0Yyz-p5Zf9|eSJlK>cYeM(zs5}PqKB2Y70=q0b|Ee@stK+Nq8B}=hELQvQ^1tM>Th}xA YnG-a>&UD)?3-maHr>mdKI;Vst0M@RAKmY&$ literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_disabled_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2dba2704f493419c5b3171a3f03a194900fcb497 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^UO=qH!3HEnRL*JxDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?x1KJJAsLNtZ#i-`IY_iUT(7~j&^5fn>R|nU<%<3?*@I@ACrG@O zzO3`ScAC|ZFOxoLdwzbA_A7>g!R_@n@AnVl1x~qW2ru+$F%kqaE{EA1NOIztqvte} z7`L0ct=SQi8;t1{K~ri`727{4e?J*7Xej YZZ(m@*Zsx7P+(y2boFyt=akR{08E~Q00000 literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_focused_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2fadd83cf9209b1f6902b9fceaa9e08650af94 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^UO=qH!3HEnRL*JxDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9q_Dj7**`jv*P1Z*Lh29dr0>e#5X;Yl_m^QtFL3~ z7p<9ipm2rR!~>ZtwoN>cxZ=^VyIMjP+@U=T?on<`?hCz&FKs&gQ_pFyw3_aoGlAUm zn3t+7`@eXN$SIG7JtC(xeytTZ`c|8t;=vc4cXjKsj}K;5=sTOQ(sOY>d-H17ucGyO pR}OW0=m*7C&$l~ou%r4AbI&E!#ml;*Ujl=O!PC{xWt~$(697(_i@yK> literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_focused_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbbf63953db1f406e16fbff34505f1bc5def9b0 GIT binary patch literal 499 zcmV2V*7i{gUsf_UxO!xyUN`FCXOKTH@g`u<4L=uRJg~WvDWhgw8<2Z0nJvndZb?nZP z$qPF>3?zdj^u3CrD2noJBscF2{tGI~5*1~Min2sSS)!sWQBjuU&_A%sFCv9`XOJdD zBnOm%cVo;;aL>#qrSu^p1z;Ok^_T9AF%O^HTFe=j^z?eO>@U}XG0uw$OS-t*J@U8m z!8oTyMM)ZZ&$XynXN$RrtN?YO*y*>b?QXO2<_*@S#XBiVM9RPxkiULB-n{Ld9Ef;} zv(7ko_55E_EJ@&)D8DAvi75#j5)~-i#ki8d5mCX{tD8mok*HE+~GXDHmyB4OE{ObGx5kx6E$Jf paWdZ>C`w96>hArtlTBSs7y($Dq5N)-%j5t6002ovPDHLkV1j6N)%5@X literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_pressed_holo_dark.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..083194a6fa111f065ef61e9ad9246a70ec53618d GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^-axF)!3HD^c9m`bQY^(zo*^7SP{WbZ0pxQQctjR6 zFmQK*Fr)d&(`y+R7~MQw978f1-`?8qbvQtx?W6j}D-SL?3U0c&(&Bfz$dT+1Vqa!` ziHq4~?Y(?gYSGjntwIm4C2}u+3MD6<|J|ehu;9l;2PXL~!S^ohn=8h6$M#A40ZoG! z-z@g#uJiZfC;qvfd%tG0$?QL0J%3#*o_5ac`kaV$(xG3a^sH@N y|3^Eunl7I4J?wsT;Eye4&o7kRSTg;y`236Eu6ccNCTD=b%;4$j=d#Wzp$Pz=7`crA literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_pressed_holo_light.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..29cbc4621542f2e2d058f0440980872d510c2849 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^UO=qH!3HEnRL*JxDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9q_DjM<(pjv*P1Z*T4OIvgNz?BjC92}chu^z({sY7XG`yXPp#@=$97vck(#_ELt$lCQjmCO_={>z;flP*?Ea3A4tsOvleg z-~3mp@cW&AXU=ei@y6+$b1#`NUa+^jRoCSoag0I9^=608KI4TQUxF_sWjSrM6!el< z*n%J;A26@c;69ejdaUoY&Adw(}hrX_L51*flGgf)f9~6BN;g^-)UN@?1%s!npUXO@geCw<2)@$* literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9a33cd2d92874dd09f4eb5d3f924eebe97b25c40 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^>_BY9!3HEJJUw_8NJ*BsMwA5Sr8n0M1DW`tbSwb=FK+^Rf3lPOJU(KVDPR|J0bAe<1Nr)22WQ%mvv4FO#pfqOKt!F literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e029e577a711e01450d8924bb7cd8bcb6867db82 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y|!3HFERhwS|Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii|v6978H@CH?sS-=0~ZfivY;J=+AIS6Aj=Q{WS37HTN$ qQz(|;D3Fkp+<4kRVK;-q0S2o8fp2Rs`~3szX7F_Nb6Mw<&;$SgLM&YX literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..285116e31e1c3fb26567af209b73718f07bc1355 GIT binary patch literal 454 zcmV;%0XhDOP)DF0XHC5fCg&1oFoM^V6d>XlD+HCBt>?{(e6rmdU}?_B0{m4Sq~g{wt4!r zOWN(uURJA*E8X9o5`pq1%=xiasQb6`jUKk!*Ufr;;jZ^fbg&jJ#D&#`!qIK=b6In= z4s{w7)41lI%r07#2$`jVkT}Ec$L&ljwAe}zSti7@ggO;j6%rHwP=!Q#LdChy6oR*c z@mo=c%?Ogk{+e}+hZtjm#F&LMNtVI#OlD|XWTvJq05qMU)SFOJNG9*oVf%flkP~v9 z=Y+3jgm<=-`V42?!wN%1FiVM3j0wDEHMGV=kqm5;4Rvd0k?m~ w8U}fi7AzZCsS>JiaI@A978H@^#nQcH7M}hZY%G%JHuabG5!aqaP2Bixj6GbE&Os5bkw9sMq-sUhLgvwDil6_u$Ij+-sD=}ZmKxYhgcu#~pn0rP!P zlW+2eN-A94>Tv7U%K#(ixsEr27ML73#$j6gN!I7~MEh2azKZipvd`~)x3!+5XZ7?s c9n*oXua>h?X*ygK2XqvJr>mdKI;Vst06dpdnE(I) literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..032a9921c54ebd6d8bb71aea1552758efb1efd19 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^>_BY9!3HEJJUw_8NJ*BsMwA5Sr?ic(Aw2{Hn)z4*}Q$iB};WR^U literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..848f3f13363cb940353382afd94e8fdcbb13bf34 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!3HE73d0rwDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MM|D7jv*Ddl79UEZ_g~yz?s6<;y3q~@R1+qk2LU1_{zW{ a!SH4(?<>94hd6<%89ZJ6T-G@yGywo*Iw!3F literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_focused_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3845135847312f61d9874eb4e4e9c703dcc168d6 GIT binary patch literal 459 zcmV;+0W|)JP)>s>b==;?%5h#oym!sb@v)nwLuGD#ddt4nJoq6c_90P317A`GSu=PO9R)W#5 zDoaABnMTGa0uGz~EeLH68Wa=l)Td^P5+Sox5E5soyX1+}R%o%6Ok|l5&k`DTj?>9t zrmYnc83`4B*cEsysCPvJ%vNa@o7Zgfu@GZSP|Fg6NwNUTGnHA}qB1pY383j2O1-J@ zZma!t*zvto$O*a5bHX<>!aG|^edb_0!U{u0FiVM3J|^%rn{`X!mWcowRGV*^%Lll& zO`wIX7002ovPDHLkV1hC_ Bz{LOn literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..23fd8c9b351c7dc4ca7d61bdf8b0fa0b3357afc0 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0!!3HE}@+EEuQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiW)s#978H@^#nQcH7M}h?kex!cUt|2fc?W{-#r$B;+r&$ zCmhJwwN<*&rR9^B`%azPhW7=3CfsE?TiI|eAXVmsigepfZQY<^*$T$v9;+|bZ{5Ls z@x~N43;ta!61B<)ywtP1E|{=7D7Ecj;BU-)@wqN;rGn!(u4Nx%>`hbb@2ehQSYT@5 Uszopr0E4hlYXATM literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-nodpi-v11/abs__action_item_divider.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-nodpi-v11/abs__action_item_divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c30f607d0aa66ce47fe22159249f7925512dd28a GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~;+`&!Ar-fh6B-)+^B5f4SNpps cki~(8q5LmfmduLwJwPQ4p00i_>zopr0KdZ(YXATM literal 0 HcmV?d00001 diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable-nodpi/abs__action_item_divider.9.png b/external/JakeWharton-ActionBarSherlock/library/res/drawable-nodpi/abs__action_item_divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..62332880b099b84b08d0d320452ae55f252599bd GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-progZV+hCf + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml new file mode 100644 index 00000000..b7b97b5a --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml new file mode 100644 index 00000000..fdcac1d8 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml new file mode 100644 index 00000000..b2ce4f0f --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml new file mode 100644 index 00000000..d7e31b1d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_dark.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_dark.xml new file mode 100644 index 00000000..8d350040 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_dark.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_light.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_light.xml new file mode 100644 index 00000000..0770f109 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__spinner_background_holo_light.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__tab_indicator_holo.xml b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__tab_indicator_holo.xml new file mode 100644 index 00000000..542a5cee --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/drawable/abs__tab_indicator_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__action_bar.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__action_bar.xml new file mode 100644 index 00000000..a9641546 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__action_bar.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar.xml new file mode 100644 index 00000000..794f5283 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar_overlay.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar_overlay.xml new file mode 100644 index 00000000..66a63f9d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout-large-land/abs__screen_action_bar_overlay.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__action_bar.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__action_bar.xml new file mode 100644 index 00000000..a9641546 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__action_bar.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml new file mode 100644 index 00000000..794f5283 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml new file mode 100644 index 00000000..66a63f9d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar.xml new file mode 100644 index 00000000..44f7dff2 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_home.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_home.xml new file mode 100644 index 00000000..3f846fbc --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_home.xml @@ -0,0 +1,37 @@ + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_inline.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_inline.xml new file mode 100644 index 00000000..2762c8bd --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_inline.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_item_layout.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_item_layout.xml new file mode 100644 index 00000000..85d86617 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_item_layout.xml @@ -0,0 +1,52 @@ + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_tab_layout.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_tab_layout.xml new file mode 100644 index 00000000..8af6662e --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_tab_layout.xml @@ -0,0 +1,53 @@ + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml new file mode 100644 index 00000000..1d37ef58 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml @@ -0,0 +1,44 @@ + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml new file mode 100644 index 00000000..d3a5fb79 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline.xml new file mode 100644 index 00000000..16c05d11 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline_overlay.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline_overlay.xml new file mode 100644 index 00000000..a8243dd4 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_inline_overlay.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml new file mode 100644 index 00000000..a9c3cc7a --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_simple.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_simple.xml new file mode 100644 index 00000000..0687578f --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__screen_simple.xml @@ -0,0 +1,43 @@ + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__simple_spinner_item.xml b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__simple_spinner_item.xml new file mode 100644 index 00000000..9be5ea8d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/layout/abs__simple_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/values-land/abs__constants.xml b/external/JakeWharton-ActionBarSherlock/library/res/values-land/abs__constants.xml new file mode 100644 index 00000000..c9028db7 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/values-land/abs__constants.xml @@ -0,0 +1,5 @@ + + + + 4 + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/values-v11/abs__styles.xml b/external/JakeWharton-ActionBarSherlock/library/res/values-v11/abs__styles.xml new file mode 100644 index 00000000..5c0dd103 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/values-v11/abs__styles.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/values-v13/abs__styles.xml b/external/JakeWharton-ActionBarSherlock/library/res/values-v13/abs__styles.xml new file mode 100644 index 00000000..4112a4aa --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/values-v13/abs__styles.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/values/abs__attrs.xml b/external/JakeWharton-ActionBarSherlock/library/res/values/abs__attrs.xml new file mode 100644 index 00000000..0e51e5ad --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/values/abs__attrs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/res/values/abs__constants.xml b/external/JakeWharton-ActionBarSherlock/library/res/values/abs__constants.xml new file mode 100644 index 00000000..ddcb58b9 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/values/abs__constants.xml @@ -0,0 +1,7 @@ + + + + #FF6899FF + 3 + tabUnderAb + \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/res/values/abs__styles.xml b/external/JakeWharton-ActionBarSherlock/library/res/values/abs__styles.xml new file mode 100644 index 00000000..a1fee779 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/res/values/abs__styles.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ActionBar.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ActionBar.java new file mode 100644 index 00000000..e4a72d03 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ActionBar.java @@ -0,0 +1,807 @@ +/* + * Copyright 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.app.Activity; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.view.ActionMode; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.MarginLayoutParams; +import android.widget.SpinnerAdapter; + +/** + * This is the public interface to the contextual ActionBar. The ActionBar acts + * as a replacement for the title bar in Activities. It provides facilities for + * creating toolbar actions as well as methods of navigating around an + * application. + */ +public abstract class ActionBar { + /** Parent activity. */ + protected final SupportActivity mActivity; + /** Parent context. */ + protected final Context mContext; + + + protected ActionBar(T activity) { + mActivity = activity; + mContext = activity; + } + + /** + * Return the actual public action bar instance. This will either return + * itself or null depending on the state of the underlying action bar. + * + * @return Action bar instance. + */ + protected abstract ActionBar getPublicInstance(); + + // ------------------------------------------------------------------------ + // ACTION MODE SUPPORT + // ------------------------------------------------------------------------ + + protected abstract ActionMode startActionMode(ActionMode.Callback callback); + + // ------------------------------------------------------------------------ + // ACTION BAR SUPPORT + // ------------------------------------------------------------------------ + + /** + * Per-child layout information associated with action bar custom views. + */ + public static class LayoutParams extends MarginLayoutParams { + /** + * Gravity for the view associated with these LayoutParams. + * + * @see android.view.Gravity + */ + public int gravity = -1; + + public LayoutParams() { + this(-1); + } + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + public LayoutParams(int width, int height) { + super(width, height); + } + public LayoutParams(int width, int height, int gravity) { + this(width, height); + this.gravity = gravity; + } + public LayoutParams(int gravity) { + this(0, 0, gravity); + } + public LayoutParams(LayoutParams source) { + super(source); + this.gravity = source.gravity; + } + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + } + + /** + * Listener for receiving events when action bar menus are shown or hidden. + */ + public interface OnMenuVisibilityListener { + /** + * Called when an action bar menu is shown or hidden. Applications may + * want to use this to tune auto-hiding behavior for the action bar or + * pause/resume video playback, gameplay, or other activity within the + * main content area. + * + * @param isVisible True if an action bar menu is now visible, false if + * no action bar menus are visible. + */ + void onMenuVisibilityChanged(boolean isVisible); + } + + /** + * Listener interface for ActionBar navigation events. + */ + public interface OnNavigationListener { + /** + * This method is called whenever a navigation item in your action bar + * is selected. + * + * @param itemPosition Position of the item clicked. + * @param itemId ID of the item clicked. + * @return True if the event was handled, false otherwise. + */ + boolean onNavigationItemSelected(int itemPosition, long itemId); + } + + /** + *

A tab in the action bar.

+ * + *

Tabs manage the hiding and showing of + * {@link android.support.v4.app.Fragment}.

+ */ + public static abstract class Tab { + /** + * An invalid position for a tab. + * + * @see #getPosition() + */ + public static int INVALID_POSITION = android.app.ActionBar.Tab.INVALID_POSITION; + + + /** + * Retrieve a previously set custom view for this tab. + * + * @return The custom view set by {@link #setCustomView(View)}. + */ + public abstract View getCustomView(); + + /** + * Return the icon associated with this tab. + * + * @return The tab's icon + */ + public abstract Drawable getIcon(); + + /** + * Return the current position of this tab in the action bar. + * + * @return Current position, or {@link #INVALID_POSITION} if this tab is + * not currently in the action bar. + */ + public abstract int getPosition(); + + /** + * Return the current tab listener. + * + * @return Tab listener. + */ + public abstract ActionBar.TabListener getTabListener(); + + /** + * @return This Tab's tag object. + */ + public abstract Object getTag(); + + /** + * Return the text of this tab. + * + * @return The tab's text + */ + public abstract CharSequence getText(); + + /** + * Select this tab. Only valid if the tab has been added to the action + * bar. + */ + public abstract void select(); + + /** + * Set a custom view to be used for this tab. This overrides values set + * by {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}. + * + * @param layoutResId A layout resource to inflate and use as a custom + * tab view + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setCustomView(int layoutResId); + + /** + * Set a custom view to be used for this tab. This overrides values set + * by {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}. + * + * @param view Custom view to be used as a tab. + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setCustomView(View view); + + /** + * Set the icon displayed on this tab. + * + * @param icon The drawable to use as an icon + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setIcon(Drawable icon); + + /** + * Set the icon displayed on this tab. + * + * @param resId Resource ID referring to the drawable to use as an icon + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setIcon(int resId); + + /** + * Set the {@link ActionBar.TabListener} that will handle switching to + * and from this tab. All tabs must have a TabListener set before being + * added to the ActionBar. + * + * @param listener Listener to handle tab selection events + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setTabListener(ActionBar.TabListener listener); + + /** + * Give this Tab an arbitrary object to hold for later use. + * + * @param obj Object to store + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setTag(Object obj); + + /** + * Set the text displayed on this tab. Text may be truncated if there is + * not room to display the entire string. + * + * @param resId A resource ID referring to the text that should be displayed + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setText(int resId); + + /** + * Set the text displayed on this tab. Text may be truncated if there is + * not room to display the entire string. + * + * @param text The text to display + * @return The current instance for call chaining + */ + public abstract ActionBar.Tab setText(CharSequence text); + } + + /** + * Callback interface invoked when a tab is focused, unfocused, added, or + * removed. + */ + public interface TabListener { + /** + * Called when a tab that is already selected is chosen again by the + * user. Some applications may use this action to return to the top + * level of a category. + * + * @param tab The tab that was reselected. + * @param ft Unused, always {@code null}. Begin your own transaction by + * calling {@link FragmentActivity#getSupportFragmentManager()}. + */ + void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft); + + /** + * Called when a tab enters the selected state. + * + * @param tab The tab that was selected + * @param ft Unused, always {@code null}. Begin your own transaction by + * calling {@link FragmentActivity#getSupportFragmentManager()}. + */ + void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft); + + /** + * Called when a tab exits the selected state. + * + * @param tab The tab that was unselected + * @param ft Unused, always {@code null}. Begin your own transaction by + * calling {@link FragmentActivity#getSupportFragmentManager()}. + */ + void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft); + } + + + + /** + * Display the 'home' element such that it appears as an 'up' affordance. + * e.g. show an arrow to the left indicating the action that will be taken. + * Set this flag if selecting the 'home' button in the action bar to return + * up by a single level in your UI rather than back to the top level or + * front page. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_HOME_AS_UP = android.app.ActionBar.DISPLAY_HOME_AS_UP; + + /** + * Show the custom view if one has been set. + * + * @see #setCustomView(int) + * @see #setCustomView(View) + * @see #setCustomView(View, LayoutParams) + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_SHOW_CUSTOM = android.app.ActionBar.DISPLAY_SHOW_CUSTOM; + + /** + * Show 'home' elements in this action bar, leaving more space for other + * navigation elements. This includes logo and icon. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_SHOW_HOME = android.app.ActionBar.DISPLAY_SHOW_HOME; + + /** + * Show the activity title and subtitle, if present. + * + * @see #setTitle(CharSequence) + * @see #setTitle(int) + * @see #setSubtitle(CharSequence) + * @see #setSubtitle(int) + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_SHOW_TITLE = android.app.ActionBar.DISPLAY_SHOW_TITLE; + + /** + * Use logo instead of icon if available. This flag will cause appropriate + * navigation modes to use a wider logo in place of the standard icon. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_USE_LOGO = android.app.ActionBar.DISPLAY_USE_LOGO; + + /** + * List navigation mode. Instead of static title text this mode presents a + * list menu for navigation within the activity. e.g. this might be + * presented to the user as a dropdown list. + */ + public static final int NAVIGATION_MODE_LIST = android.app.ActionBar.NAVIGATION_MODE_LIST; + + /** + * Standard navigation mode. Consists of either a logo or icon and title + * text with an optional subtitle. Clicking any of these elements will + * dispatch onOptionsItemSelected to the host Activity with a MenuItem with + * item ID android.R.id.home. + */ + public static final int NAVIGATION_MODE_STANDARD = android.app.ActionBar.NAVIGATION_MODE_STANDARD; + + /** + * Tab navigation mode. Instead of static title text this mode presents a + * series of tabs for navigation within the activity. + */ + public static final int NAVIGATION_MODE_TABS = android.app.ActionBar.NAVIGATION_MODE_TABS; + + + + /** + * Add a listener that will respond to menu visibility change events. + * + * @param listener The new listener to add + */ + public abstract void addOnMenuVisibilityListener(ActionBar.OnMenuVisibilityListener listener); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be added at the + * end of the list. If this is the first tab to be added it will become the + * selected tab. + * + * @param tab Tab to add + */ + public abstract void addTab(ActionBar.Tab tab); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be added at the + * end of the list. + * + * @param tab Tab to add + * @param setSelected True if the added tab should become the selected tab. + */ + public abstract void addTab(ActionBar.Tab tab, boolean setSelected); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be inserted at + * {@code position}. If this is the first tab to be added it will become the + * selected tab. + * + * @param tab The tab to add + * @param position The new position of the tab + */ + public abstract void addTab(ActionBar.Tab tab, int position); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be insterted at + * {@code position}. + * + * @param tab The tab to add + * @param position The new position of the tab + * @param setSelected True if the added tab should become the selected tab. + */ + public abstract void addTab(ActionBar.Tab tab, int position, boolean setSelected); + + /** + * @return The current custom view. + */ + public abstract View getCustomView(); + + /** + * @return The current set of display options. + */ + public abstract int getDisplayOptions(); + + /** + * Retrieve the current height of the ActionBar. + * + * @return The ActionBar's height + */ + public abstract int getHeight(); + + /** + * Get the number of navigation items present in the current navigation + * mode. + * + * @return Number of navigation items. + */ + public abstract int getNavigationItemCount(); + + /** + * Returns the current navigation mode. The result will be one of: + *
    + *
  • {@link #NAVIGATION_MODE_STANDARD}
  • + *
  • {@link #NAVIGATION_MODE_LIST}
  • + *
  • {@link #NAVIGATION_MODE_TABS}
  • + *
+ * + * @return The current navigation mode. + * @see #setNavigationMode(int) + */ + public abstract int getNavigationMode(); + + /** + * Get the position of the selected navigation item in list or tabbed + * navigation modes. + * + * @return Position of the selected item. + */ + public abstract int getSelectedNavigationIndex(); + + /** + * Returns the currently selected tab if in tabbed navigation mode and there + * is at least one tab present. + * + * @return The currently selected tab or null. + */ + public abstract ActionBar.Tab getSelectedTab(); + + /** + * Returns the current ActionBar subtitle in standard mode. Returns null if + * {@link #getNavigationMode()} would not return + * {@link #NAVIGATION_MODE_STANDARD}. + * + * @return The current ActionBar subtitle or null. + */ + public abstract CharSequence getSubtitle(); + + /** + * Returns the tab at the specified index. + * + * @param index Index value in the range 0-get + * @return Tab at specified index + */ + public abstract ActionBar.Tab getTabAt(int index); + + /** + * Returns the number of tabs currently registered with the action bar. + * + * @return Tab count + */ + public abstract int getTabCount(); + + /** + * Returns the current ActionBar title in standard mode. Returns null if + * {@link #getNavigationMode()} would not return + * {@link #NAVIGATION_MODE_STANDARD}. + * + * @return The current ActionBar title or null. + */ + public abstract CharSequence getTitle(); + + /** + * Hide the ActionBar if it is not currently showing. If the window hosting + * the ActionBar does not have the feature + * {@link android.support.v4.view.Window#FEATURE_ACTION_BAR_OVERLAY} + * it will resize application content to fit the new space available. + */ + public abstract void hide(); + + /** + * @return {@code true} if the ActionBar is showing, {@code false} + * otherwise. + */ + public abstract boolean isShowing(); + + /** + * Create and return a new ActionBar.Tab. This tab will not be included in + * the action bar until it is added. + * + * @return A new Tab + * @see #addTab(Tab) + * @see #addTab(Tab, boolean) + * @see #addTab(Tab, int) + * @see #addTab(Tab, int, boolean) + */ + public abstract ActionBar.Tab newTab(); + + /** + * Remove all tabs from the action bar and deselect the current tab. + */ + public abstract void removeAllTabs(); + + /** + * Remove a menu visibility listener. This listener will no longer receive + * menu visibility change events. + * + * @param listener A listener to remove that was previously added + */ + public abstract void removeOnMenuVisibilityListener(ActionBar.OnMenuVisibilityListener listener); + + /** + * Remove a tab from the action bar. If the removed tab was selected it will + * be deselected and another tab will be selected if present. + * + * @param tab The tab to remove + */ + public abstract void removeTab(ActionBar.Tab tab); + + /** + * Remove a tab from the action bar. If the removed tab was selected it will + * be deselected and another tab will be selected if present. + * + * @param position Position of the tab to remove + */ + public abstract void removeTabAt(int position); + + /** + *

Select the specified tab. If it is not a child of this action bar it + * will be added.

+ * + *

Note: If you want to select by index, use + * {@link #setSelectedNavigationItem(int)}.

+ * + * @param tab Tab to select + */ + public abstract void selectTab(ActionBar.Tab tab); + + /** + * Set the ActionBar's background. + * + * @param d Background drawable + */ + public abstract void setBackgroundDrawable(Drawable d); + + /** + *

Set the action bar into custom navigation mode, supplying a view for + * custom navigation.

+ * + *

Custom navigation views appear between the application icon and any + * action buttons and may use any space available there. Common use cases + * for custom navigation views might include an auto-suggesting address bar + * for a browser or other navigation mechanisms that do not translate well + * to provided navigation modes.

+ * + *

The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for the + * custom view to be displayed.

+ * + * @param resId Resource ID of a layout to inflate into the ActionBar. + * @see #setDisplayOptions(int, int) + */ + public abstract void setCustomView(int resId); + + /** + * Set the action bar into custom navigation mode, supplying a view for + * custom navigation. Custom navigation views appear between the application + * icon and any action buttons and may use any space available there. Common + * use cases for custom navigation views might include an auto-suggesting + * address bar for a browser or other navigation mechanisms that do not + * translate well to provided navigation modes. + * + * @param view Custom navigation view to place in the ActionBar. + */ + public abstract void setCustomView(View view); + + /** + *

Set the action bar into custom navigation mode, supplying a view for + * custom navigation.

+ * + *

Custom navigation views appear between the application icon and any + * action buttons and may use any space available there. Common use cases + * for custom navigation views might include an auto-suggesting address bar + * for a browser or other navigation mechanisms that do not translate well + * to provided navigation modes.

+ * + *

The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for the + * custom view to be displayed.

+ * + * @param view Custom navigation view to place in the ActionBar. + * @param layoutParams How this custom view should layout in the bar. + * @see #setDisplayOptions(int, int) + */ + public abstract void setCustomView(View view, ActionBar.LayoutParams layoutParams); + + /** + *

Set whether home should be displayed as an "up" affordance. Set this + * to true if selecting "home" returns up by a single level in your UI + * rather than back to the top level or front page.

+ * + *

To set several display options at once, see the setDisplayOptions + * methods.

+ * + * @param showHomeAsUp {@code true} to show the user that selecting home + * will return one level up rather than to the top level of the app. + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayHomeAsUpEnabled(boolean showHomeAsUp); + + /** + *

Set selected display options. Only the options specified by mask will + * be changed. To change all display option bits at once, see + * {@link #setDisplayOptions(int)}. + * + *

Example: {@code setDisplayOptions(0, DISPLAY_SHOW_HOME)} will disable + * the {@link #DISPLAY_SHOW_HOME} option. + * {@code setDisplayOptions(DISPLAY_SHOW_HOME, DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO)} + * will enable {@link #DISPLAY_SHOW_HOME} and disable + * {@link #DISPLAY_USE_LOGO}.

+ * + * @param options A combination of the bits defined by the DISPLAY_ + * constants defined in ActionBar. + * @param mask A bit mask declaring which display options should be changed. + */ + public abstract void setDisplayOptions(int options, int mask); + + /** + * Set display options. This changes all display option bits at once. To + * change a limited subset of display options, see + * {@link #setDisplayOptions(int, int)}. + * + * @param options A combination of the bits defined by the DISPLAY_ + * constants defined in ActionBar. + */ + public abstract void setDisplayOptions(int options); + + /** + *

Set whether a custom view should be displayed, if set.

+ * + *

To set several display options at once, see the setDisplayOptions + * methods.

+ * + * @param showCustom {@code true} if the currently set custom view should be + * displayed, {@code false} otherwise. + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayShowCustomEnabled(boolean showCustom); + + /** + *

Set whether to include the application home affordance in the action + * bar. Home is presented as either an activity icon or logo.

+ * + *

To set several display options at once, see the setDisplayOptions + * methods.

+ * + * @param showHome {@code true} to show home, {@code false} otherwise. + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayShowHomeEnabled(boolean showHome); + + /** + *

Set whether an activity title/subtitle should be displayed.

+ * + *

To set several display options at once, see the setDisplayOptions + * methods.

+ * + * @param showTitle {@code true} to display a title/subtitle if present. + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayShowTitleEnabled(boolean showTitle); + + /** + *

Set whether to display the activity logo rather than the activity + * icon. A logo is often a wider, more detailed image.

+ * + *

To set several display options at once, see the setDisplayOptions + * methods.

+ * + * @param useLogo {@code true} to use the activity logo, {@code false} to + * use the activity icon. + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayUseLogoEnabled(boolean useLogo); + + /** + * Set the adapter and navigation callback for list navigation mode. The + * supplied adapter will provide views for the expanded list as well as the + * currently selected item. (These may be displayed differently.) The + * supplied OnNavigationListener will alert the application when the user + * changes the current list selection. + * + * @param adapter An adapter that will provide views both to display the + * current navigation selection and populate views within the dropdown + * navigation menu. + * @param callback An OnNavigationListener that will receive events when the + * user selects a navigation item. + */ + public abstract void setListNavigationCallbacks(SpinnerAdapter adapter, ActionBar.OnNavigationListener callback); + + /** + * Set the current navigation mode. + * + * @param mode The new mode to set. + * @see #NAVIGATION_MODE_STANDARD + * @see #NAVIGATION_MODE_LIST + * @see #NAVIGATION_MODE_TABS + */ + public abstract void setNavigationMode(int mode); + + /** + * Set the selected navigation item in list or tabbed navigation modes. + * + * @param position Position of the item to select. + */ + public abstract void setSelectedNavigationItem(int position); + + /** + * Set the action bar's subtitle. This will only be displayed if + * @link #DISPLAY_SHOW_TITLE} is set. + * + * @param resId Resource ID of subtitle string to set + * @see #setSubtitle(CharSequence) + * @see #setDisplayOptions(int, int) + */ + public abstract void setSubtitle(int resId); + + /** + * Set the action bar's subtitle. This will only be displayed if + * @{link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the subtitle + * entirely. + * + * @param subtitle Subtitle to set + * @see #setSubtitle(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setSubtitle(CharSequence subtitle); + + /** + * Set the action bar's title. This will only be displayed if + * @{link #DISPLAY_SHOW_TITLE} is set. + * + * @param title Title to set + * @see #setTitle(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setTitle(CharSequence title); + + /** + * Set the action bar's title. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. + * + * @param resId Resource ID of title string to set + * @see #setTitle(CharSequence) + * @see #setDisplayOptions(int, int) + */ + public abstract void setTitle(int resId); + + /** + * Show the ActionBar if it is not currently showing. If the window hosting + * the ActionBar does not have the feature + * {@link android.support.v4.view.Window#FEATURE_ACTION_BAR_OVERLAY} + * it will resize application content to fit the new space available. + */ + public abstract void show(); +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/BackStackRecord.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/BackStackRecord.java new file mode 100644 index 00000000..8da02c67 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/BackStackRecord.java @@ -0,0 +1,721 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; +import android.util.Log; +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import com.actionbarsherlock.R; + +final class BackStackState implements Parcelable { + final int[] mOps; + final int mTransition; + final int mTransitionStyle; + final String mName; + final int mIndex; + final int mBreadCrumbTitleRes; + final CharSequence mBreadCrumbTitleText; + final int mBreadCrumbShortTitleRes; + final CharSequence mBreadCrumbShortTitleText; + + public BackStackState(FragmentManagerImpl fm, BackStackRecord bse) { + int numRemoved = 0; + BackStackRecord.Op op = bse.mHead; + while (op != null) { + if (op.removed != null) numRemoved += op.removed.size(); + op = op.next; + } + mOps = new int[bse.mNumOp*5 + numRemoved]; + + if (!bse.mAddToBackStack) { + throw new IllegalStateException("Not on back stack"); + } + + op = bse.mHead; + int pos = 0; + while (op != null) { + mOps[pos++] = op.cmd; + mOps[pos++] = op.fragment.mIndex; + mOps[pos++] = op.enterAnim; + mOps[pos++] = op.exitAnim; + if (op.removed != null) { + final int N = op.removed.size(); + mOps[pos++] = N; + for (int i=0; i 0) { + op.removed = new ArrayList(N); + for (int i=0; i CREATOR + = new Parcelable.Creator() { + public BackStackState createFromParcel(Parcel in) { + return new BackStackState(in); + } + + public BackStackState[] newArray(int size) { + return new BackStackState[size]; + } + }; +} + +/** + * @hide Entry of an operation on the fragment back stack. + */ +final class BackStackRecord extends FragmentTransaction implements + FragmentManager.BackStackEntry, Runnable { + static final String TAG = "BackStackEntry"; + + private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + + final FragmentManagerImpl mManager; + + static final int OP_NULL = 0; + static final int OP_ADD = 1; + static final int OP_REPLACE = 2; + static final int OP_REMOVE = 3; + static final int OP_HIDE = 4; + static final int OP_SHOW = 5; + static final int OP_DETACH = 6; + static final int OP_ATTACH = 7; + + static final class Op { + Op next; + Op prev; + int cmd; + Fragment fragment; + int enterAnim; + int exitAnim; + ArrayList removed; + } + + Op mHead; + Op mTail; + int mNumOp; + int mEnterAnim; + int mExitAnim; + int mTransition; + int mTransitionStyle; + boolean mAddToBackStack; + boolean mAllowAddToBackStack = true; + String mName; + boolean mCommitted; + int mIndex; + + int mBreadCrumbTitleRes; + CharSequence mBreadCrumbTitleText; + int mBreadCrumbShortTitleRes; + CharSequence mBreadCrumbShortTitleText; + + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mName="); writer.print(mName); + writer.print(" mIndex="); writer.print(mIndex); + writer.print(" mCommitted="); writer.println(mCommitted); + if (mTransition != FragmentTransaction.TRANSIT_NONE) { + writer.print(prefix); writer.print("mTransition=#"); + writer.print(Integer.toHexString(mTransition)); + writer.print(" mTransitionStyle=#"); + writer.println(Integer.toHexString(mTransitionStyle)); + } + if (mEnterAnim != 0 || mExitAnim !=0) { + writer.print(prefix); writer.print("mEnterAnim=#"); + writer.print(Integer.toHexString(mEnterAnim)); + writer.print(" mExitAnim=#"); + writer.println(Integer.toHexString(mExitAnim)); + } + if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) { + writer.print(prefix); writer.print("mBreadCrumbTitleRes=#"); + writer.print(Integer.toHexString(mBreadCrumbTitleRes)); + writer.print(" mBreadCrumbTitleText="); + writer.println(mBreadCrumbTitleText); + } + if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) { + writer.print(prefix); writer.print("mBreadCrumbShortTitleRes=#"); + writer.print(Integer.toHexString(mBreadCrumbShortTitleRes)); + writer.print(" mBreadCrumbShortTitleText="); + writer.println(mBreadCrumbShortTitleText); + } + + if (mHead != null) { + writer.print(prefix); writer.println("Operations:"); + String innerPrefix = prefix + " "; + Op op = mHead; + int num = 0; + while (op != null) { + writer.print(prefix); writer.print(" Op #"); writer.print(num); + writer.println(":"); + writer.print(innerPrefix); writer.print("cmd="); writer.print(op.cmd); + writer.print(" fragment="); writer.println(op.fragment); + if (op.enterAnim != 0 || op.exitAnim != 0) { + writer.print(prefix); writer.print("enterAnim="); writer.print(op.enterAnim); + writer.print(" exitAnim="); writer.println(op.exitAnim); + } + if (op.removed != null && op.removed.size() > 0) { + for (int i=0; i=0; i--) { + Fragment r = op.removed.get(i); + r.mBackStackNesting += amt; + if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of " + + r + " to " + r.mBackStackNesting); + } + } + op = op.next; + } + } + + public int commit() { + return commitInternal(false); + } + + public int commitAllowingStateLoss() { + return commitInternal(true); + } + + int commitInternal(boolean allowStateLoss) { + if (mCommitted) throw new IllegalStateException("commit already called"); + if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Commit: " + this); + mCommitted = true; + if (mAddToBackStack) { + mIndex = mManager.allocBackStackIndex(this); + } else { + mIndex = -1; + } + mManager.enqueueAction(this, allowStateLoss); + return mIndex; + } + + public void run() { + if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Run: " + this); + + if (mAddToBackStack) { + if (mIndex < 0) { + throw new IllegalStateException("addToBackStack() called after commit()"); + } + } + + bumpBackStackNesting(1); + + Op op = mHead; + while (op != null) { + switch (op.cmd) { + case OP_ADD: { + Fragment f = op.fragment; + f.mNextAnim = op.enterAnim; + mManager.addFragment(f, false); + } break; + case OP_REPLACE: { + Fragment f = op.fragment; + if (mManager.mAdded != null) { + for (int i=0; i= 0) { + mManager.freeBackStackIndex(mIndex); + mIndex = -1; + } + } + + public String getName() { + return mName; + } + + public int getTransition() { + return mTransition; + } + + public int getTransitionStyle() { + return mTransitionStyle; + } + + public boolean isEmpty() { + return mNumOp == 0; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/DialogFragment.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/DialogFragment.java new file mode 100644 index 00000000..a5b89a91 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/DialogFragment.java @@ -0,0 +1,396 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +/** + * Static library support version of the framework's {@link android.app.DialogFragment}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class DialogFragment extends Fragment + implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { + + /** + * Style for {@link #setStyle(int, int)}: a basic, + * normal dialog. + */ + public static final int STYLE_NORMAL = 0; + + /** + * Style for {@link #setStyle(int, int)}: don't include + * a title area. + */ + public static final int STYLE_NO_TITLE = 1; + + /** + * Style for {@link #setStyle(int, int)}: don't draw + * any frame at all; the view hierarchy returned by {@link #onCreateView} + * is entirely responsible for drawing the dialog. + */ + public static final int STYLE_NO_FRAME = 2; + + /** + * Style for {@link #setStyle(int, int)}: like + * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog. + * The user can not touch it, and its window will not receive input focus. + */ + public static final int STYLE_NO_INPUT = 3; + + private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState"; + private static final String SAVED_STYLE = "android:style"; + private static final String SAVED_THEME = "android:theme"; + private static final String SAVED_CANCELABLE = "android:cancelable"; + private static final String SAVED_SHOWS_DIALOG = "android:showsDialog"; + private static final String SAVED_BACK_STACK_ID = "android:backStackId"; + + int mStyle = STYLE_NORMAL; + int mTheme = 0; + boolean mCancelable = true; + boolean mShowsDialog = false; + int mBackStackId = -1; + + Dialog mDialog; + boolean mDestroyed; + boolean mRemoved; + + public DialogFragment() { + } + + /** + * Call to customize the basic appearance and behavior of the + * fragment's dialog. This can be used for some common dialog behaviors, + * taking care of selecting flags, theme, and other options for you. The + * same effect can be achieve by manually setting Dialog and Window + * attributes yourself. Calling this after the fragment's Dialog is + * created will have no effect. + * + * @param style Selects a standard style: may be {@link #STYLE_NORMAL}, + * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or + * {@link #STYLE_NO_INPUT}. + * @param theme Optional custom theme. If 0, an appropriate theme (based + * on the style) will be selected for you. + */ + public void setStyle(int style, int theme) { + mStyle = style; + if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) { + mTheme = android.R.style.Theme_Panel; + } + if (theme != 0) { + mTheme = theme; + } + } + + /** + * Display the dialog, adding the fragment to the given FragmentManager. This + * is a convenience for explicitly creating a transaction, adding the + * fragment to it with the given tag, and committing it. This does + * not add the transaction to the back stack. When the fragment + * is dismissed, a new transaction will be executed to remove it from + * the activity. + * @param manager The FragmentManager this fragment will be added to. + * @param tag The tag for this fragment, as per + * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}. + */ + public void show(FragmentManager manager, String tag) { + setShowsDialog(true); + FragmentTransaction ft = manager.beginTransaction(); + ft.add(this, tag); + ft.commit(); + } + + /** + * Display the dialog, adding the fragment using an existing transaction + * and then committing the transaction. + * @param transaction An existing transaction in which to add the fragment. + * @param tag The tag for this fragment, as per + * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}. + * @return Returns the identifier of the committed transaction, as per + * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. + */ + public int show(FragmentTransaction transaction, String tag) { + setShowsDialog(true); + transaction.add(this, tag); + mRemoved = false; + mBackStackId = transaction.commit(); + return mBackStackId; + } + + /** + * Dismiss the fragment and its dialog. If the fragment was added to the + * back stack, all back stack state up to and including this entry will + * be popped. Otherwise, a new transaction will be committed to remove + * the fragment. + */ + public void dismiss() { + dismissInternal(false); + } + + void dismissInternal(boolean allowStateLoss) { + if (mDialog != null) { + mDialog.dismiss(); + mDialog = null; + } + mRemoved = true; + if (mBackStackId >= 0) { + getFragmentManager().popBackStack(mBackStackId, + FragmentManager.POP_BACK_STACK_INCLUSIVE); + mBackStackId = -1; + } else { + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.remove(this); + if (allowStateLoss) { + ft.commitAllowingStateLoss(); + } else { + ft.commit(); + } + } + } + + public Dialog getDialog() { + return mDialog; + } + + public int getTheme() { + return mTheme; + } + + /** + * Control whether the shown Dialog is cancelable. Use this instead of + * directly calling {@link Dialog#setCancelable(boolean) + * Dialog.setCancelable(boolean)}, because DialogFragment needs to change + * its behavior based on this. + * + * @param cancelable If true, the dialog is cancelable. The default + * is true. + */ + public void setCancelable(boolean cancelable) { + mCancelable = cancelable; + if (mDialog != null) mDialog.setCancelable(cancelable); + } + + /** + * Return the current value of {@link #setCancelable(boolean)}. + */ + public boolean isCancelable() { + return mCancelable; + } + + /** + * Controls whether this fragment should be shown in a dialog. If not + * set, no Dialog will be created in {@link #onActivityCreated(Bundle)}, + * and the fragment's view hierarchy will thus not be added to it. This + * allows you to instead use it as a normal fragment (embedded inside of + * its activity). + * + *

This is normally set for you based on whether the fragment is + * associated with a container view ID passed to + * {@link FragmentTransaction#add(int, Fragment) FragmentTransaction.add(int, Fragment)}. + * If the fragment was added with a container, setShowsDialog will be + * initialized to false; otherwise, it will be true. + * + * @param showsDialog If true, the fragment will be displayed in a Dialog. + * If false, no Dialog will be created and the fragment's view hierarchly + * left undisturbed. + */ + public void setShowsDialog(boolean showsDialog) { + mShowsDialog = showsDialog; + } + + /** + * Return the current value of {@link #setShowsDialog(boolean)}. + */ + public boolean getShowsDialog() { + return mShowsDialog; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + //SEE: http://stackoverflow.com/questions/5637894/dialogfragments-with-devices-api-level-11/7560686#7560686 + //mShowsDialog = mContainerId == 0; + + if (savedInstanceState != null) { + mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL); + mTheme = savedInstanceState.getInt(SAVED_THEME, 0); + mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true); + mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog); + mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1); + } + + } + + /** @hide */ + @Override + public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { + if (!mShowsDialog) { + return super.getLayoutInflater(savedInstanceState); + } + + mDialog = onCreateDialog(savedInstanceState); + mDestroyed = false; + switch (mStyle) { + case STYLE_NO_INPUT: + mDialog.getWindow().addFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); + // fall through... + case STYLE_NO_FRAME: + case STYLE_NO_TITLE: + mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + } + return (LayoutInflater)mDialog.getContext().getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + } + + /** + * Override to build your own custom Dialog container. This is typically + * used to show an AlertDialog instead of a generic Dialog; when doing so, + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} does not need + * to be implemented since the AlertDialog takes care of its own content. + * + *

This method will be called after {@link #onCreate(Bundle)} and + * before {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. The + * default implementation simply instantiates and returns a {@link Dialog} + * class. + * + *

Note: DialogFragment own the {@link Dialog#setOnCancelListener + * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener + * Dialog.setOnDismissListener} callbacks. You must not set them yourself. + * To find out about these events, override {@link #onCancel(DialogInterface)} + * and {@link #onDismiss(DialogInterface)}.

+ * + * @param savedInstanceState The last saved instance state of the Fragment, + * or null if this is a freshly created Fragment. + * + * @return Return a new Dialog instance to be displayed by the Fragment. + */ + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new Dialog(getActivity(), getTheme()); + } + + public void onCancel(DialogInterface dialog) { + } + + public void onDismiss(DialogInterface dialog) { + if (!mRemoved) { + // Note: we need to use allowStateLoss, because the dialog + // dispatches this asynchronously so we can receive the call + // after the activity is paused. Worst case, when the user comes + // back to the activity they see the dialog again. + dismissInternal(true); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (!mShowsDialog) { + return; + } + + View view = getView(); + if (view != null) { + if (view.getParent() != null) { + throw new IllegalStateException("DialogFragment can not be attached to a container view"); + } + mDialog.setContentView(view); + } + mDialog.setOwnerActivity(getActivity()); + mDialog.setCancelable(mCancelable); + mDialog.setOnCancelListener(this); + mDialog.setOnDismissListener(this); + if (savedInstanceState != null) { + Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG); + if (dialogState != null) { + mDialog.onRestoreInstanceState(dialogState); + } + } + } + + @Override + public void onStart() { + super.onStart(); + if (mDialog != null) { + mRemoved = false; + mDialog.show(); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mDialog != null) { + Bundle dialogState = mDialog.onSaveInstanceState(); + if (dialogState != null) { + outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState); + } + } + if (mStyle != STYLE_NORMAL) { + outState.putInt(SAVED_STYLE, mStyle); + } + if (mTheme != 0) { + outState.putInt(SAVED_THEME, mTheme); + } + if (!mCancelable) { + outState.putBoolean(SAVED_CANCELABLE, mCancelable); + } + if (!mShowsDialog) { + outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog); + } + if (mBackStackId != -1) { + outState.putInt(SAVED_BACK_STACK_ID, mBackStackId); + } + } + + @Override + public void onStop() { + super.onStop(); + if (mDialog != null) { + mDialog.hide(); + } + } + + /** + * Remove dialog. + */ + @Override + public void onDestroyView() { + super.onDestroyView(); + mDestroyed = true; + if (mDialog != null) { + // Set removed here because this dismissal is just to hide + // the dialog -- we don't want this to cause the fragment to + // actually be removed. + mRemoved = true; + mDialog.dismiss(); + mDialog = null; + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/Fragment.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/Fragment.java new file mode 100644 index 00000000..b701fddf --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/Fragment.java @@ -0,0 +1,1339 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.app.Activity; +import android.content.ComponentCallbacks; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.util.DebugUtils; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuItem; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View.OnCreateContextMenuListener; +import android.view.animation.Animation; +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.HashMap; + +final class FragmentState implements Parcelable { + final String mClassName; + final int mIndex; + final boolean mFromLayout; + final int mFragmentId; + final int mContainerId; + final String mTag; + final boolean mRetainInstance; + final boolean mDetached; + final Bundle mArguments; + + Bundle mSavedFragmentState; + + Fragment mInstance; + + public FragmentState(Fragment frag) { + mClassName = frag.getClass().getName(); + mIndex = frag.mIndex; + mFromLayout = frag.mFromLayout; + mFragmentId = frag.mFragmentId; + mContainerId = frag.mContainerId; + mTag = frag.mTag; + mRetainInstance = frag.mRetainInstance; + mDetached = frag.mDetached; + mArguments = frag.mArguments; + } + + public FragmentState(Parcel in) { + mClassName = in.readString(); + mIndex = in.readInt(); + mFromLayout = in.readInt() != 0; + mFragmentId = in.readInt(); + mContainerId = in.readInt(); + mTag = in.readString(); + mRetainInstance = in.readInt() != 0; + mDetached = in.readInt() != 0; + mArguments = in.readBundle(); + mSavedFragmentState = in.readBundle(); + } + + public Fragment instantiate(SupportActivity activity) { + if (mInstance != null) { + return mInstance; + } + + if (mArguments != null) { + mArguments.setClassLoader(activity.getClassLoader()); + } + + mInstance = Fragment.instantiate(activity.asActivity(), mClassName, mArguments); + + if (mSavedFragmentState != null) { + mSavedFragmentState.setClassLoader(activity.getClassLoader()); + mInstance.mSavedFragmentState = mSavedFragmentState; + } + mInstance.setIndex(mIndex); + mInstance.mFromLayout = mFromLayout; + mInstance.mRestored = true; + mInstance.mFragmentId = mFragmentId; + mInstance.mContainerId = mContainerId; + mInstance.mTag = mTag; + mInstance.mRetainInstance = mRetainInstance; + mInstance.mDetached = mDetached; + mInstance.mFragmentManager = activity.getInternalCallbacks().getFragments(); + + return mInstance; + } + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mClassName); + dest.writeInt(mIndex); + dest.writeInt(mFromLayout ? 1 : 0); + dest.writeInt(mFragmentId); + dest.writeInt(mContainerId); + dest.writeString(mTag); + dest.writeInt(mRetainInstance ? 1 : 0); + dest.writeInt(mDetached ? 1 : 0); + dest.writeBundle(mArguments); + dest.writeBundle(mSavedFragmentState); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public FragmentState createFromParcel(Parcel in) { + return new FragmentState(in); + } + + public FragmentState[] newArray(int size) { + return new FragmentState[size]; + } + }; +} + +/** + * Static library support version of the framework's {@link android.app.Fragment}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener { + private static final HashMap> sClassMap = + new HashMap>(); + + static final int INITIALIZING = 0; // Not yet created. + static final int CREATED = 1; // Created. + static final int ACTIVITY_CREATED = 2; // The activity has finished its creation. + static final int STOPPED = 3; // Fully created, not started. + static final int STARTED = 4; // Created and started, not resumed. + static final int RESUMED = 5; // Created started and resumed. + + int mState = INITIALIZING; + + // Non-null if the fragment's view hierarchy is currently animating away, + // meaning we need to wait a bit on completely destroying it. This is the + // view that is animating. + View mAnimatingAway; + + // If mAnimatingAway != null, this is the state we should move to once the + // animation is done. + int mStateAfterAnimating; + + // When instantiated from saved state, this is the saved state. + Bundle mSavedFragmentState; + SparseArray mSavedViewState; + + // Index into active fragment array. + int mIndex = -1; + + // Internal unique name for this fragment; + String mWho; + + // Construction arguments; + Bundle mArguments; + + // Target fragment. + Fragment mTarget; + + // For use when retaining a fragment: this is the index of the last mTarget. + int mTargetIndex = -1; + + // Target request code. + int mTargetRequestCode; + + // True if the fragment is in the list of added fragments. + boolean mAdded; + + // If set this fragment is being removed from its activity. + boolean mRemoving; + + // True if the fragment is in the resumed state. + boolean mResumed; + + // Set to true if this fragment was instantiated from a layout file. + boolean mFromLayout; + + // Set to true when the view has actually been inflated in its layout. + boolean mInLayout; + + // True if this fragment has been restored from previously saved state. + boolean mRestored; + + // Number of active back stack entries this fragment is in. + int mBackStackNesting; + + // The fragment manager we are associated with. Set as soon as the + // fragment is used in a transaction; cleared after it has been removed + // from all transactions. + FragmentManager mFragmentManager; + + // Set as soon as a fragment is added to a transaction (or removed), + // to be able to do validation. + SupportActivity mImmediateActivity; + + // Activity this fragment is attached to. + SupportActivity mActivity; + + // The optional identifier for this fragment -- either the container ID if it + // was dynamically added to the view hierarchy, or the ID supplied in + // layout. + int mFragmentId; + + // When a fragment is being dynamically added to the view hierarchy, this + // is the identifier of the parent container it is being added to. + int mContainerId; + + // The optional named tag for this fragment -- usually used to find + // fragments that are not part of the layout. + String mTag; + + // Set to true when the app has requested that this fragment be hidden + // from the user. + boolean mHidden; + + // Set to true when the app has requested that this fragment be deactivated. + boolean mDetached; + + // If set this fragment would like its instance retained across + // configuration changes. + boolean mRetainInstance; + + // If set this fragment is being retained across the current config change. + boolean mRetaining; + + // If set this fragment has menu items to contribute. + boolean mHasMenu; + + // Used to control whether or not this fragments menus (both options and + // context) are exposed regardless of whether or not they actually exist. + boolean mExposesMenu = true; + + // Used to verify that subclasses call through to super class. + boolean mCalled; + + // If app has requested a specific animation, this is the one to use. + int mNextAnim; + + // The parent container of the fragment after dynamically added to UI. + ViewGroup mContainer; + + // The View generated for this fragment. + View mView; + + // The real inner view that will save/restore state. + View mInnerView; + + LoaderManagerImpl mLoaderManager; + boolean mLoadersStarted; + boolean mCheckedForLoaderManager; + + /** + * State information that has been retrieved from a fragment instance + * through {@link FragmentManager#saveFragmentInstanceState(Fragment) + * FragmentManager.saveFragmentInstanceState}. + */ + public static class SavedState implements Parcelable { + final Bundle mState; + + SavedState(Bundle state) { + mState = state; + } + + SavedState(Parcel in, ClassLoader loader) { + mState = in.readBundle(); + if (loader != null && mState != null) { + mState.setClassLoader(loader); + } + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeBundle(mState); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in, null); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + /** + * Thrown by {@link Fragment#instantiate(Context, String, Bundle)} when + * there is an instantiation failure. + */ + static public class InstantiationException extends RuntimeException { + private static final long serialVersionUID = 8423238441973733190L; + + public InstantiationException(String msg, Exception cause) { + super(msg, cause); + } + } + + /** + * Default constructor. Every fragment must have an + * empty constructor, so it can be instantiated when restoring its + * activity's state. It is strongly recommended that subclasses do not + * have other constructors with parameters, since these constructors + * will not be called when the fragment is re-instantiated; instead, + * arguments can be supplied by the caller with {@link #setArguments} + * and later retrieved by the Fragment with {@link #getArguments}. + * + *

Applications should generally not implement a constructor. The + * first place application code an run where the fragment is ready to + * be used is in {@link #onAttach(Activity)}, the point where the fragment + * is actually associated with its activity. Some applications may also + * want to implement {@link #onInflate} to retrieve attributes from a + * layout resource, though should take care here because this happens for + * the fragment is attached to its activity. + */ + public Fragment() { + } + + /** + * Like {@link #instantiate(Context, String, Bundle)} but with a null + * argument Bundle. + */ + public static Fragment instantiate(Context context, String fname) { + return instantiate(context, fname, null); + } + + /** + * Create a new instance of a Fragment with the given class name. This is + * the same as calling its empty constructor. + * + * @param context The calling context being used to instantiate the fragment. + * This is currently just used to get its ClassLoader. + * @param fname The class name of the fragment to instantiate. + * @param args Bundle of arguments to supply to the fragment, which it + * can retrieve with {@link #getArguments()}. May be null. + * @return Returns a new fragment instance. + * @throws InstantiationException If there is a failure in instantiating + * the given fragment class. This is a runtime exception; it is not + * normally expected to happen. + */ + public static Fragment instantiate(Context context, String fname, Bundle args) { + try { + Class clazz = sClassMap.get(fname); + if (clazz == null) { + // Class not found in the cache, see if it's real, and try to add it + clazz = context.getClassLoader().loadClass(fname); + sClassMap.put(fname, clazz); + } + Fragment f = (Fragment)clazz.newInstance(); + if (args != null) { + args.setClassLoader(f.getClass().getClassLoader()); + f.mArguments = args; + } + return f; + } catch (ClassNotFoundException e) { + throw new InstantiationException("Unable to instantiate fragment " + fname + + ": make sure class name exists, is public, and has an" + + " empty constructor that is public", e); + } catch (java.lang.InstantiationException e) { + throw new InstantiationException("Unable to instantiate fragment " + fname + + ": make sure class name exists, is public, and has an" + + " empty constructor that is public", e); + } catch (IllegalAccessException e) { + throw new InstantiationException("Unable to instantiate fragment " + fname + + ": make sure class name exists, is public, and has an" + + " empty constructor that is public", e); + } + } + + final void restoreViewState() { + if (mSavedViewState != null) { + mInnerView.restoreHierarchyState(mSavedViewState); + mSavedViewState = null; + } + } + + final void setIndex(int index) { + mIndex = index; + mWho = "android:fragment:" + mIndex; + } + + final boolean isInBackStack() { + return mBackStackNesting > 0; + } + + /** + * Subclasses can not override equals(). + */ + @Override final public boolean equals(Object o) { + return super.equals(o); + } + + /** + * Subclasses can not override hashCode(). + */ + @Override final public int hashCode() { + return super.hashCode(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + if (mIndex >= 0) { + sb.append(" #"); + sb.append(mIndex); + } + if (mFragmentId != 0) { + sb.append(" id=0x"); + sb.append(Integer.toHexString(mFragmentId)); + } + if (mTag != null) { + sb.append(" "); + sb.append(mTag); + } + sb.append('}'); + return sb.toString(); + } + + /** + * Return the identifier this fragment is known by. This is either + * the android:id value supplied in a layout or the container view ID + * supplied when adding the fragment. + */ + final public int getId() { + return mFragmentId; + } + + /** + * Get the tag name of the fragment, if specified. + */ + final public String getTag() { + return mTag; + } + + /** + * Supply the construction arguments for this fragment. This can only + * be called before the fragment has been attached to its activity; that + * is, you should call it immediately after constructing the fragment. The + * arguments supplied here will be retained across fragment destroy and + * creation. + */ + public void setArguments(Bundle args) { + if (mIndex >= 0) { + throw new IllegalStateException("Fragment already active"); + } + mArguments = args; + } + + /** + * Return the arguments supplied when the fragment was instantiated, + * if any. + */ + final public Bundle getArguments() { + return mArguments; + } + + /** + * Set the initial saved state that this Fragment should restore itself + * from when first being constructed, as returned by + * {@link FragmentManager#saveFragmentInstanceState(Fragment) + * FragmentManager.saveFragmentInstanceState}. + * + * @param state The state the fragment should be restored from. + */ + public void setInitialSavedState(SavedState state) { + if (mIndex >= 0) { + throw new IllegalStateException("Fragment already active"); + } + mSavedFragmentState = state != null && state.mState != null + ? state.mState : null; + } + + /** + * Optional target for this fragment. This may be used, for example, + * if this fragment is being started by another, and when done wants to + * give a result back to the first. The target set here is retained + * across instances via {@link FragmentManager#putFragment + * FragmentManager.putFragment()}. + * + * @param fragment The fragment that is the target of this one. + * @param requestCode Optional request code, for convenience if you + * are going to call back with {@link #onActivityResult(int, int, Intent)}. + */ + public void setTargetFragment(Fragment fragment, int requestCode) { + mTarget = fragment; + mTargetRequestCode = requestCode; + } + + /** + * Return the target fragment set by {@link #setTargetFragment}. + */ + final public Fragment getTargetFragment() { + return mTarget; + } + + /** + * Return the target request code set by {@link #setTargetFragment}. + */ + final public int getTargetRequestCode() { + return mTargetRequestCode; + } + + /** + * Return the Activity this fragment is currently associated with. + * + * @see #getSupportActivity() + */ + final public Activity getActivity() { + return (mActivity != null) ? mActivity.asActivity() : null; + } + + /** + * Return the SupportActivity interface for the activity in which this + * fragment is currently associated. + * + * @see #getActivity() + */ + final public SupportActivity getSupportActivity() { + return mActivity; + } + + /** + * Return getActivity().getResources(). + */ + final public Resources getResources() { + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } + return mActivity.getResources(); + } + + /** + * Return a localized, styled CharSequence from the application's package's + * default string table. + * + * @param resId Resource id for the CharSequence text + */ + public final CharSequence getText(int resId) { + return getResources().getText(resId); + } + + /** + * Return a localized string from the application's package's + * default string table. + * + * @param resId Resource id for the string + */ + public final String getString(int resId) { + return getResources().getString(resId); + } + + /** + * Return a localized formatted string from the application's package's + * default string table, substituting the format arguments as defined in + * {@link java.util.Formatter} and {@link java.lang.String#format}. + * + * @param resId Resource id for the format string + * @param formatArgs The format arguments that will be used for substitution. + */ + + public final String getString(int resId, Object... formatArgs) { + return getResources().getString(resId, formatArgs); + } + + /** + * Return the FragmentManager for interacting with fragments associated + * with this fragment's activity. Note that this will be non-null slightly + * before {@link #getActivity()}, during the time from when the fragment is + * placed in a {@link FragmentTransaction} until it is committed and + * attached to its activity. + */ + final public FragmentManager getFragmentManager() { + return mFragmentManager; + } + + /** + * A clone of {@link #getFragmentManager()} to maintain naming conventions + * throughout the compatibility library. + */ + final public FragmentManager getSupportFragmentManager() { + return mFragmentManager; + } + + /** + * Return true if the fragment is currently added to its activity. + */ + final public boolean isAdded() { + return mActivity != null && mAdded; + } + + /** + * Return true if the fragment has been explicitly detached from the UI. + * That is, {@link FragmentTransaction#detach(Fragment) + * FragmentTransaction.detach(Fragment)} has been used on it. + */ + final public boolean isDetached() { + return mDetached; + } + + /** + * Return true if this fragment is currently being removed from its + * activity. This is not whether its activity is finishing, but + * rather whether it is in the process of being removed from its activity. + */ + final public boolean isRemoving() { + return mRemoving; + } + + /** + * Return true if the layout is included as part of an activity view + * hierarchy via the <fragment> tag. This will always be true when + * fragments are created through the <fragment> tag, except + * in the case where an old fragment is restored from a previous state and + * it does not appear in the layout of the current state. + */ + final public boolean isInLayout() { + return mInLayout; + } + + /** + * Return true if the fragment is in the resumed state. This is true + * for the duration of {@link #onResume()} and {@link #onPause()} as well. + */ + final public boolean isResumed() { + return mResumed; + } + + /** + * Return true if the fragment is currently visible to the user. This means + * it: (1) has been added, (2) has its view attached to the window, and + * (3) is not hidden. + */ + final public boolean isVisible() { + return isAdded() && !isHidden() && mView != null + && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE; + } + + /** + * Return true if the fragment has been hidden. By default fragments + * are shown. You can find out about changes to this state with + * {@link #onHiddenChanged}. Note that the hidden state is orthogonal + * to other states -- that is, to be visible to the user, a fragment + * must be both started and not hidden. + */ + final public boolean isHidden() { + return mHidden; + } + + /** + * Called when the hidden state (as returned by {@link #isHidden()} of + * the fragment has changed. Fragments start out not hidden; this will + * be called whenever the fragment changes state from that. + * @param hidden True if the fragment is now hidden, false if it is not + * visible. + */ + public void onHiddenChanged(boolean hidden) { + } + + /** + * Control whether a fragment instance is retained across Activity + * re-creation (such as from a configuration change). This can only + * be used with fragments not in the back stack. If set, the fragment + * lifecycle will be slightly different when an activity is recreated: + *

    + *
  • {@link #onDestroy()} will not be called (but {@link #onDetach()} still + * will be, because the fragment is being detached from its current activity). + *
  • {@link #onCreate(Bundle)} will not be called since the fragment + * is not being re-created. + *
  • {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} will + * still be called. + *
+ */ + public void setRetainInstance(boolean retain) { + mRetainInstance = retain; + } + + final public boolean getRetainInstance() { + return mRetainInstance; + } + + /** + * Report that this fragment would like to participate in populating + * the options menu by receiving a call to {@link #onCreateOptionsMenu} + * and related methods. + * + * @param hasMenu If true, the fragment has menu items to contribute. + */ + public void setHasOptionsMenu(boolean hasMenu) { + if (mHasMenu != hasMenu) { + mHasMenu = hasMenu; + if (isAdded() && !isHidden()) { + mActivity.invalidateOptionsMenu(); + } + } + } + + /** + * Return the LoaderManager for this fragment, creating it if needed. + */ + public LoaderManager getLoaderManager() { + if (mLoaderManager != null) { + return mLoaderManager; + } + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } + mCheckedForLoaderManager = true; + mLoaderManager = mActivity.getInternalCallbacks().getLoaderManager(mIndex, mLoadersStarted, true); + return mLoaderManager; + } + + /** + * Call {@link Activity#startActivity(Intent)} on the fragment's + * containing Activity. + */ + public void startActivity(Intent intent) { + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } + mActivity.startActivityFromFragment(this, intent, -1); + } + + /** + * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's + * containing Activity. + */ + public void startActivityForResult(Intent intent, int requestCode) { + if (mActivity == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } + mActivity.startActivityFromFragment(this, intent, requestCode); + } + + /** + * Receive the result from a previous call to + * {@link #startActivityForResult(Intent, int)}. This follows the + * related Activity API as described there in + * {@link Activity#onActivityResult(int, int, Intent)}. + * + * @param requestCode The integer request code originally supplied to + * startActivityForResult(), allowing you to identify who this + * result came from. + * @param resultCode The integer result code returned by the child activity + * through its setResult(). + * @param data An Intent, which can return result data to the caller + * (various data can be attached to Intent "extras"). + */ + public void onActivityResult(int requestCode, int resultCode, Intent data) { + } + + /** + * @hide Hack so that DialogFragment can make its Dialog before creating + * its views, and the view construction can use the dialog's context for + * inflation. Maybe this should become a public API. Note sure. + */ + public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { + return mActivity.getLayoutInflater(); + } + + /** + * Called when a fragment is being created as part of a view layout + * inflation, typically from setting the content view of an activity. This + * may be called immediately after the fragment is created from a + * tag in a layout file. Note this is before the fragment's + * {@link #onAttach(Activity)} has been called; all you should do here is + * parse the attributes and save them away. + * + *

This is called every time the fragment is inflated, even if it is + * being inflated into a new instance with saved state. It typically makes + * sense to re-parse the parameters each time, to allow them to change with + * different configurations.

+ * + *

Here is a typical implementation of a fragment that can take parameters + * both through attributes supplied here as well from {@link #getArguments()}:

+ * + * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java + * fragment} + * + *

Note that parsing the XML attributes uses a "styleable" resource. The + * declaration for the styleable used here is:

+ * + * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments} + * + *

The fragment can then be declared within its activity's content layout + * through a tag like this:

+ * + * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes} + * + *

This fragment can also be created dynamically from arguments given + * at runtime in the arguments Bundle; here is an example of doing so at + * creation of the containing activity:

+ * + * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java + * create} + * + * @param activity The Activity that is inflating this fragment. + * @param attrs The attributes at the tag where the fragment is + * being created. + * @param savedInstanceState If the fragment is being re-created from + * a previous saved state, this is the state. + */ + public void onInflate(SupportActivity activity, AttributeSet attrs, Bundle savedInstanceState) { + mCalled = true; + } + + /** + * Called when a fragment is first attached to its activity. + * {@link #onCreate(Bundle)} will be called after this. + */ + public void onAttach(SupportActivity activity) { + mCalled = true; + } + + /** + * Called when a fragment loads an animation. + */ + public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { + return null; + } + + /** + * Called to do initial creation of a fragment. This is called after + * {@link #onAttach(Activity)} and before + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. + * + *

Note that this can be called while the fragment's activity is + * still in the process of being created. As such, you can not rely + * on things like the activity's content view hierarchy being initialized + * at this point. If you want to do work once the activity itself is + * created, see {@link #onActivityCreated(Bundle)}. + * + * @param savedInstanceState If the fragment is being re-created from + * a previous saved state, this is the state. + */ + public void onCreate(Bundle savedInstanceState) { + mCalled = true; + } + + /** + * Called to have the fragment instantiate its user interface view. + * This is optional, and non-graphical fragments can return null (which + * is the default implementation). This will be called between + * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}. + * + *

If you return a View from here, you will later be called in + * {@link #onDestroyView} when the view is being released. + * + * @param inflater The LayoutInflater object that can be used to inflate + * any views in the fragment, + * @param container If non-null, this is the parent view that the fragment's + * UI should be attached to. The fragment should not add the view itself, + * but this can be used to generate the LayoutParams of the view. + * @param savedInstanceState If non-null, this fragment is being re-constructed + * from a previous saved state as given here. + * + * @return Return the View for the fragment's UI, or null. + */ + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return null; + } + + /** + * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} + * has returned, but before any saved state has been restored in to the view. + * This gives subclasses a chance to initialize themselves once + * they know their view hierarchy has been completely created. The fragment's + * view hierarchy is not however attached to its parent at this point. + * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. + * @param savedInstanceState If non-null, this fragment is being re-constructed + * from a previous saved state as given here. + */ + public void onViewCreated(View view, Bundle savedInstanceState) { + } + + /** + * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}), + * if provided. + * + * @return The fragment's root view, or null if it has no layout. + */ + public View getView() { + return mView; + } + + /** + * Called when the fragment's activity has been created and this + * fragment's view hierarchy instantiated. It can be used to do final + * initialization once these pieces are in place, such as retrieving + * views or restoring state. It is also useful for fragments that use + * {@link #setRetainInstance(boolean)} to retain their instance, + * as this callback tells the fragment when it is fully associated with + * the new activity instance. This is called after {@link #onCreateView} + * and before {@link #onStart()}. + * + * @param savedInstanceState If the fragment is being re-created from + * a previous saved state, this is the state. + */ + public void onActivityCreated(Bundle savedInstanceState) { + mCalled = true; + } + + /** + * Called when the Fragment is visible to the user. This is generally + * tied to {@link Activity#onStart() Activity.onStart} of the containing + * Activity's lifecycle. + */ + public void onStart() { + mCalled = true; + + if (!mLoadersStarted) { + mLoadersStarted = true; + if (!mCheckedForLoaderManager) { + mCheckedForLoaderManager = true; + mLoaderManager = mActivity.getInternalCallbacks().getLoaderManager(mIndex, mLoadersStarted, false); + } + if (mLoaderManager != null) { + mLoaderManager.doStart(); + } + } + } + + /** + * Called when the fragment is visible to the user and actively running. + * This is generally + * tied to {@link Activity#onResume() Activity.onResume} of the containing + * Activity's lifecycle. + */ + public void onResume() { + mCalled = true; + } + + /** + * Called to ask the fragment to save its current dynamic state, so it + * can later be reconstructed in a new instance of its process is + * restarted. If a new instance of the fragment later needs to be + * created, the data you place in the Bundle here will be available + * in the Bundle given to {@link #onCreate(Bundle)}, + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}, and + * {@link #onActivityCreated(Bundle)}. + * + *

This corresponds to {@link Activity#onSaveInstanceState(Bundle) + * Activity.onSaveInstanceState(Bundle)} and most of the discussion there + * applies here as well. Note however: this method may be called + * at any time before {@link #onDestroy()}. There are many situations + * where a fragment may be mostly torn down (such as when placed on the + * back stack with no UI showing), but its state will not be saved until + * its owning activity actually needs to save its state. + * + * @param outState Bundle in which to place your saved state. + */ + public void onSaveInstanceState(Bundle outState) { + } + + public void onConfigurationChanged(Configuration newConfig) { + mCalled = true; + } + + /** + * Called when the Fragment is no longer resumed. This is generally + * tied to {@link Activity#onPause() Activity.onPause} of the containing + * Activity's lifecycle. + */ + public void onPause() { + mCalled = true; + } + + /** + * Called when the Fragment is no longer started. This is generally + * tied to {@link Activity#onStop() Activity.onStop} of the containing + * Activity's lifecycle. + */ + public void onStop() { + mCalled = true; + } + + public void onLowMemory() { + mCalled = true; + } + + /** + * Called when the view previously created by {@link #onCreateView} has + * been detached from the fragment. The next time the fragment needs + * to be displayed, a new view will be created. This is called + * after {@link #onStop()} and before {@link #onDestroy()}. It is called + * regardless of whether {@link #onCreateView} returned a + * non-null view. Internally it is called after the view's state has + * been saved but before it has been removed from its parent. + */ + public void onDestroyView() { + mCalled = true; + } + + /** + * Called when the fragment is no longer in use. This is called + * after {@link #onStop()} and before {@link #onDetach()}. + */ + public void onDestroy() { + mCalled = true; + //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager + // + " mLoaderManager=" + mLoaderManager); + if (!mCheckedForLoaderManager) { + mCheckedForLoaderManager = true; + mLoaderManager = mActivity.getInternalCallbacks().getLoaderManager(mIndex, mLoadersStarted, false); + } + if (mLoaderManager != null) { + mLoaderManager.doDestroy(); + } + } + + /** + * Called by the fragment manager once this fragment has been removed, + * so that we don't have any left-over state if the application decides + * to re-use the instance. This only clears state that the framework + * internally manages, not things the application sets. + */ + void initState() { + mIndex = -1; + mWho = null; + mAdded = false; + mRemoving = false; + mResumed = false; + mFromLayout = false; + mInLayout = false; + mRestored = false; + mBackStackNesting = 0; + mFragmentManager = null; + mActivity = null; + mImmediateActivity = null; + mFragmentId = 0; + mContainerId = 0; + mTag = null; + mHidden = false; + mDetached = false; + mRetaining = false; + mLoaderManager = null; + mLoadersStarted = false; + mCheckedForLoaderManager = false; + } + + /** + * Called when the fragment is no longer attached to its activity. This + * is called after {@link #onDestroy()}. + */ + public void onDetach() { + mCalled = true; + } + + /** + * Initialize the contents of the Activity's standard options menu. You + * should place your menu items in to menu. For this method + * to be called, you must have first called {@link #setHasOptionsMenu}. See + * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu} + * for more information. + * + * @param menu The options menu in which you place your items. + * + * @see #setHasOptionsMenu + * @see #onPrepareOptionsMenu + * @see #onOptionsItemSelected + */ + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + } + + /** + * Prepare the Screen's standard options menu to be displayed. This is + * called right before the menu is shown, every time it is shown. You can + * use this method to efficiently enable/disable items or otherwise + * dynamically modify the contents. See + * {@link Activity#onPrepareOptionsMenu(Menu) Activity.onPrepareOptionsMenu} + * for more information. + * + * @param menu The options menu as last shown or first initialized by + * onCreateOptionsMenu(). + * + * @see #setHasOptionsMenu + * @see #onCreateOptionsMenu + */ + public void onPrepareOptionsMenu(Menu menu) { + } + + /** + * Called when this fragment's option menu items are no longer being + * included in the overall options menu. Receiving this call means that + * the menu needed to be rebuilt, but this fragment's items were not + * included in the newly built menu (its {@link #onCreateOptionsMenu(Menu, MenuInflater)} + * was not called). + */ + public void onDestroyOptionsMenu() { + } + + /** + * This hook is called whenever an item in your options menu is selected. + * The default implementation simply returns false to have the normal + * processing happen (calling the item's Runnable or sending a message to + * its Handler as appropriate). You can use this method for any items + * for which you would like to do processing without those other + * facilities. + * + *

Derived classes should call through to the base class for it to + * perform the default menu handling. + * + * @param item The menu item that was selected. + * + * @return boolean Return false to allow normal menu processing to + * proceed, true to consume it here. + * + * @see #onCreateOptionsMenu + */ + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + /** + * This hook is called whenever the options menu is being closed (either by the user canceling + * the menu with the back/menu button, or when an item is selected). + * + * @param menu The options menu as last shown or first initialized by + * onCreateOptionsMenu(). + */ + public void onOptionsMenuClosed(android.view.Menu menu) { + } + + /** + * Called when a context menu for the {@code view} is about to be shown. + * Unlike {@link #onCreateOptionsMenu}, this will be called every + * time the context menu is about to be shown and should be populated for + * the view (or item inside the view for {@link AdapterView} subclasses, + * this can be found in the {@code menuInfo})). + *

+ * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an + * item has been selected. + *

+ * The default implementation calls up to + * {@link Activity#onCreateContextMenu Activity.onCreateContextMenu}, though + * you can not call this implementation if you don't want that behavior. + *

+ * It is not safe to hold onto the context menu after this method returns. + * {@inheritDoc} + */ + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + getActivity().onCreateContextMenu(menu, v, menuInfo); + } + + /** + * Registers a context menu to be shown for the given view (multiple views + * can show the context menu). This method will set the + * {@link OnCreateContextMenuListener} on the view to this fragment, so + * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be + * called when it is time to show the context menu. + * + * @see #unregisterForContextMenu(View) + * @param view The view that should show a context menu. + */ + public void registerForContextMenu(View view) { + view.setOnCreateContextMenuListener(this); + } + + /** + * Prevents a context menu to be shown for the given view. This method will + * remove the {@link OnCreateContextMenuListener} on the view. + * + * @see #registerForContextMenu(View) + * @param view The view that should stop showing a context menu. + */ + public void unregisterForContextMenu(View view) { + view.setOnCreateContextMenuListener(null); + } + + /** + * This hook is called whenever an item in a context menu is selected. The + * default implementation simply returns false to have the normal processing + * happen (calling the item's Runnable or sending a message to its Handler + * as appropriate). You can use this method for any items for which you + * would like to do processing without those other facilities. + *

+ * Use {@link MenuItem#getMenuInfo()} to get extra information set by the + * View that added this menu item. + *

+ * Derived classes should call through to the base class for it to perform + * the default menu handling. + * + * @param item The context menu item that was selected. + * @return boolean Return false to allow normal context menu processing to + * proceed, true to consume it here. + */ + public boolean onContextItemSelected(android.view.MenuItem item) { + return false; + } + + /** + * Print the Fragments's state into the given stream. + * + * @param prefix Text to print at the front of each line. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer The PrintWriter to which you should dump your state. This will be + * closed for you after you return. + * @param args additional arguments to the dump request. + */ + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mFragmentId=#"); + writer.print(Integer.toHexString(mFragmentId)); + writer.print(" mContainerId#="); + writer.print(Integer.toHexString(mContainerId)); + writer.print(" mTag="); writer.println(mTag); + writer.print(prefix); writer.print("mState="); writer.print(mState); + writer.print(" mIndex="); writer.print(mIndex); + writer.print(" mWho="); writer.print(mWho); + writer.print(" mBackStackNesting="); writer.println(mBackStackNesting); + writer.print(prefix); writer.print("mAdded="); writer.print(mAdded); + writer.print(" mRemoving="); writer.print(mRemoving); + writer.print(" mResumed="); writer.print(mResumed); + writer.print(" mFromLayout="); writer.print(mFromLayout); + writer.print(" mInLayout="); writer.println(mInLayout); + writer.print(prefix); writer.print("mHidden="); writer.print(mHidden); + writer.print(" mDetached="); writer.print(mDetached); + writer.print(" mRetainInstance="); writer.print(mRetainInstance); + writer.print(" mRetaining="); writer.print(mRetaining); + writer.print(" mHasMenu="); writer.println(mHasMenu); + if (mFragmentManager != null) { + writer.print(prefix); writer.print("mFragmentManager="); + writer.println(mFragmentManager); + } + if (mImmediateActivity != null) { + writer.print(prefix); writer.print("mImmediateActivity="); + writer.println(mImmediateActivity); + } + if (mActivity != null) { + writer.print(prefix); writer.print("mActivity="); + writer.println(mActivity); + } + if (mArguments != null) { + writer.print(prefix); writer.print("mArguments="); writer.println(mArguments); + } + if (mSavedFragmentState != null) { + writer.print(prefix); writer.print("mSavedFragmentState="); + writer.println(mSavedFragmentState); + } + if (mSavedViewState != null) { + writer.print(prefix); writer.print("mSavedViewState="); + writer.println(mSavedViewState); + } + if (mTarget != null) { + writer.print(prefix); writer.print("mTarget="); writer.print(mTarget); + writer.print(" mTargetRequestCode="); + writer.println(mTargetRequestCode); + } + if (mNextAnim != 0) { + writer.print(prefix); writer.print("mNextAnim="); writer.println(mNextAnim); + } + if (mContainer != null) { + writer.print(prefix); writer.print("mContainer="); writer.println(mContainer); + } + if (mView != null) { + writer.print(prefix); writer.print("mView="); writer.println(mView); + } + if (mInnerView != null) { + writer.print(prefix); writer.print("mInnerView="); writer.println(mView); + } + if (mAnimatingAway != null) { + writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway); + writer.print(prefix); writer.print("mStateAfterAnimating="); + writer.println(mStateAfterAnimating); + } + if (mLoaderManager != null) { + writer.print(prefix); writer.println("Loader Manager:"); + mLoaderManager.dump(prefix + " ", fd, writer, args); + } + } + + void performStart() { + onStart(); + if (mLoaderManager != null) { + mLoaderManager.doReportStart(); + } + } + + void performStop() { + onStop(); + } + + void performReallyStop(boolean retaining) { + if (mLoadersStarted) { + mLoadersStarted = false; + if (!mCheckedForLoaderManager) { + mCheckedForLoaderManager = true; + mLoaderManager = mActivity.getInternalCallbacks().getLoaderManager(mIndex, mLoadersStarted, false); + } + if (mLoaderManager != null) { + if (!retaining) { + mLoaderManager.doStop(); + } else { + mLoaderManager.doRetain(); + } + } + } + } + + void performDestroyView() { + onDestroyView(); + if (mLoaderManager != null) { + mLoaderManager.doReportNextStart(); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentActivity.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentActivity.java new file mode 100644 index 00000000..d3e4b703 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentActivity.java @@ -0,0 +1,1213 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.app.ActionBarWrapper; +import com.actionbarsherlock.internal.app.ActionBarImpl; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuInflaterWrapper; +import com.actionbarsherlock.internal.view.menu.MenuItemImpl; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.content.res.Resources.Theme; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.Parcelable; +import android.support.v4.view.ActionMode; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuInflater; +import android.support.v4.view.MenuItem; +import android.support.v4.view.Window; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.widget.FrameLayout; + +/** + * Base class for activities that want to use the support-based ActionBar, + * Fragment, and Loader APIs. + * + *

Known limitations:

+ *
    + *
  • When using the <fragment> tag, this implementation can not + * use the parent view's ID as the new fragment's ID. You must explicitly + * specify an ID (or tag) in the <fragment>.

    + *
  • Prior to Honeycomb (3.0), an activity's state was saved before pausing. + * Fragments are a significant amount of new state, and dynamic enough that one + * often wants them to change between pausing and stopping. These classes + * throw an exception if you try to change the fragment state after it has been + * saved, to avoid accidental loss of UI state. However this is too restrictive + * prior to Honeycomb, where the state is saved before pausing. To address this, + * when running on platforms prior to Honeycomb an exception will not be thrown + * if you change fragments between the state save and the activity being stopped. + * This means that is some cases if the activity is restored from its last saved + * state, this may be a snapshot slightly before what the user last saw.

    + *
+ */ +public class FragmentActivity extends Activity implements SupportActivity { + private static final String TAG = "FragmentActivity"; + private static final boolean DEBUG = false; + + //The following are used so FragmentMapActivity gets the same resources WITHOUT inlining the values in its jar. + static int R$layout$screen_action_bar_overlay = R.layout.abs__screen_action_bar_overlay; + static int R$layout$screen_action_bar = R.layout.abs__screen_action_bar; + static int R$layout$screen_simple = R.layout.abs__screen_simple; + static int R$id$content = R.id.abs__content; + static int[] R$styleable$SherlockTheme = R.styleable.SherlockTheme; + static int R$styleable$SherlockTheme_windowActionBar = R.styleable.SherlockTheme_windowActionBar; + static int R$styleable$SherlockTheme_windowActionModeOverlay = R.styleable.SherlockTheme_windowActionModeOverlay; + + private static final String FRAGMENTS_TAG = "android:support:fragments"; + + static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + + static final int MSG_REALLY_STOPPED = 1; + static final int MSG_RESUME_PENDING = 2; + + private static final int WINDOW_FLAG_ACTION_BAR = 1 << Window.FEATURE_ACTION_BAR; + private static final int WINDOW_FLAG_ACTION_BAR_ITEM_TEXT = 1 << Window.FEATURE_ACTION_BAR_ITEM_TEXT; + private static final int WINDOW_FLAG_ACTION_BAR_OVERLAY = 1 << Window.FEATURE_ACTION_BAR_OVERLAY; + private static final int WINDOW_FLAG_ACTION_MODE_OVERLAY = 1 << Window.FEATURE_ACTION_MODE_OVERLAY; + private static final int WINDOW_FLAG_INDETERMINANTE_PROGRESS = 1 << Window.FEATURE_INDETERMINATE_PROGRESS; + + final SupportActivity.InternalCallbacks mInternalCallbacks = new SupportActivity.InternalCallbacks() { + @Override + void invalidateSupportFragmentIndex(int index) { + FragmentActivity.this.invalidateSupportFragmentIndex(index); + } + + @Override + LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) { + return FragmentActivity.this.getLoaderManager(index, started, create); + } + + @Override + Handler getHandler() { + return mHandler; + } + + @Override + FragmentManagerImpl getFragments() { + return mFragments; + } + + @Override + void ensureSupportActionBarAttached() { + FragmentActivity.this.ensureSupportActionBarAttached(); + } + }; + + final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_REALLY_STOPPED: + if (mStopped) { + doReallyStop(false); + } + break; + case MSG_RESUME_PENDING: + mFragments.dispatchResume(); + mFragments.execPendingActions(); + break; + default: + super.handleMessage(msg); + } + } + }; + final FragmentManagerImpl mFragments = new FragmentManagerImpl(); + + ActionBar mActionBar; + boolean mIsActionBarImplAttached; + long mWindowFlags = 0; + + final MenuBuilder mSupportMenu; + final MenuBuilder.Callback mSupportMenuCallback = new MenuBuilder.Callback() { + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return FragmentActivity.this.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); + } + }; + + boolean mCreated; + boolean mResumed; + boolean mStopped; + boolean mReallyStopped; + + boolean mOptionsMenuInvalidated; + boolean mOptionsMenuCreateResult; + + boolean mCheckedForLoaderManager; + boolean mLoadersStarted; + HCSparseArray mAllLoaderManagers; + LoaderManagerImpl mLoaderManager; + + static final class NonConfigurationInstances { + Object activity; + HashMap children; + ArrayList fragments; + HCSparseArray loaders; + } + + static class FragmentTag { + public static final int[] Fragment = { + 0x01010003, 0x010100d0, 0x010100d1 + }; + public static final int Fragment_id = 1; + public static final int Fragment_name = 0; + public static final int Fragment_tag = 2; + } + + + + public FragmentActivity() { + super(); + + if (IS_HONEYCOMB) { + mActionBar = ActionBarWrapper.createFor(this); + mSupportMenu = null; //Everything should be done natively + } else { + mSupportMenu = new MenuBuilder(this); + mSupportMenu.setCallback(mSupportMenuCallback); + } + } + + @Override + public SupportActivity.InternalCallbacks getInternalCallbacks() { + return mInternalCallbacks; + } + + @Override + public Activity asActivity() { + return this; + } + + protected void ensureSupportActionBarAttached() { + if (IS_HONEYCOMB) { + return; + } + if (!mIsActionBarImplAttached) { + if (isChild()) { + //Do not allow an action bar if we have a parent activity + mWindowFlags &= ~WINDOW_FLAG_ACTION_BAR; + } + if ((mWindowFlags & WINDOW_FLAG_ACTION_BAR) == WINDOW_FLAG_ACTION_BAR) { + if ((mWindowFlags & WINDOW_FLAG_ACTION_BAR_OVERLAY) == WINDOW_FLAG_ACTION_BAR_OVERLAY) { + super.setContentView(R.layout.abs__screen_action_bar_overlay); + } else { + super.setContentView(R.layout.abs__screen_action_bar); + } + + mActionBar = new ActionBarImpl(this); + ((ActionBarImpl)mActionBar).init(); + + final boolean textEnabled = ((mWindowFlags & WINDOW_FLAG_ACTION_BAR_ITEM_TEXT) == WINDOW_FLAG_ACTION_BAR_ITEM_TEXT); + mSupportMenu.setShowsActionItemText(textEnabled); + + if ((mWindowFlags & WINDOW_FLAG_INDETERMINANTE_PROGRESS) == WINDOW_FLAG_INDETERMINANTE_PROGRESS) { + ((ActionBarImpl)mActionBar).setProgressBarIndeterminateVisibility(false); + } + + //TODO set other flags + } else { + if ((mWindowFlags & WINDOW_FLAG_INDETERMINANTE_PROGRESS) == WINDOW_FLAG_INDETERMINANTE_PROGRESS) { + super.requestWindowFeature((int)Window.FEATURE_INDETERMINATE_PROGRESS); + } + super.setContentView(R.layout.abs__screen_simple); + } + + invalidateOptionsMenu(); + mIsActionBarImplAttached = true; + } + } + + // ------------------------------------------------------------------------ + // HOOKS INTO ACTIVITY + // ------------------------------------------------------------------------ + + /** + * Enable extended window features. + * + * @param featureId The desired feature as defined in + * {@link android.support.v4.view.Window}. + * @return Returns {@code true} if the requested feature is supported and + * now enabled. + */ + @Override + public boolean requestWindowFeature(long featureId) { + if (!IS_HONEYCOMB) { + switch ((int)featureId) { + case (int)Window.FEATURE_ACTION_BAR: + case (int)Window.FEATURE_ACTION_BAR_ITEM_TEXT: + case (int)Window.FEATURE_ACTION_BAR_OVERLAY: + case (int)Window.FEATURE_ACTION_MODE_OVERLAY: + case (int)Window.FEATURE_INDETERMINATE_PROGRESS: + mWindowFlags |= (1 << featureId); + return true; + } + } + return super.requestWindowFeature((int)featureId); + } + + @Override + public android.view.MenuInflater getMenuInflater() { + if (IS_HONEYCOMB) { + if (DEBUG) Log.d(TAG, "getMenuInflater(): Wrapping native inflater."); + + //Wrap the native inflater so it can unwrap the native menu first + return new MenuInflaterWrapper(this, super.getMenuInflater()); + } + + if (DEBUG) Log.d(TAG, "getMenuInflater(): Returning support inflater."); + + //Use our custom menu inflater + return new MenuInflater(this, super.getMenuInflater()); + } + + @Override + public void setContentView(int layoutResId) { + ensureSupportActionBarAttached(); + if (IS_HONEYCOMB) { + super.setContentView(layoutResId); + } else { + FrameLayout contentView = (FrameLayout)findViewById(R.id.abs__content); + contentView.removeAllViews(); + getLayoutInflater().inflate(layoutResId, contentView, true); + } + } + + @Override + public void setContentView(View view, LayoutParams params) { + ensureSupportActionBarAttached(); + if (IS_HONEYCOMB) { + super.setContentView(view, params); + } else { + FrameLayout contentView = (FrameLayout)findViewById(R.id.abs__content); + contentView.removeAllViews(); + contentView.addView(view, params); + } + } + + @Override + public void setContentView(View view) { + ensureSupportActionBarAttached(); + if (IS_HONEYCOMB) { + super.setContentView(view); + } else { + FrameLayout contentView = (FrameLayout)findViewById(R.id.abs__content); + contentView.removeAllViews(); + contentView.addView(view); + } + } + + @Override + public void setTitle(CharSequence title) { + if (IS_HONEYCOMB || (getSupportActionBar() == null)) { + super.setTitle(title); + } else { + getSupportActionBar().setTitle(title); + } + } + + @Override + public void setTitle(int titleId) { + if (IS_HONEYCOMB || (getSupportActionBar() == null)) { + super.setTitle(titleId); + } else { + getSupportActionBar().setTitle(titleId); + } + } + + /** + * Dispatch incoming result to the correct fragment. + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + int index = requestCode>>16; + if (index != 0) { + index--; + if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) { + Log.w(TAG, "Activity result fragment index out of range: 0x" + + Integer.toHexString(requestCode)); + return; + } + Fragment frag = mFragments.mActive.get(index); + if (frag == null) { + Log.w(TAG, "Activity result no fragment exists for index: 0x" + + Integer.toHexString(requestCode)); + } else { + frag.onActivityResult(requestCode&0xffff, resultCode, data); + } + return; + } + + super.onActivityResult(requestCode, resultCode, data); + } + + @Override + protected void onApplyThemeResource(Theme theme, int resid, boolean first) { + TypedArray attrs = theme.obtainStyledAttributes(resid, R.styleable.SherlockTheme); + + final boolean actionBar = attrs.getBoolean(R.styleable.SherlockTheme_windowActionBar, false); + mWindowFlags |= actionBar ? WINDOW_FLAG_ACTION_BAR : 0; + + final boolean actionModeOverlay = attrs.getBoolean(R.styleable.SherlockTheme_windowActionModeOverlay, false); + mWindowFlags |= actionModeOverlay ? WINDOW_FLAG_ACTION_MODE_OVERLAY : 0; + + attrs.recycle(); + super.onApplyThemeResource(theme, resid, first); + } + + /** + * Take care of popping the fragment back stack or finishing the activity + * as appropriate. + */ + @Override + public void onBackPressed() { + if (!mFragments.popBackStackImmediate()) { + finish(); + } + } + + /** + * Dispatch configuration change to all fragments. + */ + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mFragments.dispatchConfigurationChanged(newConfig); + } + + /** + * Perform initialization of all fragments and loaders. + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + mFragments.attachActivity(this); + // Old versions of the platform didn't do this! + if (getLayoutInflater().getFactory() == null) { + getLayoutInflater().setFactory(this); + } + + super.onCreate(savedInstanceState); + + NonConfigurationInstances nc = (NonConfigurationInstances) + getLastNonConfigurationInstance(); + if (nc != null) { + mAllLoaderManagers = nc.loaders; + } + if (savedInstanceState != null) { + Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); + mFragments.restoreAllState(p, nc != null ? nc.fragments : null); + } + mFragments.dispatchCreate(); + } + + /** + *

Initialize the contents of the Activity's standard options menu. You + * should place your menu items in to menu.

+ * + *

The default implementation populates the menu with standard system + * menu items. These are placed in the {@link Menu.CATEGORY_SYSTEM} group + * so that they will be correctly ordered with application-defined menu + * items. Deriving classes should always call through to the base + * implementation.

+ * + *

You can safely hold on to menu (and any items created from it), + * making modifications to it as desired, until the next time + * {@code onCreateOptionsMenu()} is called.

+ * + *

When you add items to the menu, you can implement the Activity's + * {@link #onOptionsItemSelected(MenuItem)} method to handle them + * there.

+ * + * @param menu The options menu in which you place your items. + * @return You must return true for the menu to be displayed; if you return + * false it will not be shown. + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + if (DEBUG) Log.d(TAG, "onCreateOptionsMenu(Menu): Returning " + menu.hasVisibleItems()); + return menu.hasVisibleItems(); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + // Prior to Honeycomb, the framework can't invalidate the options + // menu, so we must always say we have one in case the app later + // invalidates it and needs to have it shown. + boolean result = true; + + if (IS_HONEYCOMB) { + if (DEBUG) Log.d(TAG, "onCreateOptionsMenu(android.view.Menu): Calling support method with wrapped native menu."); + MenuWrapper wrapped = new MenuWrapper(menu); + result = onCreateOptionsMenu(wrapped); + result |= mFragments.dispatchCreateOptionsMenu(wrapped, getMenuInflater()); + } + + if (DEBUG) Log.d(TAG, "onCreateOptionsMenu(android.view.Menu): Returning " + result); + return result; + } + + /** + * Add support for inflating the <fragment> tag. + */ + @Override + public View onCreateView(String name, Context context, AttributeSet attrs) { + if (!"fragment".equals(name)) { + return super.onCreateView(name, context, attrs); + } + + String fname = attrs.getAttributeValue(null, "class"); + TypedArray a = context.obtainStyledAttributes(attrs, FragmentTag.Fragment); + if (fname == null) { + fname = a.getString(FragmentTag.Fragment_name); + } + int id = a.getResourceId(FragmentTag.Fragment_id, View.NO_ID); + String tag = a.getString(FragmentTag.Fragment_tag); + a.recycle(); + + View parent = null; // NOTE: no way to get parent pre-Honeycomb. + int containerId = parent != null ? parent.getId() : 0; + if (containerId == View.NO_ID && id == View.NO_ID && tag == null) { + throw new IllegalArgumentException(attrs.getPositionDescription() + + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname); + } + + // If we restored from a previous state, we may already have + // instantiated this fragment from the state and should use + // that instance instead of making a new one. + Fragment fragment = id != View.NO_ID ? mFragments.findFragmentById(id) : null; + if (fragment == null && tag != null) { + fragment = mFragments.findFragmentByTag(tag); + } + if (fragment == null && containerId != View.NO_ID) { + fragment = mFragments.findFragmentById(containerId); + } + + if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x" + + Integer.toHexString(id) + " fname=" + fname + + " existing=" + fragment); + if (fragment == null) { + fragment = Fragment.instantiate(this, fname); + fragment.mFromLayout = true; + fragment.mFragmentId = id != 0 ? id : containerId; + fragment.mContainerId = containerId; + fragment.mTag = tag; + fragment.mInLayout = true; + fragment.mImmediateActivity = this; + fragment.mFragmentManager = mFragments; + fragment.onInflate(this, attrs, fragment.mSavedFragmentState); + mFragments.addFragment(fragment, true); + + } else if (fragment.mInLayout) { + // A fragment already exists and it is not one we restored from + // previous state. + throw new IllegalArgumentException(attrs.getPositionDescription() + + ": Duplicate id 0x" + Integer.toHexString(id) + + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId) + + " with another fragment for " + fname); + } else { + // This fragment was retained from a previous instance; get it + // going now. + fragment.mInLayout = true; + fragment.mImmediateActivity = this; + // If this fragment is newly instantiated (either right now, or + // from last saved state), then give it the attributes to + // initialize itself. + if (!fragment.mRetaining) { + fragment.onInflate(this, attrs, fragment.mSavedFragmentState); + } + mFragments.moveToState(fragment); + } + + if (fragment.mView == null) { + throw new IllegalStateException("Fragment " + fname + + " did not create a view."); + } + if (id != 0) { + fragment.mView.setId(id); + } + if (fragment.mView.getTag() == null) { + fragment.mView.setTag(tag); + } + return fragment.mView; + } + + @Override + public void invalidateOptionsMenu() { + if (DEBUG) Log.d(TAG, "supportInvalidateOptionsMenu(): Invalidating menu."); + + if (IS_HONEYCOMB) { + HoneycombInvalidateOptionsMenu.invoke(this); + } else { + mSupportMenu.clear(); + + mOptionsMenuCreateResult = onCreateOptionsMenu(mSupportMenu); + mOptionsMenuCreateResult |= mFragments.dispatchCreateOptionsMenu(mSupportMenu, getMenuInflater()); + + if (getSupportActionBar() != null) { + //Since we now know we are using a custom action bar, perform the + //inflation callback to allow it to display any items it wants. + //Any items that were displayed will have a boolean toggled so that we + //do not display them on the options menu. + ((ActionBarImpl)mActionBar).onMenuInflated(mSupportMenu); + } + + // Whoops, older platform... we'll use a hack, to manually rebuild + // the options menu the next time it is prepared. + mOptionsMenuInvalidated = true; + } + } + + private static final class HoneycombInvalidateOptionsMenu { + static void invoke(Activity activity) { + activity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL); + } + } + + /** + * Destroy all fragments and loaders. + */ + @Override + protected void onDestroy() { + super.onDestroy(); + + doReallyStop(false); + + mFragments.dispatchDestroy(); + if (mLoaderManager != null) { + mLoaderManager.doDestroy(); + } + } + + /** + * Take care of calling onBackPressed() for pre-Eclair platforms. + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (android.os.Build.VERSION.SDK_INT < 5 /* ECLAIR */ + && keyCode == KeyEvent.KEYCODE_BACK + && event.getRepeatCount() == 0) { + // Take care of calling this method on earlier versions of + // the platform where it doesn't exist. + onBackPressed(); + return true; + } + + return super.onKeyDown(keyCode, event); + } + + /** + * Dispatch onLowMemory() to all fragments. + */ + @Override + public void onLowMemory() { + super.onLowMemory(); + mFragments.dispatchLowMemory(); + } + + /** + * Dispatch context and options menu to fragments. + */ + @Override + public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { + if (super.onMenuItemSelected(featureId, item)) { + return true; + } + + switch (featureId) { + case Window.FEATURE_OPTIONS_PANEL: + return mFragments.dispatchOptionsItemSelected(new MenuItemWrapper(item)); + + case Window.FEATURE_CONTEXT_MENU: + return mFragments.dispatchContextItemSelected(new MenuItemWrapper(item)); + + default: + return false; + } + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (onOptionsItemSelected(item)) { + return true; + } + + switch (featureId) { + case Window.FEATURE_OPTIONS_PANEL: + return mFragments.dispatchOptionsItemSelected(item); + + case Window.FEATURE_CONTEXT_MENU: + return mFragments.dispatchContextItemSelected(item); + + default: + return false; + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return super.onOptionsItemSelected(item); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return onOptionsItemSelected(new MenuItemWrapper(item)); + } + + /** + * Call onOptionsMenuClosed() on fragments. + */ + @Override + public void onPanelClosed(int featureId, android.view.Menu menu) { + switch (featureId) { + case Window.FEATURE_OPTIONS_PANEL: + mFragments.dispatchOptionsMenuClosed(menu); + + if (!IS_HONEYCOMB && (getSupportActionBar() != null)) { + if (DEBUG) Log.d(TAG, "onPanelClosed(int, android.view.Menu): Dispatch menu visibility false to custom action bar."); + ((ActionBarImpl)mActionBar).onMenuVisibilityChanged(false); + } + break; + } + super.onPanelClosed(featureId, menu); + } + + /** + * Dispatch onPause() to fragments. + */ + @Override + protected void onPause() { + super.onPause(); + mResumed = false; + if (mHandler.hasMessages(MSG_RESUME_PENDING)) { + mHandler.removeMessages(MSG_RESUME_PENDING); + mFragments.dispatchResume(); + } + mFragments.dispatchPause(); + } + + /** + * Dispatch onResume() to fragments. + */ + @Override + protected void onResume() { + super.onResume(); + mHandler.sendEmptyMessage(MSG_RESUME_PENDING); + mResumed = true; + mFragments.execPendingActions(); + } + + /** + * Dispatch onResume() to fragments. + */ + @Override + protected void onPostResume() { + super.onPostResume(); + mHandler.removeMessages(MSG_RESUME_PENDING); + mFragments.dispatchResume(); + mFragments.execPendingActions(); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + boolean result = menu.hasVisibleItems(); + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(Menu): Returning " + result); + return result; + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + boolean result = super.onPrepareOptionsMenu(menu); + + if (!IS_HONEYCOMB) { + if (DEBUG) { + Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): mOptionsMenuCreateResult = " + mOptionsMenuCreateResult); + Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): mOptionsMenuInvalidated = " + mOptionsMenuInvalidated); + } + + boolean prepareResult = true; + if (mOptionsMenuCreateResult) { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Calling support method with custom menu."); + prepareResult = onPrepareOptionsMenu(mSupportMenu); + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Support method result returned " + prepareResult); + if (prepareResult) { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Dispatching fragment method with custom menu."); + mFragments.dispatchPrepareOptionsMenu(mSupportMenu); + } + } + + if (mOptionsMenuInvalidated) { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Clearing existing options menu."); + menu.clear(); + mOptionsMenuInvalidated = false; + + if (mOptionsMenuCreateResult && prepareResult) { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Adding any action items that are not displayed on the action bar."); + //Only add items that have not already been added to our custom + //action bar implementation + for (MenuItemImpl item : mSupportMenu.getItems()) { + if (!item.isShownOnActionBar()) { + item.addTo(menu); + } + } + } + } + + if (mOptionsMenuCreateResult && prepareResult && menu.hasVisibleItems()) { + if (getSupportActionBar() != null) { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Dispatch menu visibility true to custom action bar."); + ((ActionBarImpl)mActionBar).onMenuVisibilityChanged(true); + } + result = true; + } + } else { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Calling support method with wrapped native menu."); + final MenuWrapper wrappedMenu = new MenuWrapper(menu); + result = onPrepareOptionsMenu(wrappedMenu); + if (result) { + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Dispatching fragment method with wrapped native menu."); + mFragments.dispatchPrepareOptionsMenu(wrappedMenu); + } + } + + if (DEBUG) Log.d(TAG, "onPrepareOptionsMenu(android.view.Menu): Returning " + result); + return result; + } + + /** + * Cause this Activity to be recreated with a new instance. This results in + * essentially the same flow as when the Activity is created due to a + * configuration change -- the current instance will go through its + * lifecycle to onDestroy() and a new instance then created after it. + */ + @Override + public void recreate() { + //This SUCKS! Figure out a way to call the super method and support Android 1.6 + /* + if (IS_HONEYCOMB) { + super.recreate(); + } else { + */ + final Intent intent = getIntent(); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + + startActivity(intent); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { + OverridePendingTransition.invoke(this); + } + + finish(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { + OverridePendingTransition.invoke(this); + } + /* + } + */ + } + + private static final class OverridePendingTransition { + static void invoke(Activity activity) { + activity.overridePendingTransition(0, 0); + } + } + + /** + * Retain all appropriate fragment and loader state. You can NOT + * override this yourself! + */ + @Override + public final Object onRetainNonConfigurationInstance() { + if (mStopped) { + doReallyStop(true); + } + + ArrayList fragments = mFragments.retainNonConfig(); + boolean retainLoaders = false; + if (mAllLoaderManagers != null) { + // prune out any loader managers that were already stopped and so + // have nothing useful to retain. + for (int i=mAllLoaderManagers.size()-1; i>=0; i--) { + LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i); + if (lm.mRetaining) { + retainLoaders = true; + } else { + lm.doDestroy(); + mAllLoaderManagers.removeAt(i); + } + } + } + if (fragments == null && !retainLoaders) { + return null; + } + + NonConfigurationInstances nci = new NonConfigurationInstances(); + nci.activity = null; + nci.children = null; + nci.fragments = fragments; + nci.loaders = mAllLoaderManagers; + return nci; + } + + /** + * Save all appropriate fragment state. + */ + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + Parcelable p = mFragments.saveAllState(); + if (p != null) { + outState.putParcelable(FRAGMENTS_TAG, p); + } + } + + /** + * Dispatch onStart() to all fragments. Ensure any created loaders are + * now started. + */ + @Override + protected void onStart() { + super.onStart(); + + mStopped = false; + mHandler.removeMessages(MSG_REALLY_STOPPED); + + if (!mCreated) { + mCreated = true; + ensureSupportActionBarAttached(); //Needed for retained fragments + mFragments.dispatchActivityCreated(); + } + + mFragments.noteStateNotSaved(); + mFragments.execPendingActions(); + + if (!mLoadersStarted) { + mLoadersStarted = true; + if (mLoaderManager != null) { + mLoaderManager.doStart(); + } else if (!mCheckedForLoaderManager) { + mLoaderManager = getLoaderManager(-1, mLoadersStarted, false); + } + mCheckedForLoaderManager = true; + } + // NOTE: HC onStart goes here. + + mFragments.dispatchStart(); + if (mAllLoaderManagers != null) { + for (int i=mAllLoaderManagers.size()-1; i>=0; i--) { + LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i); + lm.finishRetain(); + lm.doReportStart(); + } + } + } + + /** + * Dispatch onStop() to all fragments. Ensure all loaders are stopped. + */ + @Override + protected void onStop() { + super.onStop(); + + mStopped = true; + mHandler.sendEmptyMessage(MSG_REALLY_STOPPED); + + mFragments.dispatchStop(); + } + + /** + *

Sets the visibility of the indeterminate progress bar in the + * title.

+ * + *

In order for the progress bar to be shown, the feature must be + * requested via {@link #requestWindowFeature(long)}.

+ * + *

This method must be used instead of + * {@link #setProgressBarIndeterminateVisibility(boolean)} for + * ActionBarSherlock. Pass {@link Boolean.TRUE} or + * {@link Boolean.FALSE} to ensure the appropriate one is called.

+ * + * @param visible Whether to show the progress bars in the title. + */ + @Override + public void setProgressBarIndeterminateVisibility(Boolean visible) { + if (IS_HONEYCOMB || (getSupportActionBar() == null)) { + super.setProgressBarIndeterminateVisibility(visible); + } else if ((mWindowFlags & WINDOW_FLAG_INDETERMINANTE_PROGRESS) == WINDOW_FLAG_INDETERMINANTE_PROGRESS) { + ((ActionBarImpl)mActionBar).setProgressBarIndeterminateVisibility(visible); + } + } + + // ------------------------------------------------------------------------ + // NEW METHODS + // ------------------------------------------------------------------------ + + /** + * Print the Activity's state into the given stream. This gets invoked if + * you run "adb shell dumpsys activity ". + * + * @param prefix Desired prefix to prepend at each line of output. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer The PrintWriter to which you should dump your state. This will be + * closed for you after you return. + * @param args additional arguments to the dump request. + */ + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + if (IS_HONEYCOMB) { + //This can only work if we can call the super-class impl. :/ + //ActivityCompatHoneycomb.dump(this, prefix, fd, writer, args); + } + writer.print(prefix); writer.print("Local FragmentActivity "); + writer.print(Integer.toHexString(System.identityHashCode(this))); + writer.println(" State:"); + String innerPrefix = prefix + " "; + writer.print(innerPrefix); writer.print("mCreated="); + writer.print(mCreated); writer.print("mResumed="); + writer.print(mResumed); writer.print(" mStopped="); + writer.print(mStopped); writer.print(" mReallyStopped="); + writer.println(mReallyStopped); + writer.print(innerPrefix); writer.print("mLoadersStarted="); + writer.println(mLoadersStarted); + if (mLoaderManager != null) { + writer.print(prefix); writer.print("Loader Manager "); + writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager))); + writer.println(":"); + mLoaderManager.dump(prefix + " ", fd, writer, args); + } + mFragments.dump(prefix, fd, writer, args); + } + + void doReallyStop(boolean retaining) { + if (!mReallyStopped) { + mReallyStopped = true; + mHandler.removeMessages(MSG_REALLY_STOPPED); + onReallyStop(retaining); + } + } + + /** + * Pre-HC, we didn't have a way to determine whether an activity was + * being stopped for a config change or not until we saw + * onRetainNonConfigurationInstance() called after onStop(). However + * we need to know this, to know whether to retain fragments. This will + * tell us what we need to know. + */ + void onReallyStop(boolean retaining) { + if (mLoadersStarted) { + mLoadersStarted = false; + if (mLoaderManager != null) { + if (!retaining) { + mLoaderManager.doStop(); + } else { + mLoaderManager.doRetain(); + } + } + } + + mFragments.dispatchReallyStop(retaining); + } + + // ------------------------------------------------------------------------ + // ACTION BAR AND ACTION MODE SUPPORT + // ------------------------------------------------------------------------ + + /** + * Retrieve a reference to this activity's action bar handler. + * + * @return The handler for the appropriate action bar, or null. + */ + @Override + public ActionBar getSupportActionBar() { + return (mActionBar != null) ? mActionBar.getPublicInstance() : null; + } + + /** + * Notifies the activity that an action mode has finished. Activity + * subclasses overriding this method should call the superclass + * implementation. + * + * @param mode The action mode that just finished. + */ + @Override + public void onActionModeFinished(ActionMode mode) { + } + + /** + * Notifies the Activity that an action mode has been started. Activity + * subclasses overriding this method should call the superclass + * implementation. + * + * @param mode The new action mode. + */ + @Override + public void onActionModeStarted(ActionMode mode) { + } + + /** + *

Give the Activity a chance to control the UI for an action mode + * requested by the system.

+ * + *

Note: If you are looking for a notification callback that an action + * mode has been started for this activity, see + * {@link #onActionModeStarted(ActionMode)}.

+ * + * @param callback The callback that should control the new action mode + * @return The new action mode, or null if the activity does not want to + * provide special handling for this action mode. (It will be handled by the + * system.) + */ + @Override + public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) { + return null; + } + + /** + * Start an action mode. + * + * @param callback Callback that will manage lifecycle events for this + * context mode + * @return The ContextMode that was started, or null if it was cancelled + * @see android.support.v4.view.ActionMode + */ + @Override + public final ActionMode startActionMode(final ActionMode.Callback callback) { + //Give the activity override a chance to handle the action mode + ActionMode actionMode = onWindowStartingActionMode(callback); + + if (actionMode == null) { + //If the activity did not handle, send to action bar for platform- + //specific implementation + actionMode = mActionBar.startActionMode(callback); + } + if (actionMode != null) { + //Send the activity callback that our action mode was started + onActionModeStarted(actionMode); + } + + //Return to the caller + return actionMode; + } + + // ------------------------------------------------------------------------ + // FRAGMENT SUPPORT + // ------------------------------------------------------------------------ + + /** + * Called when a fragment is attached to the activity. + */ + @Override + public void onAttachFragment(Fragment fragment) { + } + + /** + * Return the FragmentManager for interacting with fragments associated + * with this activity. + */ + @Override + public FragmentManager getSupportFragmentManager() { + return mFragments; + } + + /** + * Modifies the standard behavior to allow results to be delivered to fragments. + * This imposes a restriction that requestCode be <= 0xffff. + */ + @Override + public void startActivityForResult(Intent intent, int requestCode) { + if (requestCode != -1 && (requestCode&0xffff0000) != 0) { + throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); + } + super.startActivityForResult(intent, requestCode); + } + + /** + * Called by Fragment.startActivityForResult() to implement its behavior. + */ + @Override + public void startActivityFromFragment(Fragment fragment, Intent intent, + int requestCode) { + if (requestCode == -1) { + super.startActivityForResult(intent, -1); + return; + } + if ((requestCode&0xffff0000) != 0) { + throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); + } + super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff)); + } + + void invalidateSupportFragmentIndex(int index) { + //Log.v(TAG, "invalidateFragmentIndex: index=" + index); + if (mAllLoaderManagers != null) { + LoaderManagerImpl lm = mAllLoaderManagers.get(index); + if (lm != null) { + lm.doDestroy(); + } + mAllLoaderManagers.remove(index); + } + } + + // ------------------------------------------------------------------------ + // LOADER SUPPORT + // ------------------------------------------------------------------------ + + /** + * Return the LoaderManager for this fragment, creating it if needed. + */ + @Override + public LoaderManager getSupportLoaderManager() { + if (mLoaderManager != null) { + return mLoaderManager; + } + mCheckedForLoaderManager = true; + mLoaderManager = getLoaderManager(-1, mLoadersStarted, true); + return mLoaderManager; + } + + LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) { + if (mAllLoaderManagers == null) { + mAllLoaderManagers = new HCSparseArray(); + } + LoaderManagerImpl lm = mAllLoaderManagers.get(index); + if (lm == null) { + if (create) { + lm = new LoaderManagerImpl(this, started); + mAllLoaderManagers.put(index, lm); + } + } else { + lm.updateActivity(this); + } + return lm; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentManager.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentManager.java new file mode 100644 index 00000000..dd3c736b --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentManager.java @@ -0,0 +1,1923 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.content.Context; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.v4.util.DebugUtils; +import android.support.v4.util.LogWriter; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuItem; +import android.util.Log; +import android.util.SparseArray; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.AnimationUtils; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.view.animation.ScaleAnimation; +import android.view.animation.Animation.AnimationListener; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Static library support version of the framework's {@link android.app.FragmentManager}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + * + *

Your activity must derive from {@link FragmentActivity} to use this. + */ +public abstract class FragmentManager { + /** + * Representation of an entry on the fragment back stack, as created + * with {@link FragmentTransaction#addToBackStack(String) + * FragmentTransaction.addToBackStack()}. Entries can later be + * retrieved with {@link FragmentManager#getBackStackEntryAt(int) + * FragmentManager.getBackStackEntry()}. + * + *

Note that you should never hold on to a BackStackEntry object; + * the identifier as returned by {@link #getId} is the only thing that + * will be persisted across activity instances. + */ + public interface BackStackEntry { + /** + * Return the unique identifier for the entry. This is the only + * representation of the entry that will persist across activity + * instances. + */ + public int getId(); + + /** + * Return the full bread crumb title resource identifier for the entry, + * or 0 if it does not have one. + */ + public int getBreadCrumbTitleRes(); + + /** + * Return the short bread crumb title resource identifier for the entry, + * or 0 if it does not have one. + */ + public int getBreadCrumbShortTitleRes(); + + /** + * Return the full bread crumb title for the entry, or null if it + * does not have one. + */ + public CharSequence getBreadCrumbTitle(); + + /** + * Return the short bread crumb title for the entry, or null if it + * does not have one. + */ + public CharSequence getBreadCrumbShortTitle(); + } + + /** + * Interface to watch for changes to the back stack. + */ + public interface OnBackStackChangedListener { + /** + * Called whenever the contents of the back stack change. + */ + public void onBackStackChanged(); + } + + /** + * Start a series of edit operations on the Fragments associated with + * this FragmentManager. + * + *

Note: A fragment transaction can only be created/committed prior + * to an activity saving its state. If you try to commit a transaction + * after {@link FragmentActivity#onSaveInstanceState FragmentActivity.onSaveInstanceState()} + * (and prior to a following {@link FragmentActivity#onStart FragmentActivity.onStart} + * or {@link FragmentActivity#onResume FragmentActivity.onResume()}, you will get an error. + * This is because the framework takes care of saving your current fragments + * in the state, and if changes are made after the state is saved then they + * will be lost.

+ */ + public abstract FragmentTransaction beginTransaction(); + + /** @hide -- remove once prebuilts are in. */ + @Deprecated + public FragmentTransaction openTransaction() { + return beginTransaction(); + } + + /** + * After a {@link FragmentTransaction} is committed with + * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it + * is scheduled to be executed asynchronously on the process's main thread. + * If you want to immediately executing any such pending operations, you + * can call this function (only from the main thread) to do so. Note that + * all callbacks and other related behavior will be done from within this + * call, so be careful about where this is called from. + * + * @return Returns true if there were any pending transactions to be + * executed. + */ + public abstract boolean executePendingTransactions(); + + /** + * Finds a fragment that was identified by the given id either when inflated + * from XML or as the container ID when added in a transaction. This first + * searches through fragments that are currently added to the manager's + * activity; if no such fragment is found, then all fragments currently + * on the back stack associated with this ID are searched. + * @return The fragment if found or null otherwise. + */ + public abstract Fragment findFragmentById(int id); + + /** + * Finds a fragment that was identified by the given tag either when inflated + * from XML or as supplied when added in a transaction. This first + * searches through fragments that are currently added to the manager's + * activity; if no such fragment is found, then all fragments currently + * on the back stack are searched. + * @return The fragment if found or null otherwise. + */ + public abstract Fragment findFragmentByTag(String tag); + + /** + * Flag for {@link #popBackStack(String, int)} + * and {@link #popBackStack(int, int)}: If set, and the name or ID of + * a back stack entry has been supplied, then all matching entries will + * be consumed until one that doesn't match is found or the bottom of + * the stack is reached. Otherwise, all entries up to but not including that entry + * will be removed. + */ + public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; + + /** + * Pop the top state off the back stack. Returns true if there was one + * to pop, else false. This function is asynchronous -- it enqueues the + * request to pop, but the action will not be performed until the application + * returns to its event loop. + */ + public abstract void popBackStack(); + + /** + * Like {@link #popBackStack()}, but performs the operation immediately + * inside of the call. This is like calling {@link #executePendingTransactions()} + * afterwards. + * @return Returns true if there was something popped, else false. + */ + public abstract boolean popBackStackImmediate(); + + /** + * Pop the last fragment transition from the manager's fragment + * back stack. If there is nothing to pop, false is returned. + * This function is asynchronous -- it enqueues the + * request to pop, but the action will not be performed until the application + * returns to its event loop. + * + * @param name If non-null, this is the name of a previous back state + * to look for; if found, all states up to that state will be popped. The + * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether + * the named state itself is popped. If null, only the top state is popped. + * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. + */ + public abstract void popBackStack(String name, int flags); + + /** + * Like {@link #popBackStack(String, int)}, but performs the operation immediately + * inside of the call. This is like calling {@link #executePendingTransactions()} + * afterwards. + * @return Returns true if there was something popped, else false. + */ + public abstract boolean popBackStackImmediate(String name, int flags); + + /** + * Pop all back stack states up to the one with the given identifier. + * This function is asynchronous -- it enqueues the + * request to pop, but the action will not be performed until the application + * returns to its event loop. + * + * @param id Identifier of the stated to be popped. If no identifier exists, + * false is returned. + * The identifier is the number returned by + * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The + * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether + * the named state itself is popped. + * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. + */ + public abstract void popBackStack(int id, int flags); + + /** + * Like {@link #popBackStack(int, int)}, but performs the operation immediately + * inside of the call. This is like calling {@link #executePendingTransactions()} + * afterwards. + * @return Returns true if there was something popped, else false. + */ + public abstract boolean popBackStackImmediate(int id, int flags); + + /** + * Return the number of entries currently in the back stack. + */ + public abstract int getBackStackEntryCount(); + + /** + * Return the BackStackEntry at index index in the back stack; + * entries start index 0 being the bottom of the stack. + */ + public abstract BackStackEntry getBackStackEntryAt(int index); + + /** + * Add a new listener for changes to the fragment back stack. + */ + public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener); + + /** + * Remove a listener that was previously added with + * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}. + */ + public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener); + + /** + * Put a reference to a fragment in a Bundle. This Bundle can be + * persisted as saved state, and when later restoring + * {@link #getFragment(Bundle, String)} will return the current + * instance of the same fragment. + * + * @param bundle The bundle in which to put the fragment reference. + * @param key The name of the entry in the bundle. + * @param fragment The Fragment whose reference is to be stored. + */ + public abstract void putFragment(Bundle bundle, String key, Fragment fragment); + + /** + * Retrieve the current Fragment instance for a reference previously + * placed with {@link #putFragment(Bundle, String, Fragment)}. + * + * @param bundle The bundle from which to retrieve the fragment reference. + * @param key The name of the entry in the bundle. + * @return Returns the current Fragment instance that is associated with + * the given reference. + */ + public abstract Fragment getFragment(Bundle bundle, String key); + + /** + * Save the current instance state of the given Fragment. This can be + * used later when creating a new instance of the Fragment and adding + * it to the fragment manager, to have it create itself to match the + * current state returned here. Note that there are limits on how + * this can be used: + * + *
    + *
  • The Fragment must currently be attached to the FragmentManager. + *
  • A new Fragment created using this saved state must be the same class + * type as the Fragment it was created from. + *
  • The saved state can not contain dependencies on other fragments -- + * that is it can't use {@link #putFragment(Bundle, String, Fragment)} to + * store a fragment reference because that reference may not be valid when + * this saved state is later used. Likewise the Fragment's target and + * result code are not included in this state. + *
+ * + * @param f The Fragment whose state is to be saved. + * @return The generated state. This will be null if there was no + * interesting state created by the fragment. + */ + public abstract Fragment.SavedState saveFragmentInstanceState(Fragment f); + + /** + * Print the FragmentManager's state into the given stream. + * + * @param prefix Text to print at the front of each line. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer A PrintWriter to which the dump is to be set. + * @param args Additional arguments to the dump request. + */ + public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); + + /** + * Control whether the framework's internal fragment manager debugging + * logs are turned on. If enabled, you will see output in logcat as + * the framework performs fragment operations. + */ + public static void enableDebugLogging(boolean enabled) { + FragmentManagerImpl.DEBUG = enabled; + } +} + +final class FragmentManagerState implements Parcelable { + FragmentState[] mActive; + int[] mAdded; + BackStackState[] mBackStack; + + public FragmentManagerState() { + } + + public FragmentManagerState(Parcel in) { + mActive = in.createTypedArray(FragmentState.CREATOR); + mAdded = in.createIntArray(); + mBackStack = in.createTypedArray(BackStackState.CREATOR); + } + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeTypedArray(mActive, flags); + dest.writeIntArray(mAdded); + dest.writeTypedArray(mBackStack, flags); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public FragmentManagerState createFromParcel(Parcel in) { + return new FragmentManagerState(in); + } + + public FragmentManagerState[] newArray(int size) { + return new FragmentManagerState[size]; + } + }; +} + +/** + * Container for fragments associated with an activity. + */ +final class FragmentManagerImpl extends FragmentManager { + static boolean DEBUG = false; + static final String TAG = "FragmentManager"; + + static final boolean HONEYCOMB = android.os.Build.VERSION.SDK_INT >= 11; + + static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; + static final String TARGET_STATE_TAG = "android:target_state"; + static final String VIEW_STATE_TAG = "android:view_state"; + + ArrayList mPendingActions; + Runnable[] mTmpActions; + boolean mExecutingActions; + + ArrayList mActive; + ArrayList mAdded; + ArrayList mAvailIndices; + ArrayList mBackStack; + ArrayList mCreatedMenus; + + // Must be accessed while locked. + ArrayList mBackStackIndices; + ArrayList mAvailBackStackIndices; + + ArrayList mBackStackChangeListeners; + + int mCurState = Fragment.INITIALIZING; + SupportActivity mActivity; + + boolean mNeedMenuInvalidate; + boolean mStateSaved; + boolean mDestroyed; + String mNoTransactionsBecause; + + // Temporary vars for state save and restore. + Bundle mStateBundle = null; + SparseArray mStateArray = null; + + Runnable mExecCommit = new Runnable() { + @Override + public void run() { + execPendingActions(); + } + }; + + @Override + public FragmentTransaction beginTransaction() { + return new BackStackRecord(this); + } + + @Override + public boolean executePendingTransactions() { + return execPendingActions(); + } + + @Override + public void popBackStack() { + enqueueAction(new Runnable() { + @Override public void run() { + popBackStackState(mActivity.getInternalCallbacks().getHandler(), null, -1, 0); + } + }, false); + } + + @Override + public boolean popBackStackImmediate() { + checkStateLoss(); + executePendingTransactions(); + return popBackStackState(mActivity.getInternalCallbacks().getHandler(), null, -1, 0); + } + + @Override + public void popBackStack(final String name, final int flags) { + enqueueAction(new Runnable() { + @Override public void run() { + popBackStackState(mActivity.getInternalCallbacks().getHandler(), name, -1, flags); + } + }, false); + } + + @Override + public boolean popBackStackImmediate(String name, int flags) { + checkStateLoss(); + executePendingTransactions(); + return popBackStackState(mActivity.getInternalCallbacks().getHandler(), name, -1, flags); + } + + @Override + public void popBackStack(final int id, final int flags) { + if (id < 0) { + throw new IllegalArgumentException("Bad id: " + id); + } + enqueueAction(new Runnable() { + @Override public void run() { + popBackStackState(mActivity.getInternalCallbacks().getHandler(), null, id, flags); + } + }, false); + } + + @Override + public boolean popBackStackImmediate(int id, int flags) { + checkStateLoss(); + executePendingTransactions(); + if (id < 0) { + throw new IllegalArgumentException("Bad id: " + id); + } + return popBackStackState(mActivity.getInternalCallbacks().getHandler(), null, id, flags); + } + + @Override + public int getBackStackEntryCount() { + return mBackStack != null ? mBackStack.size() : 0; + } + + @Override + public BackStackEntry getBackStackEntryAt(int index) { + return mBackStack.get(index); + } + + @Override + public void addOnBackStackChangedListener(OnBackStackChangedListener listener) { + if (mBackStackChangeListeners == null) { + mBackStackChangeListeners = new ArrayList(); + } + mBackStackChangeListeners.add(listener); + } + + @Override + public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) { + if (mBackStackChangeListeners != null) { + mBackStackChangeListeners.remove(listener); + } + } + + @Override + public void putFragment(Bundle bundle, String key, Fragment fragment) { + if (fragment.mIndex < 0) { + throw new IllegalStateException("Fragment " + fragment + + " is not currently in the FragmentManager"); + } + bundle.putInt(key, fragment.mIndex); + } + + @Override + public Fragment getFragment(Bundle bundle, String key) { + int index = bundle.getInt(key, -1); + if (index == -1) { + return null; + } + if (index >= mActive.size()) { + throw new IllegalStateException("Fragement no longer exists for key " + + key + ": index " + index); + } + Fragment f = mActive.get(index); + if (f == null) { + throw new IllegalStateException("Fragement no longer exists for key " + + key + ": index " + index); + } + return f; + } + + @Override + public Fragment.SavedState saveFragmentInstanceState(Fragment fragment) { + if (fragment.mIndex < 0) { + throw new IllegalStateException("Fragment " + fragment + + " is not currently in the FragmentManager"); + } + if (fragment.mState > Fragment.INITIALIZING) { + Bundle result = saveFragmentBasicState(fragment); + return result != null ? new Fragment.SavedState(result) : null; + } + return null; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + sb.append("FragmentManager{"); + sb.append(Integer.toHexString(System.identityHashCode(this))); + sb.append(" in "); + DebugUtils.buildShortClassTag(mActivity, sb); + sb.append("}}"); + return sb.toString(); + } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + String innerPrefix = prefix + " "; + + int N; + if (mActive != null) { + N = mActive.size(); + if (N > 0) { + writer.print(prefix); writer.print("Active Fragments in "); + writer.print(Integer.toHexString(System.identityHashCode(this))); + writer.println(":"); + for (int i=0; i 0) { + writer.print(prefix); writer.println("Added Fragments:"); + for (int i=0; i 0) { + writer.print(prefix); writer.println("Fragments Created Menus:"); + for (int i=0; i 0) { + writer.print(prefix); writer.println("Back Stack:"); + for (int i=0; i 0) { + writer.print(prefix); writer.println("Back Stack Indices:"); + for (int i=0; i 0) { + writer.print(prefix); writer.print("mAvailBackStackIndices: "); + writer.println(Arrays.toString(mAvailBackStackIndices.toArray())); + } + } + + if (mPendingActions != null) { + N = mPendingActions.size(); + if (N > 0) { + writer.print(prefix); writer.println("Pending Actions:"); + for (int i=0; i Fragment.CREATED) { + newState = Fragment.CREATED; + } + if (f.mRemoving && newState > f.mState) { + // While removing a fragment, we can't change it to a higher state. + newState = f.mState; + } + + if (f.mState < newState) { + // For fragments that are created from a layout, when restoring from + // state we don't want to allow them to be created until they are + // being reloaded from the layout. + if (f.mFromLayout && !f.mInLayout) { + return; + } + if (f.mAnimatingAway != null) { + // The fragment is currently being animated... but! Now we + // want to move our state back up. Give up on waiting for the + // animation, move to whatever the final state should be once + // the animation is done, and then we can proceed from there. + f.mAnimatingAway = null; + moveToState(f, f.mStateAfterAnimating, 0, 0); + } + switch (f.mState) { + case Fragment.INITIALIZING: + if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); + if (f.mSavedFragmentState != null) { + f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( + FragmentManagerImpl.VIEW_STATE_TAG); + f.mTarget = getFragment(f.mSavedFragmentState, + FragmentManagerImpl.TARGET_STATE_TAG); + if (f.mTarget != null) { + f.mTargetRequestCode = f.mSavedFragmentState.getInt( + FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); + } + } + f.mActivity = mActivity; + f.mFragmentManager = mActivity.getInternalCallbacks().getFragments(); + f.mCalled = false; + f.onAttach(mActivity); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onAttach()"); + } + mActivity.onAttachFragment(f); + + if (!f.mRetaining) { + f.mCalled = false; + f.onCreate(f.mSavedFragmentState); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onCreate()"); + } + } + f.mRetaining = false; + if (f.mFromLayout) { + // For fragments that are part of the content view + // layout, we need to instantiate the view immediately + // and the inflater will take care of adding it. + f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), + null, f.mSavedFragmentState); + if (f.mView != null) { + f.mInnerView = f.mView; + f.mView = NoSaveStateFrameLayout.wrap(f.mView); + if (f.mHidden) f.mView.setVisibility(View.GONE); + f.onViewCreated(f.mView, f.mSavedFragmentState); + } else { + f.mInnerView = null; + } + } + case Fragment.CREATED: + if (newState > Fragment.CREATED) { + if (DEBUG) Log.v(TAG, "moveto ACTIVITY_CREATED: " + f); + if (!f.mFromLayout) { + ViewGroup container = null; + if (f.mContainerId != 0) { + container = (ViewGroup)mActivity.findViewById(f.mContainerId); + if (container == null && !f.mRestored) { + throw new IllegalArgumentException("No view found for id 0x" + + Integer.toHexString(f.mContainerId) + + " for fragment " + f); + } + } + f.mContainer = container; + f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), + container, f.mSavedFragmentState); + if (f.mView != null) { + f.mInnerView = f.mView; + f.mView = NoSaveStateFrameLayout.wrap(f.mView); + if (container != null) { + Animation anim = loadAnimation(f, transit, true, + transitionStyle); + if (anim != null) { + f.mView.startAnimation(anim); + } + container.addView(f.mView); + } + if (f.mHidden) f.mView.setVisibility(View.GONE); + f.onViewCreated(f.mView, f.mSavedFragmentState); + } else { + f.mInnerView = null; + } + } + + f.mCalled = false; + f.onActivityCreated(f.mSavedFragmentState); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onActivityCreated()"); + } + if (f.mView != null) { + f.restoreViewState(); + } + f.mSavedFragmentState = null; + } + case Fragment.ACTIVITY_CREATED: + case Fragment.STOPPED: + if (newState > Fragment.STOPPED) { + if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); + f.mCalled = false; + f.performStart(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onStart()"); + } + } + case Fragment.STARTED: + if (newState > Fragment.STARTED) { + if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); + f.mCalled = false; + f.mResumed = true; + f.onResume(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onResume()"); + } + } + } + } else if (f.mState > newState) { + switch (f.mState) { + case Fragment.RESUMED: + if (newState < Fragment.RESUMED) { + if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); + f.mCalled = false; + f.onPause(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onPause()"); + } + f.mResumed = false; + } + case Fragment.STARTED: + if (newState < Fragment.STARTED) { + if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); + f.mCalled = false; + f.performStop(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onStop()"); + } + } + case Fragment.STOPPED: + case Fragment.ACTIVITY_CREATED: + if (newState < Fragment.ACTIVITY_CREATED) { + if (DEBUG) Log.v(TAG, "movefrom ACTIVITY_CREATED: " + f); + if (f.mView != null) { + // Need to save the current view state if not + // done already. + if (!mActivity.isFinishing() && f.mSavedViewState == null) { + saveFragmentViewState(f); + } + } + f.mCalled = false; + f.performDestroyView(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onDestroyView()"); + } + if (f.mView != null && f.mContainer != null) { + Animation anim = null; + if (mCurState > Fragment.INITIALIZING && !mDestroyed) { + anim = loadAnimation(f, transit, false, + transitionStyle); + } + if (anim != null) { + final Fragment fragment = f; + f.mAnimatingAway = f.mView; + f.mStateAfterAnimating = newState; + anim.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationEnd(Animation animation) { + if (fragment.mAnimatingAway != null) { + fragment.mAnimatingAway = null; + moveToState(fragment, fragment.mStateAfterAnimating, + 0, 0); + } + } + @Override + public void onAnimationRepeat(Animation animation) { + } + @Override + public void onAnimationStart(Animation animation) { + } + }); + f.mView.startAnimation(anim); + } + f.mContainer.removeView(f.mView); + } + f.mContainer = null; + f.mView = null; + f.mInnerView = null; + } + case Fragment.CREATED: + if (newState < Fragment.CREATED) { + if (mDestroyed) { + if (f.mAnimatingAway != null) { + // The fragment's containing activity is + // being destroyed, but this fragment is + // currently animating away. Stop the + // animation right now -- it is not needed, + // and we can't wait any more on destroying + // the fragment. + View v = f.mAnimatingAway; + f.mAnimatingAway = null; + v.clearAnimation(); + } + } + if (f.mAnimatingAway != null) { + // We are waiting for the fragment's view to finish + // animating away. Just make a note of the state + // the fragment now should move to once the animation + // is done. + f.mStateAfterAnimating = newState; + newState = Fragment.CREATED; + } else { + if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); + if (!f.mRetaining) { + f.mCalled = false; + f.onDestroy(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onDestroy()"); + } + } + + f.mCalled = false; + f.onDetach(); + if (!f.mCalled) { + throw new SuperNotCalledException("Fragment " + f + + " did not call through to super.onDetach()"); + } + if (!f.mRetaining) { + makeInactive(f); + } else { + f.mImmediateActivity = null; + f.mActivity = null; + f.mFragmentManager = null; + } + } + } + } + } + + f.mState = newState; + } + + void moveToState(Fragment f) { + moveToState(f, mCurState, 0, 0); + } + + void moveToState(int newState, boolean always) { + moveToState(newState, 0, 0, always); + } + + void moveToState(int newState, int transit, int transitStyle, boolean always) { + if (mActivity == null && newState != Fragment.INITIALIZING) { + throw new IllegalStateException("No activity"); + } + + if (!always && mCurState == newState) { + return; + } + + mCurState = newState; + if (mActive != null) { + for (int i=0; i= 0) { + return; + } + + if (mAvailIndices == null || mAvailIndices.size() <= 0) { + if (mActive == null) { + mActive = new ArrayList(); + } + f.setIndex(mActive.size()); + mActive.add(f); + + } else { + f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); + mActive.set(f.mIndex, f); + } + } + + void makeInactive(Fragment f) { + if (f.mIndex < 0) { + return; + } + + if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); + mActive.set(f.mIndex, null); + if (mAvailIndices == null) { + mAvailIndices = new ArrayList(); + } + mAvailIndices.add(f.mIndex); + mActivity.getInternalCallbacks().invalidateSupportFragmentIndex(f.mIndex); + f.initState(); + } + + public void addFragment(Fragment fragment, boolean moveToStateNow) { + if (mAdded == null) { + mAdded = new ArrayList(); + } + if (DEBUG) Log.v(TAG, "add: " + fragment); + makeActive(fragment); + if (!fragment.mDetached) { + mAdded.add(fragment); + fragment.mAdded = true; + fragment.mRemoving = false; + if (fragment.mHasMenu && fragment.mExposesMenu) { + mNeedMenuInvalidate = true; + } + if (moveToStateNow) { + moveToState(fragment); + } + } + } + + public void removeFragment(Fragment fragment, int transition, int transitionStyle) { + if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); + final boolean inactive = !fragment.isInBackStack(); + if (!fragment.mDetached || inactive) { + mAdded.remove(fragment); + if (fragment.mHasMenu && fragment.mExposesMenu) { + mNeedMenuInvalidate = true; + } + fragment.mAdded = false; + fragment.mRemoving = true; + moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, + transition, transitionStyle); + } + } + + public void hideFragment(Fragment fragment, int transition, int transitionStyle) { + if (DEBUG) Log.v(TAG, "hide: " + fragment); + if (!fragment.mHidden) { + fragment.mHidden = true; + if (fragment.mView != null) { + Animation anim = loadAnimation(fragment, transition, true, + transitionStyle); + if (anim != null) { + fragment.mView.startAnimation(anim); + } + fragment.mView.setVisibility(View.GONE); + } + if (fragment.mAdded && fragment.mHasMenu && fragment.mExposesMenu) { + mNeedMenuInvalidate = true; + } + fragment.onHiddenChanged(true); + } + } + + public void showFragment(Fragment fragment, int transition, int transitionStyle) { + if (DEBUG) Log.v(TAG, "show: " + fragment); + if (fragment.mHidden) { + fragment.mHidden = false; + if (fragment.mView != null) { + Animation anim = loadAnimation(fragment, transition, true, + transitionStyle); + if (anim != null) { + fragment.mView.startAnimation(anim); + } + fragment.mView.setVisibility(View.VISIBLE); + } + if (fragment.mAdded && fragment.mHasMenu && fragment.mExposesMenu) { + mNeedMenuInvalidate = true; + } + fragment.onHiddenChanged(false); + } + } + + public void detachFragment(Fragment fragment, int transition, int transitionStyle) { + if (DEBUG) Log.v(TAG, "detach: " + fragment); + if (!fragment.mDetached) { + fragment.mDetached = true; + if (fragment.mAdded) { + // We are not already in back stack, so need to remove the fragment. + mAdded.remove(fragment); + if (fragment.mHasMenu && fragment.mExposesMenu) { + mNeedMenuInvalidate = true; + } + fragment.mAdded = false; + moveToState(fragment, Fragment.CREATED, transition, transitionStyle); + } + } + } + + public void attachFragment(Fragment fragment, int transition, int transitionStyle) { + if (DEBUG) Log.v(TAG, "attach: " + fragment); + if (fragment.mDetached) { + fragment.mDetached = false; + if (!fragment.mAdded) { + mAdded.add(fragment); + fragment.mAdded = true; + if (fragment.mHasMenu && fragment.mExposesMenu) { + mNeedMenuInvalidate = true; + } + moveToState(fragment, mCurState, transition, transitionStyle); + } + } + } + + public Fragment findFragmentById(int id) { + if (mActive != null) { + // First look through added fragments. + for (int i=mAdded.size()-1; i>=0; i--) { + Fragment f = mAdded.get(i); + if (f != null && f.mFragmentId == id) { + return f; + } + } + // Now for any known fragment. + for (int i=mActive.size()-1; i>=0; i--) { + Fragment f = mActive.get(i); + if (f != null && f.mFragmentId == id) { + return f; + } + } + } + return null; + } + + public Fragment findFragmentByTag(String tag) { + if (mActive != null && tag != null) { + // First look through added fragments. + for (int i=mAdded.size()-1; i>=0; i--) { + Fragment f = mAdded.get(i); + if (f != null && tag.equals(f.mTag)) { + return f; + } + } + // Now for any known fragment. + for (int i=mActive.size()-1; i>=0; i--) { + Fragment f = mActive.get(i); + if (f != null && tag.equals(f.mTag)) { + return f; + } + } + } + return null; + } + + public Fragment findFragmentByWho(String who) { + if (mActive != null && who != null) { + for (int i=mActive.size()-1; i>=0; i--) { + Fragment f = mActive.get(i); + if (f != null && who.equals(f.mWho)) { + return f; + } + } + } + return null; + } + + private void checkStateLoss() { + if (mStateSaved) { + throw new IllegalStateException( + "Can not perform this action after onSaveInstanceState"); + } + if (mNoTransactionsBecause != null) { + throw new IllegalStateException( + "Can not perform this action inside of " + mNoTransactionsBecause); + } + } + + public void enqueueAction(Runnable action, boolean allowStateLoss) { + if (!allowStateLoss) { + checkStateLoss(); + } + synchronized (this) { + if (mActivity == null) { + throw new IllegalStateException("Activity has been destroyed"); + } + mActivity.getInternalCallbacks().ensureSupportActionBarAttached(); + if (mPendingActions == null) { + mPendingActions = new ArrayList(); + } + mPendingActions.add(action); + if (mPendingActions.size() == 1) { + mActivity.getInternalCallbacks().getHandler().removeCallbacks(mExecCommit); + mActivity.getInternalCallbacks().getHandler().post(mExecCommit); + } + } + } + + public int allocBackStackIndex(BackStackRecord bse) { + synchronized (this) { + if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { + if (mBackStackIndices == null) { + mBackStackIndices = new ArrayList(); + } + int index = mBackStackIndices.size(); + if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); + mBackStackIndices.add(bse); + return index; + + } else { + int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); + if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); + mBackStackIndices.set(index, bse); + return index; + } + } + } + + public void setBackStackIndex(int index, BackStackRecord bse) { + synchronized (this) { + if (mBackStackIndices == null) { + mBackStackIndices = new ArrayList(); + } + int N = mBackStackIndices.size(); + if (index < N) { + if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); + mBackStackIndices.set(index, bse); + } else { + while (N < index) { + mBackStackIndices.add(null); + if (mAvailBackStackIndices == null) { + mAvailBackStackIndices = new ArrayList(); + } + if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); + mAvailBackStackIndices.add(N); + N++; + } + if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); + mBackStackIndices.add(bse); + } + } + } + + public void freeBackStackIndex(int index) { + synchronized (this) { + mBackStackIndices.set(index, null); + if (mAvailBackStackIndices == null) { + mAvailBackStackIndices = new ArrayList(); + } + if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); + mAvailBackStackIndices.add(index); + } + } + + /** + * Only call from main thread! + */ + public boolean execPendingActions() { + if (mExecutingActions) { + throw new IllegalStateException("Recursive entry to executePendingTransactions"); + } + + if (Looper.myLooper() != mActivity.getInternalCallbacks().getHandler().getLooper()) { + throw new IllegalStateException("Must be called from main thread of process"); + } + + boolean didSomething = false; + + while (true) { + int numActions; + + synchronized (this) { + if (mPendingActions == null || mPendingActions.size() == 0) { + return didSomething; + } + + numActions = mPendingActions.size(); + if (mTmpActions == null || mTmpActions.length < numActions) { + mTmpActions = new Runnable[numActions]; + } + mPendingActions.toArray(mTmpActions); + mPendingActions.clear(); + mActivity.getInternalCallbacks().getHandler().removeCallbacks(mExecCommit); + } + + mExecutingActions = true; + for (int i=0; i(); + } + mBackStack.add(state); + reportBackStackChanged(); + } + + boolean popBackStackState(Handler handler, String name, int id, int flags) { + if (mBackStack == null) { + return false; + } + if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) { + int last = mBackStack.size()-1; + if (last < 0) { + return false; + } + final BackStackRecord bss = mBackStack.remove(last); + bss.popFromBackStack(true); + reportBackStackChanged(); + } else { + int index = -1; + if (name != null || id >= 0) { + // If a name or ID is specified, look for that place in + // the stack. + index = mBackStack.size()-1; + while (index >= 0) { + BackStackRecord bss = mBackStack.get(index); + if (name != null && name.equals(bss.getName())) { + break; + } + if (id >= 0 && id == bss.mIndex) { + break; + } + index--; + } + if (index < 0) { + return false; + } + if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) { + index--; + // Consume all following entries that match. + while (index >= 0) { + BackStackRecord bss = mBackStack.get(index); + if ((name != null && name.equals(bss.getName())) + || (id >= 0 && id == bss.mIndex)) { + index--; + continue; + } + break; + } + } + } + if (index == mBackStack.size()-1) { + return false; + } + final ArrayList states + = new ArrayList(); + for (int i=mBackStack.size()-1; i>index; i--) { + states.add(mBackStack.remove(i)); + } + final int LAST = states.size()-1; + for (int i=0; i<=LAST; i++) { + if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); + states.get(i).popFromBackStack(i == LAST); + } + reportBackStackChanged(); + } + return true; + } + + ArrayList retainNonConfig() { + ArrayList fragments = null; + if (mActive != null) { + for (int i=0; i(); + } + fragments.add(f); + f.mRetaining = true; + f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1; + } + } + } + return fragments; + } + + void saveFragmentViewState(Fragment f) { + if (f.mInnerView == null) { + return; + } + if (mStateArray == null) { + mStateArray = new SparseArray(); + } else { + mStateArray.clear(); + } + f.mInnerView.saveHierarchyState(mStateArray); + if (mStateArray.size() > 0) { + f.mSavedViewState = mStateArray; + mStateArray = null; + } + } + + Bundle saveFragmentBasicState(Fragment f) { + Bundle result = null; + + if (mStateBundle == null) { + mStateBundle = new Bundle(); + } + f.onSaveInstanceState(mStateBundle); + if (!mStateBundle.isEmpty()) { + result = mStateBundle; + mStateBundle = null; + } + + if (f.mView != null) { + saveFragmentViewState(f); + } + if (f.mSavedViewState != null) { + if (result == null) { + result = new Bundle(); + } + result.putSparseParcelableArray( + FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); + } + + return result; + } + + Parcelable saveAllState() { + // Make sure all pending operations have now been executed to get + // our state update-to-date. + execPendingActions(); + + if (HONEYCOMB) { + // As of Honeycomb, we save state after pausing. Prior to that + // it is before pausing. With fragments this is an issue, since + // there are many things you may do after pausing but before + // stopping that change the fragment state. For those older + // devices, we will not at this point say that we have saved + // the state, so we will allow them to continue doing fragment + // transactions. This retains the same semantics as Honeycomb, + // though you do have the risk of losing the very most recent state + // if the process is killed... we'll live with that. + mStateSaved = true; + } + + if (mActive == null || mActive.size() <= 0) { + return null; + } + + // First collect all active fragments. + int N = mActive.size(); + FragmentState[] active = new FragmentState[N]; + boolean haveFragments = false; + for (int i=0; i Fragment.INITIALIZING && fs.mSavedFragmentState == null) { + fs.mSavedFragmentState = saveFragmentBasicState(f); + + if (f.mTarget != null) { + if (f.mTarget.mIndex < 0) { + String msg = "Failure saving state: " + f + + " has target not in fragment manager: " + f.mTarget; + Log.e(TAG, msg); + dump(" ", null, new PrintWriter(new LogWriter(TAG)), new String[] { }); + throw new IllegalStateException(msg); + } + if (fs.mSavedFragmentState == null) { + fs.mSavedFragmentState = new Bundle(); + } + putFragment(fs.mSavedFragmentState, + FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); + if (f.mTargetRequestCode != 0) { + fs.mSavedFragmentState.putInt( + FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, + f.mTargetRequestCode); + } + } + + } else { + fs.mSavedFragmentState = f.mSavedFragmentState; + } + + if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " + + fs.mSavedFragmentState); + } + } + + if (!haveFragments) { + if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); + return null; + } + + int[] added = null; + BackStackState[] backStack = null; + + // Build list of currently added fragments. + if (mAdded != null) { + N = mAdded.size(); + if (N > 0) { + added = new int[N]; + for (int i=0; i 0) { + backStack = new BackStackState[N]; + for (int i=0; i nonConfig) { + // If there is no saved state at all, then there can not be + // any nonConfig fragments either, so that is that. + if (state == null) return; + FragmentManagerState fms = (FragmentManagerState)state; + if (fms.mActive == null) return; + + // First re-attach any non-config instances we are retaining back + // to their saved state, so we don't try to instantiate them again. + if (nonConfig != null) { + for (int i=0; i(fms.mActive.length); + if (mAvailIndices != null) { + mAvailIndices.clear(); + } + for (int i=0; i(); + } + if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); + mAvailIndices.add(i); + } + } + + // Update the target of all retained fragments. + if (nonConfig != null) { + for (int i=0; i= 0) { + if (f.mTargetIndex < mActive.size()) { + f.mTarget = mActive.get(f.mTargetIndex); + } else { + Log.w(TAG, "Re-attaching retained fragment " + f + + " target no longer exists: " + f.mTargetIndex); + f.mTarget = null; + } + } + } + } + + // Build the list of currently added fragments. + if (fms.mAdded != null) { + mAdded = new ArrayList(fms.mAdded.length); + for (int i=0; i(fms.mBackStack.length); + for (int i=0; i= 0) { + setBackStackIndex(bse.mIndex, bse); + } + } + } else { + mBackStack = null; + } + } + + public void attachActivity(SupportActivity activity) { + if (mActivity != null) throw new IllegalStateException(); + mActivity = activity; + } + + public void noteStateNotSaved() { + mStateSaved = false; + } + + public void dispatchCreate() { + mStateSaved = false; + moveToState(Fragment.CREATED, false); + } + + public void dispatchActivityCreated() { + mStateSaved = false; + moveToState(Fragment.ACTIVITY_CREATED, false); + } + + public void dispatchStart() { + mStateSaved = false; + moveToState(Fragment.STARTED, false); + } + + public void dispatchResume() { + mStateSaved = false; + moveToState(Fragment.RESUMED, false); + } + + public void dispatchPause() { + moveToState(Fragment.STARTED, false); + } + + public void dispatchStop() { + // See saveAllState() for the explanation of this. We do this for + // all platform versions, to keep our behavior more consistent between + // them. + mStateSaved = true; + + moveToState(Fragment.STOPPED, false); + } + + public void dispatchReallyStop(boolean retaining) { + if (mActive != null) { + for (int i=0; i newMenus = null; + if (mActive != null) { + for (int i=0; i(); + } + newMenus.add(f); + } + } + } + + if (mCreatedMenus != null) { + for (int i=0; i mLastFragment = null; + private int mLastPosition = -1; + private boolean mOptionsMenuPotentiallyStale; + + public FragmentPagerAdapter(FragmentManager fm) { + mFragmentManager = fm; + } + + /** + * Return the Fragment associated with a specified position. + */ + public abstract Fragment getItem(int position); + + @Override + public void startUpdate(View container) { + mOptionsMenuPotentiallyStale = false; + } + + @Override + public Object instantiateItem(View container, int position) { + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + + // Do we already have this fragment? + String name = makeFragmentName(container.getId(), position); + Fragment fragment = mFragmentManager.findFragmentByTag(name); + if (fragment != null) { + if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment); + mCurTransaction.attach(fragment); + } else { + fragment = getItem(position); + if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment); + mCurTransaction.add(container.getId(), fragment, + makeFragmentName(container.getId(), position)); + } + + fragment.mExposesMenu = false; + return fragment; + } + + @Override + public void destroyItem(View container, int position, Object object) { + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + Fragment fragment = (Fragment)object; + fragment.mExposesMenu = true; + if (DEBUG) Log.v(TAG, "Detaching item #" + position + ": f=" + fragment + + " v=" + fragment.getView()); + mCurTransaction.detach(fragment); + } + + @Override + public void onItemSelected(int position, Object object) { + if (position == mLastPosition) { + return; + } + if ((mLastFragment != null) && (mLastFragment.get() != null)) { + mLastFragment.get().mExposesMenu = false; + } + Fragment fragment = (Fragment)object; + fragment.mExposesMenu = true; + mLastFragment = new WeakReference(fragment); + mLastPosition = position; + mOptionsMenuPotentiallyStale = true; + } + + @Override + public void finishUpdate(View container) { + if (mCurTransaction != null) { + mCurTransaction.commit(); + mCurTransaction = null; + mOptionsMenuPotentiallyStale = true; + } + if (mOptionsMenuPotentiallyStale) { + mFragmentManager.executePendingTransactions(); + ((FragmentManagerImpl)mFragmentManager).mActivity.invalidateOptionsMenu(); + } + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return ((Fragment)object).getView() == view; + } + + @Override + public Parcelable saveState() { + return null; + } + + @Override + public void restoreState(Parcelable state, ClassLoader loader) { + } + + private static String makeFragmentName(int viewId, int index) { + return "android:switcher:" + viewId + ":" + index; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentStatePagerAdapter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentStatePagerAdapter.java new file mode 100644 index 00000000..8567e83d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentStatePagerAdapter.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import java.util.ArrayList; + +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v4.view.PagerAdapter; +import android.util.Log; +import android.view.View; + +public abstract class FragmentStatePagerAdapter extends PagerAdapter { + private static final String TAG = "FragmentStatePagerAdapter"; + private static final boolean DEBUG = false; + + private final FragmentManager mFragmentManager; + private FragmentTransaction mCurTransaction = null; + + private ArrayList mSavedState = new ArrayList(); + private ArrayList mFragments = new ArrayList(); + + public FragmentStatePagerAdapter(FragmentManager fm) { + mFragmentManager = fm; + } + + /** + * Return the Fragment associated with a specified position. + */ + public abstract Fragment getItem(int position); + + @Override + public void startUpdate(View container) { + } + + @Override + public Object instantiateItem(View container, int position) { + // If we already have this item instantiated, there is nothing + // to do. This can happen when we are restoring the entire pager + // from its saved state, where the fragment manager has already + // taken care of restoring the fragments we previously had instantiated. + if (mFragments.size() > position) { + Fragment f = mFragments.get(position); + if (f != null) { + return f; + } + } + + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + + Fragment fragment = getItem(position); + if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment); + if (mSavedState.size() > position) { + Fragment.SavedState fss = mSavedState.get(position); + if (fss != null) { + fragment.setInitialSavedState(fss); + } + } + while (mFragments.size() <= position) { + mFragments.add(null); + } + mFragments.set(position, fragment); + mCurTransaction.add(container.getId(), fragment); + + return fragment; + } + + @Override + public void destroyItem(View container, int position, Object object) { + Fragment fragment = (Fragment)object; + + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object + + " v=" + ((Fragment)object).getView()); + while (mSavedState.size() <= position) { + mSavedState.add(null); + } + mSavedState.set(position, mFragmentManager.saveFragmentInstanceState(fragment)); + mFragments.set(position, null); + + mCurTransaction.remove(fragment); + } + + @Override + public void finishUpdate(View container) { + if (mCurTransaction != null) { + mCurTransaction.commit(); + mCurTransaction = null; + mFragmentManager.executePendingTransactions(); + } + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return ((Fragment)object).getView() == view; + } + + @Override + public Parcelable saveState() { + Bundle state = null; + if (mSavedState.size() > 0) { + state = new Bundle(); + Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()]; + mSavedState.toArray(fss); + state.putParcelableArray("states", fss); + } + for (int i=0; i keys = bundle.keySet(); + for (String key: keys) { + if (key.startsWith("f")) { + int index = Integer.parseInt(key.substring(1)); + Fragment f = mFragmentManager.getFragment(bundle, key); + if (f != null) { + while (mFragments.size() <= index) { + mFragments.add(null); + } + mFragments.set(index, f); + } else { + Log.w(TAG, "Bad fragment at key " + key); + } + } + } + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentTransaction.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentTransaction.java new file mode 100644 index 00000000..b8dfd5f6 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/FragmentTransaction.java @@ -0,0 +1,262 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +/** + * Static library support version of the framework's {@link android.app.FragmentTransaction}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public abstract class FragmentTransaction { + /** + * Calls {@link #add(int, Fragment, String)} with a 0 containerViewId. + */ + public abstract FragmentTransaction add(Fragment fragment, String tag); + + /** + * Calls {@link #add(int, Fragment, String)} with a null tag. + */ + public abstract FragmentTransaction add(int containerViewId, Fragment fragment); + + /** + * Add a fragment to the activity state. This fragment may optionally + * also have its view (if {@link Fragment#onCreateView Fragment.onCreateView} + * returns non-null) into a container view of the activity. + * + * @param containerViewId Optional identifier of the container this fragment is + * to be placed in. If 0, it will not be placed in a container. + * @param fragment The fragment to be added. This fragment must not already + * be added to the activity. + * @param tag Optional tag name for the fragment, to later retrieve the + * fragment with {@link FragmentManager#findFragmentByTag(String) + * FragmentManager.findFragmentByTag(String)}. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction add(int containerViewId, Fragment fragment, String tag); + + /** + * Calls {@link #replace(int, Fragment, String)} with a null tag. + */ + public abstract FragmentTransaction replace(int containerViewId, Fragment fragment); + + /** + * Replace an existing fragment that was added to a container. This is + * essentially the same as calling {@link #remove(Fragment)} for all + * currently added fragments that were added with the same containerViewId + * and then {@link #add(int, Fragment, String)} with the same arguments + * given here. + * + * @param containerViewId Identifier of the container whose fragment(s) are + * to be replaced. + * @param fragment The new fragment to place in the container. + * @param tag Optional tag name for the fragment, to later retrieve the + * fragment with {@link FragmentManager#findFragmentByTag(String) + * FragmentManager.findFragmentByTag(String)}. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction replace(int containerViewId, Fragment fragment, String tag); + + /** + * Remove an existing fragment. If it was added to a container, its view + * is also removed from that container. + * + * @param fragment The fragment to be removed. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction remove(Fragment fragment); + + /** + * Hides an existing fragment. This is only relevant for fragments whose + * views have been added to a container, as this will cause the view to + * be hidden. + * + * @param fragment The fragment to be hidden. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction hide(Fragment fragment); + + /** + * Shows a previously hidden fragment. This is only relevant for fragments whose + * views have been added to a container, as this will cause the view to + * be shown. + * + * @param fragment The fragment to be shown. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction show(Fragment fragment); + + /** + * Detach the given fragment from the UI. This is the same state as + * when it is put on the back stack: the fragment is removed from + * the UI, however its state is still being actively managed by the + * fragment manager. When going into this state its view hierarchy + * is destroyed. + * + * @param fragment The fragment to be detached. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction detach(Fragment fragment); + + /** + * Re-attach a fragment after it had previously been deatched from + * the UI with {@link #detach(Fragment)}. This + * causes its view hierarchy to be re-created, attached to the UI, + * and displayed. + * + * @param fragment The fragment to be attached. + * + * @return Returns the same FragmentTransaction instance. + */ + public abstract FragmentTransaction attach(Fragment fragment); + + /** + * @return true if this transaction contains no operations, + * false otherwise. + */ + public abstract boolean isEmpty(); + + /** + * Bit mask that is set for all enter transitions. + */ + public static final int TRANSIT_ENTER_MASK = 0x1000; + + /** + * Bit mask that is set for all exit transitions. + */ + public static final int TRANSIT_EXIT_MASK = 0x2000; + + /** Not set up for a transition. */ + public static final int TRANSIT_UNSET = -1; + /** No animation for transition. */ + public static final int TRANSIT_NONE = 0; + /** Fragment is being added onto the stack */ + public static final int TRANSIT_FRAGMENT_OPEN = 1 | TRANSIT_ENTER_MASK; + /** Fragment is being removed from the stack */ + public static final int TRANSIT_FRAGMENT_CLOSE = 2 | TRANSIT_EXIT_MASK; + /** Fragment should simply fade in or out; that is, no strong navigation associated + * with it except that it is appearing or disappearing for some reason. */ + public static final int TRANSIT_FRAGMENT_FADE = 3 | TRANSIT_ENTER_MASK; + + /** + * Set specific animation resources to run for the fragments that are + * entering and exiting in this transaction. + */ + public abstract FragmentTransaction setCustomAnimations(int enter, int exit); + + /** + * Select a standard transition animation for this transaction. May be + * one of {@link #TRANSIT_NONE}, {@link #TRANSIT_FRAGMENT_OPEN}, + * or {@link #TRANSIT_FRAGMENT_CLOSE} + */ + public abstract FragmentTransaction setTransition(int transit); + + /** + * Set a custom style resource that will be used for resolving transit + * animations. + */ + public abstract FragmentTransaction setTransitionStyle(int styleRes); + + /** + * Add this transaction to the back stack. This means that the transaction + * will be remembered after it is committed, and will reverse its operation + * when later popped off the stack. + * + * @param name An optional name for this back stack state, or null. + */ + public abstract FragmentTransaction addToBackStack(String name); + + /** + * Returns true if this FragmentTransaction is allowed to be added to the back + * stack. If this method would return false, {@link #addToBackStack(String)} + * will throw {@link IllegalStateException}. + * + * @return True if {@link #addToBackStack(String)} is permitted on this transaction. + */ + public abstract boolean isAddToBackStackAllowed(); + + /** + * Disallow calls to {@link #addToBackStack(String)}. Any future calls to + * addToBackStack will throw {@link IllegalStateException}. If addToBackStack + * has already been called, this method will throw IllegalStateException. + */ + public abstract FragmentTransaction disallowAddToBackStack(); + + /** + * Set the full title to show as a bread crumb when this transaction + * is on the back stack, as used by {@link FragmentBreadCrumbs}. + * + * @param res A string resource containing the title. + */ + public abstract FragmentTransaction setBreadCrumbTitle(int res); + + /** + * Like {@link #setBreadCrumbTitle(int)} but taking a raw string; this + * method is not recommended, as the string can not be changed + * later if the locale changes. + */ + public abstract FragmentTransaction setBreadCrumbTitle(CharSequence text); + + /** + * Set the short title to show as a bread crumb when this transaction + * is on the back stack, as used by {@link FragmentBreadCrumbs}. + * + * @param res A string resource containing the title. + */ + public abstract FragmentTransaction setBreadCrumbShortTitle(int res); + + /** + * Like {@link #setBreadCrumbShortTitle(int)} but taking a raw string; this + * method is not recommended, as the string can not be changed + * later if the locale changes. + */ + public abstract FragmentTransaction setBreadCrumbShortTitle(CharSequence text); + + /** + * Schedules a commit of this transaction. The commit does + * not happen immediately; it will be scheduled as work on the main thread + * to be done the next time that thread is ready. + * + *

A transaction can only be committed with this method + * prior to its containing activity saving its state. If the commit is + * attempted after that point, an exception will be thrown. This is + * because the state after the commit can be lost if the activity needs to + * be restored from its state. See {@link #commitAllowingStateLoss()} for + * situations where it may be okay to lose the commit.

+ * + * @return Returns the identifier of this transaction's back stack entry, + * if {@link #addToBackStack(String)} had been called. Otherwise, returns + * a negative number. + */ + public abstract int commit(); + + /** + * Like {@link #commit} but allows the commit to be executed after an + * activity's state is saved. This is dangerous because the commit can + * be lost if the activity needs to later be restored from its state, so + * this should only be used for cases where it is okay for the UI state + * to change unexpectedly on the user. + */ + public abstract int commitAllowingStateLoss(); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/HCSparseArray.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/HCSparseArray.java new file mode 100644 index 00000000..f6cf9fe2 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/HCSparseArray.java @@ -0,0 +1,360 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +/** + * A copy of Honeycomb's SparseArray, only so we can have the removeAt() method. + */ +public class HCSparseArray { + private static final Object DELETED = new Object(); + private boolean mGarbage = false; + + /** + * Creates a new SparseArray containing no mappings. + */ + public HCSparseArray() { + this(10); + } + + /** + * Creates a new SparseArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public HCSparseArray(int initialCapacity) { + initialCapacity = idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new Object[initialCapacity]; + mSize = 0; + } + + /** + * Gets the Object mapped from the specified key, or null + * if no such mapping has been made. + */ + public E get(int key) { + return get(key, null); + } + + /** + * Gets the Object mapped from the specified key, or the specified Object + * if no such mapping has been made. + */ + @SuppressWarnings("unchecked") + public E get(int key, E valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0 || mValues[i] == DELETED) { + return valueIfKeyNotFound; + } else { + return (E) mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + if (mValues[i] != DELETED) { + mValues[i] = DELETED; + mGarbage = true; + } + } + } + + /** + * Alias for {@link #delete(int)}. + */ + public void remove(int key) { + delete(key); + } + + /** + * Removes the mapping at the specified index. + */ + public void removeAt(int index) { + if (mValues[index] != DELETED) { + mValues[index] = DELETED; + mGarbage = true; + } + } + + private void gc() { + // Log.e("SparseArray", "gc start with " + mSize); + + int n = mSize; + int o = 0; + int[] keys = mKeys; + Object[] values = mValues; + + for (int i = 0; i < n; i++) { + Object val = values[i]; + + if (val != DELETED) { + if (i != o) { + keys[o] = keys[i]; + values[o] = val; + } + + o++; + } + } + + mGarbage = false; + mSize = o; + + // Log.e("SparseArray", "gc end with " + mSize); + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, E value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + + if (i < mSize && mValues[i] == DELETED) { + mKeys[i] = key; + mValues[i] = value; + return; + } + + if (mGarbage && mSize >= mKeys.length) { + gc(); + + // Search again because indices may have changed. + i = ~binarySearch(mKeys, 0, mSize, key); + } + + if (mSize >= mKeys.length) { + int n = idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + Object[] nvalues = new Object[n]; + + // Log.e("SparseArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseArray + * currently stores. + */ + public int size() { + if (mGarbage) { + gc(); + } + + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseArray stores. + */ + public int keyAt(int index) { + if (mGarbage) { + gc(); + } + + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseArray stores. + */ + @SuppressWarnings("unchecked") + public E valueAt(int index) { + if (mGarbage) { + gc(); + } + + return (E) mValues[index]; + } + + /** + * Given an index in the range 0...size()-1, sets a new + * value for the indexth key-value mapping that this + * SparseArray stores. + */ + public void setValueAt(int index, E value) { + if (mGarbage) { + gc(); + } + + mValues[index] = value; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + if (mGarbage) { + gc(); + } + + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(E value) { + if (mGarbage) { + gc(); + } + + for (int i = 0; i < mSize; i++) + if (mValues[i] == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseArray. + */ + public void clear() { + int n = mSize; + Object[] values = mValues; + + for (int i = 0; i < n; i++) { + values[i] = null; + } + + mSize = 0; + mGarbage = false; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, E value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + if (mGarbage && mSize >= mKeys.length) { + gc(); + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + Object[] nvalues = new Object[n]; + + // Log.e("SparseArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + /*private void checkIntegrity() { + for (int i = 1; i < mSize; i++) { + if (mKeys[i] <= mKeys[i - 1]) { + for (int j = 0; j < mSize; j++) { + Log.e("FAIL", j + ": " + mKeys[j] + " -> " + mValues[j]); + } + + throw new RuntimeException(); + } + } + }*/ + + static int idealByteArraySize(int need) { + for (int i = 4; i < 32; i++) + if (need <= (1 << i) - 12) + return (1 << i) - 12; + + return need; + } + + static int idealIntArraySize(int need) { + return idealByteArraySize(need * 4) / 4; + } + + private int[] mKeys; + private Object[] mValues; + private int mSize; +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ListFragment.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ListFragment.java new file mode 100644 index 00000000..7f8666ff --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/ListFragment.java @@ -0,0 +1,375 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.widget.AdapterView; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; + +/** + * Static library support version of the framework's {@link android.app.ListFragment}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class ListFragment extends Fragment { + static final int INTERNAL_EMPTY_ID = 0x00ff0001; + static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002; + static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003; + + final private Handler mHandler = new Handler(); + + final private Runnable mRequestFocus = new Runnable() { + public void run() { + mList.focusableViewAvailable(mList); + } + }; + + final private AdapterView.OnItemClickListener mOnClickListener + = new AdapterView.OnItemClickListener() { + public void onItemClick(AdapterView parent, View v, int position, long id) { + onListItemClick((ListView)parent, v, position, id); + } + }; + + ListAdapter mAdapter; + ListView mList; + View mEmptyView; + TextView mStandardEmptyView; + View mProgressContainer; + View mListContainer; + CharSequence mEmptyText; + boolean mListShown; + + public ListFragment() { + } + + /** + * Provide default implementation to return a simple list view. Subclasses + * can override to replace with their own layout. If doing so, the + * returned view hierarchy must have a ListView whose id + * is {@link android.R.id#list android.R.id.list} and can optionally + * have a sibling view id {@link android.R.id#empty android.R.id.empty} + * that is to be shown when the list is empty. + * + *

If you are overriding this method with your own custom content, + * consider including the standard layout {@link android.R.layout#list_content} + * in your layout file, so that you continue to retain all of the standard + * behavior of ListFragment. In particular, this is currently the only + * way to have the built-in indeterminant progress state be shown. + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final Context context = getActivity(); + + FrameLayout root = new FrameLayout(context); + + // ------------------------------------------------------------------ + + LinearLayout pframe = new LinearLayout(context); + pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); + pframe.setOrientation(LinearLayout.VERTICAL); + pframe.setVisibility(View.GONE); + pframe.setGravity(Gravity.CENTER); + + ProgressBar progress = new ProgressBar(context, null, + android.R.attr.progressBarStyleLarge); + pframe.addView(progress, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + root.addView(pframe, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + + // ------------------------------------------------------------------ + + FrameLayout lframe = new FrameLayout(context); + lframe.setId(INTERNAL_LIST_CONTAINER_ID); + + TextView tv = new TextView(context); + tv.setId(INTERNAL_EMPTY_ID); + tv.setGravity(Gravity.CENTER); + lframe.addView(tv, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + + ListView lv = new ListView(context); + lv.setId(android.R.id.list); + lv.setDrawSelectorOnTop(false); + lframe.addView(lv, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + + root.addView(lframe, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + + // ------------------------------------------------------------------ + + root.setLayoutParams(new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + + return root; + } + + /** + * Attach to list view once the view hierarchy has been created. + */ + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + ensureList(); + } + + /** + * Detach from list view. + */ + @Override + public void onDestroyView() { + mHandler.removeCallbacks(mRequestFocus); + mList = null; + mListShown = false; + mEmptyView = mProgressContainer = mListContainer = null; + mStandardEmptyView = null; + super.onDestroyView(); + } + + /** + * This method will be called when an item in the list is selected. + * Subclasses should override. Subclasses can call + * getListView().getItemAtPosition(position) if they need to access the + * data associated with the selected item. + * + * @param l The ListView where the click happened + * @param v The view that was clicked within the ListView + * @param position The position of the view in the list + * @param id The row id of the item that was clicked + */ + public void onListItemClick(ListView l, View v, int position, long id) { + } + + /** + * Provide the cursor for the list view. + */ + public void setListAdapter(ListAdapter adapter) { + boolean hadAdapter = mAdapter != null; + mAdapter = adapter; + if (mList != null) { + mList.setAdapter(adapter); + if (!mListShown && !hadAdapter) { + // The list was hidden, and previously didn't have an + // adapter. It is now time to show it. + setListShown(true, getView().getWindowToken() != null); + } + } + } + + /** + * Set the currently selected list item to the specified + * position with the adapter's data + * + * @param position + */ + public void setSelection(int position) { + ensureList(); + mList.setSelection(position); + } + + /** + * Get the position of the currently selected list item. + */ + public int getSelectedItemPosition() { + ensureList(); + return mList.getSelectedItemPosition(); + } + + /** + * Get the cursor row ID of the currently selected list item. + */ + public long getSelectedItemId() { + ensureList(); + return mList.getSelectedItemId(); + } + + /** + * Get the activity's list view widget. + */ + public ListView getListView() { + ensureList(); + return mList; + } + + /** + * The default content for a ListFragment has a TextView that can + * be shown when the list is empty. If you would like to have it + * shown, call this method to supply the text it should use. + */ + public void setEmptyText(CharSequence text) { + ensureList(); + if (mStandardEmptyView == null) { + throw new IllegalStateException("Can't be used with a custom content view"); + } + mStandardEmptyView.setText(text); + if (mEmptyText == null) { + mList.setEmptyView(mStandardEmptyView); + } + mEmptyText = text; + } + + /** + * Control whether the list is being displayed. You can make it not + * displayed if you are waiting for the initial data to show in it. During + * this time an indeterminant progress indicator will be shown instead. + * + *

Applications do not normally need to use this themselves. The default + * behavior of ListFragment is to start with the list not being shown, only + * showing it once an adapter is given with {@link #setListAdapter(ListAdapter)}. + * If the list at that point had not been shown, when it does get shown + * it will be do without the user ever seeing the hidden state. + * + * @param shown If true, the list view is shown; if false, the progress + * indicator. The initial value is true. + */ + public void setListShown(boolean shown) { + setListShown(shown, true); + } + + /** + * Like {@link #setListShown(boolean)}, but no animation is used when + * transitioning from the previous state. + */ + public void setListShownNoAnimation(boolean shown) { + setListShown(shown, false); + } + + /** + * Control whether the list is being displayed. You can make it not + * displayed if you are waiting for the initial data to show in it. During + * this time an indeterminant progress indicator will be shown instead. + * + * @param shown If true, the list view is shown; if false, the progress + * indicator. The initial value is true. + * @param animate If true, an animation will be used to transition to the + * new state. + */ + private void setListShown(boolean shown, boolean animate) { + ensureList(); + if (mProgressContainer == null) { + throw new IllegalStateException("Can't be used with a custom content view"); + } + if (mListShown == shown) { + return; + } + mListShown = shown; + if (shown) { + if (animate) { + mProgressContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), android.R.anim.fade_out)); + mListContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), android.R.anim.fade_in)); + } else { + mProgressContainer.clearAnimation(); + mListContainer.clearAnimation(); + } + mProgressContainer.setVisibility(View.GONE); + mListContainer.setVisibility(View.VISIBLE); + } else { + if (animate) { + mProgressContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), android.R.anim.fade_in)); + mListContainer.startAnimation(AnimationUtils.loadAnimation( + getActivity(), android.R.anim.fade_out)); + } else { + mProgressContainer.clearAnimation(); + mListContainer.clearAnimation(); + } + mProgressContainer.setVisibility(View.VISIBLE); + mListContainer.setVisibility(View.GONE); + } + } + + /** + * Get the ListAdapter associated with this activity's ListView. + */ + public ListAdapter getListAdapter() { + return mAdapter; + } + + private void ensureList() { + if (mList != null) { + return; + } + View root = getView(); + if (root == null) { + throw new IllegalStateException("Content view not yet created"); + } + if (root instanceof ListView) { + mList = (ListView)root; + } else { + mStandardEmptyView = (TextView)root.findViewById(INTERNAL_EMPTY_ID); + if (mStandardEmptyView == null) { + mEmptyView = root.findViewById(android.R.id.empty); + } else { + mStandardEmptyView.setVisibility(View.GONE); + } + mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID); + mListContainer = root.findViewById(INTERNAL_LIST_CONTAINER_ID); + View rawListView = root.findViewById(android.R.id.list); + if (!(rawListView instanceof ListView)) { + if (rawListView == null) { + throw new RuntimeException( + "Your content must have a ListView whose id attribute is " + + "'android.R.id.list'"); + } + throw new RuntimeException( + "Content has view with id attribute 'android.R.id.list' " + + "that is not a ListView class"); + } + mList = (ListView)rawListView; + if (mEmptyView != null) { + mList.setEmptyView(mEmptyView); + } else if (mEmptyText != null) { + mStandardEmptyView.setText(mEmptyText); + mList.setEmptyView(mStandardEmptyView); + } + } + mListShown = true; + mList.setOnItemClickListener(mOnClickListener); + if (mAdapter != null) { + ListAdapter adapter = mAdapter; + mAdapter = null; + setListAdapter(adapter); + } else { + // We are starting without an adapter, so assume we won't + // have our data right away and start with the progress indicator. + if (mProgressContainer != null) { + setListShown(false, false); + } + } + mHandler.post(mRequestFocus); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/LoaderManager.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/LoaderManager.java new file mode 100644 index 00000000..69258ce8 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/LoaderManager.java @@ -0,0 +1,803 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.os.Bundle; +import android.support.v4.content.Loader; +import android.support.v4.util.DebugUtils; +import android.util.Log; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.lang.reflect.Modifier; + +/** + * Static library support version of the framework's {@link android.app.LoaderManager}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + * + *

Your activity must derive from {@link FragmentActivity} to use this. + */ +public abstract class LoaderManager { + /** + * Callback interface for a client to interact with the manager. + */ + public interface LoaderCallbacks { + /** + * Instantiate and return a new Loader for the given ID. + * + * @param id The ID whose loader is to be created. + * @param args Any arguments supplied by the caller. + * @return Return a new Loader instance that is ready to start loading. + */ + public Loader onCreateLoader(int id, Bundle args); + + /** + * Called when a previously created loader has finished its load. Note + * that normally an application is not allowed to commit fragment + * transactions while in this call, since it can happen after an + * activity's state is saved. See {@link FragmentManager#beginTransaction() + * FragmentManager.openTransaction()} for further discussion on this. + * + *

This function is guaranteed to be called prior to the release of + * the last data that was supplied for this Loader. At this point + * you should remove all use of the old data (since it will be released + * soon), but should not do your own release of the data since its Loader + * owns it and will take care of that. The Loader will take care of + * management of its data so you don't have to. In particular: + * + *

    + *
  • The Loader will monitor for changes to the data, and report + * them to you through new calls here. You should not monitor the + * data yourself. For example, if the data is a {@link android.database.Cursor} + * and you place it in a {@link android.widget.CursorAdapter}, use + * the {@link android.widget.CursorAdapter#CursorAdapter(android.content.Context, + * android.database.Cursor, int)} constructor without passing + * in either {@link android.widget.CursorAdapter#FLAG_AUTO_REQUERY} + * or {@link android.widget.CursorAdapter#FLAG_REGISTER_CONTENT_OBSERVER} + * (that is, use 0 for the flags argument). This prevents the CursorAdapter + * from doing its own observing of the Cursor, which is not needed since + * when a change happens you will get a new Cursor throw another call + * here. + *

  • The Loader will release the data once it knows the application + * is no longer using it. For example, if the data is + * a {@link android.database.Cursor} from a {@link android.content.CursorLoader}, + * you should not call close() on it yourself. If the Cursor is being placed in a + * {@link android.widget.CursorAdapter}, you should use the + * {@link android.widget.CursorAdapter#swapCursor(android.database.Cursor)} + * method so that the old Cursor is not closed. + *
+ * + * @param loader The Loader that has finished. + * @param data The data generated by the Loader. + */ + public void onLoadFinished(Loader loader, D data); + + /** + * Called when a previously created loader is being reset, and thus + * making its data unavailable. The application should at this point + * remove any references it has to the Loader's data. + * + * @param loader The Loader that is being reset. + */ + public void onLoaderReset(Loader loader); + } + + /** + * Ensures a loader is initialized and active. If the loader doesn't + * already exist, one is created and (if the activity/fragment is currently + * started) starts the loader. Otherwise the last created + * loader is re-used. + * + *

In either case, the given callback is associated with the loader, and + * will be called as the loader state changes. If at the point of call + * the caller is in its started state, and the requested loader + * already exists and has generated its data, then + * callback {@link LoaderCallbacks#onLoadFinished} will + * be called immediately (inside of this function), so you must be prepared + * for this to happen. + * + * @param id A unique identifier for this loader. Can be whatever you want. + * Identifiers are scoped to a particular LoaderManager instance. + * @param args Optional arguments to supply to the loader at construction. + * If a loader already exists (a new one does not need to be created), this + * parameter will be ignored and the last arguments continue to be used. + * @param callback Interface the LoaderManager will call to report about + * changes in the state of the loader. Required. + */ + public abstract Loader initLoader(int id, Bundle args, + LoaderManager.LoaderCallbacks callback); + + /** + * Starts a new or restarts an existing {@link android.content.Loader} in + * this manager, registers the callbacks to it, + * and (if the activity/fragment is currently started) starts loading it. + * If a loader with the same id has previously been + * started it will automatically be destroyed when the new loader completes + * its work. The callback will be delivered before the old loader + * is destroyed. + * + * @param id A unique identifier for this loader. Can be whatever you want. + * Identifiers are scoped to a particular LoaderManager instance. + * @param args Optional arguments to supply to the loader at construction. + * @param callback Interface the LoaderManager will call to report about + * changes in the state of the loader. Required. + */ + public abstract Loader restartLoader(int id, Bundle args, + LoaderManager.LoaderCallbacks callback); + + /** + * Stops and removes the loader with the given ID. If this loader + * had previously reported data to the client through + * {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, a call + * will be made to {@link LoaderCallbacks#onLoaderReset(Loader)}. + */ + public abstract void destroyLoader(int id); + + /** + * Return the Loader with the given id or null if no matching Loader + * is found. + */ + public abstract Loader getLoader(int id); + + /** + * Print the LoaderManager's state into the given stream. + * + * @param prefix Text to print at the front of each line. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer A PrintWriter to which the dump is to be set. + * @param args Additional arguments to the dump request. + */ + public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); + + /** + * Control whether the framework's internal loader manager debugging + * logs are turned on. If enabled, you will see output in logcat as + * the framework performs loader operations. + */ + public static void enableDebugLogging(boolean enabled) { + LoaderManagerImpl.DEBUG = enabled; + } +} + +class LoaderManagerImpl extends LoaderManager { + static final String TAG = "LoaderManager"; + static boolean DEBUG = false; + + // These are the currently active loaders. A loader is here + // from the time its load is started until it has been explicitly + // stopped or restarted by the application. + final HCSparseArray mLoaders = new HCSparseArray(); + + // These are previously run loaders. This list is maintained internally + // to avoid destroying a loader while an application is still using it. + // It allows an application to restart a loader, but continue using its + // previously run loader until the new loader's data is available. + final HCSparseArray mInactiveLoaders = new HCSparseArray(); + + SupportActivity mActivity; + boolean mStarted; + boolean mRetaining; + boolean mRetainingStarted; + + boolean mCreatingLoader; + + final class LoaderInfo implements Loader.OnLoadCompleteListener { + final int mId; + final Bundle mArgs; + LoaderManager.LoaderCallbacks mCallbacks; + Loader mLoader; + boolean mHaveData; + boolean mDeliveredData; + Object mData; + boolean mStarted; + boolean mRetaining; + boolean mRetainingStarted; + boolean mReportNextStart; + boolean mDestroyed; + boolean mListenerRegistered; + + LoaderInfo mPendingLoader; + + public LoaderInfo(int id, Bundle args, LoaderManager.LoaderCallbacks callbacks) { + mId = id; + mArgs = args; + mCallbacks = callbacks; + } + + void start() { + if (mRetaining && mRetainingStarted) { + // Our owner is started, but we were being retained from a + // previous instance in the started state... so there is really + // nothing to do here, since the loaders are still started. + mStarted = true; + return; + } + + if (mStarted) { + // If loader already started, don't restart. + return; + } + + mStarted = true; + + if (DEBUG) Log.v(TAG, " Starting: " + this); + if (mLoader == null && mCallbacks != null) { + mLoader = mCallbacks.onCreateLoader(mId, mArgs); + } + if (mLoader != null) { + if (mLoader.getClass().isMemberClass() + && !Modifier.isStatic(mLoader.getClass().getModifiers())) { + throw new IllegalArgumentException( + "Object returned from onCreateLoader must not be a non-static inner member class: " + + mLoader); + } + if (!mListenerRegistered) { + mLoader.registerListener(mId, this); + mListenerRegistered = true; + } + mLoader.startLoading(); + } + } + + void retain() { + if (DEBUG) Log.v(TAG, " Retaining: " + this); + mRetaining = true; + mRetainingStarted = mStarted; + mStarted = false; + mCallbacks = null; + } + + void finishRetain() { + if (mRetaining) { + if (DEBUG) Log.v(TAG, " Finished Retaining: " + this); + mRetaining = false; + if (mStarted != mRetainingStarted) { + if (!mStarted) { + // This loader was retained in a started state, but + // at the end of retaining everything our owner is + // no longer started... so make it stop. + stop(); + } + } + } + + if (mStarted && mHaveData && !mReportNextStart) { + // This loader has retained its data, either completely across + // a configuration change or just whatever the last data set + // was after being restarted from a stop, and now at the point of + // finishing the retain we find we remain started, have + // our data, and the owner has a new callback... so + // let's deliver the data now. + callOnLoadFinished(mLoader, mData); + } + } + + void reportStart() { + if (mStarted) { + if (mReportNextStart) { + mReportNextStart = false; + if (mHaveData) { + callOnLoadFinished(mLoader, mData); + } + } + } + } + + void stop() { + if (DEBUG) Log.v(TAG, " Stopping: " + this); + mStarted = false; + if (!mRetaining) { + if (mLoader != null && mListenerRegistered) { + // Let the loader know we're done with it + mListenerRegistered = false; + mLoader.unregisterListener(this); + mLoader.stopLoading(); + } + } + } + + void destroy() { + if (DEBUG) Log.v(TAG, " Destroying: " + this); + mDestroyed = true; + boolean needReset = mDeliveredData; + mDeliveredData = false; + if (mCallbacks != null && mLoader != null && mHaveData && needReset) { + if (DEBUG) Log.v(TAG, " Reseting: " + this); + String lastBecause = null; + if (mActivity != null) { + lastBecause = mActivity.getInternalCallbacks().getFragments().mNoTransactionsBecause; + mActivity.getInternalCallbacks().getFragments().mNoTransactionsBecause = "onLoaderReset"; + } + try { + mCallbacks.onLoaderReset(mLoader); + } finally { + if (mActivity != null) { + mActivity.getInternalCallbacks().getFragments().mNoTransactionsBecause = lastBecause; + } + } + } + mCallbacks = null; + mData = null; + mHaveData = false; + if (mLoader != null) { + if (mListenerRegistered) { + mListenerRegistered = false; + mLoader.unregisterListener(this); + } + mLoader.reset(); + } + if (mPendingLoader != null) { + mPendingLoader.destroy(); + } + } + + @Override public void onLoadComplete(Loader loader, Object data) { + if (DEBUG) Log.v(TAG, "onLoadComplete: " + this); + + if (mDestroyed) { + if (DEBUG) Log.v(TAG, " Ignoring load complete -- destroyed"); + return; + } + + if (mLoaders.get(mId) != this) { + // This data is not coming from the current active loader. + // We don't care about it. + if (DEBUG) Log.v(TAG, " Ignoring load complete -- not active"); + return; + } + + LoaderInfo pending = mPendingLoader; + if (pending != null) { + // There is a new request pending and we were just + // waiting for the old one to complete before starting + // it. So now it is time, switch over to the new loader. + if (DEBUG) Log.v(TAG, " Switching to pending loader: " + pending); + mPendingLoader = null; + mLoaders.put(mId, null); + destroy(); + installLoader(pending); + return; + } + + // Notify of the new data so the app can switch out the old data before + // we try to destroy it. + if (mData != data || !mHaveData) { + mData = data; + mHaveData = true; + if (mStarted) { + callOnLoadFinished(loader, data); + } + } + + //if (DEBUG) Log.v(TAG, " onLoadFinished returned: " + this); + + // We have now given the application the new loader with its + // loaded data, so it should have stopped using the previous + // loader. If there is a previous loader on the inactive list, + // clean it up. + LoaderInfo info = mInactiveLoaders.get(mId); + if (info != null && info != this) { + info.mDeliveredData = false; + info.destroy(); + mInactiveLoaders.remove(mId); + } + } + + void callOnLoadFinished(Loader loader, Object data) { + if (mCallbacks != null) { + String lastBecause = null; + if (mActivity != null) { + lastBecause = mActivity.getInternalCallbacks().getFragments().mNoTransactionsBecause; + mActivity.getInternalCallbacks().getFragments().mNoTransactionsBecause = "onLoadFinished"; + } + try { + if (DEBUG) Log.v(TAG, " onLoadFinished in " + loader + ": " + + loader.dataToString(data)); + mCallbacks.onLoadFinished(loader, data); + } finally { + if (mActivity != null) { + mActivity.getInternalCallbacks().getFragments().mNoTransactionsBecause = lastBecause; + } + } + mDeliveredData = true; + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(64); + sb.append("LoaderInfo{"); + sb.append(Integer.toHexString(System.identityHashCode(this))); + sb.append(" #"); + sb.append(mId); + sb.append(" : "); + DebugUtils.buildShortClassTag(mLoader, sb); + sb.append("}}"); + return sb.toString(); + } + + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mId="); writer.print(mId); + writer.print(" mArgs="); writer.println(mArgs); + writer.print(prefix); writer.print("mCallbacks="); writer.println(mCallbacks); + writer.print(prefix); writer.print("mLoader="); writer.println(mLoader); + if (mLoader != null) { + mLoader.dump(prefix + " ", fd, writer, args); + } + if (mHaveData || mDeliveredData) { + writer.print(prefix); writer.print("mHaveData="); writer.print(mHaveData); + writer.print(" mDeliveredData="); writer.println(mDeliveredData); + writer.print(prefix); writer.print("mData="); writer.println(mData); + } + writer.print(prefix); writer.print("mStarted="); writer.print(mStarted); + writer.print(" mReportNextStart="); writer.print(mReportNextStart); + writer.print(" mDestroyed="); writer.println(mDestroyed); + writer.print(prefix); writer.print("mRetaining="); writer.print(mRetaining); + writer.print(" mRetainingStarted="); writer.print(mRetainingStarted); + writer.print(" mListenerRegistered="); writer.println(mListenerRegistered); + if (mPendingLoader != null) { + writer.print(prefix); writer.println("Pending Loader "); + writer.print(mPendingLoader); writer.println(":"); + mPendingLoader.dump(prefix + " ", fd, writer, args); + } + } + } + + LoaderManagerImpl(SupportActivity activity, boolean started) { + mActivity = activity; + mStarted = started; + } + + void updateActivity(SupportActivity activity) { + mActivity = activity; + } + + private LoaderInfo createLoader(int id, Bundle args, + LoaderManager.LoaderCallbacks callback) { + LoaderInfo info = new LoaderInfo(id, args, (LoaderManager.LoaderCallbacks)callback); + Loader loader = callback.onCreateLoader(id, args); + info.mLoader = (Loader)loader; + return info; + } + + private LoaderInfo createAndInstallLoader(int id, Bundle args, + LoaderManager.LoaderCallbacks callback) { + try { + mCreatingLoader = true; + LoaderInfo info = createLoader(id, args, callback); + installLoader(info); + return info; + } finally { + mCreatingLoader = false; + } + } + + void installLoader(LoaderInfo info) { + mLoaders.put(info.mId, info); + if (mStarted) { + // The activity will start all existing loaders in it's onStart(), + // so only start them here if we're past that point of the activitiy's + // life cycle + info.start(); + } + } + + /** + * Call to initialize a particular ID with a Loader. If this ID already + * has a Loader associated with it, it is left unchanged and any previous + * callbacks replaced with the newly provided ones. If there is not currently + * a Loader for the ID, a new one is created and started. + * + *

This function should generally be used when a component is initializing, + * to ensure that a Loader it relies on is created. This allows it to re-use + * an existing Loader's data if there already is one, so that for example + * when an {@link Activity} is re-created after a configuration change it + * does not need to re-create its loaders. + * + *

Note that in the case where an existing Loader is re-used, the + * args given here will be ignored because you will + * continue using the previous Loader. + * + * @param id A unique (to this LoaderManager instance) identifier under + * which to manage the new Loader. + * @param args Optional arguments that will be propagated to + * {@link LoaderCallbacks#onCreateLoader(int, Bundle) LoaderCallbacks.onCreateLoader()}. + * @param callback Interface implementing management of this Loader. Required. + * Its onCreateLoader() method will be called while inside of the function to + * instantiate the Loader object. + */ + @SuppressWarnings("unchecked") + public Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback) { + if (mCreatingLoader) { + throw new IllegalStateException("Called while creating a loader"); + } + + LoaderInfo info = mLoaders.get(id); + + if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args); + + if (info == null) { + // Loader doesn't already exist; create. + info = createAndInstallLoader(id, args, (LoaderManager.LoaderCallbacks)callback); + if (DEBUG) Log.v(TAG, " Created new loader " + info); + } else { + if (DEBUG) Log.v(TAG, " Re-using existing loader " + info); + info.mCallbacks = (LoaderManager.LoaderCallbacks)callback; + } + + if (info.mHaveData && mStarted) { + // If the loader has already generated its data, report it now. + info.callOnLoadFinished(info.mLoader, info.mData); + } + + return (Loader)info.mLoader; + } + + /** + * Call to re-create the Loader associated with a particular ID. If there + * is currently a Loader associated with this ID, it will be + * canceled/stopped/destroyed as appropriate. A new Loader with the given + * arguments will be created and its data delivered to you once available. + * + *

This function does some throttling of Loaders. If too many Loaders + * have been created for the given ID but not yet generated their data, + * new calls to this function will create and return a new Loader but not + * actually start it until some previous loaders have completed. + * + *

After calling this function, any previous Loaders associated with + * this ID will be considered invalid, and you will receive no further + * data updates from them. + * + * @param id A unique (to this LoaderManager instance) identifier under + * which to manage the new Loader. + * @param args Optional arguments that will be propagated to + * {@link LoaderCallbacks#onCreateLoader(int, Bundle) LoaderCallbacks.onCreateLoader()}. + * @param callback Interface implementing management of this Loader. Required. + * Its onCreateLoader() method will be called while inside of the function to + * instantiate the Loader object. + */ + @SuppressWarnings("unchecked") + public Loader restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback) { + if (mCreatingLoader) { + throw new IllegalStateException("Called while creating a loader"); + } + + LoaderInfo info = mLoaders.get(id); + if (DEBUG) Log.v(TAG, "restartLoader in " + this + ": args=" + args); + if (info != null) { + LoaderInfo inactive = mInactiveLoaders.get(id); + if (inactive != null) { + if (info.mHaveData) { + // This loader now has data... we are probably being + // called from within onLoadComplete, where we haven't + // yet destroyed the last inactive loader. So just do + // that now. + if (DEBUG) Log.v(TAG, " Removing last inactive loader: " + info); + inactive.mDeliveredData = false; + inactive.destroy(); + info.mLoader.abandon(); + mInactiveLoaders.put(id, info); + } else { + // We already have an inactive loader for this ID that we are + // waiting for! What to do, what to do... + if (!info.mStarted) { + // The current Loader has not been started... we thus + // have no reason to keep it around, so bam, slam, + // thank-you-ma'am. + if (DEBUG) Log.v(TAG, " Current loader is stopped; replacing"); + mLoaders.put(id, null); + info.destroy(); + } else { + // Now we have three active loaders... we'll queue + // up this request to be processed once one of the other loaders + // finishes. + if (info.mPendingLoader != null) { + if (DEBUG) Log.v(TAG, " Removing pending loader: " + info.mPendingLoader); + info.mPendingLoader.destroy(); + info.mPendingLoader = null; + } + if (DEBUG) Log.v(TAG, " Enqueuing as new pending loader"); + info.mPendingLoader = createLoader(id, args, + (LoaderManager.LoaderCallbacks)callback); + return (Loader)info.mPendingLoader.mLoader; + } + } + } else { + // Keep track of the previous instance of this loader so we can destroy + // it when the new one completes. + if (DEBUG) Log.v(TAG, " Making last loader inactive: " + info); + info.mLoader.abandon(); + mInactiveLoaders.put(id, info); + } + } + + info = createAndInstallLoader(id, args, (LoaderManager.LoaderCallbacks)callback); + return (Loader)info.mLoader; + } + + /** + * Rip down, tear apart, shred to pieces a current Loader ID. After returning + * from this function, any Loader objects associated with this ID are + * destroyed. Any data associated with them is destroyed. You better not + * be using it when you do this. + * @param id Identifier of the Loader to be destroyed. + */ + public void destroyLoader(int id) { + if (mCreatingLoader) { + throw new IllegalStateException("Called while creating a loader"); + } + + if (DEBUG) Log.v(TAG, "destroyLoader in " + this + " of " + id); + int idx = mLoaders.indexOfKey(id); + if (idx >= 0) { + LoaderInfo info = mLoaders.valueAt(idx); + mLoaders.removeAt(idx); + info.destroy(); + } + idx = mInactiveLoaders.indexOfKey(id); + if (idx >= 0) { + LoaderInfo info = mInactiveLoaders.valueAt(idx); + mInactiveLoaders.removeAt(idx); + info.destroy(); + } + } + + /** + * Return the most recent Loader object associated with the + * given ID. + */ + @SuppressWarnings("unchecked") + public Loader getLoader(int id) { + if (mCreatingLoader) { + throw new IllegalStateException("Called while creating a loader"); + } + + LoaderInfo loaderInfo = mLoaders.get(id); + if (loaderInfo != null) { + if (loaderInfo.mPendingLoader != null) { + return (Loader)loaderInfo.mPendingLoader.mLoader; + } + return (Loader)loaderInfo.mLoader; + } + return null; + } + + void doStart() { + if (DEBUG) Log.v(TAG, "Starting in " + this); + if (mStarted) { + RuntimeException e = new RuntimeException("here"); + e.fillInStackTrace(); + Log.w(TAG, "Called doStart when already started: " + this, e); + return; + } + + mStarted = true; + + // Call out to sub classes so they can start their loaders + // Let the existing loaders know that we want to be notified when a load is complete + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).start(); + } + } + + void doStop() { + if (DEBUG) Log.v(TAG, "Stopping in " + this); + if (!mStarted) { + RuntimeException e = new RuntimeException("here"); + e.fillInStackTrace(); + Log.w(TAG, "Called doStop when not started: " + this, e); + return; + } + + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).stop(); + } + mStarted = false; + } + + void doRetain() { + if (DEBUG) Log.v(TAG, "Retaining in " + this); + if (!mStarted) { + RuntimeException e = new RuntimeException("here"); + e.fillInStackTrace(); + Log.w(TAG, "Called doRetain when not started: " + this, e); + return; + } + + mRetaining = true; + mStarted = false; + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).retain(); + } + } + + void finishRetain() { + if (mRetaining) { + if (DEBUG) Log.v(TAG, "Finished Retaining in " + this); + + mRetaining = false; + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).finishRetain(); + } + } + } + + void doReportNextStart() { + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).mReportNextStart = true; + } + } + + void doReportStart() { + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).reportStart(); + } + } + + void doDestroy() { + if (!mRetaining) { + if (DEBUG) Log.v(TAG, "Destroying Active in " + this); + for (int i = mLoaders.size()-1; i >= 0; i--) { + mLoaders.valueAt(i).destroy(); + } + } + + if (DEBUG) Log.v(TAG, "Destroying Inactive in " + this); + for (int i = mInactiveLoaders.size()-1; i >= 0; i--) { + mInactiveLoaders.valueAt(i).destroy(); + } + mInactiveLoaders.clear(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + sb.append("LoaderManager{"); + sb.append(Integer.toHexString(System.identityHashCode(this))); + sb.append(" in "); + DebugUtils.buildShortClassTag(mActivity, sb); + sb.append("}}"); + return sb.toString(); + } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + if (mLoaders.size() > 0) { + writer.print(prefix); writer.println("Active Loaders:"); + String innerPrefix = prefix + " "; + for (int i=0; i < mLoaders.size(); i++) { + LoaderInfo li = mLoaders.valueAt(i); + writer.print(prefix); writer.print(" #"); writer.print(mLoaders.keyAt(i)); + writer.print(": "); writer.println(li.toString()); + li.dump(innerPrefix, fd, writer, args); + } + } + if (mInactiveLoaders.size() > 0) { + writer.print(prefix); writer.println("Inactive Loaders:"); + String innerPrefix = prefix + " "; + for (int i=0; i < mInactiveLoaders.size(); i++) { + LoaderInfo li = mInactiveLoaders.valueAt(i); + writer.print(prefix); writer.print(" #"); writer.print(mInactiveLoaders.keyAt(i)); + writer.print(": "); writer.println(li.toString()); + li.dump(innerPrefix, fd, writer, args); + } + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/NoSaveStateFrameLayout.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/NoSaveStateFrameLayout.java new file mode 100644 index 00000000..a2177e32 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/NoSaveStateFrameLayout.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.content.Context; +import android.os.Parcelable; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +/** + * Pre-Honeycomb versions of the platform don't have View.setSaveFromParentEnabled(), + * so instead we insert this between the view and its parent. + */ +public class NoSaveStateFrameLayout extends FrameLayout { + static ViewGroup wrap(View child) { + NoSaveStateFrameLayout wrapper = new NoSaveStateFrameLayout(child.getContext()); + ViewGroup.LayoutParams childParams = child.getLayoutParams(); + if (childParams != null) { + wrapper.setLayoutParams(childParams); + } + NoSaveStateFrameLayout.LayoutParams lp = new NoSaveStateFrameLayout.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); + child.setLayoutParams(lp); + wrapper.addView(child); + return wrapper; + } + + public NoSaveStateFrameLayout(Context context) { + super(context); + } + + /** + * Override to prevent freezing of any child views. + */ + @Override + protected void dispatchSaveInstanceState(SparseArray container) { + dispatchFreezeSelfOnly(container); + } + + /** + * Override to prevent thawing of any child views. + */ + @Override + protected void dispatchRestoreInstanceState(SparseArray container) { + dispatchThawSelfOnly(container); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SuperNotCalledException.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SuperNotCalledException.java new file mode 100644 index 00000000..d306b965 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SuperNotCalledException.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.app; + +import android.util.AndroidRuntimeException; + +final class SuperNotCalledException extends AndroidRuntimeException { + private static final long serialVersionUID = -5247191382770859874L; + + public SuperNotCalledException(String msg) { + super(msg); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SupportActivity.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SupportActivity.java new file mode 100644 index 00000000..3d956684 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/app/SupportActivity.java @@ -0,0 +1,295 @@ +package android.support.v4.app; + +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import android.app.Activity; +import android.app.Application; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.support.v4.view.ActionMode; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuItem; +import android.util.AttributeSet; +import android.view.ContextMenu; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MenuInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; + +/** + *

Instances of this interface represent an activity provided by the support + * library (e.g., {@link FragmentActivity}).

+ * + *

Provided are all of the methods which would be available if you were + * accessing the underlying activity directly and you can safely assume that + * any instances of this interface can be cast to an {@link Activity}. It is + * preferred, however, that you call {@link #asActivity()} instead.

+ */ +public interface SupportActivity { + public static abstract class InternalCallbacks { + abstract void ensureSupportActionBarAttached(); + abstract Handler getHandler(); + abstract FragmentManagerImpl getFragments(); + abstract LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create); + abstract void invalidateSupportFragmentIndex(int index); + } + + InternalCallbacks getInternalCallbacks(); + Activity asActivity(); + + /*** Activity methods ***/ + void addContentView(View view, ViewGroup.LayoutParams params); + void closeContextMenu(); + void closeOptionsMenu(); + PendingIntent createPendingResult(int requestCode, Intent data, int flags); + void dismissDialog(int id); + boolean dispatchKeyEvent(KeyEvent event); + boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event); + boolean dispatchTouchEvent(MotionEvent ev); + boolean dispatchTrackballEvent(MotionEvent ev); + View findViewById(int id); + void finish(); + void finishActivity(int requestCode); + void finishActivityFromChild(Activity child, int requestCode); + void finishFromChild(Activity child); + Application getApplication(); + ComponentName getCallingActivity(); + String getCallingPackage(); + int getChangingConfigurations(); + ComponentName getComponentName(); + View getCurrentFocus(); + Intent getIntent(); + Object getLastNonConfigurationInstance(); + LayoutInflater getLayoutInflater(); + String getLocalClassName(); + MenuInflater getMenuInflater(); + Activity getParent(); + SharedPreferences getPreferences(int mode); + int getRequestedOrientation(); + Object getSystemService(String name); + int getTaskId(); + CharSequence getTitle(); + int getTitleColor(); + int getVolumeControlStream(); + Window getWindow(); + WindowManager getWindowManager(); + boolean hasWindowFocus(); + boolean isChild(); + boolean isFinishing(); + boolean isTaskRoot(); + Cursor managedQuery(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder); + boolean moveTaskToBack(boolean nonRoot); + void onConfigurationChanged(Configuration newConfig); + void onContentChanged(); + boolean onContextItemSelected(android.view.MenuItem item); + void onContextMenuClosed(android.view.Menu menu); + void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo); + CharSequence onCreateDescription(); + boolean onCreateOptionsMenu(android.view.Menu menu); + boolean onCreatePanelMenu(int featureId, android.view.Menu menu); + View onCreatePanelView(int featureId); + boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas); + View onCreateView(String name, Context context, AttributeSet attrs); + boolean onKeyDown(int keyCode, KeyEvent event); + boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event); + boolean onKeyUp(int keyCode, KeyEvent event); + void onLowMemory(); + boolean onMenuItemSelected(int featureId, android.view.MenuItem item); + boolean onMenuOpened(int featureId, android.view.Menu menu); + boolean onOptionsItemSelected(android.view.MenuItem item); + void onOptionsMenuClosed(android.view.Menu menu); + void onPanelClosed(int featureId, android.view.Menu menu); + boolean onPrepareOptionsMenu(android.view.Menu menu); + boolean onPreparePanel(int featureId, View view, android.view.Menu menu); + Object onRetainNonConfigurationInstance(); + boolean onSearchRequested(); + boolean onTouchEvent(MotionEvent event); + boolean onTrackballEvent(MotionEvent event); + void onUserInteraction(); + void onWindowAttributesChanged(WindowManager.LayoutParams params); + void onWindowFocusChanged(boolean hasFocus); + void openContextMenu(View view); + void openOptionsMenu(); + void registerForContextMenu(View view); + void removeDialog(int id); + boolean requestWindowFeature(int featureId); + void runOnUiThread(Runnable action); + void setContentView(int layoutResId); + void setContentView(View view); + void setContentView(View view, ViewGroup.LayoutParams params); + void setDefaultKeyMode(int mode); + void setFeatureDrawable(int featureId, Drawable drawable); + void setFeatureDrawableAlpha(int featureId, int alpha); + void setFeatureDrawableResource(int featureId, int resId); + void setFeatureDrawableUri(int featureId, Uri uri); + void setIntent(Intent newIntent); + void setProgress(int progress); + void setProgressBarIndeterminate(boolean indeterminate); + void setProgressBarIndeterminateVisibility(boolean visible); + void setProgressBarVisibility(boolean visible); + void setRequestedOrientation(int requestedOrientation); + void setResult(int resultCode); + void setResult(int resultCode, Intent data); + void setSecondaryProgress(int secondaryProgress); + void setTitle(int titleId); + void setTitle(CharSequence title); + void setTitleColor(int textColor); + void setVisible(boolean visible); + void setVolumeControlStream(int streamType); + void showDialog(int id); + void startActivity(Intent intent); + void startActivityForResult(Intent intent, int requestCode); + void startActivityFromChild(Activity child, Intent intent, int requestCode); + boolean startActivityIfNeeded(Intent intent, int requestCode); + void startManagingCursor(Cursor c); + boolean startNextMatchingActivity(Intent intent); + void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchDate, boolean globalSearch); + void stopManagingCursor(Cursor c); + void takeKeyEvents(boolean get); + void unregisterForContextMenu(View view); + + /*** ContextThemeWrapper methods ***/ + //Object getSystemService(String name); + Resources.Theme getTheme(); + void setTheme(int resId); + + /*** ContextWrapper methods ***/ + //void attachBaseContext(Context base); + boolean bindService(Intent service, ServiceConnection conn, int flags); + int checkCallingOrSelfPermission(String permission); + int checkCallingOrSelfUriPermission(Uri uri, int modeFlags); + int checkCallingPermission(String permission); + int checkCallingUriPermission(Uri uri, int modeFlags); + int checkPermission(String permission, int pid, int uid); + int checkUriPermission(Uri uri, int pid, int uid, int modeFlags); + int checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags); + @Deprecated void clearWallpaper() throws IOException; + Context createPackageContext(String packageName, int flags) throws NameNotFoundException; + String[] databaseList(); + boolean deleteDatabase(String name); + boolean deleteFile(String name); + void enforceCallingOrSelfPermission(String permission, String message); + void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message); + void enforceCallingPermission(String permission, String message); + void enforceCallingUriPermission(Uri uri, int modeFlags, String message); + void enforcePermission(String permission, int pid, int uid, String message); + void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message); + void enforceUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message); + String[] fileList(); + Context getApplicationContext(); + ApplicationInfo getApplicationInfo(); + AssetManager getAssets(); + Context getBaseContext(); + File getCacheDir(); + ClassLoader getClassLoader(); + ContentResolver getContentResolver(); + File getDatabasePath(String name); + File getDir(String name, int mode); + File getFileStreamPath(String name); + File getFilesDir(); + Looper getMainLooper(); + String getPackageCodePath(); + PackageManager getPackageManager(); + String getPackageName(); + String getPackageResourcePath(); + Resources getResources(); + SharedPreferences getSharedPreferences(String name, int mode); + //Object getSystemService(String name); + //Resources.Theme getTheme(); + Drawable getWallpaper(); + int getWallpaperDesiredMinimumHeight(); + int getWallpaperDesiredMinimumWidth(); + void grantUriPermission(String toPackage, Uri uri, int modeFlags); + boolean isRestricted(); + FileInputStream openFileInput(String name) throws FileNotFoundException; + FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException; + SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory); + @Deprecated Drawable peekWallpaper(); + Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter); + Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler); + void removeStickyBroadcast(Intent intent); + void revokeUriPermission(Uri uri, int modeFlags); + void sendBroadcast(Intent intent); + void sendBroadcast(Intent intent, String receiverPermission); + void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras); + void sendOrderedBroadcast(Intent intent, String receiverPermission); + void sendStickyBroadcast(Intent intent); + //void setTheme(int resid); + void setWallpaper(Bitmap bitmap) throws IOException; + void setWallpaper(InputStream data) throws IOException; + //void startActivity(Intent intent); + boolean startInstrumentation(ComponentName className, String profileFile, Bundle arguments); + ComponentName startService(Intent service); + boolean stopService(Intent name); + void unbindService(ServiceConnection conn); + void unregisterReceiver(BroadcastReceiver receiver); + + /*** Context methods ***/ + String getString(int resId); + String getString(int resId, Object... formatArgs); + CharSequence getText(int resId); + //boolean isRestricted(); + TypedArray obtainStyledAttributes(int[] attrs); + TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs); + TypedArray obtainStyledAttributes(int resId, int[] attrs); + TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes); + + /*** Activity methods (emulated API 5+) ***/ + void onBackPressed(); + + /*** Activity methods (emulated API 11+) ***/ + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); + ActionBar getSupportActionBar(); //getActionBar() + FragmentManager getSupportFragmentManager(); //getFragmentManager() + LoaderManager getSupportLoaderManager(); //getLoaderManager() + void invalidateOptionsMenu(); + void onActionModeFinished(ActionMode mode); + void onActionModeStarted(ActionMode mode); + void onAttachFragment(Fragment fragment); + boolean onCreateOptionsMenu(Menu menu); + boolean onMenuItemSelected(int featureId, MenuItem item); + boolean onOptionsItemSelected(MenuItem item); + boolean onPrepareOptionsMenu(Menu menu); + ActionMode onWindowStartingActionMode(ActionMode.Callback callback); + void recreate(); + ActionMode startActionMode(ActionMode.Callback callback); + void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode); + + /*** Parallel helper methods ***/ + boolean requestWindowFeature(long featureId); + void setProgressBarIndeterminateVisibility(Boolean visible); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/AsyncTaskLoader.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/AsyncTaskLoader.java new file mode 100644 index 00000000..08debdd6 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/AsyncTaskLoader.java @@ -0,0 +1,287 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.content; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.SystemClock; +import android.support.v4.util.TimeUtils; +import android.util.Log; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.concurrent.CountDownLatch; + +/** + * Static library support version of the framework's {@link android.content.AsyncTaskLoader}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public abstract class AsyncTaskLoader extends Loader { + static final String TAG = "AsyncTaskLoader"; + static final boolean DEBUG = false; + + final class LoadTask extends AsyncTask implements Runnable { + + D result; + boolean waiting; + + private CountDownLatch done = new CountDownLatch(1); + + /* Runs on a worker thread */ + @Override + protected D doInBackground(Void... params) { + if (DEBUG) Log.v(TAG, this + " >>> doInBackground"); + result = AsyncTaskLoader.this.onLoadInBackground(); + if (DEBUG) Log.v(TAG, this + " <<< doInBackground"); + return result; + } + + /* Runs on the UI thread */ + @Override + protected void onPostExecute(D data) { + if (DEBUG) Log.v(TAG, this + " onPostExecute"); + try { + AsyncTaskLoader.this.dispatchOnLoadComplete(this, data); + } finally { + done.countDown(); + } + } + + @Override + protected void onCancelled() { + if (DEBUG) Log.v(TAG, this + " onCancelled"); + try { + AsyncTaskLoader.this.dispatchOnCancelled(this, result); + } finally { + done.countDown(); + } + } + + @Override + public void run() { + waiting = false; + AsyncTaskLoader.this.executePendingTask(); + } + } + + volatile LoadTask mTask; + volatile LoadTask mCancellingTask; + + long mUpdateThrottle; + long mLastLoadCompleteTime = -10000; + Handler mHandler; + + public AsyncTaskLoader(Context context) { + super(context); + } + + /** + * Set amount to throttle updates by. This is the minimum time from + * when the last {@link #onLoadInBackground()} call has completed until + * a new load is scheduled. + * + * @param delayMS Amount of delay, in milliseconds. + */ + public void setUpdateThrottle(long delayMS) { + mUpdateThrottle = delayMS; + if (delayMS != 0) { + mHandler = new Handler(); + } + } + + @Override + protected void onForceLoad() { + super.onForceLoad(); + cancelLoad(); + mTask = new LoadTask(); + if (DEBUG) Log.v(TAG, "Preparing load: mTask=" + mTask); + executePendingTask(); + } + + /** + * Attempt to cancel the current load task. See {@link AsyncTask#cancel(boolean)} + * for more info. Must be called on the main thread of the process. + * + *

Cancelling is not an immediate operation, since the load is performed + * in a background thread. If there is currently a load in progress, this + * method requests that the load be cancelled, and notes this is the case; + * once the background thread has completed its work its remaining state + * will be cleared. If another load request comes in during this time, + * it will be held until the cancelled load is complete. + * + * @return Returns false if the task could not be cancelled, + * typically because it has already completed normally, or + * because {@link #startLoading()} hasn't been called; returns + * true otherwise. + */ + public boolean cancelLoad() { + if (DEBUG) Log.v(TAG, "cancelLoad: mTask=" + mTask); + if (mTask != null) { + if (mCancellingTask != null) { + // There was a pending task already waiting for a previous + // one being canceled; just drop it. + if (DEBUG) Log.v(TAG, + "cancelLoad: still waiting for cancelled task; dropping next"); + if (mTask.waiting) { + mTask.waiting = false; + mHandler.removeCallbacks(mTask); + } + mTask = null; + return false; + } else if (mTask.waiting) { + // There is a task, but it is waiting for the time it should + // execute. We can just toss it. + if (DEBUG) Log.v(TAG, "cancelLoad: task is waiting, dropping it"); + mTask.waiting = false; + mHandler.removeCallbacks(mTask); + mTask = null; + return false; + } else { + boolean cancelled = mTask.cancel(false); + if (DEBUG) Log.v(TAG, "cancelLoad: cancelled=" + cancelled); + if (cancelled) { + mCancellingTask = mTask; + } + mTask = null; + return cancelled; + } + } + return false; + } + + /** + * Called if the task was canceled before it was completed. Gives the class a chance + * to properly dispose of the result. + */ + public void onCanceled(D data) { + } + + void executePendingTask() { + if (mCancellingTask == null && mTask != null) { + if (mTask.waiting) { + mTask.waiting = false; + mHandler.removeCallbacks(mTask); + } + if (mUpdateThrottle > 0) { + long now = SystemClock.uptimeMillis(); + if (now < (mLastLoadCompleteTime+mUpdateThrottle)) { + // Not yet time to do another load. + if (DEBUG) Log.v(TAG, "Waiting until " + + (mLastLoadCompleteTime+mUpdateThrottle) + + " to execute: " + mTask); + mTask.waiting = true; + mHandler.postAtTime(mTask, mLastLoadCompleteTime+mUpdateThrottle); + return; + } + } + if (DEBUG) Log.v(TAG, "Executing: " + mTask); + mTask.execute((Void[]) null); + // XXX TO DO: use reflection to call this version. + //mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); + } + } + + void dispatchOnCancelled(LoadTask task, D data) { + onCanceled(data); + if (mCancellingTask == task) { + if (DEBUG) Log.v(TAG, "Cancelled task is now canceled!"); + mLastLoadCompleteTime = SystemClock.uptimeMillis(); + mCancellingTask = null; + executePendingTask(); + } + } + + void dispatchOnLoadComplete(LoadTask task, D data) { + if (mTask != task) { + if (DEBUG) Log.v(TAG, "Load complete of old task, trying to cancel"); + dispatchOnCancelled(task, data); + } else { + if (isAbandoned()) { + // This cursor has been abandoned; just cancel the new data. + onCanceled(data); + } else { + mLastLoadCompleteTime = SystemClock.uptimeMillis(); + mTask = null; + if (DEBUG) Log.v(TAG, "Delivering result"); + deliverResult(data); + } + } + } + + /** + */ + public abstract D loadInBackground(); + + /** + * Called on a worker thread to perform the actual load. Implementations should not deliver the + * result directly, but should return them from this method, which will eventually end up + * calling {@link #deliverResult} on the UI thread. If implementations need to process + * the results on the UI thread they may override {@link #deliverResult} and do so + * there. + * + * @return Implementations must return the result of their load operation. + */ + protected D onLoadInBackground() { + return loadInBackground(); + } + + /** + * Locks the current thread until the loader completes the current load + * operation. Returns immediately if there is no load operation running. + * Should not be called from the UI thread: calling it from the UI + * thread would cause a deadlock. + *

+ * Use for testing only. Never call this from a UI thread. + * + * @hide + */ + public void waitForLoader() { + LoadTask task = mTask; + if (task != null) { + try { + task.done.await(); + } catch (InterruptedException e) { + // Ignore + } + } + } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + if (mTask != null) { + writer.print(prefix); writer.print("mTask="); writer.print(mTask); + writer.print(" waiting="); writer.println(mTask.waiting); + } + if (mCancellingTask != null) { + writer.print(prefix); writer.print("mCancellingTask="); writer.print(mCancellingTask); + writer.print(" waiting="); writer.println(mCancellingTask.waiting); + } + if (mUpdateThrottle != 0) { + writer.print(prefix); writer.print("mUpdateThrottle="); + TimeUtils.formatDuration(mUpdateThrottle, writer); + writer.print(" mLastLoadCompleteTime="); + TimeUtils.formatDuration(mLastLoadCompleteTime, + SystemClock.uptimeMillis(), writer); + writer.println(); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/CursorLoader.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/CursorLoader.java new file mode 100644 index 00000000..51ad8b54 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/CursorLoader.java @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.content; + +import android.content.Context; +import android.database.ContentObserver; +import android.database.Cursor; +import android.net.Uri; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.Arrays; + +/** + * Static library support version of the framework's {@link android.content.CursorLoader}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class CursorLoader extends AsyncTaskLoader { + final ForceLoadContentObserver mObserver; + + Uri mUri; + String[] mProjection; + String mSelection; + String[] mSelectionArgs; + String mSortOrder; + + Cursor mCursor; + + /* Runs on a worker thread */ + @Override + public Cursor loadInBackground() { + Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection, + mSelectionArgs, mSortOrder); + if (cursor != null) { + // Ensure the cursor window is filled + cursor.getCount(); + registerContentObserver(cursor, mObserver); + } + return cursor; + } + + /** + * Registers an observer to get notifications from the content provider + * when the cursor needs to be refreshed. + */ + void registerContentObserver(Cursor cursor, ContentObserver observer) { + cursor.registerContentObserver(mObserver); + } + + /* Runs on the UI thread */ + @Override + public void deliverResult(Cursor cursor) { + if (isReset()) { + // An async query came in while the loader is stopped + if (cursor != null) { + cursor.close(); + } + return; + } + Cursor oldCursor = mCursor; + mCursor = cursor; + + if (isStarted()) { + super.deliverResult(cursor); + } + + if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { + oldCursor.close(); + } + } + + /** + * Creates an empty unspecified CursorLoader. You must follow this with + * calls to {@link #setUri(Uri)}, {@link #setSelection(String)}, etc + * to specify the query to perform. + */ + public CursorLoader(Context context) { + super(context); + mObserver = new ForceLoadContentObserver(); + } + + /** + * Creates a fully-specified CursorLoader. See + * {@link ContentResolver#query(Uri, String[], String, String[], String) + * ContentResolver.query()} for documentation on the meaning of the + * parameters. These will be passed as-is to that call. + */ + public CursorLoader(Context context, Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + super(context); + mObserver = new ForceLoadContentObserver(); + mUri = uri; + mProjection = projection; + mSelection = selection; + mSelectionArgs = selectionArgs; + mSortOrder = sortOrder; + } + + /** + * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks + * will be called on the UI thread. If a previous load has been completed and is still valid + * the result may be passed to the callbacks immediately. + * + * Must be called from the UI thread + */ + @Override + protected void onStartLoading() { + if (mCursor != null) { + deliverResult(mCursor); + } + if (takeContentChanged() || mCursor == null) { + forceLoad(); + } + } + + /** + * Must be called from the UI thread + */ + @Override + protected void onStopLoading() { + // Attempt to cancel the current load task if possible. + cancelLoad(); + } + + @Override + public void onCanceled(Cursor cursor) { + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + } + + @Override + protected void onReset() { + super.onReset(); + + // Ensure the loader is stopped + onStopLoading(); + + if (mCursor != null && !mCursor.isClosed()) { + mCursor.close(); + } + mCursor = null; + } + + public Uri getUri() { + return mUri; + } + + public void setUri(Uri uri) { + mUri = uri; + } + + public String[] getProjection() { + return mProjection; + } + + public void setProjection(String[] projection) { + mProjection = projection; + } + + public String getSelection() { + return mSelection; + } + + public void setSelection(String selection) { + mSelection = selection; + } + + public String[] getSelectionArgs() { + return mSelectionArgs; + } + + public void setSelectionArgs(String[] selectionArgs) { + mSelectionArgs = selectionArgs; + } + + public String getSortOrder() { + return mSortOrder; + } + + public void setSortOrder(String sortOrder) { + mSortOrder = sortOrder; + } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mUri="); writer.println(mUri); + writer.print(prefix); writer.print("mProjection="); + writer.println(Arrays.toString(mProjection)); + writer.print(prefix); writer.print("mSelection="); writer.println(mSelection); + writer.print(prefix); writer.print("mSelectionArgs="); + writer.println(Arrays.toString(mSelectionArgs)); + writer.print(prefix); writer.print("mSortOrder="); writer.println(mSortOrder); + writer.print(prefix); writer.print("mCursor="); writer.println(mCursor); + writer.print(prefix); writer.print("mContentChanged="); writer.println(mContentChanged); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/Loader.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/Loader.java new file mode 100644 index 00000000..b9f2c6a8 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/content/Loader.java @@ -0,0 +1,358 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.content; + +import android.content.Context; +import android.database.ContentObserver; +import android.os.Handler; +import android.support.v4.util.DebugUtils; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +/** + * Static library support version of the framework's {@link android.content.Loader}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class Loader { + int mId; + OnLoadCompleteListener mListener; + Context mContext; + boolean mStarted = false; + boolean mAbandoned = false; + boolean mReset = true; + boolean mContentChanged = false; + + public final class ForceLoadContentObserver extends ContentObserver { + public ForceLoadContentObserver() { + super(new Handler()); + } + + @Override + public boolean deliverSelfNotifications() { + return true; + } + + @Override + public void onChange(boolean selfChange) { + onContentChanged(); + } + } + + public interface OnLoadCompleteListener { + /** + * Called on the thread that created the Loader when the load is complete. + * + * @param loader the loader that completed the load + * @param data the result of the load + */ + public void onLoadComplete(Loader loader, D data); + } + + /** + * Stores away the application context associated with context. Since Loaders can be used + * across multiple activities it's dangerous to store the context directly. + * + * @param context used to retrieve the application context. + */ + public Loader(Context context) { + mContext = context.getApplicationContext(); + } + + /** + * Sends the result of the load to the registered listener. Should only be called by subclasses. + * + * Must be called from the process's main thread. + * + * @param data the result of the load + */ + public void deliverResult(D data) { + if (mListener != null) { + mListener.onLoadComplete(this, data); + } + } + + /** + * @return an application context retrieved from the Context passed to the constructor. + */ + public Context getContext() { + return mContext; + } + + /** + * @return the ID of this loader + */ + public int getId() { + return mId; + } + + /** + * Registers a class that will receive callbacks when a load is complete. + * The callback will be called on the process's main thread so it's safe to + * pass the results to widgets. + * + *

Must be called from the process's main thread. + */ + public void registerListener(int id, OnLoadCompleteListener listener) { + if (mListener != null) { + throw new IllegalStateException("There is already a listener registered"); + } + mListener = listener; + mId = id; + } + + /** + * Remove a listener that was previously added with {@link #registerListener}. + * + * Must be called from the process's main thread. + */ + public void unregisterListener(OnLoadCompleteListener listener) { + if (mListener == null) { + throw new IllegalStateException("No listener register"); + } + if (mListener != listener) { + throw new IllegalArgumentException("Attempting to unregister the wrong listener"); + } + mListener = null; + } + + /** + * Return whether this load has been started. That is, its {@link #startLoading()} + * has been called and no calls to {@link #stopLoading()} or + * {@link #reset()} have yet been made. + */ + public boolean isStarted() { + return mStarted; + } + + /** + * Return whether this loader has been abandoned. In this state, the + * loader must not report any new data, and must keep + * its last reported data valid until it is finally reset. + */ + public boolean isAbandoned() { + return mAbandoned; + } + + /** + * Return whether this load has been reset. That is, either the loader + * has not yet been started for the first time, or its {@link #reset()} + * has been called. + */ + public boolean isReset() { + return mReset; + } + + /** + * Starts an asynchronous load of the Loader's data. When the result + * is ready the callbacks will be called on the process's main thread. + * If a previous load has been completed and is still valid + * the result may be passed to the callbacks immediately. + * The loader will monitor the source of + * the data set and may deliver future callbacks if the source changes. + * Calling {@link #stopLoading} will stop the delivery of callbacks. + * + *

This updates the Loader's internal state so that + * {@link #isStarted()} and {@link #isReset()} will return the correct + * values, and then calls the implementation's {@link #onStartLoading()}. + * + *

Must be called from the process's main thread. + */ + public final void startLoading() { + mStarted = true; + mReset = false; + mAbandoned = false; + onStartLoading(); + } + + /** + * Subclasses must implement this to take care of loading their data, + * as per {@link #startLoading()}. This is not called by clients directly, + * but as a result of a call to {@link #startLoading()}. + */ + protected void onStartLoading() { + } + + /** + * Force an asynchronous load. Unlike {@link #startLoading()} this will ignore a previously + * loaded data set and load a new one. This simply calls through to the + * implementation's {@link #onForceLoad()}. You generally should only call this + * when the loader is started -- that is, {@link #isStarted()} returns true. + * + *

Must be called from the process's main thread. + */ + public void forceLoad() { + onForceLoad(); + } + + /** + * Subclasses must implement this to take care of requests to {@link #forceLoad()}. + * This will always be called from the process's main thread. + */ + protected void onForceLoad() { + } + + /** + * Stops delivery of updates until the next time {@link #startLoading()} is called. + * Implementations should not invalidate their data at this point -- + * clients are still free to use the last data the loader reported. They will, + * however, typically stop reporting new data if the data changes; they can + * still monitor for changes, but must not report them to the client until and + * if {@link #startLoading()} is later called. + * + *

This updates the Loader's internal state so that + * {@link #isStarted()} will return the correct + * value, and then calls the implementation's {@link #onStopLoading()}. + * + *

Must be called from the process's main thread. + */ + public void stopLoading() { + mStarted = false; + onStopLoading(); + } + + /** + * Subclasses must implement this to take care of stopping their loader, + * as per {@link #stopLoading()}. This is not called by clients directly, + * but as a result of a call to {@link #stopLoading()}. + * This will always be called from the process's main thread. + */ + protected void onStopLoading() { + } + + /** + * Tell the Loader that it is being abandoned. This is called prior + * to {@link #reset} to have it retain its current data but not report + * any new data. + */ + public void abandon() { + mAbandoned = true; + onAbandon(); + } + + /** + * Subclasses implement this to take care of being abandoned. This is + * an optional intermediate state prior to {@link #onReset()} -- it means that + * the client is no longer interested in any new data from the loader, + * so the loader must not report any further updates. However, the + * loader must keep its last reported data valid until the final + * {@link #onReset()} happens. You can retrieve the current abandoned + * state with {@link #isAbandoned}. + */ + protected void onAbandon() { + } + + /** + * Resets the state of the Loader. The Loader should at this point free + * all of its resources, since it may never be called again; however, its + * {@link #startLoading()} may later be called at which point it must be + * able to start running again. + * + *

This updates the Loader's internal state so that + * {@link #isStarted()} and {@link #isReset()} will return the correct + * values, and then calls the implementation's {@link #onReset()}. + * + *

Must be called from the process's main thread. + */ + public void reset() { + onReset(); + mReset = true; + mStarted = false; + mAbandoned = false; + mContentChanged = false; + } + + /** + * Subclasses must implement this to take care of resetting their loader, + * as per {@link #reset()}. This is not called by clients directly, + * but as a result of a call to {@link #reset()}. + * This will always be called from the process's main thread. + */ + protected void onReset() { + } + + /** + * Take the current flag indicating whether the loader's content had + * changed while it was stopped. If it had, true is returned and the + * flag is cleared. + */ + public boolean takeContentChanged() { + boolean res = mContentChanged; + mContentChanged = false; + return res; + } + + /** + * Called when {@link ForceLoadContentObserver} detects a change. The + * default implementation checks to see if the loader is currently started; + * if so, it simply calls {@link #forceLoad()}; otherwise, it sets a flag + * so that {@link #takeContentChanged()} returns true. + * + *

Must be called from the process's main thread. + */ + public void onContentChanged() { + if (mStarted) { + forceLoad(); + } else { + // This loader has been stopped, so we don't want to load + // new data right now... but keep track of it changing to + // refresh later if we start again. + mContentChanged = true; + } + } + + /** + * For debugging, converts an instance of the Loader's data class to + * a string that can be printed. Must handle a null data. + */ + public String dataToString(D data) { + StringBuilder sb = new StringBuilder(64); + DebugUtils.buildShortClassTag(data, sb); + sb.append("}"); + return sb.toString(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(64); + DebugUtils.buildShortClassTag(this, sb); + sb.append(" id="); + sb.append(mId); + sb.append("}"); + return sb.toString(); + } + + /** + * Print the Loader's state into the given stream. + * + * @param prefix Text to print at the front of each line. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer A PrintWriter to which the dump is to be set. + * @param args Additional arguments to the dump request. + */ + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mId="); writer.print(mId); + writer.print(" mListener="); writer.println(mListener); + writer.print(prefix); writer.print("mStarted="); writer.print(mStarted); + writer.print(" mContentChanged="); writer.print(mContentChanged); + writer.print(" mAbandoned="); writer.print(mAbandoned); + writer.print(" mReset="); writer.println(mReset); + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompat.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompat.java new file mode 100644 index 00000000..714af337 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompat.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.os; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ParcelableCompat { + public static Parcelable.Creator newCreator( + ParcelableCompatCreatorCallbacks callbacks) { + if (android.os.Build.VERSION.SDK_INT >= 13) { + ParcelableCompatCreatorHoneycombMR2Stub.instantiate(callbacks); + } + return new CompatCreator(callbacks); + } + + static class CompatCreator implements Parcelable.Creator { + final ParcelableCompatCreatorCallbacks mCallbacks; + + public CompatCreator(ParcelableCompatCreatorCallbacks callbacks) { + mCallbacks = callbacks; + } + + @Override + public T createFromParcel(Parcel source) { + return mCallbacks.createFromParcel(source, null); + } + + @Override + public T[] newArray(int size) { + return mCallbacks.newArray(size); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatCreatorCallbacks.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatCreatorCallbacks.java new file mode 100644 index 00000000..8678cfb7 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatCreatorCallbacks.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.os; + +import android.os.Parcel; + +public interface ParcelableCompatCreatorCallbacks { + public T createFromParcel(Parcel in, ClassLoader loader); + public T[] newArray(int size); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatHoneycombMR2.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatHoneycombMR2.java new file mode 100644 index 00000000..08acb550 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/os/ParcelableCompatHoneycombMR2.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.os; + +import android.os.Parcel; +import android.os.Parcelable; + +class ParcelableCompatCreatorHoneycombMR2Stub { + static Parcelable.Creator instantiate(ParcelableCompatCreatorCallbacks callbacks) { + return new ParcelableCompatCreatorHoneycombMR2(callbacks); + } +} + +class ParcelableCompatCreatorHoneycombMR2 implements Parcelable.ClassLoaderCreator { + private final ParcelableCompatCreatorCallbacks mCallbacks; + + public ParcelableCompatCreatorHoneycombMR2(ParcelableCompatCreatorCallbacks callbacks) { + mCallbacks = callbacks; + } + + public T createFromParcel(Parcel in) { + return mCallbacks.createFromParcel(in, null); + } + + public T createFromParcel(Parcel in, ClassLoader loader) { + return mCallbacks.createFromParcel(in, loader); + } + + public T[] newArray(int size) { + return mCallbacks.newArray(size); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/DebugUtils.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/DebugUtils.java new file mode 100644 index 00000000..16c63a9f --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/DebugUtils.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.util; + +/** + * Useful debugging utilities that are not available on all versions of Android. + */ +public class DebugUtils { + public static void buildShortClassTag(Object cls, StringBuilder out) { + if (cls == null) { + out.append("null"); + } else { + String simpleName = cls.getClass().getSimpleName(); + if (simpleName == null || simpleName.length() <= 0) { + simpleName = cls.getClass().getName(); + int end = simpleName.lastIndexOf('.'); + if (end > 0) { + simpleName = simpleName.substring(end+1); + } + } + out.append(simpleName); + out.append('{'); + out.append(Integer.toHexString(System.identityHashCode(cls))); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LogWriter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LogWriter.java new file mode 100644 index 00000000..3b9d12b0 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LogWriter.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.util; + +import android.util.Log; + +import java.io.Writer; + +/** + * Useful logging utility that is not available on all versions of Android. + */ +public class LogWriter extends Writer { + private final String mTag; + private StringBuilder mBuilder = new StringBuilder(128); + + /** + * Create a new Writer that sends to the log with the given priority + * and tag. + * + * @param priority The desired log priority: + * {@link android.util.Log#VERBOSE Log.VERBOSE}, + * {@link android.util.Log#DEBUG Log.DEBUG}, + * {@link android.util.Log#INFO Log.INFO}, + * {@link android.util.Log#WARN Log.WARN}, or + * {@link android.util.Log#ERROR Log.ERROR}. + * @param tag A string tag to associate with each printed log statement. + */ + public LogWriter(String tag) { + mTag = tag; + } + + @Override public void close() { + flushBuilder(); + } + + @Override public void flush() { + flushBuilder(); + } + + @Override public void write(char[] buf, int offset, int count) { + for(int i = 0; i < count; i++) { + char c = buf[offset + i]; + if ( c == '\n') { + flushBuilder(); + } + else { + mBuilder.append(c); + } + } + } + + private void flushBuilder() { + if (mBuilder.length() > 0) { + Log.d(mTag, mBuilder.toString()); + mBuilder.delete(0, mBuilder.length()); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LruCache.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LruCache.java new file mode 100644 index 00000000..a7a2ee27 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/LruCache.java @@ -0,0 +1,323 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.util; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Static library version of {@code android.util.LruCache}. Used to write apps + * that run on API levels prior to 12. When running on API level 12 or above, + * this implementation is still used; it does not try to switch to the + * framework's implementation. See the framework SDK documentation for a class + * overview. + */ +public class LruCache { + private final LinkedHashMap map; + + /** Size of this cache in units. Not necessarily the number of elements. */ + private int size; + private int maxSize; + + private int putCount; + private int createCount; + private int evictionCount; + private int hitCount; + private int missCount; + + /** + * @param maxSize for caches that do not override {@link #sizeOf}, this is + * the maximum number of entries in the cache. For all other caches, + * this is the maximum sum of the sizes of the entries in this cache. + */ + public LruCache(int maxSize) { + if (maxSize <= 0) { + throw new IllegalArgumentException("maxSize <= 0"); + } + this.maxSize = maxSize; + this.map = new LinkedHashMap(0, 0.75f, true); + } + + /** + * Returns the value for {@code key} if it exists in the cache or can be + * created by {@code #create}. If a value was returned, it is moved to the + * head of the queue. This returns null if a value is not cached and cannot + * be created. + */ + public final V get(K key) { + if (key == null) { + throw new NullPointerException("key == null"); + } + + V mapValue; + synchronized (this) { + mapValue = map.get(key); + if (mapValue != null) { + hitCount++; + return mapValue; + } + missCount++; + } + + /* + * Attempt to create a value. This may take a long time, and the map + * may be different when create() returns. If a conflicting value was + * added to the map while create() was working, we leave that value in + * the map and release the created value. + */ + + V createdValue = create(key); + if (createdValue == null) { + return null; + } + + synchronized (this) { + createCount++; + mapValue = map.put(key, createdValue); + + if (mapValue != null) { + // There was a conflict so undo that last put + map.put(key, mapValue); + } else { + size += safeSizeOf(key, createdValue); + } + } + + if (mapValue != null) { + entryRemoved(false, key, createdValue, mapValue); + return mapValue; + } else { + trimToSize(maxSize); + return createdValue; + } + } + + /** + * Caches {@code value} for {@code key}. The value is moved to the head of + * the queue. + * + * @return the previous value mapped by {@code key}. + */ + public final V put(K key, V value) { + if (key == null || value == null) { + throw new NullPointerException("key == null || value == null"); + } + + V previous; + synchronized (this) { + putCount++; + size += safeSizeOf(key, value); + previous = map.put(key, value); + if (previous != null) { + size -= safeSizeOf(key, previous); + } + } + + if (previous != null) { + entryRemoved(false, key, previous, value); + } + + trimToSize(maxSize); + return previous; + } + + /** + * @param maxSize the maximum size of the cache before returning. May be -1 + * to evict even 0-sized elements. + */ + private void trimToSize(int maxSize) { + while (true) { + K key; + V value; + synchronized (this) { + if (size < 0 || (map.isEmpty() && size != 0)) { + throw new IllegalStateException(getClass().getName() + + ".sizeOf() is reporting inconsistent results!"); + } + + if (size <= maxSize || map.isEmpty()) { + break; + } + + Map.Entry toEvict = map.entrySet().iterator().next(); + key = toEvict.getKey(); + value = toEvict.getValue(); + map.remove(key); + size -= safeSizeOf(key, value); + evictionCount++; + } + + entryRemoved(true, key, value, null); + } + } + + /** + * Removes the entry for {@code key} if it exists. + * + * @return the previous value mapped by {@code key}. + */ + public final V remove(K key) { + if (key == null) { + throw new NullPointerException("key == null"); + } + + V previous; + synchronized (this) { + previous = map.remove(key); + if (previous != null) { + size -= safeSizeOf(key, previous); + } + } + + if (previous != null) { + entryRemoved(false, key, previous, null); + } + + return previous; + } + + /** + * Called for entries that have been evicted or removed. This method is + * invoked when a value is evicted to make space, removed by a call to + * {@link #remove}, or replaced by a call to {@link #put}. The default + * implementation does nothing. + * + *

The method is called without synchronization: other threads may + * access the cache while this method is executing. + * + * @param evicted true if the entry is being removed to make space, false + * if the removal was caused by a {@link #put} or {@link #remove}. + * @param newValue the new value for {@code key}, if it exists. If non-null, + * this removal was caused by a {@link #put}. Otherwise it was caused by + * an eviction or a {@link #remove}. + */ + protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {} + + /** + * Called after a cache miss to compute a value for the corresponding key. + * Returns the computed value or null if no value can be computed. The + * default implementation returns null. + * + *

The method is called without synchronization: other threads may + * access the cache while this method is executing. + * + *

If a value for {@code key} exists in the cache when this method + * returns, the created value will be released with {@link #entryRemoved} + * and discarded. This can occur when multiple threads request the same key + * at the same time (causing multiple values to be created), or when one + * thread calls {@link #put} while another is creating a value for the same + * key. + */ + protected V create(K key) { + return null; + } + + private int safeSizeOf(K key, V value) { + int result = sizeOf(key, value); + if (result < 0) { + throw new IllegalStateException("Negative size: " + key + "=" + value); + } + return result; + } + + /** + * Returns the size of the entry for {@code key} and {@code value} in + * user-defined units. The default implementation returns 1 so that size + * is the number of entries and max size is the maximum number of entries. + * + *

An entry's size must not change while it is in the cache. + */ + protected int sizeOf(K key, V value) { + return 1; + } + + /** + * Clear the cache, calling {@link #entryRemoved} on each removed entry. + */ + public final void evictAll() { + trimToSize(-1); // -1 will evict 0-sized elements + } + + /** + * For caches that do not override {@link #sizeOf}, this returns the number + * of entries in the cache. For all other caches, this returns the sum of + * the sizes of the entries in this cache. + */ + public synchronized final int size() { + return size; + } + + /** + * For caches that do not override {@link #sizeOf}, this returns the maximum + * number of entries in the cache. For all other caches, this returns the + * maximum sum of the sizes of the entries in this cache. + */ + public synchronized final int maxSize() { + return maxSize; + } + + /** + * Returns the number of times {@link #get} returned a value. + */ + public synchronized final int hitCount() { + return hitCount; + } + + /** + * Returns the number of times {@link #get} returned null or required a new + * value to be created. + */ + public synchronized final int missCount() { + return missCount; + } + + /** + * Returns the number of times {@link #create(Object)} returned a value. + */ + public synchronized final int createCount() { + return createCount; + } + + /** + * Returns the number of times {@link #put} was called. + */ + public synchronized final int putCount() { + return putCount; + } + + /** + * Returns the number of values that have been evicted. + */ + public synchronized final int evictionCount() { + return evictionCount; + } + + /** + * Returns a copy of the current contents of the cache, ordered from least + * recently accessed to most recently accessed. + */ + public synchronized final Map snapshot() { + return new LinkedHashMap(map); + } + + @Override public synchronized final String toString() { + int accesses = hitCount + missCount; + int hitPercent = accesses != 0 ? (100 * hitCount / accesses) : 0; + return String.format("LruCache[maxSize=%d,hits=%d,misses=%d,hitRate=%d%%]", + maxSize, hitCount, missCount, hitPercent); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/TimeUtils.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/TimeUtils.java new file mode 100644 index 00000000..65ac8544 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/util/TimeUtils.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.util; + +import java.io.PrintWriter; + +/** + * Useful time utilities that are not available on all versions of Android. + */ +public class TimeUtils { + /** @hide Field length that can hold 999 days of time */ + public static final int HUNDRED_DAY_FIELD_LEN = 19; + + private static final int SECONDS_PER_MINUTE = 60; + private static final int SECONDS_PER_HOUR = 60 * 60; + private static final int SECONDS_PER_DAY = 24 * 60 * 60; + + private static final Object sFormatSync = new Object(); + private static char[] sFormatStr = new char[HUNDRED_DAY_FIELD_LEN+5]; + + static private int accumField(int amt, int suffix, boolean always, int zeropad) { + if (amt > 99 || (always && zeropad >= 3)) { + return 3+suffix; + } + if (amt > 9 || (always && zeropad >= 2)) { + return 2+suffix; + } + if (always || amt > 0) { + return 1+suffix; + } + return 0; + } + + static private int printField(char[] formatStr, int amt, char suffix, int pos, + boolean always, int zeropad) { + if (always || amt > 0) { + final int startPos = pos; + if ((always && zeropad >= 3) || amt > 99) { + int dig = amt/100; + formatStr[pos] = (char)(dig + '0'); + pos++; + amt -= (dig*100); + } + if ((always && zeropad >= 2) || amt > 9 || startPos != pos) { + int dig = amt/10; + formatStr[pos] = (char)(dig + '0'); + pos++; + amt -= (dig*10); + } + formatStr[pos] = (char)(amt + '0'); + pos++; + formatStr[pos] = suffix; + pos++; + } + return pos; + } + + private static int formatDurationLocked(long duration, int fieldLen) { + if (sFormatStr.length < fieldLen) { + sFormatStr = new char[fieldLen]; + } + + char[] formatStr = sFormatStr; + + if (duration == 0) { + int pos = 0; + fieldLen -= 1; + while (pos < fieldLen) { + formatStr[pos] = ' '; + } + formatStr[pos] = '0'; + return pos+1; + } + + char prefix; + if (duration > 0) { + prefix = '+'; + } else { + prefix = '-'; + duration = -duration; + } + + int millis = (int)(duration%1000); + int seconds = (int) Math.floor(duration / 1000); + int days = 0, hours = 0, minutes = 0; + + if (seconds > SECONDS_PER_DAY) { + days = seconds / SECONDS_PER_DAY; + seconds -= days * SECONDS_PER_DAY; + } + if (seconds > SECONDS_PER_HOUR) { + hours = seconds / SECONDS_PER_HOUR; + seconds -= hours * SECONDS_PER_HOUR; + } + if (seconds > SECONDS_PER_MINUTE) { + minutes = seconds / SECONDS_PER_MINUTE; + seconds -= minutes * SECONDS_PER_MINUTE; + } + + int pos = 0; + + if (fieldLen != 0) { + int myLen = accumField(days, 1, false, 0); + myLen += accumField(hours, 1, myLen > 0, 2); + myLen += accumField(minutes, 1, myLen > 0, 2); + myLen += accumField(seconds, 1, myLen > 0, 2); + myLen += accumField(millis, 2, true, myLen > 0 ? 3 : 0) + 1; + while (myLen < fieldLen) { + formatStr[pos] = ' '; + pos++; + myLen++; + } + } + + formatStr[pos] = prefix; + pos++; + + int start = pos; + boolean zeropad = fieldLen != 0; + pos = printField(formatStr, days, 'd', pos, false, 0); + pos = printField(formatStr, hours, 'h', pos, pos != start, zeropad ? 2 : 0); + pos = printField(formatStr, minutes, 'm', pos, pos != start, zeropad ? 2 : 0); + pos = printField(formatStr, seconds, 's', pos, pos != start, zeropad ? 2 : 0); + pos = printField(formatStr, millis, 'm', pos, true, (zeropad && pos != start) ? 3 : 0); + formatStr[pos] = 's'; + return pos + 1; + } + + /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long duration, StringBuilder builder) { + synchronized (sFormatSync) { + int len = formatDurationLocked(duration, 0); + builder.append(sFormatStr, 0, len); + } + } + + /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long duration, PrintWriter pw, int fieldLen) { + synchronized (sFormatSync) { + int len = formatDurationLocked(duration, fieldLen); + pw.print(new String(sFormatStr, 0, len)); + } + } + + /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long duration, PrintWriter pw) { + formatDuration(duration, pw, 0); + } + + /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long time, long now, PrintWriter pw) { + if (time == 0) { + pw.print("--"); + return; + } + formatDuration(time-now, pw, 0); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ActionMode.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ActionMode.java new file mode 100644 index 00000000..f265b3cd --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ActionMode.java @@ -0,0 +1,188 @@ +/* + * Copyright 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.View; + +/** + * Represents a contextual mode of the user interface. Action modes can be used + * for modal interactions with content and replace parts of the normal UI until + * finished. Examples of good action modes include selection modes, search, + * content editing, etc. + */ +public abstract class ActionMode { + /** + *

Callback interface for action modes. Supplied to + * {@link android.support.v4.app.FragmentActivity#startActionMode(Callback)}, + * a Callback configures and handles events raised by a user's interaction + * with an action mode.

+ * + *

An action mode's lifecycle is as follows: + *

    + *
  • {@link #onCreateActionMode(ActionMode, Menu)} once on initial + * creation
  • + *
  • {@link #onPrepareActionMode(ActionMode, Menu)} after creation and + * any time the ActionMode is invalidated
  • + *
  • {@link #onActionItemClicked(ActionMode, MenuItem)} any time a + * contextual action button is clicked
  • + *
  • {@link #onDestroyActionMode(ActionMode)} when the action mode is + * closed
  • + *
+ *

+ */ + public interface Callback { + /** + * Called to report a user click on an action button. + * + * @param mode The current ActionMode + * @param item The item that was clicked + * @return true if this callback handled the event, false if the + * standard MenuItem invocation should continue. + */ + boolean onActionItemClicked(ActionMode mode, MenuItem item); + + /** + * Called when action mode is first created. The menu supplied will be + * used to generate action buttons for the action mode. + * + * @param mode ActionMode being created + * @param menu Menu used to populate action buttons + * @return true if the action mode should be created, false if entering + * this mode should be aborted. + */ + boolean onCreateActionMode(ActionMode mode, Menu menu); + + /** + * Called when an action mode is about to be exited and destroyed. + * + * @param mode The current ActionMode being destroyed + */ + void onDestroyActionMode(ActionMode mode); + + /** + * Called to refresh an action mode's action menu whenever it is + * invalidated. + * + * @param mode ActionMode being prepared + * @param menu Menu used to populate action buttons + * @return true if the menu or action mode was updated, false otherwise. + */ + boolean onPrepareActionMode(ActionMode mode, Menu menu); + } + + /** + * Finish and close this action mode. The action mode's + * {@link ActionMode.Callback} will have its + * {@link ActionMode.Callback#onDestroyActionMode(ActionMode)} method + * called. + */ + public abstract void finish(); + + /** + * Returns the current custom view for this action mode. + * + * @return The current custom view + */ + public abstract View getCustomView(); + + /** + * Returns the menu of actions that this action mode presents. + * + * @return The action mode's menu. + */ + public abstract Menu getMenu(); + + /** + * Returns a {@link MenuInflater} with the ActionMode's context. + * + * @return Menu inflater. + */ + public abstract MenuInflater getMenuInflater(); + + /** + * Returns the current subtitle of this action mode. + * + * @return Subtitle text + */ + public abstract CharSequence getSubtitle(); + + /** + * Returns the current title of this action mode. + * + * @return Title text + */ + public abstract CharSequence getTitle(); + + /** + * Invalidate the action mode and refresh menu content. The mode's + * {@link ActionMode.Callback} will have its + * {@link ActionMode.Callback#onPrepareActionMode(ActionMode, Menu)} method + * called. If it returns true the menu will be scanned for updated content + * and any relevant changes will be reflected to the user. + */ + public abstract void invalidate(); + + /** + * Set a custom view for this action mode. The custom view will take the + * place of the title and subtitle. Useful for things like search boxes. + * + * @param view Custom view to use in place of the title/subtitle. + * @see #setTitle(CharSequence) + * @see #setSubtitle(CharSequence) + */ + public abstract void setCustomView(View view); + + /** + * Set the subtitle of the action mode. This method will have no visible + * effect if a custom view has been set. + * + * @param resId Resource ID of a string to set as the subtitle + * @see #setSubtitle(CharSequence) + * @see #setCustomView(View) + */ + public abstract void setSubtitle(int resId); + + /** + * Set the subtitle of the action mode. This method will have no visible + * effect if a custom view has been set. + * + * @param subtitle Subtitle string to set + * @see #setSubtitle(int) + * @see #setCustomView(View) + */ + public abstract void setSubtitle(CharSequence subtitle); + + /** + * Set the title of the action mode. This method will have no visible effect + * if a custom view has been set. + * + * @param resId Resource ID of a string to set as the title + * @see #setTitle(CharSequence) + * @see #setCustomView(View) + */ + public abstract void setTitle(int resId); + + /** + * Set the title of the action mode. This method will have no visible effect + * if a custom view has been set. + * + * @param title Title string to set + * @see #setTitle(int) + * @see #setCustomView(View) + */ + public abstract void setTitle(CharSequence title); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Menu.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Menu.java new file mode 100644 index 00000000..39a69718 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Menu.java @@ -0,0 +1,33 @@ +package android.support.v4.view; + +public interface Menu extends android.view.Menu { + @Override + MenuItem add(CharSequence title); + + @Override + MenuItem add(int groupId, int itemId, int order, int titleRes); + + @Override + MenuItem add(int titleRes); + + @Override + MenuItem add(int groupId, int itemId, int order, CharSequence title); + + @Override + SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title); + + @Override + SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes); + + @Override + SubMenu addSubMenu(CharSequence title); + + @Override + SubMenu addSubMenu(int titleRes); + + @Override + MenuItem findItem(int id); + + @Override + MenuItem getItem(int index); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuInflater.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuInflater.java new file mode 100644 index 00000000..f32a2aa1 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuInflater.java @@ -0,0 +1,464 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.util.AttributeSet; +import android.util.Xml; +import android.view.InflateException; +import android.view.MenuItem; +import android.view.View; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuItemImpl; +import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; + +/** + * This class is used to instantiate menu XML files into Menu objects. + *

+ * For performance reasons, menu inflation relies heavily on pre-processing of + * XML files that is done at build time. Therefore, it is not currently possible + * to use MenuInflater with an XmlPullParser over a plain XML file at runtime; + * it only works with an XmlPullParser returned from a compiled resource (R. + * something file.) + */ +public final class MenuInflater extends android.view.MenuInflater { + private static final Class[] ACTION_VIEW_CONSTRUCTOR_SIGNATURE = new Class[] { Context.class }; + private static final Class[] PARAM_TYPES = new Class[] { android.view.MenuItem.class }; + + /** Android XML namespace. */ + private static final String XML_NS = "http://schemas.android.com/apk/res/android"; + + /** Menu tag name in XML. */ + private static final String XML_MENU = "menu"; + + /** Group tag name in XML. */ + private static final String XML_GROUP = "group"; + + /** Item tag name in XML. */ + private static final String XML_ITEM = "item"; + + + /** Context from which to inflate resources. */ + private final Context mContext; + + /** Native inflater for context menu fallback. */ + private final android.view.MenuInflater mNativeMenuInflater; + + + /** + * Constructs a menu inflater. + * + * @see Activity#getMenuInflater() + */ + public MenuInflater(Context context, android.view.MenuInflater nativeMenuInflater) { + super(context); + mContext = context; + mNativeMenuInflater = nativeMenuInflater; + } + + + /** + * Inflate a menu hierarchy from the specified XML resource. Throws + * {@link InflateException} if there is an error. + * + * @param menuRes Resource ID for an XML layout resource to load (e.g., + * R.menu.main_activity) + * @param menu The Menu to inflate into. The items and submenus will be + * added to this Menu. + */ + @Override + public void inflate(int menuRes, android.view.Menu menu) { + if (!(menu instanceof MenuBuilder)) { + mNativeMenuInflater.inflate(menuRes, menu); + return; + } + + MenuBuilder actionBarMenu = (MenuBuilder)menu; + XmlResourceParser parser = null; + try { + parser = mContext.getResources().getLayout(menuRes); + AttributeSet attrs = Xml.asAttributeSet(parser); + + parseMenu(parser, attrs, actionBarMenu); + } catch (XmlPullParserException e) { + throw new InflateException("Error inflating menu XML", e); + } catch (IOException e) { + throw new InflateException("Error inflating menu XML", e); + } finally { + if (parser != null) parser.close(); + } + } + + /** + * Called internally to fill the given menu. If a sub menu is seen, it will + * call this recursively. + */ + private void parseMenu(XmlPullParser parser, AttributeSet attrs, MenuBuilder menu) + throws XmlPullParserException, IOException { + ActionBarMenuState menuState = new ActionBarMenuState(menu); + + int eventType = parser.getEventType(); + String tagName; + boolean lookingForEndOfUnknownTag = false; + String unknownTagName = null; + + // This loop will skip to the menu start tag + do { + if (eventType == XmlPullParser.START_TAG) { + tagName = parser.getName(); + if (tagName.equals(XML_MENU)) { + // Go to next tag + eventType = parser.next(); + break; + } + + throw new RuntimeException("Expecting menu, got " + tagName); + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + boolean reachedEndOfMenu = false; + while (!reachedEndOfMenu) { + switch (eventType) { + case XmlPullParser.START_TAG: + if (lookingForEndOfUnknownTag) { + break; + } + + tagName = parser.getName(); + if (tagName.equals(XML_GROUP)) { + menuState.readGroup(attrs); + } else if (tagName.equals(XML_ITEM)) { + menuState.readItem(attrs); + } else if (tagName.equals(XML_MENU)) { + // A menu start tag denotes a submenu for an item + SubMenuBuilder subMenu = menuState.addSubMenuItem(); + + // Parse the submenu into returned SubMenu + parseMenu(parser, attrs, subMenu); + } else { + lookingForEndOfUnknownTag = true; + unknownTagName = tagName; + } + break; + + case XmlPullParser.END_TAG: + tagName = parser.getName(); + if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) { + lookingForEndOfUnknownTag = false; + unknownTagName = null; + } else if (tagName.equals(XML_GROUP)) { + menuState.resetGroup(); + } else if (tagName.equals(XML_ITEM)) { + // Add the item if it hasn't been added (if the item was + // a submenu, it would have been added already) + if (!menuState.hasAddedItem()) { + menuState.addItem(); + } + } else if (tagName.equals(XML_MENU)) { + reachedEndOfMenu = true; + } + break; + + case XmlPullParser.END_DOCUMENT: + throw new RuntimeException("Unexpected end of document"); + } + + eventType = parser.next(); + } + } + + + + /** + * State for the current menu. + *

+ * Groups can not be nested unless there is another menu (which will have + * its state class). + */ + private final class ActionBarMenuState { + private final MenuBuilder menu; + + /* + * Group state is set on items as they are added, allowing an item to + * override its group state. (As opposed to set on items at the group end tag.) + */ + private int groupId; + private int groupCategory; + private int groupOrder; + private int groupCheckable; + private boolean groupVisible; + private boolean groupEnabled; + + private boolean itemAdded; + private int itemId; + private int itemCategoryOrder; + private String itemTitle; + private String itemTitleCondensed; + private int itemIconResId; + private char itemAlphabeticShortcut; + private char itemNumericShortcut; + /** + * Sync to attrs.xml enum: + * - 0: none + * - 1: all + * - 2: exclusive + */ + private int itemCheckable; + private boolean itemChecked; + private boolean itemVisible; + private boolean itemEnabled; + private String itemListenerMethodName; + private int itemShowAsAction; + private int itemActionLayout; + private String itemActionViewClassName; + + private static final int defaultGroupId = View.NO_ID; + private static final int defaultItemId = View.NO_ID; + private static final int defaultItemCategory = 0; + private static final int defaultItemOrder = 0; + private static final int defaultItemCheckable = 0; + private static final boolean defaultItemChecked = false; + private static final boolean defaultItemVisible = true; + private static final boolean defaultItemEnabled = true; + private static final int defaultItemShowAsAction = 0; + private static final int defaultIconResId = View.NO_ID; + + /** Mirror of package-scoped Menu.CATEGORY_MASK. */ + private static final int Menu__CATEGORY_MASK = 0xffff0000; + /** Mirror of package-scoped Menu.USER_MASK. */ + private static final int Menu__USER_MASK = 0x0000ffff; + + public ActionBarMenuState(MenuBuilder menu) { + this.menu = menu; + + resetGroup(); + } + + public void resetGroup() { + groupId = defaultGroupId; + groupCategory = defaultItemCategory; + groupOrder = defaultItemOrder; + groupCheckable = defaultItemCheckable; + groupVisible = defaultItemVisible; + groupEnabled = defaultItemEnabled; + } + + /** + * Called when the parser is pointing to a group tag. + */ + public void readGroup(AttributeSet attrs) { + //TypedArray a = mContext.obtainStyledAttributes(attrs, com.android.internal.R.styleable.MenuGroup); + + //groupId = a.getResourceId(com.android.internal.R.styleable.MenuGroup_id, defaultGroupId); + groupId = attrs.getAttributeResourceValue(XML_NS, "id", defaultGroupId); + + //groupCategory = a.getInt(com.android.internal.R.styleable.MenuGroup_menuCategory, defaultItemCategory); + groupCategory = attrs.getAttributeIntValue(XML_NS, "menuCategory", defaultItemCategory); + + //groupOrder = a.getInt(com.android.internal.R.styleable.MenuGroup_orderInCategory, defaultItemOrder); + groupOrder = attrs.getAttributeIntValue(XML_NS, "orderInCategory", defaultItemOrder); + + //groupCheckable = a.getInt(com.android.internal.R.styleable.MenuGroup_checkableBehavior, defaultItemCheckable); + groupCheckable = attrs.getAttributeIntValue(XML_NS, "checkableBehavior", defaultItemCheckable); + + //groupVisible = a.getBoolean(com.android.internal.R.styleable.MenuGroup_visible, defaultItemVisible); + groupVisible = attrs.getAttributeBooleanValue(XML_NS, "visible", defaultItemVisible); + + //groupEnabled = a.getBoolean(com.android.internal.R.styleable.MenuGroup_enabled, defaultItemEnabled); + groupEnabled = attrs.getAttributeBooleanValue(XML_NS, "enabled", defaultItemEnabled); + + //a.recycle(); + } + + /** + * Called when the parser is pointing to an item tag. + */ + public void readItem(AttributeSet attrs) { + //TypedArray a = mContext.obtainStyledAttributes(attrs, com.android.internal.R.styleable.MenuItem); + + // Inherit attributes from the group as default value + + //itemId = a.getResourceId(com.android.internal.R.styleable.MenuItem_id, defaultItemId); + itemId = attrs.getAttributeResourceValue(XML_NS, "id", defaultItemId); + + //final int category = a.getInt(com.android.internal.R.styleable.MenuItem_menuCategory, groupCategory); + final int category = attrs.getAttributeIntValue(XML_NS, "menuCategory", groupCategory); + + //final int order = a.getInt(com.android.internal.R.styleable.MenuItem_orderInCategory, groupOrder); + final int order = attrs.getAttributeIntValue(XML_NS, "orderInCategory", groupOrder); + + //itemCategoryOrder = (category & Menu.CATEGORY_MASK) | (order & Menu.USER_MASK); + itemCategoryOrder = (category & Menu__CATEGORY_MASK) | (order & Menu__USER_MASK); + + //itemTitle = a.getString(com.android.internal.R.styleable.MenuItem_title); + final int itemTitleId = attrs.getAttributeResourceValue(XML_NS, "title", 0); + if (itemTitleId != 0) { + itemTitle = mContext.getString(itemTitleId); + } else { + itemTitle = attrs.getAttributeValue(XML_NS, "title"); + } + + //itemTitleCondensed = a.getString(com.android.internal.R.styleable.MenuItem_titleCondensed); + final int itemTitleCondensedId = attrs.getAttributeResourceValue(XML_NS, "titleCondensed", 0); + if (itemTitleCondensedId != 0) { + itemTitleCondensed = mContext.getString(itemTitleCondensedId); + } else { + itemTitleCondensed = attrs.getAttributeValue(XML_NS, "titleCondensed"); + } + + //itemIconResId = a.getResourceId(com.android.internal.R.styleable.MenuItem_icon, 0); + itemIconResId = attrs.getAttributeResourceValue(XML_NS, "icon", defaultIconResId); + + //itemAlphabeticShortcut = getShortcut(a.getString(com.android.internal.R.styleable.MenuItem_alphabeticShortcut)); + itemAlphabeticShortcut = getShortcut(attrs.getAttributeValue(XML_NS, "alphabeticShortcut")); + + //itemNumericShortcut = getShortcut(a.getString(com.android.internal.R.styleable.MenuItem_numericShortcut)); + itemNumericShortcut = getShortcut(attrs.getAttributeValue(XML_NS, "numericShortcut")); + + //if (a.hasValue(com.android.internal.R.styleable.MenuItem_checkable)) { + if (attrs.getAttributeValue(XML_NS, "checkable") != null) { + // Item has attribute checkable, use it + //itemCheckable = a.getBoolean(com.android.internal.R.styleable.MenuItem_checkable, false) ? 1 : 0; + itemCheckable = attrs.getAttributeBooleanValue(XML_NS, "checkable", false) ? 1 : 0; + } else { + // Item does not have attribute, use the group's (group can have one more state + // for checkable that represents the exclusive checkable) + itemCheckable = groupCheckable; + } + + //itemChecked = a.getBoolean(com.android.internal.R.styleable.MenuItem_checked, defaultItemChecked); + itemChecked = attrs.getAttributeBooleanValue(XML_NS, "checked", defaultItemChecked); + + //itemVisible = a.getBoolean(com.android.internal.R.styleable.MenuItem_visible, groupVisible); + itemVisible = attrs.getAttributeBooleanValue(XML_NS, "visible", groupVisible); + + //itemEnabled = a.getBoolean(com.android.internal.R.styleable.MenuItem_enabled, groupEnabled); + itemEnabled = attrs.getAttributeBooleanValue(XML_NS, "enabled", groupEnabled); + + //presumed emulation of 3.0+'s MenuInflator: + itemListenerMethodName = attrs.getAttributeValue(XML_NS, "onClick"); + itemShowAsAction = attrs.getAttributeIntValue(XML_NS, "showAsAction", defaultItemShowAsAction); + itemActionLayout = attrs.getAttributeResourceValue(XML_NS, "actionLayout", 0); + itemActionViewClassName = attrs.getAttributeValue(XML_NS, "actionViewClass"); + + //a.recycle(); + + itemAdded = false; + } + + private char getShortcut(String shortcutString) { + if (shortcutString == null) { + return 0; + } else { + return shortcutString.charAt(0); + } + } + + private void setItem(MenuItemImpl item) { + item.setChecked(itemChecked) + .setVisible(itemVisible) + .setEnabled(itemEnabled) + .setCheckable(itemCheckable >= 1) + .setTitleCondensed(itemTitleCondensed) + .setIcon(itemIconResId) + .setAlphabeticShortcut(itemAlphabeticShortcut) + .setNumericShortcut(itemNumericShortcut); + + if (itemShowAsAction > 0) { + item.setShowAsAction(itemShowAsAction); + } + if (itemListenerMethodName != null) { + if (MenuInflater.this.mContext.isRestricted()) { + throw new IllegalStateException("The android:onClick attribute cannot be used within a restricted context"); + } + item.setOnMenuItemClickListener(new InflatedOnMenuItemClickListener(itemListenerMethodName)); + } + if (itemCheckable >= 2) { + item.setExclusiveCheckable(true); + } + if (itemActionViewClassName != null) { + try { + Context context = MenuInflater.this.mContext; + ClassLoader loader = context.getClassLoader(); + Class actionViewClass = Class.forName(itemActionViewClassName, true, loader); + Constructor constructor = actionViewClass.getConstructor(ACTION_VIEW_CONSTRUCTOR_SIGNATURE); + View actionView = (View)constructor.newInstance(new Object[] { context }); + item.setActionView(actionView); + } catch (Exception e) { + throw new InflateException(e); + } + } else if (itemActionLayout > 0) { + item.setActionView(itemActionLayout); + } + } + + public void addItem() { + itemAdded = true; + setItem((MenuItemImpl)menu.add(groupId, itemId, itemCategoryOrder, itemTitle)); + } + + public SubMenuBuilder addSubMenuItem() { + itemAdded = true; + SubMenuBuilder subMenu = menu.addSubMenu(groupId, itemId, itemCategoryOrder, itemTitle); + setItem(subMenu.getItem()); + return subMenu; + } + + public boolean hasAddedItem() { + return itemAdded; + } + } + + class InflatedOnMenuItemClickListener implements android.view.MenuItem.OnMenuItemClickListener { + private Method mMethod; + + public InflatedOnMenuItemClickListener(String methodName) { + final Class localClass = MenuInflater.this.getClass(); + try { + mMethod = localClass.getMethod(methodName, PARAM_TYPES); + } catch (Exception e) { + StringBuilder b = new StringBuilder(); + b.append("Couldn't resolve menu item onClick handler "); + b.append(methodName); + b.append(" in class "); + b.append(localClass.getName()); + throw new InflateException(b.toString(), e); + } + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + final Object[] params = new Object[] { item }; + try { + if (mMethod.getReturnType() == Boolean.TYPE) { + return (Boolean)mMethod.invoke(MenuInflater.this, params); + } + return false; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuItem.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuItem.java new file mode 100644 index 00000000..49740ea4 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MenuItem.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.View; + +/** + *

Interface for direct access to a previously created menu item.

+ * + *

An Item is returned by calling one of the {@link Menu#add(int)} + * methods.

+ * + *

For a feature set of specific menu types, see {@link Menu}.

+ */ +public interface MenuItem extends android.view.MenuItem { + /** + * Interface definition for a callback to be invoked when a menu item is + * clicked. + */ + public static abstract class OnMenuItemClickListener implements android.view.MenuItem.OnMenuItemClickListener { + /** + * Called when a menu item has been invoked. This is the first code + * that is executed; if it returns true, no other callbacks will be + * executed. + * + * @param item The menu item that was invoked. + * @return Return true to consume this click and prevent others from + * executing. + */ + public abstract boolean onMenuItemClick(MenuItem item); + + @Override + public final boolean onMenuItemClick(android.view.MenuItem item) { + return this.onMenuItemClick(new MenuItemWrapper(item)); + } + } + + + + /** + * Always show this item as a button in an Action Bar. Use sparingly! If too + * many items are set to always show in the Action Bar it can crowd the + * Action Bar and degrade the user experience on devices with smaller + * screens. A good rule of thumb is to have no more than 2 items set to + * always show at a time. + */ + public static final int SHOW_AS_ACTION_ALWAYS = android.view.MenuItem.SHOW_AS_ACTION_ALWAYS; + + /** + * Show this item as a button in an Action Bar if the system decides there + * is room for it. + */ + public static final int SHOW_AS_ACTION_IF_ROOM = android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM; + + /** + * Never show this item as a button in an Action Bar. + */ + public static final int SHOW_AS_ACTION_NEVER = android.view.MenuItem.SHOW_AS_ACTION_NEVER; + + /** + * When this item is in the action bar, always show it with a text label + * even if it also has an icon specified. + */ + public static final int SHOW_AS_ACTION_WITH_TEXT = android.view.MenuItem.SHOW_AS_ACTION_WITH_TEXT; + + + + /** + * Returns the currently set action view for this menu item. + * + * @return The item's action view + * @see #setActionView(int) + * @see #setActionView(View) + * @see #setShowAsAction(int) + */ + View getActionView(); + + /** + * Set an action view for this menu item. An action view will be displayed + * in place of an automatically generated menu item element in the UI when + * this item is shown as an action within a parent. + * + * @param resId Layout resource to use for presenting this item to the user. + * @return This Item so additional setters can be called. + * @see #setActionView(View) + */ + MenuItem setActionView(int resId); + + /** + * Set an action view for this menu item. An action view will be displayed + * in place of an automatically generated menu item element in the UI when + * this item is shown as an action within a parent. + * + * @param view View to use for presenting this item to the user. + * @return This Item so additional setters can be called. + * @see #setActionView(int) + */ + MenuItem setActionView(View view); + + /** + * Sets how this item should display in the presence of an Action Bar. The + * parameter actionEnum is a flag set. One of + * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or + * {@link #SHOW_AS_ACTION_NEVER} should be used, and you may optionally OR + * the value with {@link #SHOW_AS_ACTION_WITH_TEXT}. + * {@link #SHOW_AS_ACTION_WITH_TEXT} requests that when the item is shown as + * an action, it should be shown with a text label. + * + * @param actionEnum How the item should display. One of + * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or + * {@link #SHOW_AS_ACTION_NEVER}. {@link #SHOW_AS_ACTION_NEVER} is the + * default. + */ + void setShowAsAction(int actionEnum); + + // --------------------------------------------------------------------- + // MENU ITEM SUPPORT + // --------------------------------------------------------------------- + + @Override + SubMenu getSubMenu(); + + @Override + MenuItem setAlphabeticShortcut(char alphaChar); + + @Override + MenuItem setCheckable(boolean checkable); + + @Override + MenuItem setChecked(boolean checked); + + @Override + MenuItem setEnabled(boolean enabled); + + @Override + MenuItem setIcon(Drawable icon); + + @Override + MenuItem setIcon(int iconRes); + + @Override + MenuItem setIntent(Intent intent); + + @Override + MenuItem setNumericShortcut(char numericChar); + + /** + * Set a custom listener for invocation of this menu item. + * + * @param menuItemClickListener The object to receive invokations. + * @return This Item so additional setters can be called. + */ + MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener); + + @Override + MenuItem setShortcut(char numericChar, char alphaChar); + + @Override + MenuItem setTitle(CharSequence title); + + @Override + MenuItem setTitle(int title); + + @Override + MenuItem setTitleCondensed(CharSequence title); + + @Override + MenuItem setVisible(boolean visible); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompat.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompat.java new file mode 100644 index 00000000..3e5e13e1 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompat.java @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.MotionEvent; + +/** + * Helper for accessing newer features in MotionEvent. + */ +public class MotionEventCompat { + /** + * Interface for the full API. + */ + interface MotionEventVersionImpl { + public int findPointerIndex(MotionEvent event, int pointerId); + public int getPointerId(MotionEvent event, int pointerIndex); + public float getX(MotionEvent event, int pointerIndex); + public float getY(MotionEvent event, int pointerIndex); + } + + /** + * Interface implementation that doesn't use anything about v4 APIs. + */ + static class BaseMotionEventVersionImpl implements MotionEventVersionImpl { + @Override + public int findPointerIndex(MotionEvent event, int pointerId) { + return -1; + } + @Override + public int getPointerId(MotionEvent event, int pointerIndex) { + return -1; + } + @Override + public float getX(MotionEvent event, int pointerIndex) { + return event.getX(); + } + @Override + public float getY(MotionEvent event, int pointerIndex) { + return event.getY(); + } + } + + /** + * Interface implementation for devices with at least v11 APIs. + */ + static class EclairMotionEventVersionImpl implements MotionEventVersionImpl { + @Override + public int findPointerIndex(MotionEvent event, int pointerId) { + return MotionEventCompatEclair.findPointerIndex(event, pointerId); + } + @Override + public int getPointerId(MotionEvent event, int pointerIndex) { + return MotionEventCompatEclair.getPointerId(event, pointerIndex); + } + @Override + public float getX(MotionEvent event, int pointerIndex) { + return MotionEventCompatEclair.getX(event, pointerIndex); + } + @Override + public float getY(MotionEvent event, int pointerIndex) { + return MotionEventCompatEclair.getY(event, pointerIndex); + } + } + + /** + * Select the correct implementation to use for the current platform. + */ + static final MotionEventVersionImpl IMPL; + static { + if (android.os.Build.VERSION.SDK_INT >= 5) { + IMPL = new EclairMotionEventVersionImpl(); + } else { + IMPL = new BaseMotionEventVersionImpl(); + } + } + + // ------------------------------------------------------------------- + + /** + * Synonym for {@link MotionEvent#ACTION_MASK}. + */ + public static final int ACTION_MASK = 0xff; + + /** + * Synonym for {@link MotionEvent#ACTION_POINTER_DOWN}. + */ + public static final int ACTION_POINTER_DOWN = 5; + + /** + * Synonym for {@link MotionEvent#ACTION_POINTER_UP}. + */ + public static final int ACTION_POINTER_UP = 6; + + /** + * Synonym for {@link MotionEvent#ACTION_HOVER_MOVE}. + */ + public static final int ACTION_HOVER_MOVE = 7; + + /** + * Synonym for {@link MotionEvent#ACTION_SCROLL}. + */ + public static final int ACTION_SCROLL = 8; + + /** + * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_MASK}. + */ + public static final int ACTION_POINTER_INDEX_MASK = 0xff00; + + /** + * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_SHIFT}. + */ + public static final int ACTION_POINTER_INDEX_SHIFT = 8; + + /** + * Call {@link MotionEvent#getAction}, returning only the {@link #ACTION_MASK} + * portion. + */ + public static int getActionMasked(MotionEvent event) { + return event.getAction() & ACTION_MASK; + } + + /** + * Call {@link MotionEvent#getAction}, returning only the pointer index + * portion + */ + public static int getActionIndex(MotionEvent event) { + return (event.getAction() & ACTION_POINTER_INDEX_MASK) + >> ACTION_POINTER_INDEX_SHIFT; + } + + /** + * Call {@link MotionEvent#findPointerIndex(int)}. + * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, + * does nothing and returns -1. + */ + public static int findPointerIndex(MotionEvent event, int pointerId) { + return IMPL.findPointerIndex(event, pointerId); + } + + /** + * Call {@link MotionEvent#getPointerId(int)}. + * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, + * {@link IndexOutOfBoundsException} is thrown. + */ + public static int getPointerId(MotionEvent event, int pointerIndex) { + return IMPL.getPointerId(event, pointerIndex); + } + + /** + * Call {@link MotionEvent#getX(int)}. + * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, + * {@link IndexOutOfBoundsException} is thrown. + */ + public static float getX(MotionEvent event, int pointerIndex) { + return IMPL.getX(event, pointerIndex); + } + + /** + * Call {@link MotionEvent#getY(int)}. + * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, + * {@link IndexOutOfBoundsException} is thrown. + */ + public static float getY(MotionEvent event, int pointerIndex) { + return IMPL.getY(event, pointerIndex); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompatEclair.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompatEclair.java new file mode 100644 index 00000000..dedb1d1d --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/MotionEventCompatEclair.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.MotionEvent; + +/** + * Implementation of motion event compatibility that can call Eclair APIs. + */ +class MotionEventCompatEclair { + public static int findPointerIndex(MotionEvent event, int pointerId) { + return event.findPointerIndex(pointerId); + } + public static int getPointerId(MotionEvent event, int pointerIndex) { + return event.getPointerId(pointerIndex); + } + public static float getX(MotionEvent event, int pointerIndex) { + return event.getX(pointerIndex); + } + public static float getY(MotionEvent event, int pointerIndex) { + return event.getY(pointerIndex); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/PagerAdapter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/PagerAdapter.java new file mode 100644 index 00000000..5b2e8a5a --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/PagerAdapter.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.os.Parcelable; +import android.view.View; + +/** + * Base class providing the adapter to populate pages inside of + * a {@link ViewPager}. You will most likely want to use a more + * specific implementation of this, such as + * {@link android.support.v4.app.FragmentPagerAdapter} or + * {@link android.support.v4.app.FragmentStatePagerAdapter}. + */ +public abstract class PagerAdapter { + private DataSetObserver mObserver; + + public static final int POSITION_UNCHANGED = -1; + public static final int POSITION_NONE = -2; + + /** + * Used to watch for changes within the adapter. + */ + interface DataSetObserver { + public void onDataSetChanged(); + } + + /** + * Return the number of views available. + */ + public abstract int getCount(); + + /** + * Called when a change in the shown pages is going to start being made. + * @param container The containing View which is displaying this adapter's + * page views. + */ + public abstract void startUpdate(View container); + + /** + * Create the page for the given position. The adapter is responsible + * for adding the view to the container given here, although it only + * must ensure this is done by the time it returns from + * {@link #finishUpdate()}. + * + * @param container The containing View in which the page will be shown. + * @param position The page position to be instantiated. + * @return Returns an Object representing the new page. This does not + * need to be a View, but can be some other container of the page. + */ + public abstract Object instantiateItem(View container, int position); + + /** + * Remove a page for the given position. The adapter is responsible + * for removing the view from its container, although it only must ensure + * this is done by the time it returns from {@link #finishUpdate()}. + * + * @param container The containing View from which the page will be removed. + * @param position The page position to be removed. + * @param object The same object that was returned by + * {@link #instantiateItem(View, int)}. + */ + public abstract void destroyItem(View container, int position, Object object); + + /** + * Notification for when an item has been selected in the associated pager. + * This can be used to update the state of the item or activity based on which + * item is currently selected. + * + * @param position The selected page position. + * @param object The object of the selected page. + */ + public void onItemSelected(int position, Object object) { + //For rent. Call 1-800-VIEW-PGR. + } + + /** + * Called when the a change in the shown pages has been completed. At this + * point you must ensure that all of the pages have actually been added or + * removed from the container as appropriate. + * @param container The containing View which is displaying this adapter's + * page views. + */ + public abstract void finishUpdate(View container); + + public abstract boolean isViewFromObject(View view, Object object); + + public abstract Parcelable saveState(); + + public abstract void restoreState(Parcelable state, ClassLoader loader); + + /** + * Called when the host view is attempting to determine if an item's position + * has changed. Returns {@link #POSITION_UNCHANGED} if the position of the given + * item has not changed or {@link #POSITION_NONE} if the item is no longer present + * in the adapter. + * + *

The default implementation assumes that items will never + * change position and always returns {@link #POSITION_UNCHANGED}. + * + * @param object Object representing an item, previously returned by a call to + * {@link #instantiateItem(View, int)}. + * @return object's new position index from [0, {@link #getCount()}), + * {@link #POSITION_UNCHANGED} if the object's position has not changed, + * or {@link #POSITION_NONE} if the item is no longer present. + */ + public int getItemPosition(Object object) { + return POSITION_UNCHANGED; + } + + /** + * This method should be called by the application if the data backing this adapter has changed + * and associated views should update. + */ + public void notifyDataSetChanged() { + if (mObserver != null) { + mObserver.onDataSetChanged(); + } + } + + void setDataSetObserver(DataSetObserver observer) { + mObserver = observer; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/SubMenu.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/SubMenu.java new file mode 100644 index 00000000..724f0ff5 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/SubMenu.java @@ -0,0 +1,30 @@ +package android.support.v4.view; + +import android.graphics.drawable.Drawable; +import android.view.View; + +public interface SubMenu extends android.view.SubMenu { + @Override + MenuItem getItem(); + + @Override + SubMenu setHeaderIcon(Drawable icon); + + @Override + SubMenu setHeaderIcon(int iconRes); + + @Override + SubMenu setHeaderTitle(CharSequence title); + + @Override + SubMenu setHeaderTitle(int titleRes); + + @Override + SubMenu setHeaderView(View view); + + @Override + SubMenu setIcon(Drawable icon); + + @Override + SubMenu setIcon(int iconRes); +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompat.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompat.java new file mode 100644 index 00000000..8c874906 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompat.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.VelocityTracker; + +/** + * Helper for accessing newer features in VelocityTracker. + */ +public class VelocityTrackerCompat { + /** + * Interface for the full API. + */ + interface VelocityTrackerVersionImpl { + public float getXVelocity(VelocityTracker tracker, int pointerId); + public float getYVelocity(VelocityTracker tracker, int pointerId); + } + + /** + * Interface implementation that doesn't use anything about v4 APIs. + */ + static class BaseVelocityTrackerVersionImpl implements VelocityTrackerVersionImpl { + @Override + public float getXVelocity(VelocityTracker tracker, int pointerId) { + return tracker.getXVelocity(); + } + @Override + public float getYVelocity(VelocityTracker tracker, int pointerId) { + return tracker.getYVelocity(); + } + } + + /** + * Interface implementation for devices with at least v11 APIs. + */ + static class HoneycombVelocityTrackerVersionImpl implements VelocityTrackerVersionImpl { + @Override + public float getXVelocity(VelocityTracker tracker, int pointerId) { + return VelocityTrackerCompatHoneycomb.getXVelocity(tracker, pointerId); + } + @Override + public float getYVelocity(VelocityTracker tracker, int pointerId) { + return VelocityTrackerCompatHoneycomb.getYVelocity(tracker, pointerId); + } + } + + /** + * Select the correct implementation to use for the current platform. + */ + static final VelocityTrackerVersionImpl IMPL; + static { + if (android.os.Build.VERSION.SDK_INT >= 11) { + IMPL = new HoneycombVelocityTrackerVersionImpl(); + } else { + IMPL = new BaseVelocityTrackerVersionImpl(); + } + } + + // ------------------------------------------------------------------- + + /** + * Call {@link VelocityTracker#getXVelocity(int)}. + * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, + * returns {@link VelocityTracker#getXVelocity()}. + */ + public static float getXVelocity(VelocityTracker tracker, int pointerId) { + return IMPL.getXVelocity(tracker, pointerId); + } + + /** + * Call {@link VelocityTracker#getYVelocity(int)}. + * If running on a pre-{@android.os.Build.VERSION_CODES#HONEYCOMB} device, + * returns {@link VelocityTracker#getYVelocity()}. + */ + public static float getYVelocity(VelocityTracker tracker, int pointerId) { + return IMPL.getYVelocity(tracker, pointerId); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompatHoneycomb.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompatHoneycomb.java new file mode 100644 index 00000000..4f9d326c --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/VelocityTrackerCompatHoneycomb.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.VelocityTracker; + +/** + * Implementation of velocity tracker compatibility that can call Honeycomb APIs. + */ +class VelocityTrackerCompatHoneycomb { + public static float getXVelocity(VelocityTracker tracker, int pointerId) { + return tracker.getXVelocity(pointerId); + } + public static float getYVelocity(VelocityTracker tracker, int pointerId) { + return tracker.getYVelocity(pointerId); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompat.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompat.java new file mode 100644 index 00000000..14446621 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompat.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.ViewConfiguration; + +/** + * Helper for accessing newer features in ViewConfiguration. + */ +public class ViewConfigurationCompat { + /** + * Interface for the full API. + */ + interface ViewConfigurationVersionImpl { + public int getScaledPagingTouchSlop(ViewConfiguration config); + } + + /** + * Interface implementation that doesn't use anything about v4 APIs. + */ + static class BaseViewConfigurationVersionImpl implements ViewConfigurationVersionImpl { + @Override + public int getScaledPagingTouchSlop(ViewConfiguration config) { + return config.getScaledTouchSlop(); + } + } + + /** + * Interface implementation for devices with at least v11 APIs. + */ + static class FroyoViewConfigurationVersionImpl implements ViewConfigurationVersionImpl { + @Override + public int getScaledPagingTouchSlop(ViewConfiguration config) { + return ViewConfigurationCompatFroyo.getScaledPagingTouchSlop(config); + } + } + + /** + * Select the correct implementation to use for the current platform. + */ + static final ViewConfigurationVersionImpl IMPL; + static { + if (android.os.Build.VERSION.SDK_INT >= 11) { + IMPL = new FroyoViewConfigurationVersionImpl(); + } else { + IMPL = new BaseViewConfigurationVersionImpl(); + } + } + + // ------------------------------------------------------------------- + + /** + * Call {@link ViewConfiguration#getScaledPagingTouchSlop()}. + * If running on a pre-{@android.os.Build.VERSION_CODES#FROYO} device, + * returns {@link ViewConfiguration#getScaledTouchSlop()}. + */ + public static int getScaledPagingTouchSlop(ViewConfiguration config) { + return IMPL.getScaledPagingTouchSlop(config); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompatFroyo.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompatFroyo.java new file mode 100644 index 00000000..e97a2a2e --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewConfigurationCompatFroyo.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.view.ViewConfiguration; + +/** + * Implementation of menu compatibility that can call Honeycomb APIs. + */ +class ViewConfigurationCompatFroyo { + public static int getScaledPagingTouchSlop(ViewConfiguration config) { + return config.getScaledPagingTouchSlop(); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewPager.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewPager.java new file mode 100644 index 00000000..9d69975a --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/ViewPager.java @@ -0,0 +1,996 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; + +import android.content.Context; +import android.support.v4.os.ParcelableCompat; +import android.support.v4.os.ParcelableCompatCreatorCallbacks; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.widget.Scroller; + +import java.util.ArrayList; + +/** + * Layout manager that allows the user to flip left and right + * through pages of data. You supply an implementation of a + * {@link PagerAdapter} to generate the pages that the view shows. + * + *

Note this class is currently under early design and + * development. The API will likely change in later updates of + * the compatibility library, requiring changes to the source code + * of apps when they are compiled against the newer version.

+ */ +public class ViewPager extends ViewGroup { + private static final String TAG = "ViewPager"; + private static final boolean DEBUG = false; + + private static final boolean USE_CACHE = false; + + static class ItemInfo { + Object object; + int position; + boolean scrolling; + } + + private final ArrayList mItems = new ArrayList(); + + private PagerAdapter mAdapter; + private int mCurItem; // Index of currently displayed page. + private int mRestoredCurItem = -1; + private Parcelable mRestoredAdapterState = null; + private ClassLoader mRestoredClassLoader = null; + private Scroller mScroller; + private PagerAdapter.DataSetObserver mObserver; + + private int mChildWidthMeasureSpec; + private int mChildHeightMeasureSpec; + private boolean mInLayout; + + private boolean mScrollingCacheEnabled; + + private boolean mPopulatePending; + private boolean mScrolling; + + private boolean mIsBeingDragged; + private boolean mIsUnableToDrag; + private int mTouchSlop; + private float mInitialMotionX; + /** + * Position of the last motion event. + */ + private float mLastMotionX; + private float mLastMotionY; + /** + * ID of the active pointer. This is used to retain consistency during + * drags/flings if multiple pointers are used. + */ + private int mActivePointerId = INVALID_POINTER; + /** + * Sentinel value for no current active pointer. + * Used by {@link #mActivePointerId}. + */ + private static final int INVALID_POINTER = -1; + + /** + * Determines speed during touch scrolling + */ + private VelocityTracker mVelocityTracker; + private int mMinimumVelocity; + private int mMaximumVelocity; + + private OnPageChangeListener mOnPageChangeListener; + + /** + * Indicates that the pager is in an idle, settled state. The current page + * is fully in view and no animation is in progress. + */ + public static final int SCROLL_STATE_IDLE = 0; + + /** + * Indicates that the pager is currently being dragged by the user. + */ + public static final int SCROLL_STATE_DRAGGING = 1; + + /** + * Indicates that the pager is in the process of settling to a final position. + */ + public static final int SCROLL_STATE_SETTLING = 2; + + private int mScrollState = SCROLL_STATE_IDLE; + + /** + * Callback interface for responding to changing state of the selected page. + */ + public interface OnPageChangeListener { + + /** + * This method will be invoked when the current page is scrolled, either as part + * of a programmatically initiated smooth scroll or a user initiated touch scroll. + * + * @param position Position index of the first page currently being displayed. + * Page position+1 will be visible if positionOffset is nonzero. + * @param positionOffset Value from [0, 1) indicating the offset from the page at position. + * @param positionOffsetPixels Value in pixels indicating the offset from position. + */ + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels); + + /** + * This method will be invoked when a new page becomes selected. Animation is not + * necessarily complete. + * + * @param position Position index of the new selected page. + */ + public void onPageSelected(int position); + + /** + * Called when the scroll state changes. Useful for discovering when the user + * begins dragging, when the pager is automatically settling to the current page, + * or when it is fully stopped/idle. + * + * @param state The new scroll state. + * @see ViewPager#SCROLL_STATE_IDLE + * @see ViewPager#SCROLL_STATE_DRAGGING + * @see ViewPager#SCROLL_STATE_SETTLING + */ + public void onPageScrollStateChanged(int state); + } + + /** + * Simple implementation of the {@link OnPageChangeListener} interface with stub + * implementations of each method. Extend this if you do not intend to override + * every method of {@link OnPageChangeListener}. + */ + public static class SimpleOnPageChangeListener implements OnPageChangeListener { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + // This space for rent + } + + @Override + public void onPageSelected(int position) { + // This space for rent + } + + @Override + public void onPageScrollStateChanged(int state) { + // This space for rent + } + } + + public ViewPager(Context context) { + super(context); + initViewPager(); + } + + public ViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + initViewPager(); + } + + void initViewPager() { + setWillNotDraw(false); + mScroller = new Scroller(getContext()); + final ViewConfiguration configuration = ViewConfiguration.get(getContext()); + mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); + mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); + mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + } + + private void setScrollState(int newState) { + if (mScrollState == newState) { + return; + } + + mScrollState = newState; + if (mOnPageChangeListener != null) { + mOnPageChangeListener.onPageScrollStateChanged(newState); + } + } + + public void setAdapter(PagerAdapter adapter) { + if (mAdapter != null) { + mAdapter.setDataSetObserver(null); + } + + mAdapter = adapter; + + if (mAdapter != null) { + if (mObserver == null) { + mObserver = new DataSetObserver(); + } + mAdapter.setDataSetObserver(mObserver); + mPopulatePending = false; + if (mRestoredCurItem >= 0) { + mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader); + setCurrentItemInternal(mRestoredCurItem, false, true); + mRestoredCurItem = -1; + mRestoredAdapterState = null; + mRestoredClassLoader = null; + } else { + populate(); + } + } + } + + public PagerAdapter getAdapter() { + return mAdapter; + } + + public void setCurrentItem(int item) { + mPopulatePending = false; + setCurrentItemInternal(item, true, false); + } + + void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) { + if (mAdapter == null || mAdapter.getCount() <= 0) { + setScrollingCacheEnabled(false); + return; + } + if (!always && mCurItem == item && mItems.size() != 0) { + setScrollingCacheEnabled(false); + return; + } + if (item < 0) { + item = 0; + } else if (item >= mAdapter.getCount()) { + item = mAdapter.getCount() - 1; + } + if (item > (mCurItem+1) || item < (mCurItem-1)) { + // We are doing a jump by more than one page. To avoid + // glitches, we want to keep all current pages in the view + // until the scroll ends. + for (int i=0; i 0; + int newCurrItem = -1; + + for (int i = 0; i < mItems.size(); i++) { + final ItemInfo ii = mItems.get(i); + final int newPos = mAdapter.getItemPosition(ii.object); + + if (newPos == PagerAdapter.POSITION_UNCHANGED) { + continue; + } + + if (newPos == PagerAdapter.POSITION_NONE) { + mItems.remove(i); + i--; + mAdapter.destroyItem(this, ii.position, ii.object); + needPopulate = true; + + if (mCurItem == ii.position) { + // Keep the current item in the valid range + newCurrItem = Math.max(0, Math.min(mCurItem, mAdapter.getCount() - 1)); + } + continue; + } + + if (ii.position != newPos) { + if (ii.position == mCurItem) { + // Our current item changed position. Follow it. + newCurrItem = newPos; + } + + ii.position = newPos; + needPopulate = true; + } + } + + if (newCurrItem >= 0) { + // TODO This currently causes a jump. + setCurrentItemInternal(newCurrItem, false, true); + needPopulate = true; + } + if (needPopulate) { + populate(); + requestLayout(); + } + } + + void populate() { + if (mAdapter == null) { + return; + } + + // Bail now if we are waiting to populate. This is to hold off + // on creating views from the time the user releases their finger to + // fling to a new position until we have finished the scroll to + // that position, avoiding glitches from happening at that point. + if (mPopulatePending) { + if (DEBUG) Log.i(TAG, "populate is pending, skipping for now..."); + return; + } + + // Also, don't populate until we are attached to a window. This is to + // avoid trying to populate before we have restored our view hierarchy + // state and conflicting with what is restored. + if (getWindowToken() == null) { + return; + } + + mAdapter.startUpdate(this); + + final int startPos = mCurItem > 0 ? mCurItem - 1 : mCurItem; + final int N = mAdapter.getCount(); + final int endPos = mCurItem < (N-1) ? mCurItem+1 : N-1; + + if (DEBUG) Log.v(TAG, "populating: startPos=" + startPos + " endPos=" + endPos); + + // Add and remove pages in the existing list. + int lastPos = -1; + for (int i=0; i endPos) && !ii.scrolling) { + if (DEBUG) Log.i(TAG, "removing: " + ii.position + " @ " + i); + mItems.remove(i); + i--; + mAdapter.destroyItem(this, ii.position, ii.object); + } else if (lastPos < endPos && ii.position > startPos) { + // The next item is outside of our range, but we have a gap + // between it and the last item where we want to have a page + // shown. Fill in the gap. + lastPos++; + if (lastPos < startPos) { + lastPos = startPos; + } + while (lastPos <= endPos && lastPos < ii.position) { + if (DEBUG) Log.i(TAG, "inserting: " + lastPos + " @ " + i); + addNewItem(lastPos, i); + lastPos++; + i++; + } + } + lastPos = ii.position; + } + + // Add any new pages we need at the end. + lastPos = mItems.size() > 0 ? mItems.get(mItems.size()-1).position : -1; + boolean first = (lastPos == -1); + if (lastPos < endPos) { + lastPos++; + lastPos = lastPos > startPos ? lastPos : startPos; + while (lastPos <= endPos) { + if (DEBUG) Log.i(TAG, "appending: " + lastPos); + addNewItem(lastPos, -1); + if (first && (lastPos == mCurItem)) { + //Creating first item for the first time + mAdapter.onItemSelected(mCurItem, mItems.get(mItems.size() - 1).object); + first = false; + } + lastPos++; + } + } + + if (DEBUG) { + Log.i(TAG, "Current page list:"); + for (int i=0; i CREATOR + = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks() { + @Override + public SavedState createFromParcel(Parcel in, ClassLoader loader) { + return new SavedState(in, loader); + } + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }); + + SavedState(Parcel in, ClassLoader loader) { + super(in); + if (loader == null) { + loader = getClass().getClassLoader(); + } + position = in.readInt(); + adapterState = in.readParcelable(loader); + this.loader = loader; + } + } + + @Override + public Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + SavedState ss = new SavedState(superState); + ss.position = mCurItem; + ss.adapterState = mAdapter.saveState(); + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (!(state instanceof SavedState)) { + super.onRestoreInstanceState(state); + return; + } + + SavedState ss = (SavedState)state; + super.onRestoreInstanceState(ss.getSuperState()); + + if (mAdapter != null) { + mAdapter.restoreState(ss.adapterState, ss.loader); + setCurrentItemInternal(ss.position, false, true); + } else { + mRestoredCurItem = ss.position; + mRestoredAdapterState = ss.adapterState; + mRestoredClassLoader = ss.loader; + } + } + + @Override + public void addView(View child, int index, LayoutParams params) { + if (mInLayout) { + addViewInLayout(child, index, params); + child.measure(mChildWidthMeasureSpec, mChildHeightMeasureSpec); + } else { + super.addView(child, index, params); + } + + if (USE_CACHE) { + if (child.getVisibility() != GONE) { + child.setDrawingCacheEnabled(mScrollingCacheEnabled); + } else { + child.setDrawingCacheEnabled(false); + } + } + } + + ItemInfo infoForChild(View child) { + for (int i=0; i Build.VERSION_CODES.DONUT) { + // If we don't have a valid id, the touch down wasn't on content. + break; + } + + final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId); + final float x = MotionEventCompat.getX(ev, pointerIndex); + final float dx = x - mLastMotionX; + final float xDiff = Math.abs(dx); + final float y = MotionEventCompat.getY(ev, pointerIndex); + final float yDiff = Math.abs(y - mLastMotionY); + if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff); + + if (xDiff > mTouchSlop && xDiff > yDiff) { + if (DEBUG) Log.v(TAG, "Starting drag!"); + mIsBeingDragged = true; + setScrollState(SCROLL_STATE_DRAGGING); + mLastMotionX = x; + setScrollingCacheEnabled(true); + } else { + if (yDiff > mTouchSlop) { + // The finger has moved enough in the vertical + // direction to be counted as a drag... abort + // any attempt to drag horizontally, to work correctly + // with children that have scrolling containers. + if (DEBUG) Log.v(TAG, "Starting unable to drag!"); + mIsUnableToDrag = true; + } + } + break; + } + + case MotionEvent.ACTION_DOWN: { + /* + * Remember location of down touch. + * ACTION_DOWN always refers to pointer index 0. + */ + mLastMotionX = mInitialMotionX = ev.getX(); + mLastMotionY = ev.getY(); + mActivePointerId = MotionEventCompat.getPointerId(ev, 0); + + if (mScrollState == SCROLL_STATE_SETTLING) { + // Let the user 'catch' the pager as it animates. + mIsBeingDragged = true; + mIsUnableToDrag = false; + setScrollState(SCROLL_STATE_DRAGGING); + } else { + completeScroll(); + mIsBeingDragged = false; + mIsUnableToDrag = false; + } + + if (DEBUG) Log.v(TAG, "Down at " + mLastMotionX + "," + mLastMotionY + + " mIsBeingDragged=" + mIsBeingDragged + + "mIsUnableToDrag=" + mIsUnableToDrag); + break; + } + + case MotionEventCompat.ACTION_POINTER_UP: + onSecondaryPointerUp(ev); + break; + } + + /* + * The only time we want to intercept motion events is if we are in the + * drag mode. + */ + return mIsBeingDragged; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + + if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) { + // Don't handle edge touches immediately -- they may actually belong to one of our + // descendants. + return false; + } + + if (mAdapter == null || mAdapter.getCount() == 0) { + // Nothing to present or scroll; nothing to touch. + return false; + } + + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + mVelocityTracker.addMovement(ev); + + final int action = ev.getAction(); + + switch (action & MotionEventCompat.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: { + /* + * If being flinged and user touches, stop the fling. isFinished + * will be false if being flinged. + */ + completeScroll(); + + // Remember where the motion event started + mLastMotionX = mInitialMotionX = ev.getX(); + mActivePointerId = MotionEventCompat.getPointerId(ev, 0); + break; + } + case MotionEvent.ACTION_MOVE: + if (!mIsBeingDragged) { + final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId); + final float x = MotionEventCompat.getX(ev, pointerIndex); + final float xDiff = Math.abs(x - mLastMotionX); + final float y = MotionEventCompat.getY(ev, pointerIndex); + final float yDiff = Math.abs(y - mLastMotionY); + if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff); + if (xDiff > mTouchSlop && xDiff > yDiff) { + if (DEBUG) Log.v(TAG, "Starting drag!"); + mIsBeingDragged = true; + mLastMotionX = x; + setScrollState(SCROLL_STATE_DRAGGING); + setScrollingCacheEnabled(true); + } + } + if (mIsBeingDragged) { + // Scroll to follow the motion event + final int activePointerIndex = MotionEventCompat.findPointerIndex( + ev, mActivePointerId); + final float x = MotionEventCompat.getX(ev, activePointerIndex); + final float deltaX = mLastMotionX - x; + mLastMotionX = x; + float scrollX = getScrollX() + deltaX; + final int width = getWidth(); + + final float leftBound = Math.max(0, (mCurItem - 1) * width); + final float rightBound = + Math.min(mCurItem + 1, mAdapter.getCount() - 1) * width; + if (scrollX < leftBound) { + scrollX = leftBound; + } else if (scrollX > rightBound) { + scrollX = rightBound; + } + // Don't lose the rounded component + mLastMotionX += scrollX - (int) scrollX; + scrollTo((int) scrollX, getScrollY()); + if (mOnPageChangeListener != null) { + final int position = (int) scrollX / width; + final int positionOffsetPixels = (int) scrollX % width; + final float positionOffset = (float) positionOffsetPixels / width; + mOnPageChangeListener.onPageScrolled(position, positionOffset, + positionOffsetPixels); + } + } + break; + case MotionEvent.ACTION_UP: + if (mIsBeingDragged) { + final VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + int initialVelocity = (int)VelocityTrackerCompat.getYVelocity( + velocityTracker, mActivePointerId); + mPopulatePending = true; + if ((Math.abs(initialVelocity) > mMinimumVelocity) + || Math.abs(mInitialMotionX-mLastMotionX) >= (getWidth()/3)) { + if (mLastMotionX > mInitialMotionX) { + setCurrentItemInternal(mCurItem-1, true, true); + } else { + setCurrentItemInternal(mCurItem+1, true, true); + } + } else { + setCurrentItemInternal(mCurItem, true, true); + } + + mActivePointerId = INVALID_POINTER; + endDrag(); + } + break; + case MotionEvent.ACTION_CANCEL: + if (mIsBeingDragged) { + setCurrentItemInternal(mCurItem, true, true); + mActivePointerId = INVALID_POINTER; + endDrag(); + } + break; + case MotionEventCompat.ACTION_POINTER_DOWN: { + final int index = MotionEventCompat.getActionIndex(ev); + final float x = MotionEventCompat.getX(ev, index); + mLastMotionX = x; + mActivePointerId = MotionEventCompat.getPointerId(ev, index); + break; + } + case MotionEventCompat.ACTION_POINTER_UP: + onSecondaryPointerUp(ev); + mLastMotionX = MotionEventCompat.getX(ev, + MotionEventCompat.findPointerIndex(ev, mActivePointerId)); + break; + } + return true; + } + + private void onSecondaryPointerUp(MotionEvent ev) { + final int pointerIndex = MotionEventCompat.getActionIndex(ev); + final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); + if (pointerId == mActivePointerId) { + // This was our active pointer going up. Choose a new + // active pointer and adjust accordingly. + final int newPointerIndex = pointerIndex == 0 ? 1 : 0; + mLastMotionX = MotionEventCompat.getX(ev, newPointerIndex); + mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); + if (mVelocityTracker != null) { + mVelocityTracker.clear(); + } + } + } + + private void endDrag() { + mIsBeingDragged = false; + mIsUnableToDrag = false; + + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + } + + private void setScrollingCacheEnabled(boolean enabled) { + if (mScrollingCacheEnabled != enabled) { + mScrollingCacheEnabled = enabled; + if (USE_CACHE) { + final int size = getChildCount(); + for (int i = 0; i < size; ++i) { + final View child = getChildAt(i); + if (child.getVisibility() != GONE) { + child.setDrawingCacheEnabled(enabled); + } + } + } + } + } + + private class DataSetObserver implements PagerAdapter.DataSetObserver { + @Override + public void onDataSetChanged() { + dataSetChanged(); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Window.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Window.java new file mode 100644 index 00000000..f2a6400e --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/view/Window.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.view; + +import android.content.Context; + +/** + *

Abstract base class for a top-level window look and behavior policy. An + * instance of this class should be used as the top-level view added to the + * window manager. It provides standard UI policies such as a background, title + * area, default key processing, etc.

+ * + *

The only existing implementation of this abstract class is + * android.policy.PhoneWindow, which you should instantiate when needing a + * Window. Eventually that class will be refactored and a factory method added + * for creating Window instances without knowing about a particular + * implementation.

+ */ +public abstract class Window extends android.view.Window { + /* + * We use long values so that we can intercept the call to + * requestWindowFeature in our Activity. + */ + + /** + * Flag for enabling the Action Bar. This is enabled by default for some + * devices. The Action Bar replaces the title bar and provides an alternate + * location for an on-screen menu button on some devices. + */ + public static final long FEATURE_ACTION_BAR = android.view.Window.FEATURE_ACTION_BAR; + + /** + * Enable the pre-3.0 action bar implementation to honor the 'withText' + * attribute on menu items regardless of display resolution and/or density. + */ + //Hopefully the native Window.FEATURE_XXX numbering won't get this high anytime soon. + public static final long FEATURE_ACTION_BAR_ITEM_TEXT = 31; + + /** + * Flag for requesting an Action Bar that overlays window content. Normally + * an Action Bar will sit in the space above window content, but if this + * feature is requested along with {@link #FEATURE_ACTION_BAR} it will be + * layered over the window content itself. This is useful if you would like + * your app to have more control over how the Action Bar is displayed, such + * as letting application content scroll beneath an Action Bar with a + * transparent background or otherwise displaying a transparent/translucent + * Action Bar over application content. + */ + public static final long FEATURE_ACTION_BAR_OVERLAY = android.view.Window.FEATURE_ACTION_BAR_OVERLAY; + + /** + * Flag for specifying the behavior of action modes when an Action Bar is + * not present. If overlay is enabled, the action mode UI will be allowed to + * cover existing window content. + */ + public static final long FEATURE_ACTION_MODE_OVERLAY = android.view.Window.FEATURE_ACTION_MODE_OVERLAY; + + /** + * Flag for indeterminate progress . + */ + public static final long FEATURE_INDETERMINATE_PROGRESS = android.view.Window.FEATURE_INDETERMINATE_PROGRESS; + + + + /** + * Create a new instance for a context. + * + * @param context Context. + */ + public Window(Context context) { + super(context); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorAdapter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorAdapter.java new file mode 100644 index 00000000..9c6b8184 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorAdapter.java @@ -0,0 +1,484 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.widget; + +import android.content.Context; +import android.database.ContentObserver; +import android.database.Cursor; +import android.database.DataSetObserver; +import android.os.Handler; +import android.util.Config; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.Filter; +import android.widget.FilterQueryProvider; +import android.widget.Filterable; + +/** + * Static library support version of the framework's {@link android.widget.CursorAdapter}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public abstract class CursorAdapter extends BaseAdapter implements Filterable, + CursorFilter.CursorFilterClient { + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected boolean mDataValid; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected boolean mAutoRequery; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected Cursor mCursor; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected Context mContext; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected int mRowIDColumn; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected ChangeObserver mChangeObserver; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected DataSetObserver mDataSetObserver; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected CursorFilter mCursorFilter; + /** + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected FilterQueryProvider mFilterQueryProvider; + + /** + * If set the adapter will call requery() on the cursor whenever a content change + * notification is delivered. Implies {@link #FLAG_REGISTER_CONTENT_OBSERVER}. + * + * @deprecated This option is discouraged, as it results in Cursor queries + * being performed on the application's UI thread and thus can cause poor + * responsiveness or even Application Not Responding errors. As an alternative, + * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}. + */ + @Deprecated + public static final int FLAG_AUTO_REQUERY = 0x01; + + /** + * If set the adapter will register a content observer on the cursor and will call + * {@link #onContentChanged()} when a notification comes in. Be careful when + * using this flag: you will need to unset the current Cursor from the adapter + * to avoid leaks due to its registered observers. This flag is not needed + * when using a CursorAdapter with a + * {@link android.content.CursorLoader}. + */ + public static final int FLAG_REGISTER_CONTENT_OBSERVER = 0x02; + + /** + * Constructor that always enables auto-requery. + * + * @deprecated This option is discouraged, as it results in Cursor queries + * being performed on the application's UI thread and thus can cause poor + * responsiveness or even Application Not Responding errors. As an alternative, + * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}. + * + * @param c The cursor from which to get the data. + * @param context The context + */ + @Deprecated + public CursorAdapter(Context context, Cursor c) { + init(context, c, FLAG_AUTO_REQUERY); + } + + /** + * Constructor that allows control over auto-requery. It is recommended + * you not use this, but instead {@link #CursorAdapter(Context, Cursor, int)}. + * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER} + * will always be set. + * + * @param c The cursor from which to get the data. + * @param context The context + * @param autoRequery If true the adapter will call requery() on the + * cursor whenever it changes so the most recent + * data is always displayed. Using true here is discouraged. + */ + public CursorAdapter(Context context, Cursor c, boolean autoRequery) { + init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER); + } + + /** + * Recommended constructor. + * + * @param c The cursor from which to get the data. + * @param context The context + * @param flags Flags used to determine the behavior of the adapter; may + * be any combination of {@link #FLAG_AUTO_REQUERY} and + * {@link #FLAG_REGISTER_CONTENT_OBSERVER}. + */ + public CursorAdapter(Context context, Cursor c, int flags) { + init(context, c, flags); + } + + /** + * @deprecated Don't use this, use the normal constructor. This will + * be removed in the future. + */ + @Deprecated + protected void init(Context context, Cursor c, boolean autoRequery) { + init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER); + } + + void init(Context context, Cursor c, int flags) { + if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) { + flags |= FLAG_REGISTER_CONTENT_OBSERVER; + mAutoRequery = true; + } else { + mAutoRequery = false; + } + boolean cursorPresent = c != null; + mCursor = c; + mDataValid = cursorPresent; + mContext = context; + mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1; + if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) { + mChangeObserver = new ChangeObserver(); + mDataSetObserver = new MyDataSetObserver(); + } else { + mChangeObserver = null; + mDataSetObserver = null; + } + + if (cursorPresent) { + if (mChangeObserver != null) c.registerContentObserver(mChangeObserver); + if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver); + } + } + + /** + * Returns the cursor. + * @return the cursor. + */ + public Cursor getCursor() { + return mCursor; + } + + /** + * @see android.widget.ListAdapter#getCount() + */ + public int getCount() { + if (mDataValid && mCursor != null) { + return mCursor.getCount(); + } else { + return 0; + } + } + + /** + * @see android.widget.ListAdapter#getItem(int) + */ + public Object getItem(int position) { + if (mDataValid && mCursor != null) { + mCursor.moveToPosition(position); + return mCursor; + } else { + return null; + } + } + + /** + * @see android.widget.ListAdapter#getItemId(int) + */ + public long getItemId(int position) { + if (mDataValid && mCursor != null) { + if (mCursor.moveToPosition(position)) { + return mCursor.getLong(mRowIDColumn); + } else { + return 0; + } + } else { + return 0; + } + } + + @Override + public boolean hasStableIds() { + return true; + } + + /** + * @see android.widget.ListAdapter#getView(int, View, ViewGroup) + */ + public View getView(int position, View convertView, ViewGroup parent) { + if (!mDataValid) { + throw new IllegalStateException("this should only be called when the cursor is valid"); + } + if (!mCursor.moveToPosition(position)) { + throw new IllegalStateException("couldn't move cursor to position " + position); + } + View v; + if (convertView == null) { + v = newView(mContext, mCursor, parent); + } else { + v = convertView; + } + bindView(v, mContext, mCursor); + return v; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + if (mDataValid) { + mCursor.moveToPosition(position); + View v; + if (convertView == null) { + v = newDropDownView(mContext, mCursor, parent); + } else { + v = convertView; + } + bindView(v, mContext, mCursor); + return v; + } else { + return null; + } + } + + /** + * Makes a new view to hold the data pointed to by cursor. + * @param context Interface to application's global information + * @param cursor The cursor from which to get the data. The cursor is already + * moved to the correct position. + * @param parent The parent to which the new view is attached to + * @return the newly created view. + */ + public abstract View newView(Context context, Cursor cursor, ViewGroup parent); + + /** + * Makes a new drop down view to hold the data pointed to by cursor. + * @param context Interface to application's global information + * @param cursor The cursor from which to get the data. The cursor is already + * moved to the correct position. + * @param parent The parent to which the new view is attached to + * @return the newly created view. + */ + public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) { + return newView(context, cursor, parent); + } + + /** + * Bind an existing view to the data pointed to by cursor + * @param view Existing view, returned earlier by newView + * @param context Interface to application's global information + * @param cursor The cursor from which to get the data. The cursor is already + * moved to the correct position. + */ + public abstract void bindView(View view, Context context, Cursor cursor); + + /** + * Change the underlying cursor to a new cursor. If there is an existing cursor it will be + * closed. + * + * @param cursor The new cursor to be used + */ + public void changeCursor(Cursor cursor) { + Cursor old = swapCursor(cursor); + if (old != null) { + old.close(); + } + } + + /** + * Swap in a new Cursor, returning the old Cursor. Unlike + * {@link #changeCursor(Cursor)}, the returned old Cursor is not + * closed. + * + * @param newCursor The new cursor to be used. + * @return Returns the previously set Cursor, or null if there wasa not one. + * If the given new Cursor is the same instance is the previously set + * Cursor, null is also returned. + */ + public Cursor swapCursor(Cursor newCursor) { + if (newCursor == mCursor) { + return null; + } + Cursor oldCursor = mCursor; + if (oldCursor != null) { + if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver); + if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver); + } + mCursor = newCursor; + if (newCursor != null) { + if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver); + if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver); + mRowIDColumn = newCursor.getColumnIndexOrThrow("_id"); + mDataValid = true; + // notify the observers about the new cursor + notifyDataSetChanged(); + } else { + mRowIDColumn = -1; + mDataValid = false; + // notify the observers about the lack of a data set + notifyDataSetInvalidated(); + } + return oldCursor; + } + + /** + *

Converts the cursor into a CharSequence. Subclasses should override this + * method to convert their results. The default implementation returns an + * empty String for null values or the default String representation of + * the value.

+ * + * @param cursor the cursor to convert to a CharSequence + * @return a CharSequence representing the value + */ + public CharSequence convertToString(Cursor cursor) { + return cursor == null ? "" : cursor.toString(); + } + + /** + * Runs a query with the specified constraint. This query is requested + * by the filter attached to this adapter. + * + * The query is provided by a + * {@link android.widget.FilterQueryProvider}. + * If no provider is specified, the current cursor is not filtered and returned. + * + * After this method returns the resulting cursor is passed to {@link #changeCursor(Cursor)} + * and the previous cursor is closed. + * + * This method is always executed on a background thread, not on the + * application's main thread (or UI thread.) + * + * Contract: when constraint is null or empty, the original results, + * prior to any filtering, must be returned. + * + * @param constraint the constraint with which the query must be filtered + * + * @return a Cursor representing the results of the new query + * + * @see #getFilter() + * @see #getFilterQueryProvider() + * @see #setFilterQueryProvider(android.widget.FilterQueryProvider) + */ + public Cursor runQueryOnBackgroundThread(CharSequence constraint) { + if (mFilterQueryProvider != null) { + return mFilterQueryProvider.runQuery(constraint); + } + + return mCursor; + } + + public Filter getFilter() { + if (mCursorFilter == null) { + mCursorFilter = new CursorFilter(this); + } + return mCursorFilter; + } + + /** + * Returns the query filter provider used for filtering. When the + * provider is null, no filtering occurs. + * + * @return the current filter query provider or null if it does not exist + * + * @see #setFilterQueryProvider(android.widget.FilterQueryProvider) + * @see #runQueryOnBackgroundThread(CharSequence) + */ + public FilterQueryProvider getFilterQueryProvider() { + return mFilterQueryProvider; + } + + /** + * Sets the query filter provider used to filter the current Cursor. + * The provider's + * {@link android.widget.FilterQueryProvider#runQuery(CharSequence)} + * method is invoked when filtering is requested by a client of + * this adapter. + * + * @param filterQueryProvider the filter query provider or null to remove it + * + * @see #getFilterQueryProvider() + * @see #runQueryOnBackgroundThread(CharSequence) + */ + public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) { + mFilterQueryProvider = filterQueryProvider; + } + + /** + * Called when the {@link ContentObserver} on the cursor receives a change notification. + * The default implementation provides the auto-requery logic, but may be overridden by + * sub classes. + * + * @see ContentObserver#onChange(boolean) + */ + protected void onContentChanged() { + if (mAutoRequery && mCursor != null && !mCursor.isClosed()) { + if (Config.LOGV) Log.v("Cursor", "Auto requerying " + mCursor + " due to update"); + mDataValid = mCursor.requery(); + } + } + + private class ChangeObserver extends ContentObserver { + public ChangeObserver() { + super(new Handler()); + } + + @Override + public boolean deliverSelfNotifications() { + return true; + } + + @Override + public void onChange(boolean selfChange) { + onContentChanged(); + } + } + + private class MyDataSetObserver extends DataSetObserver { + @Override + public void onChanged() { + mDataValid = true; + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + mDataValid = false; + notifyDataSetInvalidated(); + } + } + +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorFilter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorFilter.java new file mode 100644 index 00000000..69b87be2 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/CursorFilter.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.widget; + +import android.database.Cursor; +import android.widget.Filter; + +/** + *

The CursorFilter delegates most of the work to the CursorAdapter. + * Subclasses should override these delegate methods to run the queries + * and convert the results into String that can be used by auto-completion + * widgets.

+ */ +class CursorFilter extends Filter { + + CursorFilterClient mClient; + + interface CursorFilterClient { + CharSequence convertToString(Cursor cursor); + Cursor runQueryOnBackgroundThread(CharSequence constraint); + Cursor getCursor(); + void changeCursor(Cursor cursor); + } + + CursorFilter(CursorFilterClient client) { + mClient = client; + } + + @Override + public CharSequence convertResultToString(Object resultValue) { + return mClient.convertToString((Cursor) resultValue); + } + + @Override + protected FilterResults performFiltering(CharSequence constraint) { + Cursor cursor = mClient.runQueryOnBackgroundThread(constraint); + + FilterResults results = new FilterResults(); + if (cursor != null) { + results.count = cursor.getCount(); + results.values = cursor; + } else { + results.count = 0; + results.values = null; + } + return results; + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + Cursor oldCursor = mClient.getCursor(); + + if (results.values != null && results.values != oldCursor) { + mClient.changeCursor((Cursor) results.values); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/ResourceCursorAdapter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/ResourceCursorAdapter.java new file mode 100644 index 00000000..12dce787 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/ResourceCursorAdapter.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.widget; + +import android.content.Context; +import android.database.Cursor; +import android.view.View; +import android.view.ViewGroup; +import android.view.LayoutInflater; + +/** + * Static library support version of the framework's {@link android.widget.ResourceCursorAdapter}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public abstract class ResourceCursorAdapter extends CursorAdapter { + private int mLayout; + + private int mDropDownLayout; + + private LayoutInflater mInflater; + + /** + * Constructor the enables auto-requery. + * + * @deprecated This option is discouraged, as it results in Cursor queries + * being performed on the application's UI thread and thus can cause poor + * responsiveness or even Application Not Responding errors. As an alternative, + * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}. + * + * @param context The context where the ListView associated with this adapter is running + * @param layout resource identifier of a layout file that defines the views + * for this list item. Unless you override them later, this will + * define both the item views and the drop down views. + */ + @Deprecated + public ResourceCursorAdapter(Context context, int layout, Cursor c) { + super(context, c); + mLayout = mDropDownLayout = layout; + mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + /** + * Constructor with default behavior as per + * {@link CursorAdapter#CursorAdapter(Context, Cursor, boolean)}; it is recommended + * you not use this, but instead {@link #ResourceCursorAdapter(Context, int, Cursor, int)}. + * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER} + * will always be set. + * + * @param context The context where the ListView associated with this adapter is running + * @param layout resource identifier of a layout file that defines the views + * for this list item. Unless you override them later, this will + * define both the item views and the drop down views. + * @param c The cursor from which to get the data. + * @param autoRequery If true the adapter will call requery() on the + * cursor whenever it changes so the most recent + * data is always displayed. Using true here is discouraged. + */ + public ResourceCursorAdapter(Context context, int layout, Cursor c, boolean autoRequery) { + super(context, c, autoRequery); + mLayout = mDropDownLayout = layout; + mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + /** + * Standard constructor. + * + * @param context The context where the ListView associated with this adapter is running + * @param layout Resource identifier of a layout file that defines the views + * for this list item. Unless you override them later, this will + * define both the item views and the drop down views. + * @param c The cursor from which to get the data. + * @param flags Flags used to determine the behavior of the adapter, + * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}. + */ + public ResourceCursorAdapter(Context context, int layout, Cursor c, int flags) { + super(context, c, flags); + mLayout = mDropDownLayout = layout; + mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + /** + * Inflates view(s) from the specified XML file. + * + * @see android.widget.CursorAdapter#newView(android.content.Context, + * android.database.Cursor, ViewGroup) + */ + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return mInflater.inflate(mLayout, parent, false); + } + + @Override + public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) { + return mInflater.inflate(mDropDownLayout, parent, false); + } + + /** + *

Sets the layout resource of the item views.

+ * + * @param layout the layout resources used to create item views + */ + public void setViewResource(int layout) { + mLayout = layout; + } + + /** + *

Sets the layout resource of the drop down views.

+ * + * @param dropDownLayout the layout resources used to create drop down views + */ + public void setDropDownViewResource(int dropDownLayout) { + mDropDownLayout = dropDownLayout; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/SimpleCursorAdapter.java b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/SimpleCursorAdapter.java new file mode 100644 index 00000000..4b81b11f --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/android/support/v4/widget/SimpleCursorAdapter.java @@ -0,0 +1,398 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.v4.widget; + +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +/** + * Static library support version of the framework's {@link android.widget.SimpleCursorAdapter}. + * Used to write apps that run on platforms prior to Android 3.0. When running + * on Android 3.0 or above, this implementation is still used; it does not try + * to switch to the framework's implementation. See the framework SDK + * documentation for a class overview. + */ +public class SimpleCursorAdapter extends ResourceCursorAdapter { + /** + * A list of columns containing the data to bind to the UI. + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected int[] mFrom; + /** + * A list of View ids representing the views to which the data must be bound. + * This field should be made private, so it is hidden from the SDK. + * {@hide} + */ + protected int[] mTo; + + private int mStringConversionColumn = -1; + private CursorToStringConverter mCursorToStringConverter; + private ViewBinder mViewBinder; + + String[] mOriginalFrom; + + /** + * Constructor the enables auto-requery. + * + * @deprecated This option is discouraged, as it results in Cursor queries + * being performed on the application's UI thread and thus can cause poor + * responsiveness or even Application Not Responding errors. As an alternative, + * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}. + */ + @Deprecated + public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { + super(context, layout, c); + mTo = to; + mOriginalFrom = from; + findColumns(from); + } + + /** + * Standard constructor. + * + * @param context The context where the ListView associated with this + * SimpleListItemFactory is running + * @param layout resource identifier of a layout file that defines the views + * for this list item. The layout file should include at least + * those named views defined in "to" + * @param c The database cursor. Can be null if the cursor is not available yet. + * @param from A list of column names representing the data to bind to the UI. Can be null + * if the cursor is not available yet. + * @param to The views that should display column in the "from" parameter. + * These should all be TextViews. The first N views in this list + * are given the values of the first N columns in the from + * parameter. Can be null if the cursor is not available yet. + * @param flags Flags used to determine the behavior of the adapter, + * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}. + */ + public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, + int[] to, int flags) { + super(context, layout, c, flags); + mTo = to; + mOriginalFrom = from; + findColumns(from); + } + + /** + * Binds all of the field names passed into the "to" parameter of the + * constructor with their corresponding cursor columns as specified in the + * "from" parameter. + * + * Binding occurs in two phases. First, if a + * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available, + * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)} + * is invoked. If the returned value is true, binding has occured. If the + * returned value is false and the view to bind is a TextView, + * {@link #setViewText(TextView, String)} is invoked. If the returned value is + * false and the view to bind is an ImageView, + * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate + * binding can be found, an {@link IllegalStateException} is thrown. + * + * @throws IllegalStateException if binding cannot occur + * + * @see android.widget.CursorAdapter#bindView(android.view.View, + * android.content.Context, android.database.Cursor) + * @see #getViewBinder() + * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder) + * @see #setViewImage(ImageView, String) + * @see #setViewText(TextView, String) + */ + @Override + public void bindView(View view, Context context, Cursor cursor) { + final ViewBinder binder = mViewBinder; + final int count = mTo.length; + final int[] from = mFrom; + final int[] to = mTo; + + for (int i = 0; i < count; i++) { + final View v = view.findViewById(to[i]); + if (v != null) { + boolean bound = false; + if (binder != null) { + bound = binder.setViewValue(v, cursor, from[i]); + } + + if (!bound) { + String text = cursor.getString(from[i]); + if (text == null) { + text = ""; + } + + if (v instanceof TextView) { + setViewText((TextView) v, text); + } else if (v instanceof ImageView) { + setViewImage((ImageView) v, text); + } else { + throw new IllegalStateException(v.getClass().getName() + " is not a " + + " view that can be bounds by this SimpleCursorAdapter"); + } + } + } + } + } + + /** + * Returns the {@link ViewBinder} used to bind data to views. + * + * @return a ViewBinder or null if the binder does not exist + * + * @see #bindView(android.view.View, android.content.Context, android.database.Cursor) + * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder) + */ + public ViewBinder getViewBinder() { + return mViewBinder; + } + + /** + * Sets the binder used to bind data to views. + * + * @param viewBinder the binder used to bind data to views, can be null to + * remove the existing binder + * + * @see #bindView(android.view.View, android.content.Context, android.database.Cursor) + * @see #getViewBinder() + */ + public void setViewBinder(ViewBinder viewBinder) { + mViewBinder = viewBinder; + } + + /** + * Called by bindView() to set the image for an ImageView but only if + * there is no existing ViewBinder or if the existing ViewBinder cannot + * handle binding to an ImageView. + * + * By default, the value will be treated as an image resource. If the + * value cannot be used as an image resource, the value is used as an + * image Uri. + * + * Intended to be overridden by Adapters that need to filter strings + * retrieved from the database. + * + * @param v ImageView to receive an image + * @param value the value retrieved from the cursor + */ + public void setViewImage(ImageView v, String value) { + try { + v.setImageResource(Integer.parseInt(value)); + } catch (NumberFormatException nfe) { + v.setImageURI(Uri.parse(value)); + } + } + + /** + * Called by bindView() to set the text for a TextView but only if + * there is no existing ViewBinder or if the existing ViewBinder cannot + * handle binding to an TextView. + * + * Intended to be overridden by Adapters that need to filter strings + * retrieved from the database. + * + * @param v TextView to receive text + * @param text the text to be set for the TextView + */ + public void setViewText(TextView v, String text) { + v.setText(text); + } + + /** + * Return the index of the column used to get a String representation + * of the Cursor. + * + * @return a valid index in the current Cursor or -1 + * + * @see android.widget.CursorAdapter#convertToString(android.database.Cursor) + * @see #setStringConversionColumn(int) + * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) + * @see #getCursorToStringConverter() + */ + public int getStringConversionColumn() { + return mStringConversionColumn; + } + + /** + * Defines the index of the column in the Cursor used to get a String + * representation of that Cursor. The column is used to convert the + * Cursor to a String only when the current CursorToStringConverter + * is null. + * + * @param stringConversionColumn a valid index in the current Cursor or -1 to use the default + * conversion mechanism + * + * @see android.widget.CursorAdapter#convertToString(android.database.Cursor) + * @see #getStringConversionColumn() + * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) + * @see #getCursorToStringConverter() + */ + public void setStringConversionColumn(int stringConversionColumn) { + mStringConversionColumn = stringConversionColumn; + } + + /** + * Returns the converter used to convert the filtering Cursor + * into a String. + * + * @return null if the converter does not exist or an instance of + * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter} + * + * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) + * @see #getStringConversionColumn() + * @see #setStringConversionColumn(int) + * @see android.widget.CursorAdapter#convertToString(android.database.Cursor) + */ + public CursorToStringConverter getCursorToStringConverter() { + return mCursorToStringConverter; + } + + /** + * Sets the converter used to convert the filtering Cursor + * into a String. + * + * @param cursorToStringConverter the Cursor to String converter, or + * null to remove the converter + * + * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) + * @see #getStringConversionColumn() + * @see #setStringConversionColumn(int) + * @see android.widget.CursorAdapter#convertToString(android.database.Cursor) + */ + public void setCursorToStringConverter(CursorToStringConverter cursorToStringConverter) { + mCursorToStringConverter = cursorToStringConverter; + } + + /** + * Returns a CharSequence representation of the specified Cursor as defined + * by the current CursorToStringConverter. If no CursorToStringConverter + * has been set, the String conversion column is used instead. If the + * conversion column is -1, the returned String is empty if the cursor + * is null or Cursor.toString(). + * + * @param cursor the Cursor to convert to a CharSequence + * + * @return a non-null CharSequence representing the cursor + */ + @Override + public CharSequence convertToString(Cursor cursor) { + if (mCursorToStringConverter != null) { + return mCursorToStringConverter.convertToString(cursor); + } else if (mStringConversionColumn > -1) { + return cursor.getString(mStringConversionColumn); + } + + return super.convertToString(cursor); + } + + /** + * Create a map from an array of strings to an array of column-id integers in mCursor. + * If mCursor is null, the array will be discarded. + * + * @param from the Strings naming the columns of interest + */ + private void findColumns(String[] from) { + if (mCursor != null) { + int i; + int count = from.length; + if (mFrom == null || mFrom.length != count) { + mFrom = new int[count]; + } + for (i = 0; i < count; i++) { + mFrom[i] = mCursor.getColumnIndexOrThrow(from[i]); + } + } else { + mFrom = null; + } + } + + @Override + public Cursor swapCursor(Cursor c) { + Cursor res = super.swapCursor(c); + // rescan columns in case cursor layout is different + findColumns(mOriginalFrom); + return res; + } + + /** + * Change the cursor and change the column-to-view mappings at the same time. + * + * @param c The database cursor. Can be null if the cursor is not available yet. + * @param from A list of column names representing the data to bind to the UI. Can be null + * if the cursor is not available yet. + * @param to The views that should display column in the "from" parameter. + * These should all be TextViews. The first N views in this list + * are given the values of the first N columns in the from + * parameter. Can be null if the cursor is not available yet. + */ + public void changeCursorAndColumns(Cursor c, String[] from, int[] to) { + mOriginalFrom = from; + mTo = to; + super.changeCursor(c); + findColumns(mOriginalFrom); + } + + /** + * This class can be used by external clients of SimpleCursorAdapter + * to bind values fom the Cursor to views. + * + * You should use this class to bind values from the Cursor to views + * that are not directly supported by SimpleCursorAdapter or to + * change the way binding occurs for views supported by + * SimpleCursorAdapter. + * + * @see SimpleCursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor) + * @see SimpleCursorAdapter#setViewImage(ImageView, String) + * @see SimpleCursorAdapter#setViewText(TextView, String) + */ + public static interface ViewBinder { + /** + * Binds the Cursor column defined by the specified index to the specified view. + * + * When binding is handled by this ViewBinder, this method must return true. + * If this method returns false, SimpleCursorAdapter will attempts to handle + * the binding on its own. + * + * @param view the view to bind the data to + * @param cursor the cursor to get the data from + * @param columnIndex the column at which the data can be found in the cursor + * + * @return true if the data was bound to the view, false otherwise + */ + boolean setViewValue(View view, Cursor cursor, int columnIndex); + } + + /** + * This class can be used by external clients of SimpleCursorAdapter + * to define how the Cursor should be converted to a String. + * + * @see android.widget.CursorAdapter#convertToString(android.database.Cursor) + */ + public static interface CursorToStringConverter { + /** + * Returns a CharSequence representing the specified Cursor. + * + * @param cursor the cursor for which a CharSequence representation + * is requested + * + * @return a non-null CharSequence representing the cursor + */ + CharSequence convertToString(Cursor cursor); + } + +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java new file mode 100644 index 00000000..7cc6c8d2 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java @@ -0,0 +1,422 @@ +/* + * Copyright (C) 2011 Jake Wharton + * Copyright (C) 2010 Johan Nilsson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.app; + +import java.util.ArrayList; +import java.util.List; +import android.app.Activity; +import android.graphics.drawable.Drawable; +import android.support.v4.app.ActionBar; +import android.support.v4.app.SupportActivity; +import android.support.v4.view.ActionMode; +import android.support.v4.view.MenuItem; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.SpinnerAdapter; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.view.menu.ActionMenuItemView; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuItemImpl; +import com.actionbarsherlock.internal.widget.ActionBarContainer; +import com.actionbarsherlock.internal.widget.ActionBarView; + +public final class ActionBarImpl extends ActionBar { + /** Action bar container. */ + private ActionBarContainer mContainerView; + + /** Action bar view. */ + private ActionBarView mActionView; + + /** List of listeners to the menu visibility. */ + private final List mMenuListeners = new ArrayList(); + + + + public ActionBarImpl(T activity) { + super(activity); + } + + + // ------------------------------------------------------------------------ + // ACTION BAR SHERLOCK SUPPORT + // ------------------------------------------------------------------------ + + @Override + protected ActionBar getPublicInstance() { + return this; + } + + public void init() { + mActionView = (ActionBarView)mActivity.findViewById(R.id.abs__action_bar); + mContainerView = (ActionBarContainer)mActivity.findViewById(R.id.abs__action_bar_container); + + if (mActionView == null) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used with a screen_*.xml layout"); + } + + if (mActionView.getTitle() == null) { + mActionView.setTitle(mActivity.getTitle()); + } + } + + public void onMenuInflated(MenuBuilder menu) { + if (mActionView == null) { + return; + } + + final int maxItems = mActivity.getResources().getInteger(R.integer.abs__max_action_buttons); + + //Iterate and grab as many actions as we can up to maxItems honoring + //their showAsAction values + int ifItems = 0; + final int count = menu.size(); + boolean showsActionItemText = menu.getShowsActionItemText(); + List keep = new ArrayList(); + for (int i = 0; i < count; i++) { + MenuItemImpl item = (MenuItemImpl)menu.getItem(i); + + //Items without an icon or custom view are forced into the overflow menu + if (!showsActionItemText && (item.getIcon() == null) && (item.getActionView() == null)) { + continue; + } + if (showsActionItemText && ((item.getTitle() == null) || "".equals(item.getTitle()))) { + continue; + } + + if ((item.getShowAsAction() & MenuItem.SHOW_AS_ACTION_ALWAYS) != 0) { + //Show always therefore add to keep list + keep.add(item); + + if ((keep.size() > maxItems) && (ifItems > 0)) { + //If we have exceeded the max and there are "ifRoom" items + //then iterate backwards to remove one and add it to the + //head of the classic items list. + for (int j = keep.size() - 1; j >= 0; j--) { + if ((keep.get(j).getShowAsAction() & MenuItem.SHOW_AS_ACTION_IF_ROOM) != 0) { + keep.remove(j); + ifItems -= 1; + break; + } + } + } + } else if (((item.getShowAsAction() & MenuItem.SHOW_AS_ACTION_IF_ROOM) != 0) + && (keep.size() < maxItems)) { + //"ifRoom" items are added if we have not exceeded the max. + keep.add(item); + ifItems += 1; + } + } + + //Mark items that will be shown on the action bar as such so they do + //not show up on the activity options menu + mActionView.removeAllItems(); + for (MenuItemImpl item : keep) { + item.setIsShownOnActionBar(true); + + //Get a new item for this menu item + ActionMenuItemView actionItem = mActionView.newItem(); + actionItem.initialize(item, MenuBuilder.TYPE_ACTION_BAR); + + //Associate the itemview with the item so changes will be reflected + item.setItemView(MenuBuilder.TYPE_ACTION_BAR, actionItem); + + //Add to the action bar for display + mActionView.addItem(actionItem); + } + } + + public void onMenuVisibilityChanged(boolean isVisible) { + //Marshal to all listeners + for (OnMenuVisibilityListener listener : mMenuListeners) { + listener.onMenuVisibilityChanged(isVisible); + } + } + + public void setProgressBarIndeterminateVisibility(boolean visible) { + if (mActionView != null) { + mActionView.setProgressBarIndeterminateVisibility(visible); + } + } + + // ------------------------------------------------------------------------ + // ACTION MODE METHODS + // ------------------------------------------------------------------------ + + @Override + protected ActionMode startActionMode(ActionMode.Callback callback) { + throw new RuntimeException("Not implemented."); + } + + // ------------------------------------------------------------------------ + // ACTION BAR METHODS + // ------------------------------------------------------------------------ + + @Override + public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + if (!mMenuListeners.contains(listener)) { + mMenuListeners.add(listener); + } + } + + @Override + public void addTab(Tab tab) { + mActionView.addTab(tab); + } + + @Override + public void addTab(Tab tab, boolean setSelected) { + mActionView.addTab(tab, setSelected); + } + + @Override + public void addTab(Tab tab, int position) { + mActionView.addTab(tab, position); + } + + @Override + public void addTab(ActionBar.Tab tab, int position, boolean setSelected) { + mActionView.addTab(tab, position, setSelected); + } + + @Override + public View getCustomView() { + return mActionView.getCustomView(); + } + + @Override + public int getDisplayOptions() { + return mActionView.getDisplayOptions(); + } + + @Override + public int getHeight() { + return mActionView.getHeight(); + } + + @Override + public int getNavigationItemCount() { + switch (mActionView.getNavigationMode()) { + default: + case ActionBar.NAVIGATION_MODE_STANDARD: + return 0; + + case ActionBar.NAVIGATION_MODE_LIST: + SpinnerAdapter dropdownAdapter = mActionView.getDropdownAdapter(); + return (dropdownAdapter != null) ? dropdownAdapter.getCount() : 0; + + case ActionBar.NAVIGATION_MODE_TABS: + return mActionView.getTabCount(); + } + } + + @Override + public int getNavigationMode() { + return mActionView.getNavigationMode(); + } + + @Override + public int getSelectedNavigationIndex() { + switch (mActionView.getNavigationMode()) { + default: + case ActionBar.NAVIGATION_MODE_STANDARD: + return -1; + + case ActionBar.NAVIGATION_MODE_LIST: + return mActionView.getDropdownSelectedPosition(); + + case ActionBar.NAVIGATION_MODE_TABS: + return mActionView.getSelectedTab().getPosition(); + } + } + + @Override + public ActionBar.Tab getSelectedTab() { + return mActionView.getSelectedTab(); + } + + @Override + public CharSequence getSubtitle() { + return mActionView.getSubtitle(); + } + + @Override + public ActionBar.Tab getTabAt(int index) { + return mActionView.getTabAt(index); + } + + @Override + public int getTabCount() { + return mActionView.getTabCount(); + } + + @Override + public CharSequence getTitle() { + return mActionView.getTitle(); + } + + @Override + public void hide() { + //TODO: animate + mContainerView.setVisibility(View.GONE); + } + + @Override + public boolean isShowing() { + return mContainerView.getVisibility() == View.VISIBLE; + } + + @Override + public ActionBar.Tab newTab() { + return mActionView.newTab(); + } + + @Override + public void removeAllTabs() { + mActionView.removeAllTabs(); + } + + @Override + public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + mMenuListeners.remove(listener); + } + + @Override + public void removeTab(ActionBar.Tab tab) { + removeTabAt(tab.getPosition()); + } + + @Override + public void removeTabAt(int position) { + mActionView.removeTabAt(position); + } + + @Override + public void setBackgroundDrawable(Drawable d) { + mContainerView.setBackgroundDrawable(d); + } + + @Override + public void setCustomView(int resId) { + View view = LayoutInflater.from(mContext).inflate(resId, mActionView, false); + setCustomView(view); + } + + @Override + public void setCustomView(View view) { + mActionView.setCustomNavigationView(view); + } + + @Override + public void setCustomView(View view, ActionBar.LayoutParams layoutParams) { + view.setLayoutParams(layoutParams); + mActionView.setCustomNavigationView(view); + } + + @Override + public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { + setDisplayOptions(showHomeAsUp ? ActionBar.DISPLAY_HOME_AS_UP : 0, ActionBar.DISPLAY_HOME_AS_UP); + } + + @Override + public void setDisplayOptions(int options) { + mActionView.setDisplayOptions(options); + } + + @Override + public void setDisplayOptions(int newOptions, int mask) { + mActionView.setDisplayOptions((mActionView.getDisplayOptions() & ~mask) | newOptions); + } + + @Override + public void setDisplayShowCustomEnabled(boolean showCustom) { + setDisplayOptions(showCustom ? ActionBar.DISPLAY_SHOW_CUSTOM : 0, ActionBar.DISPLAY_SHOW_CUSTOM); + } + + @Override + public void setDisplayShowHomeEnabled(boolean showHome) { + setDisplayOptions(showHome ? ActionBar.DISPLAY_SHOW_HOME : 0, ActionBar.DISPLAY_SHOW_HOME); + } + + @Override + public void setDisplayShowTitleEnabled(boolean showTitle) { + setDisplayOptions(showTitle ? ActionBar.DISPLAY_SHOW_TITLE : 0, ActionBar.DISPLAY_SHOW_TITLE); + } + + @Override + public void setDisplayUseLogoEnabled(boolean useLogo) { + setDisplayOptions(useLogo ? ActionBar.DISPLAY_USE_LOGO : 0, ActionBar.DISPLAY_USE_LOGO); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, ActionBar.OnNavigationListener callback) { + mActionView.setDropdownAdapter(adapter); + mActionView.setCallback(callback); + } + + @Override + public void setNavigationMode(int mode) { + mActionView.setNavigationMode(mode); + } + + @Override + public void setSelectedNavigationItem(int position) { + switch (mActionView.getNavigationMode()) { + default: + case ActionBar.NAVIGATION_MODE_STANDARD: + throw new IllegalStateException(); + + case ActionBar.NAVIGATION_MODE_TABS: + mActionView.getTabAt(position).select(); + break; + + case ActionBar.NAVIGATION_MODE_LIST: + mActionView.setDropdownSelectedPosition(position); + break; + } + } + + @Override + public void selectTab(ActionBar.Tab tab) { + mActionView.selectTab(tab); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mActionView.setSubtitle(subtitle); + } + + @Override + public void setSubtitle(int resId) { + mActionView.setSubtitle(resId); + } + + @Override + public void setTitle(CharSequence title) { + mActionView.setTitle(title); + } + @Override + public void setTitle(int resId) { + mActionView.setTitle(resId); + } + + @Override + public void show() { + //TODO: animate + mContainerView.setVisibility(View.VISIBLE); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java new file mode 100644 index 00000000..75d58286 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java @@ -0,0 +1,581 @@ +/* + * Copyright 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.app; + +import java.util.HashMap; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +import android.app.Activity; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.app.ActionBar; +import android.support.v4.app.SupportActivity; +import android.support.v4.view.ActionMode; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuInflater; +import android.view.View; +import android.widget.SpinnerAdapter; + +public final class ActionBarWrapper { + //No instances + private ActionBarWrapper() {} + + /** + * Abstraction to get an instance of our implementing class. + * + * @param activity Parent activity. + * @return {@code ActionBar} instance. + */ + public static ActionBar createFor(T activity) { + return new ActionBarWrapper.Impl(activity); + } + + /** + *

Handler for Android's native {@link android.app.ActionBar}.

+ */ + public static final class Impl extends ActionBar implements android.app.ActionBar.TabListener { + /** Mapping between support listeners and native listeners. */ + private final HashMap mMenuListenerMap = new HashMap(); + + + private Impl(T activity) { + super(activity); + } + + + /** + * Get the native {@link ActionBar} instance. + * + * @return The action bar. + */ + private android.app.ActionBar getActionBar() { + return mActivity.asActivity().getActionBar(); + } + + @Override + protected ActionBar getPublicInstance() { + return (getActionBar() != null) ? this : null; + } + + /** + * Converts our Tab wrapper to a native version containing the wrapper + * instance as its tag. + * + * @param tab Tab wrapper instance. + * @return Native tab. + */ + private android.app.ActionBar.Tab convertTabToNative(ActionBar.Tab tab) { + return getActionBar().newTab() + .setCustomView(tab.getCustomView()) + .setIcon(tab.getIcon()) + .setTabListener(this) + .setTag(tab) + .setText(tab.getText()); + } + + @Override + public void onTabReselected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { + ActionBar.TabListener listener = ((ActionBar.Tab)tab.getTag()).getTabListener(); + if (listener != null) { + listener.onTabReselected((ActionBar.Tab)tab.getTag(), null); + } + } + + @Override + public void onTabSelected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { + ActionBar.TabListener listener = ((ActionBar.Tab)tab.getTag()).getTabListener(); + if (listener != null) { + listener.onTabSelected((ActionBar.Tab)tab.getTag(), null); + } + } + + @Override + public void onTabUnselected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { + ActionBar.TabListener listener = ((ActionBar.Tab)tab.getTag()).getTabListener(); + if (listener != null) { + listener.onTabUnselected((ActionBar.Tab)tab.getTag(), null); + } + } + + // --------------------------------------------------------------------- + // ACTION MODE SUPPORT + // --------------------------------------------------------------------- + + @Override + protected ActionMode startActionMode(final ActionMode.Callback callback) { + //We have to re-wrap the instances in every callback since the + //wrapped instance is needed before we could have a change to + //properly store it. + return new ActionModeWrapper(mContext, + mActivity.asActivity().startActionMode(new android.view.ActionMode.Callback() { + @Override + public boolean onPrepareActionMode(android.view.ActionMode mode, android.view.Menu menu) { + return callback.onPrepareActionMode(new ActionModeWrapper(mContext, mode), new MenuWrapper(menu)); + } + + @Override + public void onDestroyActionMode(android.view.ActionMode mode) { + final ActionMode actionMode = new ActionModeWrapper(mContext, mode); + callback.onDestroyActionMode(actionMode); + + //Send the activity callback once the action mode callback has run. + //This type-check has already occurred in the action bar constructor. + ((SupportActivity)mActivity).onActionModeFinished(actionMode); + } + + @Override + public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) { + return callback.onCreateActionMode(new ActionModeWrapper(mContext, mode), new MenuWrapper(menu)); + } + + @Override + public boolean onActionItemClicked(android.view.ActionMode mode, android.view.MenuItem item) { + return callback.onActionItemClicked(new ActionModeWrapper(mContext, mode), new MenuItemWrapper(item)); + } + }) + ); + } + + private static class ActionModeWrapper extends ActionMode { + private final Context mContext; + private final android.view.ActionMode mActionMode; + + ActionModeWrapper(Context context, android.view.ActionMode actionMode) { + mContext = context; + mActionMode = actionMode; + } + + @Override + public void finish() { + mActionMode.finish(); + } + + @Override + public View getCustomView() { + return mActionMode.getCustomView(); + } + + @Override + public Menu getMenu() { + return new MenuWrapper(mActionMode.getMenu()); + } + + @Override + public MenuInflater getMenuInflater() { + return new MenuInflater(mContext, null); + } + + @Override + public CharSequence getSubtitle() { + return mActionMode.getSubtitle(); + } + + @Override + public CharSequence getTitle() { + return mActionMode.getTitle(); + } + + @Override + public void invalidate() { + mActionMode.invalidate(); + } + + @Override + public void setCustomView(View view) { + mActionMode.setCustomView(view); + } + + @Override + public void setSubtitle(int resId) { + mActionMode.setSubtitle(resId); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mActionMode.setSubtitle(subtitle); + } + + @Override + public void setTitle(int resId) { + mActionMode.setTitle(resId); + } + + @Override + public void setTitle(CharSequence title) { + mActionMode.setTitle(title); + } + } + + // --------------------------------------------------------------------- + // ACTION BAR SUPPORT + // --------------------------------------------------------------------- + + private static class TabImpl extends ActionBar.Tab { + final ActionBarWrapper.Impl mActionBar; + + View mCustomView; + Drawable mIcon; + ActionBar.TabListener mListener; + Object mTag; + CharSequence mText; + + TabImpl(ActionBarWrapper.Impl actionBar) { + mActionBar = actionBar; + } + + @Override + public View getCustomView() { + return mCustomView; + } + + @Override + public Drawable getIcon() { + return mIcon; + } + + @Override + public int getPosition() { + final int tabCount = mActionBar.getTabCount(); + for (int i = 0; i < tabCount; i++) { + if (mActionBar.getTabAt(i).equals(this)) { + return i; + } + } + return ActionBar.Tab.INVALID_POSITION; + } + + @Override + public ActionBar.TabListener getTabListener() { + return mListener; + } + + @Override + public Object getTag() { + return mTag; + } + + @Override + public CharSequence getText() { + return mText; + } + + @Override + public void select() { + mActionBar.selectTab(this); + } + + @Override + public ActionBar.Tab setCustomView(int layoutResId) { + mCustomView = mActionBar.mActivity.getLayoutInflater().inflate(layoutResId, null); + return this; + } + + @Override + public ActionBar.Tab setCustomView(View view) { + mCustomView = view; + return this; + } + + @Override + public ActionBar.Tab setIcon(Drawable icon) { + mIcon = icon; + return this; + } + + @Override + public ActionBar.Tab setIcon(int resId) { + mIcon = mActionBar.mActivity.getResources().getDrawable(resId); + return this; + } + + @Override + public ActionBar.Tab setTabListener(TabListener listener) { + mListener = listener; + return this; + } + + @Override + public ActionBar.Tab setTag(Object obj) { + mTag = obj; + return this; + } + + @Override + public ActionBar.Tab setText(int resId) { + mText = mActionBar.mActivity.getResources().getString(resId); + return this; + } + + @Override + public ActionBar.Tab setText(CharSequence text) { + mText = text; + return this; + } + } + + @Override + public void addOnMenuVisibilityListener(final OnMenuVisibilityListener listener) { + if ((listener != null) && !mMenuListenerMap.containsKey(listener)) { + android.app.ActionBar.OnMenuVisibilityListener nativeListener = new android.app.ActionBar.OnMenuVisibilityListener() { + @Override + public void onMenuVisibilityChanged(boolean isVisible) { + listener.onMenuVisibilityChanged(isVisible); + } + }; + mMenuListenerMap.put(listener, nativeListener); + + getActionBar().addOnMenuVisibilityListener(nativeListener); + } + } + + @Override + public void addTab(Tab tab) { + getActionBar().addTab(convertTabToNative(tab)); + } + + @Override + public void addTab(Tab tab, boolean setSelected) { + getActionBar().addTab(convertTabToNative(tab), setSelected); + } + + @Override + public void addTab(Tab tab, int position) { + getActionBar().addTab(convertTabToNative(tab), position); + } + + @Override + public void addTab(ActionBar.Tab tab, int position, boolean setSelected) { + getActionBar().addTab(convertTabToNative(tab), position, setSelected); + } + + @Override + public View getCustomView() { + return getActionBar().getCustomView(); + } + + @Override + public int getDisplayOptions() { + return getActionBar().getDisplayOptions(); + } + + @Override + public int getHeight() { + return getActionBar().getHeight(); + } + + @Override + public int getNavigationItemCount() { + return getActionBar().getNavigationItemCount(); + } + + @Override + public int getNavigationMode() { + return getActionBar().getNavigationMode(); + } + + @Override + public int getSelectedNavigationIndex() { + return getActionBar().getSelectedNavigationIndex(); + } + + @Override + public Tab getSelectedTab() { + return (ActionBar.Tab)getActionBar().getSelectedTab().getTag(); + } + + @Override + public CharSequence getSubtitle() { + return getActionBar().getSubtitle(); + } + + @Override + public ActionBar.Tab getTabAt(int index) { + return (Tab)getActionBar().getTabAt(index).getTag(); + } + + @Override + public int getTabCount() { + return getActionBar().getTabCount(); + } + + @Override + public CharSequence getTitle() { + return getActionBar().getTitle(); + } + + @Override + public void hide() { + getActionBar().hide(); + } + + @Override + public boolean isShowing() { + return getActionBar().isShowing(); + } + + @Override + public ActionBar.Tab newTab() { + return new TabImpl(this); + } + + @Override + public void removeAllTabs() { + getActionBar().removeAllTabs(); + } + + @Override + public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + if ((listener != null) && mMenuListenerMap.containsKey(listener)) { + getActionBar().removeOnMenuVisibilityListener( + mMenuListenerMap.remove(listener) + ); + } + } + + @Override + public void removeTab(Tab tab) { + final int tabCount = getActionBar().getTabCount(); + for (int i = 0; i < tabCount; i++) { + if (getActionBar().getTabAt(i).getTag().equals(tab)) { + getActionBar().removeTabAt(i); + break; + } + } + } + + @Override + public void removeTabAt(int position) { + getActionBar().removeTabAt(position); + } + + @Override + public void selectTab(ActionBar.Tab tab) { + final int tabCount = getActionBar().getTabCount(); + for (int i = 0; i < tabCount; i++) { + if (getActionBar().getTabAt(i).getTag().equals(tab)) { + getActionBar().setSelectedNavigationItem(i); + break; + } + } + } + + @Override + public void setBackgroundDrawable(Drawable d) { + getActionBar().setBackgroundDrawable(d); + } + + @Override + public void setCustomView(int resId) { + getActionBar().setCustomView(resId); + } + + @Override + public void setCustomView(View view) { + getActionBar().setCustomView(view); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + android.app.ActionBar.LayoutParams nativeLayoutParams = new android.app.ActionBar.LayoutParams(layoutParams); + nativeLayoutParams.gravity = layoutParams.gravity; + getActionBar().setCustomView(view, nativeLayoutParams); + } + + @Override + public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { + getActionBar().setDisplayHomeAsUpEnabled(showHomeAsUp); + } + + @Override + public void setDisplayOptions(int options, int mask) { + getActionBar().setDisplayOptions(options, mask); + } + + @Override + public void setDisplayOptions(int options) { + getActionBar().setDisplayOptions(options); + } + + @Override + public void setDisplayShowCustomEnabled(boolean showCustom) { + getActionBar().setDisplayShowCustomEnabled(showCustom); + } + + @Override + public void setDisplayShowHomeEnabled(boolean showHome) { + getActionBar().setDisplayShowHomeEnabled(showHome); + } + + @Override + public void setDisplayShowTitleEnabled(boolean showTitle) { + getActionBar().setDisplayShowTitleEnabled(showTitle); + } + + @Override + public void setDisplayUseLogoEnabled(boolean useLogo) { + getActionBar().setDisplayUseLogoEnabled(useLogo); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, final OnNavigationListener callback) { + getActionBar().setListNavigationCallbacks(adapter, new android.app.ActionBar.OnNavigationListener() { + @Override + public boolean onNavigationItemSelected(int itemPosition, long itemId) { + if (callback != null) { + return callback.onNavigationItemSelected(itemPosition, itemId); + } + return false; + } + }); + } + + @Override + public void setNavigationMode(int mode) { + getActionBar().setNavigationMode(mode); + } + + @Override + public void setSelectedNavigationItem(int position) { + getActionBar().setSelectedNavigationItem(position); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + getActionBar().setSubtitle(subtitle); + } + + @Override + public void setSubtitle(int resId) { + getActionBar().setSubtitle(resId); + } + + @Override + public void setTitle(CharSequence title) { + getActionBar().setTitle(title); + } + + @Override + public void setTitle(int resId) { + getActionBar().setTitle(resId); + } + + @Override + public void show() { + getActionBar().show(); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java new file mode 100644 index 00000000..6c32fed3 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java @@ -0,0 +1,255 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.support.v4.view.MenuItem; +import android.support.v4.view.SubMenu; +import android.view.ContextMenu; +import android.view.View; + +public class ActionMenuItem implements MenuItem { + private static final int CHECKABLE = MenuItemImpl.CHECKABLE; + private static final int CHECKED = MenuItemImpl.CHECKED; + private static final int ENABLED = MenuItemImpl.ENABLED; + private static final int EXCLUSIVE = MenuItemImpl.EXCLUSIVE; + private static final int HIDDEN = MenuItemImpl.HIDDEN; + private static final int NO_ICON = 0; + + //XXX UNUSED: private final int mCategoryOrder; + private MenuItem.OnMenuItemClickListener mClickListener; + private Context mContext; + private int mFlags = ENABLED; + private final int mGroup; + private Drawable mIconDrawable; + private int mIconResId = NO_ICON; + private final int mId; + private Intent mIntent; + private final int mOrdering; + private char mShortcutAlphabeticChar; + private char mShortcutNumericChar; + private CharSequence mTitle; + private CharSequence mTitleCondensed; + + public ActionMenuItem(Context context, int group, int id, int categoryOrder, int ordering, CharSequence title) { + mContext = context; + mId = id; + mGroup = group; + //XXX UNUSED mCategoryOrder = categoryOrder; + mOrdering = ordering; + mTitle = title; + } + + @Override + public View getActionView() { + return null; + } + + @Override + public char getAlphabeticShortcut() { + return mShortcutAlphabeticChar; + } + + @Override + public int getGroupId() { + return mGroup; + } + + @Override + public Drawable getIcon() { + return mIconDrawable; + } + + @Override + public Intent getIntent() { + return mIntent; + } + + @Override + public int getItemId() { + return mId; + } + + @Override + public ContextMenu.ContextMenuInfo getMenuInfo() { + return null; + } + + @Override + public char getNumericShortcut() { + return mShortcutNumericChar; + } + + @Override + public int getOrder() { + return mOrdering; + } + + @Override + public SubMenu getSubMenu() { + return null; + } + + @Override + public CharSequence getTitle() { + return mTitle; + } + + @Override + public CharSequence getTitleCondensed() { + return mTitleCondensed; + } + + @Override + public boolean hasSubMenu() { + return false; + } + + public boolean invoke() { + if ((mClickListener != null) && mClickListener.onMenuItemClick(this)) { + return true; + } else if (mIntent != null) { + mContext.startActivity(mIntent); + return true; + } + return false; + } + + @Override + public boolean isCheckable() { + return (mFlags & CHECKABLE) != 0; + } + + @Override + public boolean isChecked() { + return (mFlags & CHECKED) != 0; + } + + @Override + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + @Override + public boolean isVisible() { + return (mFlags & HIDDEN) == 0; + } + + @Override + public MenuItem setActionView(int layoutResId) { + throw new UnsupportedOperationException(); + } + + @Override + public MenuItem setActionView(View view) { + throw new UnsupportedOperationException(); + } + + @Override + public MenuItem setAlphabeticShortcut(char shortcut) { + mShortcutAlphabeticChar = shortcut; + return this; + } + + @Override + public MenuItem setCheckable(boolean checkable) { + mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); + return this; + } + + @Override + public MenuItem setChecked(boolean checked) { + mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); + return this; + } + + @Override + public MenuItem setEnabled(boolean enabled) { + mFlags = (mFlags & ~ENABLED) | (enabled ? ENABLED : 0); + return this; + } + + public ActionMenuItem setExclusiveCheckable(boolean exclusive) { + mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); + return this; + } + + @Override + public MenuItem setIcon(int resId) { + mIconResId = resId; + mIconDrawable = mContext.getResources().getDrawable(mIconResId); + return this; + } + + @Override + public MenuItem setIcon(Drawable icon) { + mIconDrawable = icon; + mIconResId = NO_ICON; + return this; + } + + @Override + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + @Override + public MenuItem setNumericShortcut(char shortcut) { + mShortcutNumericChar = shortcut; + return this; + } + + @Override + public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener listener) { + mClickListener = listener; + return this; + } + + @Override + public android.view.MenuItem setOnMenuItemClickListener(final android.view.MenuItem.OnMenuItemClickListener listener) { + mClickListener = new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + return listener.onMenuItemClick(item); + } + }; + return null; + } + + @Override + public MenuItem setShortcut(char numericShortcut, char alphabeticShortcut) { + mShortcutNumericChar = numericShortcut; + mShortcutAlphabeticChar = alphabeticShortcut; + return this; + } + + @Override + public void setShowAsAction(int layoutResId) { + //No op + } + + @Override + public MenuItem setTitle(int resId) { + this.mTitle = mContext.getResources().getString(resId); + return this; + } + + @Override + public MenuItem setTitle(CharSequence title) { + mTitle = title; + return this; + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mTitleCondensed = title; + return this; + } + + @Override + public MenuItem setVisible(boolean visible) { + mFlags = (mFlags & HIDDEN) | (visible ? 0 : HIDDEN); + return this; + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java new file mode 100644 index 00000000..110c957c --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java @@ -0,0 +1,149 @@ +package com.actionbarsherlock.internal.view.menu; + +import java.lang.ref.WeakReference; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import com.actionbarsherlock.R; + +public class ActionMenuItemView extends RelativeLayout implements MenuView.ItemView, View.OnClickListener { + private ImageView mImageButton; + private TextView mTextButton; + private FrameLayout mCustomView; + private MenuItemImpl mMenuItem; + private WeakReference mDivider; + + public ActionMenuItemView(Context context) { + this(context, null); + } + public ActionMenuItemView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.actionButtonStyle); + } + public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setOnClickListener(this); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mImageButton = (ImageView) findViewById(R.id.abs__item_icon); + mImageButton.setOnClickListener(this); + mTextButton = (TextView) findViewById(R.id.abs__item_text); + mTextButton.setOnClickListener(this); + mCustomView = (FrameLayout) findViewById(R.id.abs__item_custom); + mCustomView.setOnClickListener(this); + } + + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + mImageButton.setEnabled(enabled); + mTextButton.setEnabled(enabled); + mCustomView.setEnabled(enabled); + } + + public void setDivider(ImageView divider) { + mDivider = new WeakReference(divider); + //Ensure we are not displaying the divider when we are not visible + setDividerVisibility(getVisibility()); + } + + public void setVisible(boolean visible) { + final int visibility = visible ? View.VISIBLE : View.GONE; + setDividerVisibility(visibility); + setVisibility(visibility); + } + + private void setDividerVisibility(int visibility) { + if ((mDivider != null) && (mDivider.get() != null)) { + mDivider.get().setVisibility(visibility); + } + } + + public void reloadDisplay() { + final boolean hasCustomView = mCustomView.getChildCount() > 0; + final boolean hasText = mMenuItem.showsActionItemText() && !"".equals(mTextButton.getText()); + + if (hasCustomView) { + mCustomView.setVisibility(View.VISIBLE); + mImageButton.setVisibility(View.GONE); + mTextButton.setVisibility(View.GONE); + } else { + mCustomView.setVisibility(View.GONE); + mImageButton.setVisibility(View.VISIBLE); + mTextButton.setVisibility(hasText ? View.VISIBLE : View.GONE); + } + } + + public void setIcon(Drawable icon) { + mImageButton.setImageDrawable(icon); + } + + public void setTitle(CharSequence title) { + mTextButton.setText(title); + reloadDisplay(); + } + + @Override + public void initialize(MenuItemImpl itemData, int menuType) { + mMenuItem = itemData; + setId(itemData.getItemId()); + setIcon(itemData.getIcon()); + setTitle(itemData.getTitle()); + setEnabled(itemData.isEnabled()); + setActionView(itemData.getActionView()); + setVisible(itemData.isVisible()); + } + + @Override + public MenuItemImpl getItemData() { + return mMenuItem; + } + + @Override + public void setCheckable(boolean checkable) { + // No-op + } + + @Override + public void setChecked(boolean checked) { + // No-op + } + + @Override + public void setShortcut(boolean showShortcut, char shortcutKey) { + // No-op + } + + @Override + public void setActionView(View actionView) { + mCustomView.removeAllViews(); + if (actionView != null) { + mCustomView.addView(actionView); + } + reloadDisplay(); + } + + @Override + public boolean prefersCondensedTitle() { + return true; + } + + @Override + public boolean showsIcon() { + return true; + } + + @Override + public void onClick(View v) { + if (mMenuItem != null) { + mMenuItem.invoke(); + } + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java new file mode 100644 index 00000000..41661ece --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * Copyright (C) 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; +import java.util.List; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuItem; +import android.view.KeyEvent; + +/** + * An implementation of the {@link android.view.Menu} interface for use in + * inflating menu XML resources to be added to a third-party action bar. + * + * @author Jake Wharton + * @see com.android.internal.view.menu.MenuBuilder + */ +public class MenuBuilder implements Menu { + private static final int DEFAULT_ITEM_ID = 0; + private static final int DEFAULT_GROUP_ID = 0; + private static final int DEFAULT_ORDER = 0; + + public static final int NUM_TYPES = 2; + public static final int TYPE_ACTION_BAR = 0; + public static final int TYPE_NATIVE = 1; + + /** + * This is the part of an order integer that the user can provide. + * @hide + */ + static final int USER_MASK = 0x0000ffff; + + /** + * Bit shift of the user portion of the order integer. + * @hide + */ + static final int USER_SHIFT = 0; + + /** + * This is the part of an order integer that supplies the category of the + * item. + * @hide + */ + + static final int CATEGORY_MASK = 0xffff0000; + + /** + * Bit shift of the category portion of the order integer. + * @hide + */ + static final int CATEGORY_SHIFT = 16; + + private static final int[] CATEGORY_TO_ORDER = new int[] { + 1, /* No category */ + 4, /* CONTAINER */ + 5, /* SYSTEM */ + 3, /* SECONDARY */ + 2, /* ALTERNATIVE */ + 0, /* SELECTED_ALTERNATIVE */ + }; + + + + public interface Callback { + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item); + } + + + + /** Context used for resolving any resources. */ + private final Context mContext; + + /** Child {@link ActionBarMenuItem} items. */ + private final ArrayList mItems; + + /** Menu callback that will receive various events. */ + private Callback mCallback; + + private boolean mShowsActionItemText; + + + + /** + * Create a new action bar menu. + * + * @param context Context used if resource resolution is required. + */ + public MenuBuilder(Context context) { + this.mContext = context; + this.mItems = new ArrayList(); + } + + + /** + * Adds an item to the menu. The other add methods funnel to this. + * + * @param itemId Unique item ID. + * @param groupId Group ID. + * @param order Order. + * @param title Item title. + * @return MenuItem instance. + */ + private MenuItem addInternal(int itemId, int groupId, int order, CharSequence title) { + final int ordering = getOrdering(order); + final MenuItemImpl item = new MenuItemImpl(this, groupId, itemId, order, ordering, title, MenuItem.SHOW_AS_ACTION_NEVER); + + mItems.add(findInsertIndex(mItems, ordering), item); + return item; + } + + private static int findInsertIndex(ArrayList items, int ordering) { + for (int i = items.size() - 1; i >= 0; i--) { + MenuItemImpl item = items.get(i); + if (item.getOrdering() <= ordering) { + return i + 1; + } + } + + return 0; + } + + /** + * Returns the ordering across all items. This will grab the category from + * the upper bits, find out how to order the category with respect to other + * categories, and combine it with the lower bits. + * + * @param categoryOrder The category order for a particular item (if it has + * not been or/add with a category, the default category is + * assumed). + * @return An ordering integer that can be used to order this item across + * all the items (even from other categories). + */ + private static int getOrdering(int categoryOrder) { + final int index = (categoryOrder & CATEGORY_MASK) >> CATEGORY_SHIFT; + + if (index < 0 || index >= CATEGORY_TO_ORDER.length) { + throw new IllegalArgumentException("order does not contain a valid category."); + } + + return (CATEGORY_TO_ORDER[index] << CATEGORY_SHIFT) | (categoryOrder & USER_MASK); + } + + public void setCallback(Callback callback) { + mCallback = callback; + } + + public Callback getCallback() { + return mCallback; + } + + public boolean getShowsActionItemText() { + return mShowsActionItemText; + } + + public void setShowsActionItemText(boolean showsActionItemText) { + mShowsActionItemText = showsActionItemText; + } + + /** + * Gets the root menu (if this is a submenu, find its root menu). + * + * @return The root menu. + */ + public MenuBuilder getRootMenu() { + return this; + } + + /** + * Get a list of the items contained in this menu. + * + * @return List of {@link MenuItemImpl}s. + */ + public final List getItems() { + return this.mItems; + } + + final MenuItemImpl remove(int index) { + return this.mItems.remove(index); + } + + final Context getContext() { + return this.mContext; + } + + void setExclusiveItemChecked(MenuItem item) { + final int group = item.getGroupId(); + + final int N = mItems.size(); + for (int i = 0; i < N; i++) { + MenuItemImpl curItem = mItems.get(i); + if (curItem.getGroupId() == group) { + if (!curItem.isExclusiveCheckable()) continue; + if (!curItem.isCheckable()) continue; + + // Check the item meant to be checked, uncheck the others (that are in the group) + curItem.setCheckedInt(curItem == item); + } + } + } + + // ** Menu Methods ** \\ + + @Override + public MenuItem add(int titleResourceId) { + return addInternal(0, 0, 0, mContext.getResources().getString(titleResourceId)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleResourceId) { + return addInternal(itemId, groupId, order, mContext.getResources().getString(titleResourceId)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + return addInternal(itemId, groupId, order, title); + } + + @Override + public MenuItem add(CharSequence title) { + return addInternal(0, 0, 0, title); + } + + @Override + public SubMenuBuilder addSubMenu(CharSequence title) { + return this.addSubMenu(DEFAULT_GROUP_ID, DEFAULT_ITEM_ID, DEFAULT_ORDER, title); + } + + @Override + public SubMenuBuilder addSubMenu(int titleResourceId) { + return this.addSubMenu(DEFAULT_GROUP_ID, DEFAULT_ITEM_ID, DEFAULT_ORDER, titleResourceId); + } + + @Override + public SubMenuBuilder addSubMenu(int groupId, int itemId, int order, int titleResourceId) { + String title = this.mContext.getResources().getString(titleResourceId); + return this.addSubMenu(groupId, itemId, order, title); + } + + @Override + public SubMenuBuilder addSubMenu(int groupId, int itemId, int order, CharSequence title) { + MenuItemImpl item = (MenuItemImpl)this.add(groupId, itemId, order, title); + SubMenuBuilder subMenu = new SubMenuBuilder(this.mContext, this, item); + item.setSubMenu(subMenu); + return subMenu; + } + + @Override + public void clear() { + this.mItems.clear(); + } + + @Override + public void close() {} + + @Override + public MenuItemImpl findItem(int itemId) { + for (MenuItemImpl item : this.mItems) { + if (item.getItemId() == itemId) { + return item; + } + } + return null; + } + + @Override + public MenuItemImpl getItem(int index) { + return this.mItems.get(index); + } + + @Override + public boolean hasVisibleItems() { + for (MenuItem item : this.mItems) { + if (item.isVisible()) { + return true; + } + } + return false; + } + + @Override + public void removeItem(int itemId) { + final int size = this.mItems.size(); + for (int i = 0; i < size; i++) { + if (this.mItems.get(i).getItemId() == itemId) { + this.mItems.remove(i); + return; + } + } + } + + @Override + public int size() { + return this.mItems.size(); + } + + @Override + public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, android.view.MenuItem[] outSpecificItems) { + PackageManager pm = mContext.getPackageManager(); + final List lri = + pm.queryIntentActivityOptions(caller, specifics, intent, 0); + final int N = lri != null ? lri.size() : 0; + + if ((flags & FLAG_APPEND_TO_GROUP) == 0) { + removeGroup(groupId); + } + + for (int i=0; i= 0) { + outSpecificItems[ri.specificIndex] = item; + } + } + + return N; + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return false; + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + throw new RuntimeException("Method not supported."); + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + return false; + } + + @Override + public void removeGroup(int groupId) { + final int size = this.mItems.size(); + for (int i = 0; i < size; i++) { + if (this.mItems.get(i).getGroupId() == groupId) { + this.mItems.remove(i); + } + } + } + + @Override + public void setGroupCheckable(int groupId, boolean checkable, boolean exclusive) { + final int N = mItems.size(); + for (int i = 0; i < N; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getGroupId() == groupId) { + item.setExclusiveCheckable(exclusive); + item.setCheckable(checkable); + } + } + } + + @Override + public void setGroupEnabled(int groupId, boolean enabled) { + final int size = this.mItems.size(); + for (int i = 0; i < size; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getGroupId() == groupId) { + item.setEnabled(enabled); + } + } + } + + @Override + public void setGroupVisible(int groupId, boolean visible) { + final int size = this.mItems.size(); + for (int i = 0; i < size; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getGroupId() == groupId) { + item.setVisible(visible); + } + } + } + + @Override + public void setQwertyMode(boolean isQwerty) { + throw new RuntimeException("Method not supported."); + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.java new file mode 100644 index 00000000..29040bab --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuInflaterWrapper.java @@ -0,0 +1,21 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; + +public final class MenuInflaterWrapper extends android.view.MenuInflater { + private final android.view.MenuInflater mMenuInflater; + + public MenuInflaterWrapper(Context context, android.view.MenuInflater menuInflater) { + super(context); + mMenuInflater = menuInflater; + } + + @Override + public void inflate(int menuRes, android.view.Menu menu) { + if (menu instanceof MenuWrapper) { + mMenuInflater.inflate(menuRes, ((MenuWrapper)menu).unwrap()); + } else { + mMenuInflater.inflate(menuRes, menu); + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java new file mode 100644 index 00000000..0970d7ed --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java @@ -0,0 +1,663 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.lang.ref.WeakReference; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.support.v4.view.MenuItem; +import android.util.Log; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.LayoutInflater; +import android.view.View; + +/** + * An implementation of the {@link android.view.MenuItem} interface for use in + * inflating menu XML resources to be added to a third-party action bar. + * + * @author Jake Wharton + * @see com.android.internal.view.menu.MenuItemImpl + */ +public final class MenuItemImpl implements MenuItem { + private static final String TAG = "MenuItemImpl"; + + private final MenuBuilder mMenu; + + private final int mItemId; + private final int mGroupId; + private final int mCategoryOrder; + private final int mOrdering; + + private Intent mIntent; + private CharSequence mTitle; + private CharSequence mTitleCondensed; + private char mNumericalShortcut; + private char mAlphabeticalShortcut; + private int mShowAsAction; + private SubMenuBuilder mSubMenu; + private Runnable mItemCallback; + private OnMenuItemClickListener mClickListener; + private Drawable mIcon; + private int mIconRes = View.NO_ID; + private View mActionView; + private int mActionViewRes = View.NO_ID; + + int mFlags = ENABLED; + static final int CHECKABLE = 0x01; + static final int CHECKED = 0x02; + static final int EXCLUSIVE = 0x04; + static final int HIDDEN = 0x08; + static final int ENABLED = 0x10; + static final int IS_ACTION = 0x20; + + private final WeakReference[] mItemViews; + + private final DialogInterface.OnClickListener subMenuClick = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int index) { + dialog.dismiss(); + mSubMenu.getItem(index).invoke(); + } + }; + private final DialogInterface.OnMultiChoiceClickListener subMenuMultiClick = new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int index, boolean isChecked) { + dialog.dismiss(); + mSubMenu.getItem(index).setChecked(isChecked); + } + }; + + + /** + * Create a new action bar menu item. + * + * @param context Context used if resource resolution is required. + * @param itemId A unique ID. Used in the activity callback. + * @param groupId Group ID. Currently unused. + * @param order Item order. Currently unused. + * @param title Title of the item. + */ + @SuppressWarnings("unchecked") + public MenuItemImpl(MenuBuilder menu, int groupId, int itemId, int order, int ordering, CharSequence title, int showAsAction) { + mMenu = menu; + + mItemId = itemId; + mGroupId = groupId; + mCategoryOrder = order; + mOrdering = ordering; + mTitle = title; + mShowAsAction = showAsAction; + + mItemViews = new WeakReference[MenuBuilder.NUM_TYPES]; + } + + + + public boolean invoke() { + if (hasSubMenu()) { + AlertDialog.Builder builder = new AlertDialog.Builder(mMenu.getContext()); + builder.setTitle(getTitle()); + + final boolean isExclusive = mSubMenu.getItem(0).isExclusiveCheckable(); + final boolean isCheckable = mSubMenu.getItem(0).isCheckable(); + final CharSequence[] titles = getSubMenuTitles(); + if (isExclusive) { + builder.setSingleChoiceItems(titles, getSubMenuSelected(), subMenuClick); + } else if (isCheckable) { + builder.setMultiChoiceItems(titles, getSubMenuChecked(), subMenuMultiClick); + } else { + builder.setItems(titles, subMenuClick); + } + + builder.show(); + return true; + } + + if (mClickListener != null && + mClickListener.onMenuItemClick(this)) { + return true; + } + + MenuBuilder.Callback callback = mMenu.getRootMenu().getCallback(); + if (callback != null && + callback.onMenuItemSelected(mMenu.getRootMenu(), this)) { + return true; + } + + if (mItemCallback != null) { + mItemCallback.run(); + return true; + } + + if (mIntent != null) { + try { + mMenu.getContext().startActivity(mIntent); + return true; + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Can't find activity to handle intent; ignoring", e); + } + } + + return false; + } + + private CharSequence[] getSubMenuTitles() { + final int count = mSubMenu.size(); + CharSequence[] list = new CharSequence[count]; + for (int i = 0; i < count; i++) { + list[i] = mSubMenu.getItem(i).getTitle(); + } + return list; + } + + private int getSubMenuSelected() { + final int count = mSubMenu.size(); + for (int i = 0; i < count; i++) { + if (mSubMenu.getItem(i).isChecked()) { + return i; + } + } + return -1; + } + + private boolean[] getSubMenuChecked() { + final int count = mSubMenu.size(); + boolean[] checked = new boolean[count]; + for (int i = 0; i < count; i++) { + checked[i] = mSubMenu.getItem(i).isChecked(); + } + return checked; + } + + private boolean hasItemView(int menuType) { + return mItemViews[menuType] != null && mItemViews[menuType].get() != null; + } + + public void setItemView(int type, MenuView.ItemView itemView) { + mItemViews[type] = new WeakReference(itemView); + } + + + public void addTo(android.view.Menu menu) { + if (hasSubMenu()) { + android.view.SubMenu subMenu = menu.addSubMenu(mGroupId, mItemId, mCategoryOrder, mTitle); + if (mIconRes != View.NO_ID) { + subMenu.setIcon(mIconRes); + } else { + subMenu.setIcon(mIcon); + } + for (MenuItemImpl item : mSubMenu.getItems()) { + item.addTo(subMenu); + } + + if (mSubMenu.getItem(0).isExclusiveCheckable()) { + int checked = getSubMenuSelected(); + if (checked != -1) { + subMenu.getItem(checked).setChecked(true); + } + } + } else { + android.view.MenuItem item = menu.add(mGroupId, mItemId, mCategoryOrder, mTitle) + .setAlphabeticShortcut(mAlphabeticalShortcut) + .setNumericShortcut(mNumericalShortcut) + .setVisible(isVisible()) + .setIntent(mIntent) + .setCheckable(isCheckable()) + .setChecked(isChecked()) + .setOnMenuItemClickListener(mClickListener); + + if (isExclusiveCheckable()) { + menu.setGroupCheckable(mGroupId, true, true); + } + + //Create and initialize a native itemview wrapper + NativeMenuItemView nativeWrapper = new NativeMenuItemView(item); + nativeWrapper.initialize(this, MenuBuilder.TYPE_NATIVE); + + //Associate the itemview to this so changes will be reflected + setItemView(MenuBuilder.TYPE_NATIVE, nativeWrapper); + } + } + + /** + * Get whether or not this item is being shown on the action bar. + * + * @return {@code true} if shown, {@code false} otherwise. + */ + public boolean isShownOnActionBar() { + return (mFlags & IS_ACTION) == IS_ACTION; + } + + /** + * Denote whether or not this menu item is being shown on the action bar. + * + * @param isShownOnActionBar {@code true} if shown or {@code false}. + */ + public void setIsShownOnActionBar(boolean isShownOnActionBar) { + mFlags = (mFlags & ~IS_ACTION) | (isShownOnActionBar ? IS_ACTION : 0); + } + + @Override + public Intent getIntent() { + return this.mIntent; + } + + @Override + public int getItemId() { + return this.mItemId; + } + + @Override + public CharSequence getTitle() { + return this.mTitle; + } + + @Override + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + @Override + public boolean isVisible() { + return (mFlags & HIDDEN) == 0; + } + + @Override + public MenuItem setEnabled(boolean enabled) { + final boolean oldValue = isEnabled(); + mFlags = (mFlags & ~ENABLED) | (enabled ? ENABLED : 0); + + if (oldValue != enabled) { + for (int i = MenuBuilder.NUM_TYPES - 1; i >= 0; i--) { + if (hasItemView(i)) { + mItemViews[i].get().setEnabled(enabled); + } + } + } + + return this; + } + + @Override + public MenuItem setIcon(int iconResourceId) { + mIcon = null; + mIconRes = iconResourceId; + + if (mIconRes != View.NO_ID) { + setIconOnViews(mMenu.getContext().getResources().getDrawable(mIconRes)); + } + + return this; + } + + @Override + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + @Override + public MenuItem setTitle(CharSequence title) { + mTitle = title; + return this; + } + + @Override + public MenuItem setTitle(int titleResourceId) { + mTitle = mMenu.getContext().getResources().getString(titleResourceId); + return this; + } + + @Override + public MenuItem setVisible(boolean visible) { + final boolean oldValue = isVisible(); + mFlags = (mFlags & ~HIDDEN) | (visible ? 0 : HIDDEN); + if (oldValue != visible) { + for (int i = MenuBuilder.NUM_TYPES - 1; i >= 0; i--) { + if (hasItemView(i)) { + mItemViews[i].get().setVisible(visible); + } + } + } + return this; + } + + @Override + public boolean isChecked() { + return (mFlags & CHECKED) == CHECKED; + } + + @Override + public MenuItem setChecked(boolean checked) { + if ((mFlags & EXCLUSIVE) == EXCLUSIVE) { + // Call the method on the Menu since it knows about the others in this + // exclusive checkable group + mMenu.setExclusiveItemChecked(this); + } else { + setCheckedInt(checked); + } + + return this; + } + + void setCheckedInt(boolean checked) { + final boolean oldValue = isChecked(); + mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); + if (oldValue != checked) { + for (int i = MenuBuilder.NUM_TYPES - 1; i >= 0; i--) { + if (hasItemView(i)) { + mItemViews[i].get().setChecked(checked); + } + } + } + } + + @Override + public boolean isCheckable() { + return (mFlags & CHECKABLE) == CHECKABLE; + } + + @Override + public MenuItem setCheckable(boolean checkable) { + final boolean oldValue = isCheckable(); + mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); + if (oldValue != checkable) { + for (int i = MenuBuilder.NUM_TYPES - 1; i >= 0; i--) { + if (hasItemView(i)) { + mItemViews[i].get().setCheckable(checkable); + } + } + } + + return this; + } + + public void setExclusiveCheckable(boolean exclusive) { + mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); + } + + public boolean isExclusiveCheckable() { + return (mFlags & EXCLUSIVE) == EXCLUSIVE; + } + + @Override + public CharSequence getTitleCondensed() { + return mTitleCondensed; + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mTitleCondensed = title; + return this; + } + + @Override + public int getGroupId() { + return mGroupId; + } + + @Override + public int getOrder() { + return mCategoryOrder; + } + + public int getOrdering() { + return mOrdering; + } + + @Override + public SubMenuBuilder getSubMenu() { + return mSubMenu; + } + + /** + * Set the sub-menu of this item. + * + * @param subMenu Sub-menu instance. + * @return This Item so additional setters can be called. + */ + MenuItem setSubMenu(SubMenuBuilder subMenu) { + mSubMenu = subMenu; + return this; + } + + @Override + public boolean hasSubMenu() { + return (mSubMenu != null) && (mSubMenu.size() > 0); + } + + @Override + public char getAlphabeticShortcut() { + return mAlphabeticalShortcut; + } + + @Override + public char getNumericShortcut() { + return mNumericalShortcut; + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + mAlphabeticalShortcut = Character.toLowerCase(alphaChar); + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + mNumericalShortcut = numericChar; + return this; + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + setNumericShortcut(numericChar); + setAlphabeticShortcut(alphaChar); + return this; + } + + @Override + public void setShowAsAction(int actionEnum) { + mShowAsAction = actionEnum; + } + + public int getShowAsAction() { + return mShowAsAction; + } + + public boolean showsActionItemText() { + return mMenu.getShowsActionItemText(); + } + + @Override + public View getActionView() { + if (mActionView != null) { + return mActionView; + } + if (mActionViewRes != View.NO_ID) { + return LayoutInflater.from(mMenu.getContext()).inflate(mActionViewRes, null, false); + } + return null; + } + + @Override + public Drawable getIcon() { + if (mIcon != null) { + return mIcon; + } + if (mIconRes != View.NO_ID) { + return mMenu.getContext().getResources().getDrawable(mIconRes); + } + return null; + } + + @Override + public ContextMenuInfo getMenuInfo() { + return null; + } + + @Override + public MenuItem setActionView(View view) { + mActionView = view; + mActionViewRes = View.NO_ID; + setActionViewOnViews(mActionView); + return this; + } + + @Override + public MenuItem setActionView(int resId) { + mActionView = null; + mActionViewRes = resId; + + if (mActionViewRes != View.NO_ID) { + setActionViewOnViews(LayoutInflater.from(mMenu.getContext()).inflate(mActionViewRes, null, false)); + } + + return this; + } + + void setActionViewOnViews(View view) { + for (int i = MenuBuilder.NUM_TYPES - 1; i >= 0; i--) { + if (hasItemView(i)) { + mItemViews[i].get().setActionView(view); + } + } + } + + @Override + public MenuItem setIcon(Drawable icon) { + mIcon = icon; + mIconRes = View.NO_ID; + setIconOnViews(icon); + return this; + } + + void setIconOnViews(Drawable icon) { + for (int i = MenuBuilder.NUM_TYPES - 1; i >= 0; i--) { + if (hasItemView(i)) { + mItemViews[i].get().setIcon(icon); + } + } + } + + @Override + public android.view.MenuItem setOnMenuItemClickListener(final android.view.MenuItem.OnMenuItemClickListener menuItemClickListener) { + return this.setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + return menuItemClickListener.onMenuItemClick(new MenuItemWrapper(item)); + } + }); + } + + @Override + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mClickListener = menuItemClickListener; + return this; + } + + /** + * Returns the currently set menu click listener for this item. + * + * @return Click listener or {@code null}. + */ + public OnMenuItemClickListener getOnMenuItemClickListener() { + return mClickListener; + } + + + + + public static final class NativeMenuItemView implements MenuView.ItemView { + private final android.view.MenuItem mItem; + + + public NativeMenuItemView(android.view.MenuItem item) { + mItem = item; + } + + + @Override + public MenuItemImpl getItemData() { + return null; + } + + @Override + public void initialize(MenuItemImpl itemData, int menuType) { + setIcon(itemData.getIcon()); + setTitle(itemData.getTitle()); + setEnabled(itemData.isEnabled()); + setCheckable(itemData.isCheckable()); + setChecked(itemData.isChecked()); + setActionView(itemData.getActionView()); + setVisible(itemData.isVisible()); + } + + @Override + public boolean prefersCondensedTitle() { + return true; + } + + @Override + public void setCheckable(boolean checkable) { + mItem.setCheckable(checkable); + } + + @Override + public void setChecked(boolean checked) { + mItem.setChecked(checked); + } + + @Override + public void setEnabled(boolean enabled) { + mItem.setEnabled(enabled); + } + + @Override + public void setIcon(Drawable icon) { + mItem.setIcon(icon); + } + + @Override + public void setShortcut(boolean showShortcut, char shortcutKey) { + //Not supported + } + + @Override + public void setTitle(CharSequence title) { + mItem.setTitle(title); + } + + @Override + public boolean showsIcon() { + return true; + } + + @Override + public void setActionView(View actionView) { + //Not supported + } + + @Override + public void setVisible(boolean visible) { + mItem.setVisible(visible); + } + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java new file mode 100644 index 00000000..2ed1e548 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java @@ -0,0 +1,315 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * Copyright (C) 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.support.v4.view.MenuItem; +import android.support.v4.view.SubMenu; +import android.view.View; +import android.view.ContextMenu.ContextMenuInfo; + +/** + *

Interface for direct access to a previously created menu item.

+ * + *

An Item is returned by calling one of the {@link Menu#add(int)} + * methods.

+ * + *

For a feature set of specific menu types, see {@link Menu}.

+ */ +public final class MenuItemWrapper implements MenuItem { + private static final class HoneycombMenuItem { + static View getActionView(android.view.MenuItem item) { + return item.getActionView(); + } + + static void setActionView(android.view.MenuItem item, int resId) { + item.setActionView(resId); + } + + static void setActionView(android.view.MenuItem item, View view) { + item.setActionView(view); + } + + static void setShowAsAction(android.view.MenuItem item, int actionEnum) { + item.setShowAsAction(actionEnum); + } + } + + /** Native {@link android.view.MenuItem} whose methods are wrapped. */ + private final android.view.MenuItem mMenuItem; + + /** + * Constructor used to create a wrapper to a native + * {@link android.view.MenuItem} so we can return the same type for native + * and {@link MenuItemImpl} instances, the latter of which will override + * all the methods defined in this base class. + * + * @param menuItem Native instance. + */ + public MenuItemWrapper(android.view.MenuItem menuItem) { + mMenuItem = menuItem; + } + + + /** + * Returns the currently set action view for this menu item. + * + * @return The item's action view + * @see #setActionView(int) + * @see #setActionView(View) + * @see #setShowAsAction(int) + */ + public View getActionView() { + if (mMenuItem != null) { + return HoneycombMenuItem.getActionView(mMenuItem); + } + return null; + } + + /** + * Set an action view for this menu item. An action view will be displayed + * in place of an automatically generated menu item element in the UI when + * this item is shown as an action within a parent. + * + * @param resId Layout resource to use for presenting this item to the user. + * @return This Item so additional setters can be called. + * @see #setActionView(View) + */ + public MenuItem setActionView(int resId) { + if (mMenuItem != null) { + HoneycombMenuItem.setActionView(mMenuItem, resId); + } + return this; + } + + /** + * Set an action view for this menu item. An action view will be displayed + * in place of an automatically generated menu item element in the UI when + * this item is shown as an action within a parent. + * + * @param view View to use for presenting this item to the user. + * @return This Item so additional setters can be called. + * @see #setActionView(int) + */ + public MenuItem setActionView(View view) { + if (mMenuItem != null) { + HoneycombMenuItem.setActionView(mMenuItem, view); + } + return this; + } + + /** + * Sets how this item should display in the presence of an Action Bar. The + * parameter actionEnum is a flag set. One of + * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or + * {@link #SHOW_AS_ACTION_NEVER} should be used, and you may optionally OR + * the value with {@link #SHOW_AS_ACTION_WITH_TEXT}. + * {@link #SHOW_AS_ACTION_WITH_TEXT} requests that when the item is shown as + * an action, it should be shown with a text label. + * + * @param actionEnum How the item should display. One of + * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or + * {@link #SHOW_AS_ACTION_NEVER}. {@link #SHOW_AS_ACTION_NEVER} is the + * default. + */ + public void setShowAsAction(int actionEnum) { + if (mMenuItem != null) { + HoneycombMenuItem.setShowAsAction(mMenuItem, actionEnum); + } + } + + // --------------------------------------------------------------------- + // MENU ITEM SUPPORT + // --------------------------------------------------------------------- + + @Override + public char getAlphabeticShortcut() { + return mMenuItem.getAlphabeticShortcut(); + } + + @Override + public int getGroupId() { + return mMenuItem.getGroupId(); + } + + @Override + public Drawable getIcon() { + return mMenuItem.getIcon(); + } + + @Override + public Intent getIntent() { + return mMenuItem.getIntent(); + } + + @Override + public int getItemId() { + return mMenuItem.getItemId(); + } + + @Override + public ContextMenuInfo getMenuInfo() { + return mMenuItem.getMenuInfo(); + } + + @Override + public char getNumericShortcut() { + return mMenuItem.getNumericShortcut(); + } + + @Override + public int getOrder() { + return mMenuItem.getOrder(); + } + + @Override + public SubMenu getSubMenu() { + return new SubMenuWrapper(mMenuItem.getSubMenu()); + } + + @Override + public CharSequence getTitle() { + return mMenuItem.getTitle(); + } + + @Override + public CharSequence getTitleCondensed() { + return mMenuItem.getTitleCondensed(); + } + + @Override + public boolean hasSubMenu() { + return mMenuItem.hasSubMenu(); + } + + @Override + public boolean isCheckable() { + return mMenuItem.isCheckable(); + } + + @Override + public boolean isChecked() { + return mMenuItem.isChecked(); + } + + @Override + public boolean isEnabled() { + return mMenuItem.isEnabled(); + } + + @Override + public boolean isVisible() { + return mMenuItem.isVisible(); + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + mMenuItem.setAlphabeticShortcut(alphaChar); + return this; + } + + @Override + public MenuItem setCheckable(boolean checkable) { + mMenuItem.setCheckable(checkable); + return this; + } + + @Override + public MenuItem setChecked(boolean checked) { + mMenuItem.setChecked(checked); + return this; + } + + @Override + public MenuItem setEnabled(boolean enabled) { + mMenuItem.setEnabled(enabled); + return this; + } + + @Override + public MenuItem setIcon(Drawable icon) { + mMenuItem.setIcon(icon); + return this; + } + + @Override + public MenuItem setIcon(int iconRes) { + mMenuItem.setIcon(iconRes); + return this; + } + + @Override + public MenuItem setIntent(Intent intent) { + mMenuItem.setIntent(intent); + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + mMenuItem.setNumericShortcut(numericChar); + return this; + } + + @Override + public MenuItem setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener menuItemClickListener) { + mMenuItem.setOnMenuItemClickListener(menuItemClickListener); + return this; + } + + /** + * Set a custom listener for invocation of this menu item. + * + * @param menuItemClickListener The object to receive invokations. + * @return This Item so additional setters can be called. + */ + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mMenuItem.setOnMenuItemClickListener(menuItemClickListener); + return this; + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + mMenuItem.setShortcut(numericChar, alphaChar); + return this; + } + + @Override + public MenuItem setTitle(CharSequence title) { + mMenuItem.setTitle(title); + return this; + } + + @Override + public MenuItem setTitle(int title) { + mMenuItem.setTitle(title); + return this; + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mMenuItem.setTitleCondensed(title); + return this; + } + + @Override + public MenuItem setVisible(boolean visible) { + mMenuItem.setVisible(visible); + return this; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java new file mode 100644 index 00000000..daae3fe8 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; +import android.view.View; + +/** + * Minimal interface for a menu view. {@link #initialize(MenuBuilder, int)} must be called for the + * menu to be functional. + * + * @hide + */ +public interface MenuView { + /** + * Initializes the menu to the given menu. This should be called after the + * view is inflated. + * + * @param menu The menu that this MenuView should display. + * @param menuType The type of this menu, one of + * {@link MenuBuilder#TYPE_ICON}, {@link MenuBuilder#TYPE_EXPANDED}, + * {@link MenuBuilder#TYPE_DIALOG}). + */ + public void initialize(MenuBuilder menu, int menuType); + + /** + * Forces the menu view to update its view to reflect the new state of the menu. + * + * @param cleared Whether the menu was cleared or just modified. + */ + public void updateChildren(boolean cleared); + + /** + * Returns the default animations to be used for this menu when entering/exiting. + * @return A resource ID for the default animations to be used for this menu. + */ + public int getWindowAnimations(); + + /** + * Minimal interface for a menu item view. {@link #initialize(MenuItemImpl, int)} must be called + * for the item to be functional. + */ + public interface ItemView { + /** + * Initializes with the provided MenuItemData. This should be called after the view is + * inflated. + * @param itemData The item that this ItemView should display. + * @param menuType The type of this menu, one of + * {@link MenuBuilder#TYPE_ICON}, {@link MenuBuilder#TYPE_EXPANDED}, + * {@link MenuBuilder#TYPE_DIALOG}). + */ + public void initialize(MenuItemImpl itemData, int menuType); + + /** + * Gets the item data that this view is displaying. + * @return the item data, or null if there is not one + */ + public MenuItemImpl getItemData(); + + /** + * Sets the title of the item view. + * @param title The title to set. + */ + public void setTitle(CharSequence title); + + /** + * Sets the enabled state of the item view. + * @param enabled Whether the item view should be enabled. + */ + public void setEnabled(boolean enabled); + + /** + * Displays the checkbox for the item view. This does not ensure the item view will be + * checked, for that use {@link #setChecked}. + * @param checkable Whether to display the checkbox or to hide it + */ + public void setCheckable(boolean checkable); + + /** + * Checks the checkbox for the item view. If the checkbox is hidden, it will NOT be + * made visible, call {@link #setCheckable(boolean)} for that. + * @param checked Whether the checkbox should be checked + */ + public void setChecked(boolean checked); + + /** + * Sets the visibility for the item view. + * @param visible Whether the item is visible + */ + public void setVisible(boolean visible); + + /** + * Sets the shortcut for the item. + * @param showShortcut Whether a shortcut should be shown(if false, the value of + * shortcutKey should be ignored). + * @param shortcutKey The shortcut key that should be shown on the ItemView. + */ + public void setShortcut(boolean showShortcut, char shortcutKey); + + /** + * Set the icon of this item view. + * @param icon The icon of this item. null to hide the icon. + */ + public void setIcon(Drawable icon); + + /** + * Set the action view of this item view. + * @param actionView Action view. + */ + public void setActionView(View actionView); + + /** + * Whether this item view prefers displaying the condensed title rather + * than the normal title. If a condensed title is not available, the + * normal title will be used. + * + * @return Whether this item view prefers displaying the condensed + * title. + */ + public boolean prefersCondensedTitle(); + + /** + * Whether this item view shows an icon. + * + * @return Whether this item view shows an icon. + */ + public boolean showsIcon(); + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java new file mode 100644 index 00000000..4e499930 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java @@ -0,0 +1,156 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.content.ComponentName; +import android.content.Intent; +import android.support.v4.view.Menu; +import android.support.v4.view.MenuItem; +import android.support.v4.view.SubMenu; +import android.view.KeyEvent; + +/** + * Wrapper around a native Menu instance which implements our version of the + * Menu interface. + */ +public class MenuWrapper implements Menu { + /** Native menu. */ + private final android.view.Menu mMenu; + + /** + * Create a new wrapped instance. + * + * @param menu Native menu. + */ + public MenuWrapper(android.view.Menu menu) { + this.mMenu = menu; + } + + /** + * Get the native menu instance we are wrapping. + * + * @return Native menu. + */ + android.view.Menu unwrap() { + return mMenu; + } + + @Override + public MenuItem add(CharSequence title) { + return new MenuItemWrapper(mMenu.add(title)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return new MenuItemWrapper(mMenu.add(groupId, itemId, order, titleRes)); + } + + @Override + public MenuItem add(int titleRes) { + return new MenuItemWrapper(mMenu.add(titleRes)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + return new MenuItemWrapper(mMenu.add(groupId, itemId, order, title)); + } + + @Override + public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, android.view.MenuItem[] outSpecificItems) { + return mMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, outSpecificItems); + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return new SubMenuWrapper(mMenu.addSubMenu(title)); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return new SubMenuWrapper(mMenu.addSubMenu(titleRes)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { + return new SubMenuWrapper(mMenu.addSubMenu(groupId, itemId, order, title)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + return new SubMenuWrapper(mMenu.addSubMenu(groupId, itemId, order, titleRes)); + } + + @Override + public void clear() { + mMenu.clear(); + } + + @Override + public void close() { + mMenu.close(); + } + + @Override + public MenuItem findItem(int id) { + android.view.MenuItem item = mMenu.findItem(id); + return (item != null) ? new MenuItemWrapper(item) : null; + } + + @Override + public MenuItem getItem(int index) { + return new MenuItemWrapper(mMenu.getItem(index)); + } + + @Override + public boolean hasVisibleItems() { + return mMenu.hasVisibleItems(); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return mMenu.isShortcutKey(keyCode, event); + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + return mMenu.performIdentifierAction(id, flags); + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + return mMenu.performShortcut(keyCode, event, flags); + } + + @Override + public void removeGroup(int groupId) { + mMenu.removeGroup(groupId); + } + + @Override + public void removeItem(int id) { + mMenu.removeItem(id); + } + + @Override + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + mMenu.setGroupCheckable(group, checkable, exclusive); + } + + @Override + public void setGroupEnabled(int group, boolean enabled) { + mMenu.setGroupEnabled(group, enabled); + } + + @Override + public void setGroupVisible(int group, boolean visible) { + mMenu.setGroupVisible(group, visible); + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mMenu.setQwertyMode(isQwerty); + } + + @Override + public int size() { + return mMenu.size(); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java new file mode 100644 index 00000000..dac262d5 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * Copyright (C) 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.view.SubMenu; +import android.view.View; + +/** + * The model for a sub menu, which is an extension of the menu. Most methods + * are proxied to the parent menu. + */ +public final class SubMenuBuilder extends MenuBuilder implements SubMenu { + private MenuBuilder mParentMenu; + private MenuItemImpl mItem; + + public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) { + super(context); + + mParentMenu = parentMenu; + mItem = item; + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mParentMenu.setQwertyMode(isQwerty); + } + + //@Override + //public boolean isQwertyMode() { + // return mParentMenu.isQwertyMode(); + //} + + //@Override + //public void setShortcutsVisible(boolean shortcutsVisible) { + // mParentMenu.setShortcutsVisible(shortcutsVisible); + //} + + //@Override + //public boolean isShortcutsVisible() { + // return mParentMenu.isShortcutsVisible(); + //} + + MenuBuilder getParentMenu() { + return mParentMenu; + } + + @Override + public MenuItemImpl getItem() { + return mItem; + } + + //@Override + //public Callback getCallback() { + // return mParentMenu.getCallback(); + //} + + //@Override + //public void setCallback(Callback callback) { + // mParentMenu.setCallback(callback); + //} + + @Override + public MenuBuilder getRootMenu() { + return mParentMenu; + } + + public SubMenuBuilder setIcon(Drawable icon) { + mItem.setIcon(icon); + return this; + } + + public SubMenuBuilder setIcon(int iconRes) { + mItem.setIcon(iconRes); + return this; + } + + public SubMenuBuilder setHeaderIcon(Drawable icon) { + throw new RuntimeException("Method not supported."); + } + + public SubMenuBuilder setHeaderIcon(int iconRes) { + throw new RuntimeException("Method not supported."); + } + + public SubMenuBuilder setHeaderTitle(CharSequence title) { + throw new RuntimeException("Method not supported."); + } + + public SubMenuBuilder setHeaderTitle(int titleRes) { + throw new RuntimeException("Method not supported."); + } + + @Override + public SubMenuBuilder setHeaderView(View view) { + throw new RuntimeException("Method not supported."); + } + + @Override + public void clearHeader() { + throw new RuntimeException("Method not supported."); + } +} \ No newline at end of file diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java new file mode 100644 index 00000000..60e81ea7 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java @@ -0,0 +1,82 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; +import android.support.v4.view.MenuItem; +import android.support.v4.view.SubMenu; +import android.view.View; + +public class SubMenuWrapper extends MenuWrapper implements SubMenu { + /** Native sub-menu. */ + private final android.view.SubMenu mSubMenu; + + /** + * Create a new wrapped instance. + * + * @param subMenu Native sub-menu. + */ + public SubMenuWrapper(android.view.SubMenu subMenu) { + super(subMenu); + mSubMenu = subMenu; + } + + /** + * Get the native sub-menu instance we are wrapping. + * + * @return Native sub-menu. + */ + android.view.SubMenu unwrap() { + return mSubMenu; + } + + @Override + public void clearHeader() { + mSubMenu.clearHeader(); + } + + @Override + public MenuItem getItem() { + return new MenuItemWrapper(mSubMenu.getItem()); + } + + @Override + public SubMenu setHeaderIcon(Drawable icon) { + mSubMenu.setHeaderIcon(icon); + return this; + } + + @Override + public SubMenu setHeaderIcon(int iconRes) { + mSubMenu.setHeaderIcon(iconRes); + return this; + } + + @Override + public SubMenu setHeaderTitle(CharSequence title) { + mSubMenu.setHeaderTitle(title); + return this; + } + + @Override + public SubMenu setHeaderTitle(int titleRes) { + mSubMenu.setHeaderTitle(titleRes); + return this; + } + + @Override + public SubMenu setHeaderView(View view) { + mSubMenu.setHeaderView(view); + return this; + } + + @Override + public SubMenu setIcon(Drawable icon) { + mSubMenu.setIcon(icon); + return this; + } + + @Override + public SubMenu setIcon(int iconRes) { + mSubMenu.setIcon(iconRes); + return this; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java new file mode 100644 index 00000000..6f5a5992 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java @@ -0,0 +1,35 @@ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +public class ActionBarContainer extends FrameLayout { + private boolean mIsTransitioning; + + public ActionBarContainer(Context context) { + this(context, null); + } + + public ActionBarContainer(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return mIsTransitioning || super.onInterceptTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + return true; + } + + public void setTransitioning(boolean transitioning) { + mIsTransitioning = transitioning; + setDescendantFocusability(transitioning ? ViewGroup.FOCUS_BLOCK_DESCENDANTS : ViewGroup.FOCUS_AFTER_DESCENDANTS); + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java new file mode 100644 index 00000000..d51046eb --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java @@ -0,0 +1,690 @@ +package com.actionbarsherlock.internal.widget; + +import android.app.Activity; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.v4.app.ActionBar; +import android.support.v4.view.Window; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.AdapterView; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.Spinner; +import android.widget.SpinnerAdapter; +import android.widget.TextView; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.view.menu.ActionMenuItem; +import com.actionbarsherlock.internal.view.menu.ActionMenuItemView; + +public final class ActionBarView extends RelativeLayout { + /** Default display options if none are defined in the theme. */ + private static final int DEFAULT_DISPLAY_OPTIONS = ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME; + + /** Default navigation mode if one is not defined in the theme. */ + private static final int DEFAULT_NAVIGATION_MODE = ActionBar.NAVIGATION_MODE_STANDARD; + + + + private final View mHomeAsUpView; + private final View mHomeLayout; + private final ActionMenuItem mLogoNavItem; + + private final CharSequence mTitle; + private final TextView mTitleLayout; + + private final CharSequence mSubtitle; + private final TextView mSubtitleLayout; + + /** Indeterminate progress bar. */ + private final ProgressBar mIndeterminateProgress; + + /** List view. */ + private final Spinner mSpinner; + private SpinnerAdapter mSpinnerAdapter; + private final AdapterView.OnItemSelectedListener mNavItemSelectedListener; + private ActionBar.OnNavigationListener mCallback; + + /** Custom view parent. */ + private final FrameLayout mCustomView; + private View mCustomNavView; + + private ImageView mIconView; + private Drawable mLogo; + private Drawable mIcon; + private final Drawable mDivider; + + /** Container for all action items. */ + private final LinearLayout mActionsView; + + /** Container for all tab items. */ + private final LinearLayout mTabsView; + + /** + * Display state flags. + * + * @see #getDisplayOptions() + * @see #getDisplayOptionValue(int) + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + * @see #setDisplayOption(int, boolean) + * @see #reloadDisplay() + */ + private int mDisplayOptions; + + /** + * Current navigation mode + * + * @see #getNavigationMode() + * @see #setNavigationMode(int) + */ + private int mNavigationMode = -1; + + private boolean mIsConstructing; + + + + public ActionBarView(Context context) { + this(context, null); + } + + public ActionBarView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ActionBarView(final Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mIsConstructing = true; + LayoutInflater.from(context).inflate(R.layout.abs__action_bar, this, true); + + mNavItemSelectedListener = new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) { + if (mCallback != null) { + mCallback.onNavigationItemSelected(arg2, arg3); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + //No op + } + }; + + setBackgroundResource(0); + + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockTheme, defStyle, 0); + final ApplicationInfo appInfo = context.getApplicationInfo(); + final PackageManager pm = context.getPackageManager(); + + + //// TITLE //// + + mTitleLayout = (TextView)findViewById(R.id.abs__action_bar_title); + + //Try to load title style from the theme + final int titleTextStyle = a.getResourceId(R.styleable.SherlockTheme_abTitleTextStyle, 0); + if (titleTextStyle != 0) { + mTitleLayout.setTextAppearance(context, titleTextStyle); + } + + //Try to load title from the theme + mTitle = a.getString(R.styleable.SherlockTheme_abTitle); + if (mTitle != null) { + setTitle(mTitle); + } + + + //// SUBTITLE //// + + mSubtitleLayout = (TextView)findViewById(R.id.abs__action_bar_subtitle); + + //Try to load subtitle style from the theme + final int subtitleTextStyle = a.getResourceId(R.styleable.SherlockTheme_abSubtitleTextStyle, 0); + if (subtitleTextStyle != 0) { + mSubtitleLayout.setTextAppearance(context, subtitleTextStyle); + } + + //Try to load subtitle from theme + mSubtitle = a.getString(R.styleable.SherlockTheme_abSubtitle); + if (mSubtitle != null) { + setSubtitle(mSubtitle); + } + + + /// HOME //// + + //TODO load optional home layout from theme + mHomeLayout = findViewById(R.id.abs__home_wrapper); + + //Try to load the logo from the theme + mLogo = a.getDrawable(R.styleable.SherlockTheme_abLogo); + /* + if ((mLogo == null) && (context instanceof Activity)) { + //LOGO LOADING DOES NOT WORK + //SEE: http://stackoverflow.com/questions/6105504/load-activity-and-or-application-logo-programmatically-from-manifest + //SEE: https://groups.google.com/forum/#!topic/android-developers/UFR4l0ZwJWc + } + */ + + //Try to load the icon from the theme + mIcon = a.getDrawable(R.styleable.SherlockTheme_abIcon); + if ((mIcon == null) && (context instanceof Activity)) { + mIcon = appInfo.loadIcon(pm); + } + + mHomeAsUpView = findViewById(R.id.abs__up); + mIconView = (ImageView)findViewById(R.id.abs__home); + + + //// NAVIGATION //// + + mSpinner = (Spinner)findViewById(R.id.abs__nav_list); + mSpinner.setOnItemSelectedListener(mNavItemSelectedListener); + + mTabsView = (LinearLayout)findViewById(R.id.abs__nav_tabs); + + + //// CUSTOM VIEW //// + + mCustomView = (FrameLayout)findViewById(R.id.abs__custom); + + //Try to load a custom view from the theme. This will NOT automatically + //trigger the visibility of the custom layout, however. + final int customViewResourceId = a.getResourceId(R.styleable.SherlockTheme_abCustomNavigationLayout, 0); + if (customViewResourceId != 0) { + mCustomNavView = LayoutInflater.from(context).inflate(customViewResourceId, mCustomView, true); + mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + setDisplayOptions(mDisplayOptions | ActionBar.DISPLAY_SHOW_CUSTOM); + } + + + + + mActionsView = (LinearLayout)findViewById(R.id.abs__actions); + mDivider = a.getDrawable(R.styleable.SherlockTheme_abDivider); + + mIndeterminateProgress = (ProgressBar)findViewById(R.id.abs__iprogress); + + //Try to get the display options defined in the theme, or fall back to + //displaying the title and home icon + setDisplayOptions(a.getInteger(R.styleable.SherlockTheme_abDisplayOptions, DEFAULT_DISPLAY_OPTIONS)); + + //Try to get the navigation defined in the theme, or, fall back to + //use standard navigation by default + setNavigationMode(a.getInteger(R.styleable.SherlockTheme_abNavigationMode, DEFAULT_NAVIGATION_MODE)); + + + //Reduce, Reuse, Recycle! + a.recycle(); + mIsConstructing = false; + + mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle); + mHomeLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (context instanceof Activity) { + ((Activity)context).onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem); + } + } + }); + mHomeLayout.setClickable(true); + mHomeLayout.setFocusable(true); + + reloadDisplay(); + } + + + + // ------------------------------------------------------------------------ + // HELPER METHODS + // ------------------------------------------------------------------------ + + /** + * Helper to get a boolean value for a specific flag. + * + * @param flag Target flag. + * @return Value. + */ + private boolean getDisplayOptionValue(int flag) { + return (mDisplayOptions & flag) == flag; + } + + /** + * Reload the current action bar display state. + */ + private void reloadDisplay() { + if (mIsConstructing) { + return; //Do not run if we are in the constructor + } + + final boolean isStandard = mNavigationMode == ActionBar.NAVIGATION_MODE_STANDARD; + final boolean isList = mNavigationMode == ActionBar.NAVIGATION_MODE_LIST; + final boolean isTab = mNavigationMode == ActionBar.NAVIGATION_MODE_TABS; + final boolean isTabUnderAb = isTab && getContext().getString(R.string.abs__tab_under_ab_tag).equals(mTabsView.getTag()); + final boolean hasSubtitle = (mSubtitleLayout.getText() != null) && !mSubtitleLayout.getText().equals(""); + final boolean displayHome = getDisplayOptionValue(ActionBar.DISPLAY_SHOW_HOME); + final boolean displayHomeAsUp = getDisplayOptionValue(ActionBar.DISPLAY_HOME_AS_UP); + final boolean displayTitle = getDisplayOptionValue(ActionBar.DISPLAY_SHOW_TITLE); + final boolean displayCustom = getDisplayOptionValue(ActionBar.DISPLAY_SHOW_CUSTOM); + final boolean displayLogo = getDisplayOptionValue(ActionBar.DISPLAY_USE_LOGO) && (mLogo != null); + + mHomeLayout.setVisibility(displayHome ? View.VISIBLE : View.GONE); + if (displayHome) { + mHomeAsUpView.setVisibility(displayHomeAsUp ? View.VISIBLE : View.GONE); + mIconView.setImageDrawable(displayLogo ? mLogo : mIcon); + } + + //Only show list if we are in list navigation and there are list items + mSpinner.setVisibility(isList ? View.VISIBLE : View.GONE); + + // Show tabs if in tabs navigation mode. + mTabsView.setVisibility(isTab ? View.VISIBLE : View.GONE); + + //Show title view if we are not in list navigation, not showing custom + //view, and the show title flag is true + mTitleLayout.setVisibility((isStandard || isTabUnderAb) && !displayCustom && displayTitle ? View.VISIBLE : View.GONE); + //Show subtitle view if we are not in list navigation, not showing + //custom view, show title flag is true, and a subtitle is set + mSubtitleLayout.setVisibility((isStandard || isTabUnderAb) && !displayCustom && displayTitle && hasSubtitle ? View.VISIBLE : View.GONE); + //Show custom view if we are not in list navigation and showing custom + //flag is set + mCustomView.setVisibility(isStandard && displayCustom ? View.VISIBLE : View.GONE); + } + + // ------------------------------------------------------------------------ + // ACTION BAR API + // ------------------------------------------------------------------------ + + public void addTab(ActionBar.Tab tab) { + final int tabCount = getTabCount(); + addTab(tab, tabCount, tabCount == 0); + } + + public void addTab(ActionBar.Tab tab, boolean setSelected) { + addTab(tab, getTabCount(), setSelected); + } + + public void addTab(ActionBar.Tab tab, int position) { + addTab(tab, position, getTabCount() == 0); + } + + public void addTab(ActionBar.Tab tab, int position, boolean setSelected) { + mTabsView.addView(((TabImpl)tab).mView, position); + if (setSelected) { + tab.select(); + } + } + + public View getCustomView() { + return mCustomNavView; + } + + public int getDisplayOptions() { + return mDisplayOptions; + } + + public SpinnerAdapter getDropdownAdapter() { + return this.mSpinnerAdapter; + } + + public int getDropdownSelectedPosition() { + return this.mSpinner.getSelectedItemPosition(); + } + + public int getNavigationMode() { + return mNavigationMode; + } + + public ActionBar.Tab getSelectedTab() { + final int count = mTabsView.getChildCount(); + for (int i = 0; i < count; i++) { + TabImpl tab = (TabImpl)mTabsView.getChildAt(i).getTag(); + if (tab.mView.isSelected()) { + return tab; + } + } + return null; + } + + public CharSequence getSubtitle() { + if ((mNavigationMode == ActionBar.NAVIGATION_MODE_STANDARD) && !mSubtitleLayout.getText().equals("")) { + return mSubtitleLayout.getText(); + } else { + return null; + } + } + + public ActionBar.Tab getTabAt(int index) { + View view = mTabsView.getChildAt(index); + return (view != null) ? (TabImpl)view.getTag() : null; + } + + public int getTabCount() { + return mTabsView.getChildCount(); + } + + public CharSequence getTitle() { + if ((mNavigationMode == ActionBar.NAVIGATION_MODE_STANDARD) && !mTitleLayout.getText().equals("")) { + return mTitleLayout.getText(); + } else { + return null; + } + } + + public TabImpl newTab() { + return new TabImpl(this); + } + + public void removeAllTabs() { + TabImpl selected = (TabImpl)getSelectedTab(); + if (selected != null) { + selected.unselect(); + } + mTabsView.removeAllViews(); + } + + public void removeTab(ActionBar.Tab tab) { + final int count = mTabsView.getChildCount(); + for (int i = 0; i < count; i++) { + TabImpl existingTab = (TabImpl)mTabsView.getChildAt(i).getTag(); + if (existingTab.equals(tab)) { + removeTabAt(i); + break; + } + } + } + + public void removeTabAt(int position) { + TabImpl tab = (TabImpl)getTabAt(position); + if (tab != null) { + tab.unselect(); + mTabsView.removeViewAt(position); + + if (position > 0) { + //Select previous tab + ((TabImpl)mTabsView.getChildAt(position - 1).getTag()).select(); + } else if (mTabsView.getChildCount() > 0) { + //Select first tab + ((TabImpl)mTabsView.getChildAt(0).getTag()).select(); + } + } + } + + public void setCallback(ActionBar.OnNavigationListener callback) { + mCallback = callback; + } + + public void setCustomNavigationView(View view) { + mCustomNavView = view; + mCustomView.removeAllViews(); + mCustomView.addView(view); + } + + public void setDisplayOptions(int options) { + mDisplayOptions = options; + reloadDisplay(); + } + + public void setDropdownAdapter(SpinnerAdapter spinnerAdapter) { + mSpinnerAdapter = spinnerAdapter; + if (mSpinner != null) { + mSpinner.setAdapter(mSpinnerAdapter); + } + } + + public void setDropdownSelectedPosition(int position) { + mSpinner.setSelection(position); + } + + public void setProgressBarIndeterminateVisibility(boolean visible) { + mIndeterminateProgress.setVisibility(visible ? View.VISIBLE : View.GONE); + } + + public void setNavigationMode(int mode) { + if ((mode != ActionBar.NAVIGATION_MODE_STANDARD) && (mode != ActionBar.NAVIGATION_MODE_LIST) + && (mode != ActionBar.NAVIGATION_MODE_TABS)) { + throw new IllegalArgumentException("Unknown navigation mode value " + Integer.toString(mode)); + } + + if (mode != mNavigationMode) { + mNavigationMode = mode; + reloadDisplay(); + } + } + + public void selectTab(ActionBar.Tab tab) { + final int count = mTabsView.getChildCount(); + for (int i = 0; i < count; i++) { + TabImpl existingTab = (TabImpl)mTabsView.getChildAt(i).getTag(); + if (existingTab.equals(tab)) { + existingTab.select(); + break; + } + } + } + + public void setSubtitle(CharSequence subtitle) { + mSubtitleLayout.setText((subtitle == null) ? "" : subtitle); + reloadDisplay(); + } + + public void setSubtitle(int resId) { + mSubtitleLayout.setText(resId); + reloadDisplay(); + } + + public void setTitle(CharSequence title) { + mTitleLayout.setText((title == null) ? "" : title); + } + + public void setTitle(int resId) { + mTitleLayout.setText(resId); + } + + // ------------------------------------------------------------------------ + // ACTION ITEMS SUPPORT + // ------------------------------------------------------------------------ + + public ActionMenuItemView newItem() { + ActionMenuItemView item = (ActionMenuItemView)LayoutInflater.from(getContext()).inflate(R.layout.abs__action_bar_item_layout, mActionsView, false); + return item; + } + + public void addItem(ActionMenuItemView item) { + if (mDivider != null) { + ImageView divider = new ImageView(getContext()); + divider.setImageDrawable(mDivider); + divider.setScaleType(ImageView.ScaleType.FIT_XY); + + LinearLayout.LayoutParams dividerParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.FILL_PARENT + ); + + mActionsView.addView(divider, dividerParams); + item.setDivider(divider); + } + + mActionsView.addView(item); + } + + public void removeAllItems() { + mActionsView.removeAllViews(); + } + + // ------------------------------------------------------------------------ + // HELPER INTERFACES AND HELPER CLASSES + // ------------------------------------------------------------------------ + + private static class TabImpl extends ActionBar.Tab { + private static final View.OnClickListener clickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + ((TabImpl)v.getTag()).select(); + } + }; + + final ActionBarView mActionBar; + final View mView; + final ImageView mIconView; + final TextView mTextView; + final FrameLayout mCustomView; + + ActionBar.TabListener mListener; + Object mTag; + + + TabImpl(ActionBarView actionBar) { + mActionBar = actionBar; + mView = LayoutInflater.from(mActionBar.getContext()).inflate(R.layout.abs__action_bar_tab_layout, actionBar.mTabsView, false); + mView.setTag(this); + mView.setOnClickListener(clickListener); + + mIconView = (ImageView)mView.findViewById(R.id.abs__tab_icon); + mTextView = (TextView)mView.findViewById(R.id.abs__tab); + mCustomView = (FrameLayout)mView.findViewById(R.id.abs__tab_custom); + } + + /** + * Update display to reflect current property state. + */ + void reloadDisplay() { + boolean hasCustom = mCustomView.getChildCount() > 0; + mIconView.setVisibility(hasCustom ? View.GONE : View.VISIBLE); + mTextView.setVisibility(hasCustom ? View.GONE : View.VISIBLE); + mCustomView.setVisibility(hasCustom ? View.VISIBLE : View.GONE); + } + + @Override + public View getCustomView() { + return mCustomView.getChildAt(0); + } + + @Override + public Drawable getIcon() { + return mIconView.getDrawable(); + } + + @Override + public int getPosition() { + final int count = mActionBar.mTabsView.getChildCount(); + for (int i = 0; i < count; i++) { + if (mActionBar.mTabsView.getChildAt(i).getTag().equals(this)) { + return i; + } + } + return -1; + } + + @Override + public ActionBar.TabListener getTabListener() { + return mListener; + } + + @Override + public Object getTag() { + return mTag; + } + + @Override + public CharSequence getText() { + return mTextView.getText(); + } + + @Override + public TabImpl setCustomView(int layoutResId) { + mCustomView.removeAllViews(); + LayoutInflater.from(mActionBar.getContext()).inflate(layoutResId, mCustomView, true); + reloadDisplay(); + return this; + } + + @Override + public TabImpl setCustomView(View view) { + mCustomView.removeAllViews(); + if (view != null) { + mCustomView.addView(view); + } + reloadDisplay(); + return this; + } + + @Override + public TabImpl setIcon(Drawable icon) { + mIconView.setImageDrawable(icon); + return this; + } + + @Override + public TabImpl setIcon(int resId) { + mIconView.setImageResource(resId); + return this; + } + + @Override + public TabImpl setTabListener(ActionBar.TabListener listener) { + mListener = listener; + return this; + } + + @Override + public TabImpl setTag(Object obj) { + mTag = obj; + return this; + } + + @Override + public TabImpl setText(int resId) { + mTextView.setText(resId); + return this; + } + + @Override + public TabImpl setText(CharSequence text) { + mTextView.setText(text); + return this; + } + + @Override + public void select() { + if (mView.isSelected()) { + if (mListener != null) { + mListener.onTabReselected(this, null); + } + return; + } + + TabImpl current = (TabImpl)mActionBar.getSelectedTab(); + if (current != null) { + current.unselect(); + } + + mView.setSelected(true); + if (mListener != null) { + mListener.onTabSelected(this, null); + } + } + + /** + * Unselect this tab. Only valid if the tab has been added to the + * action bar and was previously selected. + */ + void unselect() { + if (mView.isSelected()) { + mView.setSelected(false); + + if (mListener != null) { + mListener.onTabUnselected(this, null); + } + } + } + } +} diff --git a/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTextView.java b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTextView.java new file mode 100644 index 00000000..edd5ec0a --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTextView.java @@ -0,0 +1,51 @@ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.TextView; + +/** + * @author marco + * Workaround to be able to scroll text inside a TextView without it required + * to be focused. For some strange reason there isn't an easy way to do this + * natively. + * + * Original code written by Evan Cummings: + * http://androidbears.stellarpc.net/?p=185 + */ +public final class ScrollingTextView extends TextView { + + public ScrollingTextView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + } + + public ScrollingTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ScrollingTextView(Context context) { + super(context); + } + + @Override + protected void onFocusChanged(boolean focused, int direction, + Rect previouslyFocusedRect) { + if (focused) { + super.onFocusChanged(focused, direction, previouslyFocusedRect); + } + } + + @Override + public void onWindowFocusChanged(boolean focused) { + if (focused) { + super.onWindowFocusChanged(focused); + } + } + + @Override + public boolean isFocused() { + return true; + } +} diff --git a/external/JakeWharton-ActionBarSherlock/pom.xml b/external/JakeWharton-ActionBarSherlock/pom.xml new file mode 100644 index 00000000..ee3d1521 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/pom.xml @@ -0,0 +1,213 @@ + + + + 4.0.0 + + com.actionbarsherlock + parent + pom + 3.3.0 + + ActionBarSherlock (Parent) + Android library for implementing the action bar design pattern using the native ActionBar on 3.0+ and a custom implementation on pre-3.0 all through the same API. + https://github.com/JakeWharton/ActionBarSherlock + 2011 + + + library + plugins + samples + test + + + + http://github.com/JakeWharton/ActionBarSherlock/ + scm:git:git://github.com/JakeWharton/ActionBarSherlock.git + scm:git:git@github.com:JakeWharton/ActionBarSherlock.git + + + + + Jake Wharton + jakewharton@gmail.com + jakewharton + http://jakewharton.com + -5 + + developer + + + + + + + Apache License Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + personal-repository + JakeWharton.com Maven Repository + scp://r.jakewharton.com/home/jakewharton_repository/r.jakewharton.com/maven/release/ + + + personal-repository + JakeWharton.com Maven Repository + scp://r.jakewharton.com/home/jakewharton_repository/r.jakewharton.com/maven/snapshot/ + + + github-project-site + GitHub Project Pages + gitsite:git@github.com/JakeWharton/ActionBarSherlock + + + + + + Jake Wharton + http://jakewharton.com + + + + GitHub Issues + https://github.com/JakeWharton/ActionBarSherlock/issues + + + + UTF-8 + UTF-8 + + actionbarsherlock + + 1.6 + 3.2_r1 + 13 + 13_r1 + + + + + + android + android + ${android.version} + + + + com.google.android.maps + maps + ${android.maps.version} + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${java.version} + ${java.version} + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + + + com.jayway.maven.plugins.android.generation2 + maven-android-plugin + 2.9.0-beta-5 + + + ${android.platform} + + true + + true + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.6 + + true + + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.1 + + true + + + + + org.apache.maven.plugins + maven-site-plugin + 2.2 + false + + false + false + ${basedir}/website + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.6 + + + org.apache.maven.wagon + wagon-ssh + 1.0-beta-7 + + + + + + + + org.apache.maven.scm + maven-scm-provider-gitexe + 1.4 + + + org.apache.maven.scm + maven-scm-manager-plexus + 1.4 + + + org.kathrynhuxtable.maven.wagon + wagon-gitsite + 0.3.1 + + + + diff --git a/external/JakeWharton-ActionBarSherlock/update-version.py b/external/JakeWharton-ActionBarSherlock/update-version.py new file mode 100755 index 00000000..a80af157 --- /dev/null +++ b/external/JakeWharton-ActionBarSherlock/update-version.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +import os +import re +from datetime import date + +repo = os.path.dirname(os.path.realpath(__file__)) +changelog = os.path.join(repo, 'CHANGELOG.md') + +code = 'android:versionCode="%s"' +name = 'android:versionName="%s"' +in_code = code % r'(\d+)' +in_name = name % r'([^"]+)' +new_code = None +new_name = None + +# Update manifest files +for dirpath, dirnames, filenames in os.walk(repo): + for filename in filenames: + if filename == 'AndroidManifest.xml': + filepath = os.path.join(dirpath, filename) + with open(filepath) as f: + contents = f.read() + if new_code is None: + print('Current version code: ' + re.search(in_code, contents).group(1)) + new_code = raw_input('New version code: ') + print('Current version name: ' + re.search(in_name, contents).group(1)) + new_name = raw_input('New version name: ') + contents = re.sub(in_code, code % new_code, contents) + contents = re.sub(in_name, name % new_name, contents) + with open(filepath, 'w') as f: + f.write(contents) + +# Update change log +with open(changelog) as f: + contents = f.read() +if 'In Development' in contents: + contents = contents.replace('In Development', date.today().strftime('%Y-%m-%d')) + with open(changelog, 'w') as f: + f.write(contents)