From ba69b3a647d162f36afe3cd741b307c16eb8dcc8 Mon Sep 17 00:00:00 2001 From: cketti Date: Sat, 21 Jun 2014 16:54:09 +0200 Subject: [PATCH] Remove ActionBarSherlock --- .project | 1 - Android.mk | 4 +- build.gradle | 2 +- build.xml | 16 +- plugins/ActionBarSherlock/.gitignore | 34 - plugins/ActionBarSherlock/.travis.yml | 11 - plugins/ActionBarSherlock/CHANGELOG.md | 469 ----- plugins/ActionBarSherlock/CONTRIBUTING.md | 11 - plugins/ActionBarSherlock/LICENSE.txt | 202 -- plugins/ActionBarSherlock/README.md | 60 - plugins/ActionBarSherlock/checkstyle.xml | 121 -- plugins/ActionBarSherlock/library/.project | 33 - .../library/AndroidManifest.xml | 6 - plugins/ActionBarSherlock/library/README.md | 15 - .../ActionBarSherlock/library/build.gradle | 25 - .../library/libs/android-support-v4.jar | Bin 484258 -> 0 bytes plugins/ActionBarSherlock/library/pom.xml | 148 -- .../library/project.properties | 12 - ...s__primary_text_disable_only_holo_dark.xml | 20 - ...__primary_text_disable_only_holo_light.xml | 21 - .../res/color/abs__primary_text_holo_dark.xml | 24 - .../color/abs__primary_text_holo_light.xml | 26 - .../abs__ab_bottom_solid_dark_holo.9.png | Bin 144 -> 0 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 138 -> 0 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 144 -> 0 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 135 -> 0 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 134 -> 0 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 2863 -> 0 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 2859 -> 0 bytes .../abs__ab_solid_dark_holo.9.png | Bin 146 -> 0 bytes .../abs__ab_solid_light_holo.9.png | Bin 145 -> 0 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 192 -> 0 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 146 -> 0 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 146 -> 0 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 139 -> 0 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 133 -> 0 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 155 -> 0 bytes .../abs__ab_transparent_light_holo.9.png | Bin 145 -> 0 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 104 -> 0 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 102 -> 0 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 112 -> 0 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 108 -> 0 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 110 -> 0 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 108 -> 0 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 149 -> 0 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 145 -> 0 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 147 -> 0 bytes .../abs__cab_background_top_holo_light.9.png | Bin 147 -> 0 bytes .../abs__dialog_full_holo_dark.9.png | Bin 1414 -> 0 bytes .../abs__dialog_full_holo_light.9.png | Bin 1537 -> 0 bytes .../abs__ic_ab_back_holo_dark.png | Bin 602 -> 0 bytes .../abs__ic_ab_back_holo_light.png | Bin 546 -> 0 bytes .../abs__ic_cab_done_holo_dark.png | Bin 713 -> 0 bytes .../abs__ic_cab_done_holo_light.png | Bin 737 -> 0 bytes .../drawable-hdpi/abs__ic_clear_disabled.png | Bin 1774 -> 0 bytes .../drawable-hdpi/abs__ic_clear_normal.png | Bin 1945 -> 0 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 1504 -> 0 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 1540 -> 0 bytes .../library/res/drawable-hdpi/abs__ic_go.png | Bin 1415 -> 0 bytes .../abs__ic_go_search_api_holo_light.png | Bin 1252 -> 0 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 144 -> 0 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 148 -> 0 bytes .../abs__ic_menu_share_holo_dark.png | Bin 467 -> 0 bytes .../abs__ic_menu_share_holo_light.png | Bin 505 -> 0 bytes .../res/drawable-hdpi/abs__ic_search.png | Bin 2280 -> 0 bytes .../abs__ic_search_api_holo_light.png | Bin 2271 -> 0 bytes .../drawable-hdpi/abs__ic_voice_search.png | Bin 2070 -> 0 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 1833 -> 0 bytes .../abs__list_activated_holo.9.png | Bin 154 -> 0 bytes .../abs__list_divider_holo_dark.9.png | Bin 78 -> 0 bytes .../abs__list_divider_holo_light.9.png | Bin 76 -> 0 bytes .../abs__list_focused_holo.9.png | Bin 159 -> 0 bytes .../abs__list_longpressed_holo.9.png | Bin 154 -> 0 bytes .../abs__list_pressed_holo_dark.9.png | Bin 159 -> 0 bytes .../abs__list_pressed_holo_light.9.png | Bin 159 -> 0 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 189 -> 0 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 189 -> 0 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 922 -> 0 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 1061 -> 0 bytes .../abs__progress_bg_holo_dark.9.png | Bin 178 -> 0 bytes .../abs__progress_bg_holo_light.9.png | Bin 174 -> 0 bytes .../abs__progress_primary_holo_dark.9.png | Bin 917 -> 0 bytes .../abs__progress_primary_holo_light.9.png | Bin 917 -> 0 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 188 -> 0 bytes .../abs__progress_secondary_holo_light.9.png | Bin 188 -> 0 bytes .../abs__spinner_48_inner_holo.png | Bin 2081 -> 0 bytes .../abs__spinner_48_outer_holo.png | Bin 1811 -> 0 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 311 -> 0 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 312 -> 0 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 306 -> 0 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 306 -> 0 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 524 -> 0 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 523 -> 0 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 464 -> 0 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 458 -> 0 bytes .../abs__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_selected_holo.9.png | Bin 148 -> 0 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 145 -> 0 bytes ...__textfield_search_default_holo_dark.9.png | Bin 110 -> 0 bytes ..._textfield_search_default_holo_light.9.png | Bin 105 -> 0 bytes ...field_search_right_default_holo_dark.9.png | Bin 108 -> 0 bytes ...ield_search_right_default_holo_light.9.png | Bin 103 -> 0 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 114 -> 0 bytes ...eld_search_right_selected_holo_light.9.png | Bin 111 -> 0 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 114 -> 0 bytes ...textfield_search_selected_holo_light.9.png | Bin 112 -> 0 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 134 -> 0 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 129 -> 0 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 134 -> 0 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 123 -> 0 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 123 -> 0 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 2849 -> 0 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 191 -> 0 bytes .../abs__ab_solid_dark_holo.9.png | Bin 133 -> 0 bytes .../abs__ab_solid_light_holo.9.png | Bin 133 -> 0 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 168 -> 0 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 134 -> 0 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 133 -> 0 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 127 -> 0 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 123 -> 0 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 139 -> 0 bytes .../abs__ab_transparent_light_holo.9.png | Bin 133 -> 0 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 101 -> 0 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 99 -> 0 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 109 -> 0 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 105 -> 0 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 107 -> 0 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 105 -> 0 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 127 -> 0 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 124 -> 0 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 130 -> 0 bytes .../abs__cab_background_top_holo_light.9.png | Bin 128 -> 0 bytes .../abs__dialog_full_holo_dark.9.png | Bin 882 -> 0 bytes .../abs__dialog_full_holo_light.9.png | Bin 1003 -> 0 bytes .../abs__ic_ab_back_holo_dark.png | Bin 466 -> 0 bytes .../abs__ic_ab_back_holo_light.png | Bin 438 -> 0 bytes .../abs__ic_cab_done_holo_dark.png | Bin 566 -> 0 bytes .../abs__ic_cab_done_holo_light.png | Bin 552 -> 0 bytes .../drawable-mdpi/abs__ic_clear_disabled.png | Bin 1775 -> 0 bytes .../drawable-mdpi/abs__ic_clear_normal.png | Bin 1869 -> 0 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 740 -> 0 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 743 -> 0 bytes .../library/res/drawable-mdpi/abs__ic_go.png | Bin 1538 -> 0 bytes .../abs__ic_go_search_api_holo_light.png | Bin 570 -> 0 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 122 -> 0 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 131 -> 0 bytes .../abs__ic_menu_share_holo_dark.png | Bin 332 -> 0 bytes .../abs__ic_menu_share_holo_light.png | Bin 355 -> 0 bytes .../res/drawable-mdpi/abs__ic_search.png | Bin 2280 -> 0 bytes .../abs__ic_search_api_holo_light.png | Bin 1541 -> 0 bytes .../drawable-mdpi/abs__ic_voice_search.png | Bin 1937 -> 0 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 794 -> 0 bytes .../abs__list_activated_holo.9.png | Bin 151 -> 0 bytes .../abs__list_divider_holo_dark.9.png | Bin 78 -> 0 bytes .../abs__list_divider_holo_light.9.png | Bin 76 -> 0 bytes .../abs__list_focused_holo.9.png | Bin 158 -> 0 bytes .../abs__list_longpressed_holo.9.png | Bin 151 -> 0 bytes .../abs__list_pressed_holo_dark.9.png | Bin 158 -> 0 bytes .../abs__list_pressed_holo_light.9.png | Bin 158 -> 0 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 172 -> 0 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 171 -> 0 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 651 -> 0 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 720 -> 0 bytes .../abs__progress_bg_holo_dark.9.png | Bin 165 -> 0 bytes .../abs__progress_bg_holo_light.9.png | Bin 159 -> 0 bytes .../abs__progress_primary_holo_dark.9.png | Bin 572 -> 0 bytes .../abs__progress_primary_holo_light.9.png | Bin 572 -> 0 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 170 -> 0 bytes .../abs__progress_secondary_holo_light.9.png | Bin 170 -> 0 bytes .../abs__spinner_48_inner_holo.png | Bin 1336 -> 0 bytes .../abs__spinner_48_outer_holo.png | Bin 1165 -> 0 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 254 -> 0 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 255 -> 0 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 249 -> 0 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 249 -> 0 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 417 -> 0 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 424 -> 0 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 370 -> 0 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 370 -> 0 bytes .../abs__tab_selected_focused_holo.9.png | Bin 148 -> 0 bytes .../abs__tab_selected_holo.9.png | Bin 151 -> 0 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 150 -> 0 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 155 -> 0 bytes ...__textfield_search_default_holo_dark.9.png | Bin 106 -> 0 bytes ..._textfield_search_default_holo_light.9.png | Bin 100 -> 0 bytes ...field_search_right_default_holo_dark.9.png | Bin 105 -> 0 bytes ...ield_search_right_default_holo_light.9.png | Bin 98 -> 0 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 107 -> 0 bytes ...eld_search_right_selected_holo_light.9.png | Bin 107 -> 0 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 109 -> 0 bytes ...textfield_search_selected_holo_light.9.png | Bin 109 -> 0 bytes .../abs__progress_medium_holo.xml | 34 - .../abs__ab_bottom_solid_dark_holo.9.png | Bin 165 -> 0 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 157 -> 0 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 166 -> 0 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 153 -> 0 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 152 -> 0 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 2878 -> 0 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 2873 -> 0 bytes .../abs__ab_solid_dark_holo.9.png | Bin 163 -> 0 bytes .../abs__ab_solid_light_holo.9.png | Bin 163 -> 0 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 290 -> 0 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 163 -> 0 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 163 -> 0 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 158 -> 0 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 152 -> 0 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 171 -> 0 bytes .../abs__ab_transparent_light_holo.9.png | Bin 160 -> 0 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 109 -> 0 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 108 -> 0 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 112 -> 0 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 113 -> 0 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 115 -> 0 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 113 -> 0 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 166 -> 0 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 161 -> 0 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 174 -> 0 bytes .../abs__cab_background_top_holo_light.9.png | Bin 161 -> 0 bytes .../abs__dialog_full_holo_dark.9.png | Bin 2159 -> 0 bytes .../abs__dialog_full_holo_light.9.png | Bin 2302 -> 0 bytes .../abs__ic_ab_back_holo_dark.png | Bin 741 -> 0 bytes .../abs__ic_ab_back_holo_light.png | Bin 661 -> 0 bytes .../abs__ic_cab_done_holo_dark.png | Bin 970 -> 0 bytes .../abs__ic_cab_done_holo_light.png | Bin 915 -> 0 bytes .../drawable-xhdpi/abs__ic_clear_disabled.png | Bin 2531 -> 0 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 1315 -> 0 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 1447 -> 0 bytes .../library/res/drawable-xhdpi/abs__ic_go.png | Bin 1983 -> 0 bytes .../abs__ic_go_search_api_holo_light.png | Bin 836 -> 0 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 167 -> 0 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 184 -> 0 bytes .../abs__ic_menu_share_holo_dark.png | Bin 699 -> 0 bytes .../abs__ic_menu_share_holo_light.png | Bin 935 -> 0 bytes .../res/drawable-xhdpi/abs__ic_search.png | Bin 3784 -> 0 bytes .../abs__ic_search_api_holo_light.png | Bin 3037 -> 0 bytes .../drawable-xhdpi/abs__ic_voice_search.png | Bin 3053 -> 0 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 1414 -> 0 bytes .../abs__list_activated_holo.9.png | Bin 158 -> 0 bytes .../abs__list_divider_holo_dark.9.png | Bin 83 -> 0 bytes .../abs__list_divider_holo_light.9.png | Bin 83 -> 0 bytes .../abs__list_focused_holo.9.png | Bin 163 -> 0 bytes .../abs__list_longpressed_holo.9.png | Bin 158 -> 0 bytes .../abs__list_pressed_holo_dark.9.png | Bin 163 -> 0 bytes .../abs__list_pressed_holo_light.9.png | Bin 163 -> 0 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 190 -> 0 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 188 -> 0 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 1362 -> 0 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 1551 -> 0 bytes .../abs__progress_bg_holo_dark.9.png | Bin 174 -> 0 bytes .../abs__progress_bg_holo_light.9.png | Bin 172 -> 0 bytes .../abs__progress_primary_holo_dark.9.png | Bin 1309 -> 0 bytes .../abs__progress_primary_holo_light.9.png | Bin 1309 -> 0 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 184 -> 0 bytes .../abs__progress_secondary_holo_light.9.png | Bin 184 -> 0 bytes .../abs__spinner_48_inner_holo.png | Bin 2769 -> 0 bytes .../abs__spinner_48_outer_holo.png | Bin 2432 -> 0 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 395 -> 0 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 394 -> 0 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 381 -> 0 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 381 -> 0 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 680 -> 0 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 671 -> 0 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 609 -> 0 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 602 -> 0 bytes .../abs__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_selected_holo.9.png | Bin 153 -> 0 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 149 -> 0 bytes ...__textfield_search_default_holo_dark.9.png | Bin 126 -> 0 bytes ..._textfield_search_default_holo_light.9.png | Bin 126 -> 0 bytes ...field_search_right_default_holo_dark.9.png | Bin 125 -> 0 bytes ...ield_search_right_default_holo_light.9.png | Bin 127 -> 0 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 128 -> 0 bytes ...eld_search_right_selected_holo_light.9.png | Bin 128 -> 0 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 114 -> 0 bytes ...textfield_search_selected_holo_light.9.png | Bin 126 -> 0 bytes .../abs__activated_background_holo_dark.xml | 20 - .../abs__activated_background_holo_light.xml | 20 - .../drawable/abs__btn_cab_done_holo_dark.xml | 24 - .../drawable/abs__btn_cab_done_holo_light.xml | 24 - .../library/res/drawable/abs__ic_clear.xml | 22 - .../res/drawable/abs__ic_clear_holo_light.xml | 22 - .../abs__ic_menu_moreoverflow_holo_dark.xml | 18 - .../abs__ic_menu_moreoverflow_holo_light.xml | 18 - .../abs__item_background_holo_dark.xml | 26 - .../abs__item_background_holo_light.xml | 26 - ...lector_background_transition_holo_dark.xml | 20 - ...ector_background_transition_holo_light.xml | 20 - .../drawable/abs__list_selector_holo_dark.xml | 27 - .../abs__list_selector_holo_light.xml | 28 - .../abs__progress_horizontal_holo_dark.xml | 32 - .../abs__progress_horizontal_holo_light.xml | 32 - .../drawable/abs__progress_medium_holo.xml | 34 - .../drawable/abs__search_dropdown_dark.xml | 22 - .../drawable/abs__search_dropdown_light.xml | 22 - .../drawable/abs__spinner_ab_holo_dark.xml | 25 - .../drawable/abs__spinner_ab_holo_light.xml | 25 - .../drawable/abs__tab_indicator_ab_holo.xml | 34 - .../abs__textfield_searchview_holo_dark.xml | 22 - .../abs__textfield_searchview_holo_light.xml | 22 - ...__textfield_searchview_right_holo_dark.xml | 22 - ..._textfield_searchview_right_holo_light.xml | 22 - .../abs__action_mode_close_item.xml | 40 - .../sherlock_spinner_dropdown_item.xml | 26 - .../res/layout-v14/sherlock_spinner_item.xml | 26 - .../layout-xlarge/abs__screen_action_bar.xml | 50 - .../abs__screen_action_bar_overlay.xml | 49 - .../res/layout/abs__action_bar_home.xml | 38 - .../res/layout/abs__action_bar_tab.xml | 7 - .../layout/abs__action_bar_tab_bar_view.xml | 6 - .../res/layout/abs__action_bar_title_item.xml | 50 - .../layout/abs__action_menu_item_layout.xml | 56 - .../res/layout/abs__action_menu_layout.xml | 23 - .../res/layout/abs__action_mode_bar.xml | 24 - .../layout/abs__action_mode_close_item.xml | 31 - .../res/layout/abs__activity_chooser_view.xml | 70 - .../abs__activity_chooser_view_list_item.xml | 53 - .../res/layout/abs__dialog_title_holo.xml | 46 - .../layout/abs__list_menu_item_checkbox.xml | 26 - .../res/layout/abs__list_menu_item_icon.xml | 28 - .../res/layout/abs__list_menu_item_layout.xml | 59 - .../res/layout/abs__list_menu_item_radio.xml | 24 - .../layout/abs__popup_menu_item_layout.xml | 60 - .../res/layout/abs__screen_action_bar.xml | 57 - .../layout/abs__screen_action_bar_overlay.xml | 59 - .../library/res/layout/abs__screen_simple.xml | 38 - ...abs__screen_simple_overlay_action_mode.xml | 38 - .../abs__search_dropdown_item_icons_2line.xml | 89 - .../library/res/layout/abs__search_view.xml | 159 -- .../res/layout/abs__simple_dropdown_hint.xml | 29 - .../layout/sherlock_spinner_dropdown_item.xml | 26 - .../res/layout/sherlock_spinner_item.xml | 26 - .../library/res/values-land/abs__dimens.xml | 33 - .../abs__dimens.xml | 33 - .../abs__dimens.xml | 33 - .../abs__dimens.xml | 33 - .../abs__dimens.xml | 36 - .../library/res/values-large/abs__dimens.xml | 29 - .../library/res/values-sw600dp/abs__bools.xml | 19 - .../res/values-sw600dp/abs__dimens.xml | 38 - .../library/res/values-v11/abs__themes.xml | 12 - .../library/res/values-v14/abs__styles.xml | 123 -- .../library/res/values-v14/abs__themes.xml | 34 - .../library/res/values-w360dp/abs__dimens.xml | 22 - .../library/res/values-w480dp/abs__bools.xml | 22 - .../library/res/values-w480dp/abs__config.xml | 29 - .../library/res/values-w500dp/abs__dimens.xml | 22 - .../library/res/values-w600dp/abs__dimens.xml | 22 - .../library/res/values-xlarge/abs__dimens.xml | 45 - .../library/res/values/abs__attrs.xml | 432 ---- .../library/res/values/abs__bools.xml | 22 - .../library/res/values/abs__colors.xml | 27 - .../library/res/values/abs__config.xml | 43 - .../library/res/values/abs__dimens.xml | 67 - .../library/res/values/abs__ids.xml | 26 - .../library/res/values/abs__strings.xml | 53 - .../library/res/values/abs__styles.xml | 412 ---- .../library/res/values/abs__themes.xml | 239 --- .../src/android/support/v4/app/Watson.java | 144 -- .../actionbarsherlock/ActionBarSherlock.java | 794 -------- .../com/actionbarsherlock/app/ActionBar.java | 956 --------- .../app/SherlockActivity.java | 270 --- .../app/SherlockDialogFragment.java | 68 - .../app/SherlockExpandableListActivity.java | 259 --- .../app/SherlockFragment.java | 68 - .../app/SherlockFragmentActivity.java | 303 --- .../app/SherlockListActivity.java | 270 --- .../app/SherlockListFragment.java | 68 - .../app/SherlockPreferenceActivity.java | 270 --- .../internal/ActionBarSherlockCompat.java | 1203 ----------- .../internal/ActionBarSherlockNative.java | 336 --- .../internal/ResourcesCompat.java | 95 - .../internal/app/ActionBarImpl.java | 1026 ---------- .../internal/app/ActionBarWrapper.java | 468 ----- .../nineoldandroids/animation/Animator.java | 278 --- .../animation/AnimatorListenerAdapter.java | 54 - .../animation/AnimatorSet.java | 1111 ---------- .../animation/FloatEvaluator.java | 42 - .../animation/FloatKeyframeSet.java | 136 -- .../animation/IntEvaluator.java | 42 - .../animation/IntKeyframeSet.java | 135 -- .../nineoldandroids/animation/Keyframe.java | 361 ---- .../animation/KeyframeSet.java | 227 --- .../animation/ObjectAnimator.java | 491 ----- .../animation/PropertyValuesHolder.java | 1012 --------- .../animation/TypeEvaluator.java | 44 - .../animation/ValueAnimator.java | 1265 ------------ .../nineoldandroids/view/NineViewGroup.java | 79 - .../view/animation/AnimatorProxy.java | 212 -- .../widget/NineFrameLayout.java | 57 - .../widget/NineHorizontalScrollView.java | 41 - .../widget/NineLinearLayout.java | 57 - .../internal/view/ActionProviderWrapper.java | 40 - .../internal/view/StandaloneActionMode.java | 148 -- .../view/View_HasStateListenerSupport.java | 6 - .../View_OnAttachStateChangeListener.java | 8 - .../internal/view/menu/ActionMenu.java | 264 --- .../internal/view/menu/ActionMenuItem.java | 278 --- .../view/menu/ActionMenuItemView.java | 295 --- .../view/menu/ActionMenuPresenter.java | 714 ------- .../internal/view/menu/ActionMenuView.java | 575 ------ .../internal/view/menu/BaseMenuPresenter.java | 231 --- .../internal/view/menu/ListMenuItemView.java | 278 --- .../internal/view/menu/MenuBuilder.java | 1335 ------------ .../internal/view/menu/MenuItemImpl.java | 647 ------ .../internal/view/menu/MenuItemWrapper.java | 310 --- .../internal/view/menu/MenuPopupHelper.java | 376 ---- .../internal/view/menu/MenuPresenter.java | 148 -- .../internal/view/menu/MenuView.java | 120 -- .../internal/view/menu/MenuWrapper.java | 185 -- .../internal/view/menu/SubMenuBuilder.java | 134 -- .../internal/view/menu/SubMenuWrapper.java | 72 - .../internal/widget/AbsActionBarView.java | 291 --- .../internal/widget/ActionBarContainer.java | 258 --- .../internal/widget/ActionBarContextView.java | 518 ----- .../internal/widget/ActionBarView.java | 1548 -------------- .../internal/widget/CapitalizingButton.java | 40 - .../internal/widget/CapitalizingTextView.java | 50 - .../widget/CollapsibleActionViewWrapper.java | 30 - .../widget/FakeDialogPhoneWindow.java | 64 - .../internal/widget/IcsAbsSpinner.java | 479 ----- .../internal/widget/IcsAdapterView.java | 1160 ----------- .../internal/widget/IcsColorDrawable.java | 41 - .../internal/widget/IcsLinearLayout.java | 410 ---- .../internal/widget/IcsListPopupWindow.java | 644 ------ .../internal/widget/IcsProgressBar.java | 1193 ----------- .../internal/widget/IcsSpinner.java | 703 ------- .../internal/widget/IcsView.java | 21 - .../widget/ScrollingTabContainerView.java | 546 ----- .../actionbarsherlock/view/ActionMode.java | 224 -- .../view/ActionProvider.java | 170 -- .../view/CollapsibleActionView.java | 39 - .../src/com/actionbarsherlock/view/Menu.java | 447 ---- .../actionbarsherlock/view/MenuInflater.java | 495 ----- .../com/actionbarsherlock/view/MenuItem.java | 598 ------ .../com/actionbarsherlock/view/SubMenu.java | 110 - .../com/actionbarsherlock/view/Window.java | 65 - .../widget/ActivityChooserModel.java | 1104 ---------- .../widget/ActivityChooserView.java | 827 -------- .../actionbarsherlock/widget/SearchView.java | 1811 ----------------- .../widget/ShareActionProvider.java | 316 --- .../widget/SuggestionsAdapter.java | 733 ------- .../internal/ManifestParsingTest.java | 37 - plugins/ActionBarSherlock/pom.xml | 191 -- proguard.cfg | 4 - project.properties | 9 +- res/menu/folder_list_option.xml | 2 +- res/menu/folder_select_option.xml | 2 +- res/values-v14/themes.xml | 2 +- res/values/themes.xml | 8 +- settings.gradle | 1 - src/com/fsck/k9/activity/Accounts.java | 41 +- src/com/fsck/k9/activity/ChooseFolder.java | 13 +- src/com/fsck/k9/activity/FolderList.java | 12 +- src/com/fsck/k9/activity/K9Activity.java | 4 +- .../fsck/k9/activity/K9FragmentActivity.java | 4 +- src/com/fsck/k9/activity/K9ListActivity.java | 6 +- .../k9/activity/K9PreferenceActivity.java | 8 +- .../fsck/k9/activity/ManageIdentities.java | 6 +- src/com/fsck/k9/activity/MessageCompose.java | 85 +- src/com/fsck/k9/activity/MessageList.java | 40 +- .../loader/AttachmentContentLoader.java | 12 +- .../activity/loader/AttachmentInfoLoader.java | 6 +- src/com/fsck/k9/crypto/Apg.java | 2 +- src/com/fsck/k9/crypto/CryptoProvider.java | 2 +- src/com/fsck/k9/crypto/None.java | 2 +- .../fragment/ConfirmationDialogFragment.java | 5 +- .../fsck/k9/fragment/MessageListFragment.java | 32 +- .../fsck/k9/fragment/MessageViewFragment.java | 12 +- .../k9/fragment/ProgressDialogFragment.java | 9 +- src/com/fsck/k9/helper/FileBrowserHelper.java | 2 +- src/com/fsck/k9/view/MessageCryptoView.java | 2 +- src/com/fsck/k9/view/MessageOpenPgpView.java | 15 +- src/com/fsck/k9/view/SingleMessageView.java | 28 +- 475 files changed, 185 insertions(+), 38903 deletions(-) delete mode 100644 plugins/ActionBarSherlock/.gitignore delete mode 100644 plugins/ActionBarSherlock/.travis.yml delete mode 100644 plugins/ActionBarSherlock/CHANGELOG.md delete mode 100644 plugins/ActionBarSherlock/CONTRIBUTING.md delete mode 100644 plugins/ActionBarSherlock/LICENSE.txt delete mode 100644 plugins/ActionBarSherlock/README.md delete mode 100644 plugins/ActionBarSherlock/checkstyle.xml delete mode 100644 plugins/ActionBarSherlock/library/.project delete mode 100644 plugins/ActionBarSherlock/library/AndroidManifest.xml delete mode 100644 plugins/ActionBarSherlock/library/README.md delete mode 100644 plugins/ActionBarSherlock/library/build.gradle delete mode 100644 plugins/ActionBarSherlock/library/libs/android-support-v4.jar delete mode 100644 plugins/ActionBarSherlock/library/pom.xml delete mode 100644 plugins/ActionBarSherlock/library/project.properties delete mode 100644 plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_go.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_search.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_disabled.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_voice_search.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_primary_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_48_inner_holo.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_48_outer_holo.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_voice_search.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_divider_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_focused_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_outer_holo.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml delete mode 100644 plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__attrs.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__bools.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__colors.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__config.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__dimens.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__ids.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__strings.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__styles.xml delete mode 100644 plugins/ActionBarSherlock/library/res/values/abs__themes.xml delete mode 100644 plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java delete mode 100644 plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java delete mode 100644 plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java delete mode 100644 plugins/ActionBarSherlock/pom.xml diff --git a/.project b/.project index 7daaec651..6a8c2199f 100644 --- a/.project +++ b/.project @@ -3,7 +3,6 @@ k9mail - k9mail-ActionBarSherlock k9mail-Android-PullToRefresh k9mail-ckChangeLog k9mail-HoloColorPicker diff --git a/Android.mk b/Android.mk index 12e4c2569..5d232f0fb 100644 --- a/Android.mk +++ b/Android.mk @@ -12,12 +12,11 @@ LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 LOCAL_MODULE_TAGS := eng LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_SRC_FILES += $(call all-java-files-under, plugins/ActionBarSherlock/library/src) LOCAL_SRC_FILES += $(call all-java-files-under, plugins/Android-PullToRefresh/library/src) LOCAL_SRC_FILES += $(call all-java-files-under, plugins/ckChangeLog/library/src) LOCAL_SRC_FILES += $(call all-java-files-under, plugins/HoloColorPicker/src) -res_dir := res plugins/ActionBarSherlock/library/res plugins/Android-PullToRefresh/library/res plugins/ckChangeLog/library/res plugins/HoloColorPicker/res +res_dir := res plugins/Android-PullToRefresh/library/res plugins/ckChangeLog/library/res plugins/HoloColorPicker/res LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dir)) LOCAL_SDK_VERSION := current @@ -28,7 +27,6 @@ LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_AAPT_FLAGS += --extra-packages de.cketti.library.changelog LOCAL_AAPT_FLAGS += --extra-packages android.support.v4.app -LOCAL_AAPT_FLAGS += --extra-packages com.actionbarsherlock LOCAL_AAPT_FLAGS += --extra-packages com.handmark.pulltorefresh.library LOCAL_AAPT_FLAGS += --extra-packages com.larswerkman.colorpicker diff --git a/build.gradle b/build.gradle index 7ce3e8da4..1b68ac21a 100644 --- a/build.gradle +++ b/build.gradle @@ -11,11 +11,11 @@ buildscript { apply plugin: 'android' dependencies { - compile project(':plugins:ActionBarSherlock:library') compile project(':plugins:Android-PullToRefresh:library') compile project(':plugins:ckChangeLog:library') compile project(':plugins:HoloColorPicker') compile project(':plugins:openpgp-api-library') + compile 'com.android.support:support-v13:19.1.0' compile fileTree(dir: 'libs', include: '*.jar') } diff --git a/build.xml b/build.xml index b5162eddf..5f39d7e80 100644 --- a/build.xml +++ b/build.xml @@ -399,20 +399,6 @@ - - - - - - - - - - - - - - @@ -469,7 +455,7 @@ - diff --git a/plugins/ActionBarSherlock/.gitignore b/plugins/ActionBarSherlock/.gitignore deleted file mode 100644 index 6d0dc1c16..000000000 --- a/plugins/ActionBarSherlock/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -#Android generated -bin -gen -lint.xml - -#Eclipse -.project -.classpath -.settings -.checkstyle - -#IntelliJ IDEA -.idea -*.iml -*.ipr -*.iws -classes -gen-external-apklibs - -#Maven -target -release.properties -pom.xml.* - -#Ant -build.xml -ant.properties -local.properties -proguard.cfg -proguard-project.txt - -#Other -.DS_Store -tmp diff --git a/plugins/ActionBarSherlock/.travis.yml b/plugins/ActionBarSherlock/.travis.yml deleted file mode 100644 index e9a32d4fa..000000000 --- a/plugins/ActionBarSherlock/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: java - -notifications: - email: false - -before_install: - - wget http://dl.google.com/android/android-sdk_r20.0.3-linux.tgz - - tar -zxf android-sdk_r20.0.3-linux.tgz - - export ANDROID_HOME=~/builds/JakeWharton/ActionBarSherlock/android-sdk-linux - - export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools - - android update sdk --filter 1,5 --no-ui --force diff --git a/plugins/ActionBarSherlock/CHANGELOG.md b/plugins/ActionBarSherlock/CHANGELOG.md deleted file mode 100644 index 432230bf0..000000000 --- a/plugins/ActionBarSherlock/CHANGELOG.md +++ /dev/null @@ -1,469 +0,0 @@ -Change Log -=============================================================================== - -Version 4.2.0 *(2012-10-07)* ----------------------------- - -**Maven `artifactId` is now to 'actionbarsherlock'.** - -Note: The `.Dialog` themes are now deprecated. These will be removed in a future -version of the library. - - * Add `SearchView` widget for standard search interaction (API 8+ only) - * Fix: `ShareActionProvider` in the split action bar no longer fills the entire - screen. - * Fix: `ShareActionProvider` now does file I/O on a background thread. - * Fix: Automatically correct `ColorDrawable` not respecting bounds when used as - a stacked background. - * Fix: Ensure fragments collection is present before dispatching events. - * Fix: XML-defined `onClick` searches the correct context for the declared - method. - * Fix: Ensure action mode start/finish callbacks are invoked on the activity - for the native action bar. - * Fix: Allow tab callbacks to have a fragment transaction instance for any - `FragmentActivity`. - * Fix: Ensure `CollapsibleActionView` callbacks are dispatched in both native - and compatbility action bars. - * Fix: Remove `.ForceOverflow` themes. These never should have been included. - - -Version 4.1.0 *(2012-05-17)* ----------------------------- - - * Fix: Altered technique used for menu event dispatching through the fragment - manager for greater control. - * Fix: Do not dispatch menu creation event if the activity has been destroyed. - * Fix: Correct potential `NullPointerException` when expanding an action item. - * Fix: Correct potential `NullPointerException` when the hardware menu key was - pressed in an activity that is forcing the overflow menu. - * Fix: Do not set a listener on the native action bar tab wrapper unless a - compatibility listener has been set. - * Fix: Ensure the compatibility animation framework is always available on - views even if they were previously detached from the view hierarchy. - - -Version 4.0.2 *(2012-04-15)* ----------------------------- - - * Upgrade to r7 support library. - * Fix: Do not trigger menu creation after `onCreate` if activity is finishing. - * Fix: Prevent overflow from displaying if there are no overflow action items. - * Fix: Long-pressing menu key no longer triggers overflow. - * Fix: Use proper tab state-list drawable to mimic ICS. - * Fix: Ensure dispatching menu creation and preparation to fragments can - properly return `false` when appropriate to avoid rendering artifacts. - * Fix: Properly save and fetch action mode tag on ICS. - * Fix: Add missing density-specific resources for certain asssets and remove - unused assets. - - -Version 4.0.1 *(2012-03-25)* ----------------------------- - - * Add `ShareActionProvider` widget for use as action items. - * Re-add 'Styled' sample to provide a more comprehensive theming example. - * Fix: Do not dispatch options item selection to fragments if the activity - handles the callback. - * Fix: Prevent menu key from opening the overflow menu when an action mode is - currently displayed. - * Fix: Ensure fragment transaction instance is not `null` on initial tab - selection callback. - * Fix: Displaying an action mode while using stacked tab navigation no longer - throws an exception. - * Fix: Using expandable action item callbacks no longer results in a possible - exception on older devices. - - -Version 4.0.0 *(2012-03-07)* ----------------------------- - -Complete rewrite of the library to backport the Android 4.0 action bar. - - * The minimum supported version of Android is now 2.1 (API 7). - * New base activities are provided (e.g., `SherlockActivity` and - `SherlockFragmentActivity`) which extend from the native activities. - * The support library sources are no longer included in the library. You must - include `android-support-v4.jar` in your project separately. - * Theming now mirrors that of the native action bar through the use of multiple - styles rather than through `ab`- and `am`-prefixed attributes in the theme. - * The action bar can be statically attached to an activity view without the - requirement of using one of the provided base activities. - - -Version 3.5.1 *(2012-01-03)* ----------------------------- - - * Fix: `NullPointerException` in `FragmentManager` can no longer occur when an - attempt is being made to save to a `Bundle` that has not yet been created. - * Fix: Pre-3.0 action item submenu dialogs now properly dismiss themselves when - an item of theirs is selected. - - -Version 3.5.0 *(2011-12-18)* ----------------------------- - - * Library now uses the `r6` version of the compatibility library for its base. - Ice Cream Sandwich-specific implementations are currently disabled, however, - but will be added in a future version of the library. - - `MenuCompat`, `MenuItemCompat`, and `ActivityCompat` have be added back in - to ease transition to this library but all their methods and the classes - themselves have been deprecated. - * Rewritten menu and action item support from Ice Cream Sandwich. - - * Removed the need for the custom `Window.FEATURE_ACTION_ITEM_TEXT` flag. - You should now use the `showAsAction` attribute and/or the - `setShowAsAction(int)` method on each `MenuItem` to control whether or - not text is shown - * Action item dividers are now added automatically only when necessary - to distinguish possible confusion between action items. - * Fix: Action views now properly size themselves within the bounded space - of the menu. - - * Fix: List navigation no longer becomes unusable on certain device - configurations. - * Fix: `SubMenu`'s `findItem(int)` method now properly returns the support - version of `MenuItem`. - * Fix: Invisible sub-menu items are no longer shown on the pre-3.0 popup list. - - -Version 3.4.2 *(2001-11-09)* ----------------------------- - - * Fix: Stacked action bar now properly sets the tab bar background based on - the theme. - - -Version 3.4.1 *(2011-11-09)* ----------------------------- - - * The `makeFragmentName` method in `FragmentPagerAdapter` has been changed to - `public` scope to allow for easier access to your fragments that it is - managing. - * Action bar will now animate when calling `show()` or `hide()`. - * `SherlockPreferenceActivity` now provides full fragment and loader support. - * Examples for the plugins are now in their own sample application. - * Fix: Home icon no longer erroneously clipped when it exceeds the size of the - action bar. - * Fix: Tabs will now scroll horizontally to mimic the native action bar - behavior. - * Fix: Plugins now properly DO NOT inline their `R.java` integer constants. - * Fix: Tabs below the action bar are now styled with a default background so - that they do not incorrectly inherit an applied background unless explicity - declared. - - -Version 3.4.0 *(2011-10-30)* ----------------------------- - - * Library now uses the `r4` version of the compatibility library for its base. - Ice Cream Sandwich-specific implementations are currently disabled, however, - but will be added in a future version of the library. - * Context menu callbacks now use the support version of `MenuItem` to maintain - consistency. - * Added preference plugin which provides an action bar enhanced preference - screen. - * Fix: `abHomeLayout` theme attribute is now honored. - * Fix: `onPrepareOptionsMenu` is now properly dispatched upon menu - invalidation. - - -Version 3.3.1 *(2011-10-20)* ----------------------------- - -ADT 14 is now required. Maven 3 is required if building from the command line. - - * XML-defined `onClick` attributes will now check for an `onClick` method that - takes an `android.support.v4.view.MenuItem` instance. - * Tabs on medium screens in landscape now display inline rather than below the - action bar to mirror how Android 4.0 behaves with the same configuration. - * Fix: Menu inflater properly checks activity context for `onClick` method - declared in the XML. - * Fix: Dialog fragment properly saves its `showDialog` state when not being - used as a popup. - * Fix: Return `-1` when in tab navigation but no tab is selected. This brings - the library in line with the post-3.0 behavior. - * Fix: Removing a menu group no longer throws an `IndexOutOfBoundsException`. - * Fix: `getSelectedTab` and `getTabAt` no longer throw `NullPointerException`s - on post-3.0 when no tab was selected or no tab existed at the specified - position, respectively. - * Fix: `findFragmentById` now properly returns fragments attached to - `android.R.id.content` when run on pre-3.0 devices. - - -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/plugins/ActionBarSherlock/CONTRIBUTING.md b/plugins/ActionBarSherlock/CONTRIBUTING.md deleted file mode 100644 index 30d383364..000000000 --- a/plugins/ActionBarSherlock/CONTRIBUTING.md +++ /dev/null @@ -1,11 +0,0 @@ -Contributing -============ - -If you would like to contribute code to ActionBarSherlock you can do so through -GitHub by forking the repository and sending a pull request. - -When submitting code, please make every effort to follow existing conventions -and style in order to keep the code as readable as possible. Please also make -sure your code compiles by running `mvn clean verify`. Checkstyle failures -during compilation indicate errors in your style and can be viewed in the -`checkstyle-result.xml` file. diff --git a/plugins/ActionBarSherlock/LICENSE.txt b/plugins/ActionBarSherlock/LICENSE.txt deleted file mode 100644 index d64569567..000000000 --- a/plugins/ActionBarSherlock/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - 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/plugins/ActionBarSherlock/README.md b/plugins/ActionBarSherlock/README.md deleted file mode 100644 index 6506c361d..000000000 --- a/plugins/ActionBarSherlock/README.md +++ /dev/null @@ -1,60 +0,0 @@ -ActionBarSherlock -================= - -ActionBarSherlock is an standalone library designed to facilitate the use of -the action bar design pattern across all versions of Android through a single -API. - -The library will automatically use the [native ActionBar][2] implementation on -Android 4.0 or later. For previous versions which do not include ActionBar, a -custom action bar implementation based on the sources of Ice Cream Sandwich -will automatically be wrapped around the layout. This allows you to easily -develop an application with an action bar for every version of Android from 2.x -and up. - -**See http://actionbarsherlock.com for more information.** - -![Example Image][3] - -Try out the sample applications on the Android Market: [Feature Demos][4], -[Fragments][5], and [RoboGuice][6]. - -Continuous integration is provided by [Travis CI][7]. - - - -Developed By -============ - -* Jake Wharton - - - - -License -======= - - Copyright 2012 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://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos - [5]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.fragments - [6]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.roboguice - [7]: https://travis-ci.org/JakeWharton/ActionBarSherlock diff --git a/plugins/ActionBarSherlock/checkstyle.xml b/plugins/ActionBarSherlock/checkstyle.xml deleted file mode 100644 index cfde0eaf7..000000000 --- a/plugins/ActionBarSherlock/checkstyle.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/.project b/plugins/ActionBarSherlock/library/.project deleted file mode 100644 index 191f90718..000000000 --- a/plugins/ActionBarSherlock/library/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - k9mail-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/plugins/ActionBarSherlock/library/AndroidManifest.xml b/plugins/ActionBarSherlock/library/AndroidManifest.xml deleted file mode 100644 index 7b8a84824..000000000 --- a/plugins/ActionBarSherlock/library/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/plugins/ActionBarSherlock/library/README.md b/plugins/ActionBarSherlock/library/README.md deleted file mode 100644 index e8a2c080e..000000000 --- a/plugins/ActionBarSherlock/library/README.md +++ /dev/null @@ -1,15 +0,0 @@ -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 -[usage page][1]. - - - - - - - [1]: http://actionbarsherlock.com/usage.html diff --git a/plugins/ActionBarSherlock/library/build.gradle b/plugins/ActionBarSherlock/library/build.gradle deleted file mode 100644 index 30759b2bd..000000000 --- a/plugins/ActionBarSherlock/library/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -apply plugin: 'android-library' - -dependencies { - compile fileTree(dir: 'libs', include: '*.jar') -} - -android { - compileSdkVersion 19 - buildToolsVersion '19.1.0' - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - res.srcDirs = ['res'] - } - } - - // Do not abort build if lint finds errors - lintOptions { - abortOnError false - } -} - -archivesBaseName = 'ActionBarSherlock' diff --git a/plugins/ActionBarSherlock/library/libs/android-support-v4.jar b/plugins/ActionBarSherlock/library/libs/android-support-v4.jar deleted file mode 100644 index 428bdbc02a1aa32649e236e0734261bd68bc4e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484258 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ПpHSAC30$g7yH$GiAcgHdf4hoNNNW2%pqu zqm$p?=GRMDf)wGe9H;r09RK&TjQ_Hv_fKyvIs3o#YMlOcZ8BTg>aQr}Re~xWmlV(? zs?N)M$fu!?PsQp%u!|&~RYs>FD#&9D94X_agdk;f?l|+*?Cc_nlWWB`!pX#_YNFxmH!C(N&tDvv;ZIOL8 zln~KycEM#t!65H6S7MIYG1cwkgJToX#!Uh7nD!v1YT~^O=yH5Baka@kZ`|#wbwy64 zGVk<#aTEU{gwHCimv*-{QOZ?=)-Oy$&YhLoiUXUqt?e~0l(rlvXm9#ypZqrh49bO8 zjF;);Ui~<$*V=Q*=8>KT7=_m#BR!X@Hr2?#-iNrqTp^2UeGL5SZhpy­S=@2b9k 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�@v;$9bpl_%m}> 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

f4)&8pa{MTrd^Bdt^+KRphNNz9%3le_j=ZTL zn~oY&UXW2Iwv{u-IM_RhR_%PZrBGh5;2?Xh6KqG+EwS$eIZDm7de=_dD!eVHR!z9n zg$@W+v92DVk8!BqwsJlFBzs?8o#7=*U8vqx?~-%ldL^uf@r|Y4>@Fr}izc0#V4b1z zgFXyqbz5SY`q`3F0HGzbVlT`^Yz;+piFOhe+_}16iy+x6$@D7GZht^2p!=#v!Abo} zN!zj}y1dn>&HxKbA6q^pXBonMo_&mdE?)T(Nwq0^4lg?57I7o%D{5lVTD=Wa+eYA3 z{{qp1fkWlP5pr65M5bLKY=mAqcXEaErcWmT`|O%u8L0=jKlYdxl|;CQQn>#Js3T~^ zfwToj*#JzM(5kTB4IFS4-}(x5j95uS;ujhJfqA^BU3Aq1Ijt^UG(;~dTfh>Fl8QKM zy$)GIjFi(3++SKA)^I8td<=dL+?me@P+h@y3#bf#lt7j^XX=T8?g5+_7TNB2rcGKE zd_?X5(>M?rHu2go?lUL!D+q#>QK4HQq2=TK6Av7{FcIeir{M#1;)q^>)GtKy)k-?C zw;$$JYbv>S5a$(qD$P&$=Ld4?1iw+q2lVnB59QZ6cyl(6o}{N{9fUx3BxZ7sDh1Az zeZDkpsmiw)-X2UNtscz`NhMNqJ*N)|L|hBSY+g5mJxm4iwg{%}X0>`RvMWA7bx{A%J|UWm{6g>UJlC-r4Xk*25{iNAaBsly_qsemqR zjd;fPEgcEp2duvj4FoFsxbmGG^K+7&gS3^_u5N~12sS2h@eG@0FU+rPA8LBFpOA^z zjYWYnE*dE~qtc|3PVz4HS$_5a1RmLgXJT-kNA{i}W0VrF^qymSkda6B*`6kD)FZv$ zC@4%6j~K6zXTgpvu90Wx2`7j&8Dh+Dk?{q*vI{#!xtkc(Q!!alS_Q~l*?39;WlCvc zt}r-WUOBrcxkzh1pZb6x8LCRHlA&A~z1Wu`FM`lnp@KAz%dYK1qpBEsWTkxL*$5RE zccwyEOd)@^COYXPy^#P) zIE>(>64uJY8Y?X$UcK$x6e{Zb54Gnt>rVH|Y;qY_;`YY*3H!G)!?3HZfsK`~HX1+-&+z#R=F5C|kj)s3mqYHdRrqvJ(m?;qcvqi&&t}+n z;PIdDbEW@&zW?n$_x}Yl^}k?3)!&G16crRc-i+r*kVFS_AYpj{a*_oCMEn2Fh1}x;}@TbM)FA}6v*FKU9I;w2?CeYlZNaw>rN}0&t_j~s%^wn9_cYx z!kLDi@GRP=!t9tDF=E2ouG5ByqRZ?!;Y{Y;VaX7evt-VgZ0Iz9RN7&(hAc&1>=zj| zX`(Hdoxrpnd%4QkHD}4p!ap`k_-xfwYXx&PsCrgw$fqO?lb^tIXOr5e#*)<0?FlPWpkTUXLcU7SNr{XPCE(Hm&hap5hChY zXq57VMi3Hv6)9IxwMAtFt;tU7T&e!X{=cFLIV|CwckUbplnW9!dKDVqyE~JX2i4(vdb(OF|-TR3q-)q(F8 zd7*Z(;e3T*jqbYkINr?AfuI`n)!!S9xpq7KXAId=9P7}j2KThvJ2~lYKW#g~7Wt8g zXf%BFvl8AIBF^fy9^}bp_>2A-&00xcBIAgM~nlr55T zmCrD_Di@rT6)mDOAlbZgWf_<&7BD>{GAvT)<}RqF=R{H_rluOYpnkRqmY@j8zkao! zKwZVSN*7do`Nv2t+1x+c61G}UU$sQW&LM0&SOenyCj2Nm!?+SE9;CjFIDi*#k0TJp zvQCuq6?`}N#SkERiqJLSDv6>e`~)zGmv<_EsayP}r0YX6h471pE1EMzOm2R$Tz<6$ zdPr^8DB7k=2v|=Hfd9b%eETe&Mh_HD7Cqe^}_|2t&`dKU^X@eJK5OJ>6J&Ld~am7YZ^xjxj5EHU=Myb|fkSt_07{GZlC0KDqGy=X6Hp;rtPGKqb&b;4`@rY?(p#6;Ip9!cbq1D!piYPkrjp=>1Xm}R7c>OX<^!uyfg`lP>PZQ zl9b|;X(ZJ?k=**lHEjw%xl+iDv+V1*p zn|?@%jbwyO6mN+JZ75oqOe7#UF!q>p3WztB`m!eivz2vR@)yXvgbC6F1VJ7mK7oYq z^q=I1pf(@C{*=1|7Ac&?gT3j@HD~Wvw$n(K-JjPFDS%lcR#Wi`%b+{fkoP-A z94cvAH!LA;7uQ?z@>2+}R@$CTyjpv@ytgJ>HXvPF$<1@DcE^zI1iTe!nEUM?U_s57 zD-mv`M7;IuYwIZeo^pg*cUE1^{lFEUrv)XMOvd(9T^DXkSnw~Yu9Lasfk$ZHW!>xM z9`{v?*3Td98);j(8g>vzsudt-tjlfWp3!IE3eH`^HQLK3lJbF;iUl3eGK-+twakZ( zK5s23+}B_kDSbCh@PRBum~T1xqGdhKg(y_7WbjxE-0GW~Kl%sfMO$7F?qF7&;35pL;1U}={$=ewoUrqv}C^~&dkNN2idTib&ac#d{q@D@8QY#i57aI*(2 zu2~!-Lv2R&?j&a^l z$n16HqFtrskl$_`jHkJ9s)^kLt7H(1Fo?ZUyF`X8z&S$Ht>LTUUt#LK4oB@{FD!WOHiH;FjG;F=LmxZ!r0$pS61OB}g*d+iSH{7- z*ca-aX89FfYMQb|6PoT5J5`n#9$S=Ue%X#T_e+EP@?1;5b3Eu~l()+72Mo^A-kxYWG zmz^H%*kcL1=6Zz|$>K~+eG+`xb7gkkK*qg}ZOwlbld0<|JVhOoq}>&BN@a6BQ_&HK zJg!Wg&%Mzoe*H5#n)0vfjsCul*#iH&|DOGC|NDQtl2I~nH8ECl{(tOObCfS+zX|An zN_9GHG$@WriBOXx=crHxVif7+>6VwI%t`l7et@f2cN%xv3>smgBFT6I=n2X!3Hz1b z0Y;mZN(uZRYFT4;qI>W;Vd}K=>-GfJM{yf8?-z#vQ&iMWHe`vG!bpmBprn)f9U1%6 zAlP08OnW6^`Fp)t)L*_wkw0G+jzyrR6_{w{u&b?zuP{F_ zCxw7NaFLblLtL-Jr(nT=|>BVY^jIu>hc4m8y<(Me!OOYZz?~`K)dN}>s zw;e`=+2g5=G~7O-qYN30E5*KcH1XMT-BfnrQDKhyIUw`v=lC6L=l+Nr1Gz1d9)XQ! zsg#Qw{1tgRhOYh`lQO9giJ9iU@6lPJJyc?P0k0YT!vc_-bcL7bv<`E{T>Y1LSihMj z3@-R#|D4kg&qRe13^JrW_ZY6Hv>%xo(~LR_br+(MJmrT~mF*N0EK8*+NO~offoDgF zD`a2sL{l56k-4lUIG@Oi#HONV7{to9D~~io%WoU#%XN%QfZ3@B(dt zuY8Ivn#%4HE=i*Zvf`H2iP}L^Z+nB~pn6d>iP|H`8hDh%j7Yo?2x{WY7q$tjy2XUw z{bjF^J)37aME+cJVZ6=NDuycrnuSX$!nr3$;hCfr!(0|@7MzPBEBLGl{dPf@Q41=C zcF0y?alYZn6uVu-4<||N)|yL-K)q=Pd!u9z=-BuN}K| zG>iaA+!FxV{QAB*!Y8yE2XPo97S5+NuO zai^{TEr?IBeWYF5)(u+TtnhsP@T6oS3U%mC>F{JbQ~WphwRQlu zjN=a32f^}O?4I&EuXy2l)(Jl;1CI*V;=;eTYUn=3iP`IXT5#njfr+!dub zHdbixZ4RfzZ`P2>C}lA$tm@sjZ@Ca^z7nz!A;87$7)W3kK#1TIuF}azzKV2k4RACF zrco#w=l==xuPd}Yrl z^ie|tGn{7Nl_`>JZ8Os=&AtTd&fN!UB$aLL;zZ6B^ z0PYh_@JVMqdUxT^dd$A_*}Wf}wB7)y+Ve+nKz-li1_o+T7TasVh=7uUW(JaiHQRB4 zj=~9EJL(0@FtlFvoICjWh4n(l)EAz+beM`SYt^iBnj+l#8w@gRmENq$@SeJK=Hj1! zvij(=Yw;{uZ9Z1JZXE|DI2lk~atZNRZwMG@^fL_(6rYry-1|&ku(WXLgzddr!0{qU z;e5=wUfnVdZWub(%^Q~}o5lasO=2#F-8iE6$^mJ}X(qdJTn$z5Z28Fkk3q~40;vwg1p~=!@y~X{~oMH=%5K5+J=cI4)`J# zN1-%|NY2=wxI`>>g+(KY`w(U=FcS4Dsx`9*0hqqL>u}Kb91Z5+>2vcfphXS5nA{-jnTWkeZ-C9OGq3>S$ z>XrW^>SN|(Z>otE-|v!e@$|dRK9*JxHENoX#+vU{XRdGOtNO?Bw!kNZBgU_RYo;wl zC(2L^EL}R$pAp2c`Nqr;=rS8=Dn>&{fJ~a(H~aEBla;7~NHaf=_Ukq(r~3Xu8cZ{W zr8du~sMdDRuqY3;uF}1n$S3rBdF}G9i%91AhhXxoBt0set#A|b)L; zo4}yL#3fZJPMi6HbMRMDhK!U`J@uK4lU${ll!nHI4u^@R0nze0qAV*DVg>peW*(CR z3%KEfCvB6=R8~E3%po}1vlVlW)09ZD^_v9Rm)xwN^E7{Ca z9Eb)O28icNcBOnXLK|Qjraa=fb_W-BYk#Q!{n3Q79!_iNq+uC&W-fQLAD~t|3_q@k zB4607MEAA%GTU@hZWmtDAKcuS64u=(vs={0by<@+!3&@*Ezhulj*Z~QW&5ai0 zTAsCAH0Ug)iMc zf@|qyX=49vkc4~-ggnICpy;<;Aj>9GCc-V@x3SjAs#MtYd8%nCTCBqYEetQ|wJ|EQ z#wI;ymc5M87YX6kMWQgZVG~aIviv_0@caum$oxmiiIX(^vp3ZIHjXyZs@(j;nA{LI zQ!sA3c=5G)s+kPWVo%)+^PlxBXRhh4p0+%=zI^|f*ed#SKyv|bB)S1f3`}=J-TiTa^WFTuiMW3jwZ{$Gf_y?4I5z~w2hGq z>!X(FW4-^H_igsqAf~W_BxXpM=$s9kH!*z{I;#jE$FfUpF2_V$rjNSIrTkClzB1BX zNnCUQtuG*(Esmn)_p#OV<=mnCoJhoVZ6XoyDO)!z=FvpS+pi1aM1(L@oefjp2>Ppv ztr>f-MzSJgU%}}+STk)r5yE%vonP`Vr3295ar5(B71Vn9zB`Cizve|?*(I)~ z#Q5_m%-Y@sy695Ad=|e;MUW-*O=@(AD+6!AkHaU8tEaa;h~5V?6t?w8fjs*$nNMHk`^K9pUP@ZWi2uV zRhmK@3T&H#Xw}t$;;Dnp8J}2k<;lY-qQ2;^f4s~`{p2g~Dz%q1Sj6wT8Inz~24zgE zXW`k@ReF>&D=Cs`Jx3VdXn?zyn3Sp+s*H4DY+O_2AVwe59eWu)!VaR5+HpmPomJYf z@menpe4WN2hUoDl=l6$4e`aC_vFZWZ(L-Hk;t~-D(xC^r4u+`{)}5iIE^wx7v8Id! zVll&6!~P&;=?loGZ!8Hr>gQ(*2{>6f)J>l?U0_iObJZeBkSg&CKNPAC7x^YJX)A_X zuIPNrVj79#d_Uf<0F8(c6icHQ+)X3FH#mrT~*u~7*-OTx) zl>XmDH;PDn`)Qoa_WPlsPoznLsHJQ%3-C0;L8_9;Aas#I3!8GjRx!#v9qu4L7%0Uk zu>1jhD0M(RV9ei&^2znEIPThVTzD;pmI?iPK7sNg%y2Pk4p)=x4jlR7z&GkvRh!za zc2h#cggI8>_r_rImoV~c3wj*}e)tI}OPRE-d162Fuvj%g(8MnI8r-9nFJZZUgZgnm zU{s!gqjrWgp?)AEoR1%Tdt+EjyQngIaU)faZx^L6Q6_l2FQU>ap7#CTTaV0Gg+igD zUR9(VYDyeSdhvGzXNqn^N=wuj8fN9FgprL#FwY#NX+_6$I@JbLSOMlU$cWJO3{XTjNEs@w zwiuM%DSw4nMgD=?G*OL#24*#78Tzogw1yP7t5Zz3`yi+$u{6X&GEcviUDM3tIDA4a z>M4xFq^;~cQ>Tt32qCVJCqj!xo@ zMg+yo0MMGHY27P&I2Xc_$1BI*h|_c|aDSrle1!sg2zFg4eJm7?#$}%y{O^2Cdafp( zOfsgyX}g$?bSzZGD{p>7<|QsB`)fpZ&d!Q0Nf(}=FvOX=ngw@7lDv{gV0`Kwt>l^@ zetY`6W~Ub59tQITFXI1Av-6*zS>!L_#s3izC~V|n_OCDh6|GUMvi+5DhV;=wZ&ywf z4zj19y3hhcDK3Ym+NA7KA_N)=x!vL+^Zj7O=CVcXJ=14~5|!``^sO+u@w*(c2l?W& zV{0Spw$I(<#>U^}hMI%#C=G2Yz0Sb2;F@rM+!VZjV~e!tu9}T3f@m z_Z-XR^0LPC?tU;J^7&rzxKvz-p?x1Etv_uUINHi_O!A$%!KSdK7Sp`*LWAz-b#Ocl z4LsIXYMqA`HhUn@3?m??KBH>Jz;kWWmcFZImX&t$JTTQ{K%~kRq#;gLn?IIlR<}C8 zBWU$u&{mmZ=CdYgVV{oIPU)1JWhOBOZ zg?P|%4L+Hik2QihNd=V&;If@mI)@f;BG|@zG~v5Y_QgS^hER6 z!+L#gOJvFzm7jsfS9-eVo}|Du64S`)#kvKrV&Q$SMK?~9=jgqDCZtMqElrI5y`5-; zjQxUY)p4&AJ1@dFS1p(#MmeAJ+oR6G)Ksy^V~aBv>sk~}5IWH{0Y&y9k#IJBmh0Sx z#AVZTYH-%Cq@~1Z2ra8`l|M`_E+v_!$B3%J$x*P+5uuSn{x#T3C196VtK%2AuB7z1 zuhjLDd_2Y-i|#-%|FFnDA<4x9b7T`+=y=;)=}I1JWn-fhwgcR-F`nG$%#zyODppN# zrgXhsjOA}``)JiBKIPd2Y)*jO2F_>;Pr?Pq*!@(VvAxx{nTv|biT310To?cm>4 zjr!W^*S=q?UH;#|^nb4QzXsF)4Ttr=dco|(|D~!O#@{JVTB{g*38zO~qg66VS}Q8I zBkKzTn;&?#4oub;xytAUt;&_&Zi)~W2rwv(aFC5|90rF*n!nw1x1jv|GkGyFH7#J^ z4@8xp6dYI;SWHHuDK9J`Pwxc^{ zPJe5T%ob|H7~*DZZuL!#<&w{3lx_J$ytSmzV~gw4w&N<2UFd-TG$3jN=-gY~KzS;c z54(7duT^9ht`RjJ&Pn2)qv#+EF3u(S?X}$5GUq*lr49z*1GKuYXW!gD-=M$zBnqIE zJJ_cI+#YI`9AK&$pKv`Z-Ie3R0mZ~E#01EpprWD}r+6}UGLDm2 z)vpV`*%16K^U6d^_<(4DfZJg$-K+Nf<>ML5@y9$8C9!s}c-3N14F2gzhHP>0`jlYB zzzH34M3Xa}3x=7Fa4R(kgPl*iX2{VOc@RRQR3B}!<}7)*v4td4FX zl1U-Ni(;aJ$)>*wwh_6{983oe6t~38y9v5v4iYXuOYaD7IjUsPfIUun!>cs)w=0Wo z6MVN{9#4tqBch1@q$_q)fqgRmI-QMu<7^$if(^aZuzC9!pIzL!esMoMqXi+mYpr41 z8Qc#H0e*h~Qz~~MlkNC^O6lRi%dCz9CgMX%&7xanMK=RJO4b{x_%S_TAUQVJxxLlF zuS9fMIaLb=oS1W{a}MhglU7!`3kQ@|vDtc~Y6%LPb(0r;s``cnAW8Um4=Jocb^rqe zPFPp{ZPGj2s0opXkqTnG>+-a-NLVvRsJ^akz^M7uJV_Y#6nAp zOwC2o%P@5~=PX9;dg!TdK}ib!dm8aNq&G&%?~|Aet2S-sB&*Z2N&~7g?q&{1NShCAkJf2{g zBvL&=oCXy+Ml1BPwjJ837Ub;iJURy2Cdq1Tl3#}mTW!<0C3k3Z3ExEiJdLu>hB{ME ztBtu_MDh}jGf=sLH}G$lOqW9OOEWL&yj3&M97ap$EA##|%T0X_`SrKbM&!?u^!Rm2 zIsfHN_*{D944NaHASjLVY~i68>vW-DC}q%@ zTEf5QesI3mrc zYsxfZjNlQ~sw8fxLLq#}m0V~z)OgJ;X=`o_wVuh>J=0PBdS_C<+vDL_tvlXY#SyM- zz|G16w7^+qpvOWTVd0>T>V--!HFF+LLWen|M7?gT zGe3T1A-mLAt#pP`9(=Nr7hVaXKbLgsaln?ks{1i}Q6treNZsS)GWj;kkWoS9=3A^| zq&VIxz=f@I?HB7HEJcyO&Z7Kix#Zj!Ukkl*xz(M-jy-Jemwr7|9(@S9-!<(Zsp3VP zQzI(H`hnS}d?de%hhtizGma5#XLrM^WIRGqlR$hIcbC7De9!Q1dJy8Sj^F*#B}Wd} zM?kl@m)62UQ%NwjtWAt3Zn;R|ORR;_%BjhCW|k5M(BHFeltoxrPUhOQJ~z^Q>~319 z`cxaiuH(F1LyLU=O3Fo9oH0zB?l4<-4h4A+fHW8S%@WRnHO1I$v2muj!yh!ew@WrL)3CIC2 zo_vvOrX=^ubrG4B8QW_n;eW@}h}sE+=<{K2f?go6>0iQvWR;`pmI@>`(-_|vfwRCF zr|)ehr!?HyCF%lMem|IPY1LJNI4)wv#&1L)T#2|?8TfTipuA83C|;IJKtD# zc|F4$f6u>JgKpBWlzNZExV7SQX(QmqLsbOBKM9QlmNmk$E5ataX4VBwG7?Qva;4fo zQ6HKqEMm^v=qq!^R2k!wrAXqK?Xg3M4#n;RpN}Vezfq4s?M(=-s12TRJs&&A zCVt*f=?5m*TpYH=7FyuZ#0X8G>QaRw2<2_`yxBILlEom^qGK_oLvqYo#V*qgK0`?t zjSF-ZjWU2*Lj!wrOuNL+Q*4^?P_|P%k9C;Kt$`ijM(sUy2(Rx%r#`E<-9kS+|84kz zUVSw$hX5Q~UO1b~F?zllpEa;v7PQUQDb878I@?b}C6!7+F?BVsOZ7HiVMpuzD&6Ke= zacE3Bjk+DATP%S+BYQ25m5^u*5M=sItAPDI`y%Pjm1|BU;jdf^bKTjClEi8p`JaB* z)QnLDc5b-&-sj2E;ku~atv*mB3gr8xdcRCrl9H>y%@`8tnVgD;5E2wy1}mZyTfrTO zbu5|^9H+?yVx$;NSNb;ekl*V`s=?VclY%XLryHN~F!g{)**f^nOzf+McOJL&=iScN zC>}#X>G4Gi6({6wPkW!q3qL~Dx@g>i=F8Trq+P;ayQIAH-n_WRV^*62h^Ok6s+{NG(j) z@nAkl(%!V8Qmq~FLLo0z|ps*Le zyxPi=teJ%>WE{1m+2J%)gJB|qYeIt=c4d(|APS|02StUK$@6iog&m&cPAH> z&`x50fwZ9;A6!cfBD0VUSQIP!Ks{4jr1M$0vPsDpXVjzoMk{f_9<6FqMFP z51s&9A>)mWOnJc(Vnr|DQ$lr43N8^Ap8pQbE&**v12tI&?W>I9jf0Z037J0)Bdp~{ z`CLGDFY6vek(T)LZbcT@Mj+%4{6w$_mJ^|Pjp)ZdR4g^#-RaWbQA{-oqI&O_9L5L! zzcvT|NhL7;W!d<5zV@HCBQeoJF#SwOVxN}H+OQZ3JHklcLW3~l3wDHcJ%d()*OU_y ziXQA4cmu*vNNYB@0B_SjcKHmRAOp~x!kI)x!>2mf+c#31$tD_>H0@e~zR72}4f4pR zU8?Ha=v3@cZK_2fq4r188o5%Z*=3634tKzJCKtrVzH?$w0|!6nC9!EuRwt*#`%F|F zRT!4akh@4|eo)IE=`RC3Ui@~cdwV?s@~7*6jeO38CCuXft%5$qj-l6l{h_yCum8SJ z68y`5#eY`NuRiIE!2Z{_|KzTf{t?uiII!8asUEXv-Ru`oouQ1`M@cHIMFpiqMeTL6 z-o}&m(~V+kisGg5rC=uP1IRzg)54@V&)4#JcZ%<6e}mP--roNMq%I~Ih`{{J6V(vT z1!3Y<^SXXy=R%77f*-Iao>{qInJylou1U?5iVtnznvt?U}2xZ|z z=J2+SdeF*U|3PN(npicsLrLldcjvD*#ZJRn^yuB$cl+AfJ*fqSVYB!NkRY*2*C z_cSq6t-`-U?6ZK4w1=M}%*J$Kl5X_$d6;;#J*mKr^}D^!0M>|M+`tK@Ai6S<>e6Zc z%LP+0!qV5{Mc_RVtZMG*yJIQH5rLR{)(rnH%%=X`KKn`>3t>F`*a?ao{XV!?VfR+SXjMv_hI zfg?|3IaNtvnvoD3cyTWJw==s*qj_-KkY906+BPakhUV(mXlDE(tcawb2B& zwT?&0(=MsCO{WYJhciODouo0;tjz_^CH=D(d({*Q^Mb{~QiqwY=eJ#I+sceI#bl9& ztsd()b|XoFG`LRmAEs=Xsw|73ec2s$7tXub6=cxda za@u*6RND?fNn}FKcp8?W3+^?{+u@hXKX!fK+p5~NrCdA}X<#BFNsWKVl_*?zlFvKR zu#0)%(pbYNwFqx;j1LCb8E-xYPf>?gZ0P%!n6Sh|Hm0fl6o(Y?0M(%lvJEvj(3 zO|Yw_z{{{zr3IVu;ViR~qqbEBRg>&H@~h==^fKaSG)bRoyK=kseZ}xd?D-gD2o4!T zVbJ`=WL9YDZ}hS0xS&`0+4hKWSBsJp1hacZo*Ar?V>)iDlBgqBvG zRu9gumD#({81_)A!y^7H0$t$`N-ibxZxL&w@qPr2G=hq1xNOg+Pvese)x~-8x5f=X zHXVt~866zN&FhOr58+B02T>`^ZOG~N(W7vLFw2_YHS!nRvTMc6k-abrswOnCgcA#& z5mgz{NQaY1Shh&t*$J}JS`mB>(C40rtKb(azu{uf?Xl%%<7*5w@xJ9pS=+@ihw?n3Yvs!)Nt)BE8%H*neu( zLc#eeH`fos5y)U@=0`hciwS?=rY6!5(oqLf?eI0)ZGlGkE_AB}j0v;~+EFMIxsk0A zp3zu89ZVycEP1F|SN_fICWl&lQ$5cju~k^}U7^ZIjHddyQc<00)|iTZ!YSOABRm%SonnmZ5ixagD1=G-@) zWl7%7^iO&Qp|CNvfKs9n_GpgS{1_sKcCyfSKjl}}zPbHG zR_esaxYsii{F=CL`v79jVU8ruZ*BYX4oq3?5k^Oc;D6Tsh-1m8!-8dzFCi&zW45@~ z6-1HojU?`tH0rNg7IS^EpNq~M)uQ%nI_FH`GLNJcM}{%DaKmb;9bQ^&&fa%XorZBe zwZ0;;XR}K(g8V~9_0gox<#3P%-k}d(t;|NltI*0=bIRR%v6Y`s9I9&YX;L;bi_B+G zJuByX+hI}dEOkr?m)}sxZ>^XW5y^jFi4{<@rv+EZ8Gfva*B>59+V2w{r-}y{rWp#x zme3xgLUzJB4oXM^)+GUhUF5}is1}vJ_sZL%rLv}0$)xU)voTBuGht-5O{ChgOF#{xvf;0s>_a{Kk6Y;6?6=B(IP&By; zg#w8}?|@kCp-K?`JDcwhuvc~G99LhP3{_J{?FKaxxdabcwC#Was~d(V3jFcv0240C zS!SgX(5d!C*td{?Ul2eBqz}iZm%BG9-jO$gU|TPHx^b;ZQCEY;4sV`gJs8IB_wZX1Rc9N612<$s&P6pcY1$?&%xnGe;~6~EYn3BVdO(QJ2PipLYA#jljTG5^fPN6 zdnm65exmw>uK540)GJA!CdYh@jr5TID;)n%AV&X} zrT*VKlYe4wt?#aAi`bu=lja_ca9+r_Kz(Y09G!iVN|j(HB2aB?NGrjHg7BG}#MrA7 zbe)aRE7sM`>Xqs?zDC81>Vq^i>Zs98+RcO37dq9x71hW0wI9nlk6DkNFTNh;l$nzh zqC1XP6WLd*E7G3z%byBH~MCc6LHwLtv3$ynr&Zx0uaU7ryy{>7v{&dOP=DF z9!BVO6Ny>teUpJH@VHk51eO$DQ+fJmN|&g_3ZkZiU>}}dZ@+ksGg5Yn%ucVk#g8@* zxi|{`$uxdHl%OpvcuqnJu+y3kuXt^=e#r~)XyePA!XjIp!JbF85|Lq}lr$kqQOc}V zpa<#Mbr<=z2x{J=nU(6=xcafs-%>baX)4nBa{}QE3=_Ewi{bu+WLS_QQySZ<(d*#t zNQs`gEQ7;Pha`n%@&2|v!}OQ4r*^M}!c&J}=>5^Uko`ge1ueM3X%M+o1v_AA-(7yW zrHQ$Ke5K!cIH+1(G_t9Z!@b4sx5N7E{37ASN>3r_n#7c14~x0%w{j}2=HM4i#dMCc z@+O?PbeiOH;*3Q(JI#wlmNh|TyLmT2bUIEs^n$xSK5hg%B{l10A~#sGs<0RjhgipV z?t=FVJ)Q5|Esyse)mN9{kM5$_!{j?!rKcIIG>$@!L)=pv(e`r$g;2S$o$*F4+`&AecF!nVl=sUiEJb0{E=R z94Z~(uyKo^HnKP>^mP5!Q`A{aMe?FaMlNy(`-WECkz{bR)M=nO=7z54ga=f^z%d|5 zW4zQZaN4wE?(A=iqoaq+S{*exg*SI8ZYGFDQ`1QLC%v2JZe)+Fti#NA}Z zD=Q0^R6ea#j}yg|g)~)W`J6g!dw}H>G;LDBEo4?H*C?cQoi%E{O+ii3=oyoh*L_S_ z(k0Jx`eVdstyM*XOr}$jR(@^F>@?&PZ%tpi7Ybx=1eSFtb#m;;Z2d`~G5S&9s-8-= zTwEJB_yn&!^&mQ}s2xLIG>VO8;j&6-!7n?^R{6s`_=qo_^g6Vwn?@?rKC^|+)1jb@yCVAQd-@tRn0 z^_y%Tge#RNtboQf?3=O>9yIu`{#x`mh>YI!#Nt@8#NUQ=Qagfeg|sX8SAAL#4T~CI@Ta}F`)s6D9#$Tp=uaod8e%=M5T*`JDi2K5Sk+jVi=_Oax7*;+H{XI6<^gt(C{ z)o$Xs4Pzo1MA%FnXRPd`89l*qHym>S@9rr<7U2hNnL0n0r!067`JxX!JGK z&mISxS!ikF%gH-j2BGhaAH>57`9MeVwo)@dhunE&&L!Rk?*IokJ+~&$Cq;6A)^32- zc0e~;CX#4V2IWa9`stW>5`$DgkDT?Y1k|TBdlFCiFxu%)@uf&vFThJO89}-Dhw3Sj z+8VRmH0|@Pp&0d2UeX6hSZZ6X3uThegf=fehG7%2<)ki z6%{W8A|HXUmrAn-2tTIe5PN6?dGT^Ge=w^E<<3>%#3XJZSWfR-PdsPrEwd_K-&_2S z7!J)!Z{*CKqP(#m>NIMZYajv5c}OI*YCBVU_+(kh4YKDARq;DB&Fy~KFsf!KCGvn$ zR#d5FA+Ma>2V97EwDKF><1SaxHE#o_Jp3P!uMi1>0qFFRyXu{6Q37`quNA2SqfXOt z$?u583v$~gSas_~>E5nOMlQU4(e9lP?W2ngTqZf${*X~zL%b2i^RX#YyEJA*y!HK~tn6<8FMf3;v zOmhPaA<})ArtG&Iai3tOj~vKfV}S;Ty#{j0%{!UrY#kekrwuUIab0ZfS#0FYwl+Nq zLagpt`2Ik53Wi1oZWm4q-Mpu-pqgXjl#1IPc<_r+L-n3FoKslCC@D7H_^={m=SCrF z`y24(%fsOLY4^*L+by-T|NgAD+z4XaY;bfv zY%y6icPWYEOl;JzyAx%Kqx40HoL=4Hk6v3}KhB$})-TW%u}BGN$RzVzRtxFh=d^)! zGSZp{o5JvlCToqc43wz)VW1l%?PRqTsBtK$Atl(MitOO4FAV!}V>n+IR;2ZD#ANZp zoD^yD)*BA~)>aiym^u$qU(e%%lDbl`D@+5=qlyEw?kcB>pCHR0i!MPWcw|rEqt97t z#gdIX>Jl#hJb)2d3yW@yixGaI$xzTHcyCy}5~w~K#ZaG^@#st@M)(-D$w^c*(7Z>p zLG-vo!5p8On3 ze(2r;-V=;#_kEK?YEg*=N1-6A^cqZ<0WWiGGr?-mZeh7q#b7%fQt=pQVRyVu3dAR* zzYd6F{2gK;k?XcSXsVlnA5I5$bZe}0sr0>F2t;hiO8RxRj?jivlB;b-)8sT=tkTs5l2B(GnoXM22h!Q{{(xH9EY^vQuiUm`0Kk(pb z3GFscpBi6qy1sGYL|*6%V&2b#&6L#Ha;v9NmLh<6Q^$(ej-Tn+z3&Cq!3zau$0&En zHI^ES94$d=5HfTy(UvN25Ij@`n9U7^9~0YH(k#z$^wkMPWb3p>cn-#8czPL%VMlUb zDQm`d7BWT_`y4bJ@p!Lq5YrLgR?5isK)G?FBd#=37{-CYdBo0$8nm!vG;}2I?omuZ z*)ZaKKJMbb%Hvdb)8|0=SwcwVt$aWC9w1aWl{ZFm@Qi&<%|A7p5z~iAH(#LuJz|nf z6UD%eoU0OZ@taYS?*qwyXiu8OfhM-Y&32%{c!KdKUzvhZ4}DcUzla-VyTjjlEkS=F zM!PT4`{kdcH_X?G1Olo^s}}zI5C43_`uhC;@u_ojwX$XW*TCdIkD~mGqg1Wz%+$UP z|EE_%i28*~k_P(cCa**1G=mYem*o~m05u2nDwxho88Q8wtuls)q!b6+3`gfVKQZEF z>!l1eJB@r{N`;&2+M4^Cq7GhD0c(@|X}AhL_xql}4y47~0p$B$G^-zm|I_6WI6Meo z%VnDH$z$rzrppw7@T-4T0P+F$!d<`CM55=k7kr=nFgL+r#ThWcwEdlUYoV^46+gGn zapXAHPmOEDYqT%LOTKsqTtrtypM~LwKuNhjJiK>zBjR$mA5kCi{5G&s6d(y@i%pL~ zv*?=7ojJA08}rcu+awzoLy#G*Fs%@SpDU1&COZ{9nur`YGL#4yP8cqCh=sDs3*g$reESUm(RSFb z3gFkC@CM7hhTSry_g|x(E>bw=h1QrTa%ntmV0?lv*4MkI1>r+I6>ibJZxl(^E?1?~ z2+P?NP_2Av&&L+HBBxd@x^ksZ8IOC_XP`BFpg^HS^(_*SIj)2&RMyeF&Ml0e%9hEc zEaQ}_JnnX`Pb%rwqj?Rn-f!6aZq3Hr;Vp2MiwqS%>+DuB64e*-fCkRGAg#Qvy*y-d z=(@;=kv2I`kRQE83NuKT%y+mwlAC)C12(}y2kjiZ4t}bgo#rKwnrNki&Zt6XN`0z@ z-cYYum3%0)#kf$BvrtwCmf`TkfONsvu>t4V2yES8q1(MH%769hAwIA(znFVu3sFqTE#NdM6hau2Y(6-%@ykI8S0Z#!-ReZTes z2ejJg`h_fUFTdmeocIpq(H-cx@J3D7$m-TiilVEAt%|Mc)(u^00-hqT)!A`WiHqTX z1yJ9!mk{{*G^Y}M$Q=G!uP``c@brVf1cLmblB~E16I3)oIhs2L8KI&HE8o$JvA2<2 zqV#SGUA3_0^u&Sa1na01%3Yi#75O6C)TL&T(5-5uXCW?eJmaJ&O>ZKWO*Y1(zFCC= z&2{30+^cWvAZQZyo!6%9rBKf~qQ-)|Cg)y=KTt;f*NDX*lm`RzH$e0=5Idp~3Ze-F zQU`!hk*3;4ARtkk!r4Qy@^1@FG{AOdJ)kFWC5tr z(URRqYgK*Z!*lExCYtsm&|JWq(4#C}AbPB2veb5tD%I`fOH9A5RVvCCRiqU_w2fos zKvL}L@lZ7E-+$;xr0NX2i$oX29wbm=q?wH8fz;r;fczBGUXwpj1`I&Yuaxc6Mj4X% zW5Tj3w?~B#GrN}C+pnbK%3ny5kM1vc_idRf0i)XH7g`P_z15;nPO(7(;MO@tg|p21 zc&CCgOsEA$=X@j0GK4{_w#Meh_U(cB$J++BT{xp0h{K{r_9f^RTFZP9r+0jlZg3YI zvoXG1k-p!^F^9t%3#1G(_0SXadkhkHQBgQ5Wevy} zLvN$fKKDF>`VoBur4Ab0h%D08y0p1AY?}6+y#-j>HbYYRhLY^ti%F(@!*$YpgeeAH zV9ytOlVXn#4fZT`G7;~JL|!DJcKUfigG*1^1DG(oqYuYi>8L&!$HZLet+t&z`|_7q zHZKye5Sho__s#5ruhaSwZQjHzZ$Q*zyUs^Q#QDvuG4sl}^92Z3&gDK1i5vMf37*Y% zfZy($pMN#;#-U}LbC$$1fgL0qd!}61SdVWE;v;Ipbq9$tX5wnU>wY9uhqheC99F4J zBFxFGxL_@^$kdS#_Dr2$BM%KJ3xqupZ)pKbjmfx#rTsFtrsc}PntjCx-PU%Y;_G4u zb3?1=3&*%s$bvoz{8g3Qv-#9;8%ZkvG70X%fJ|8gdl`Ya3NwM#fM@*E0bFATB^BFyIiAVMK)a9D(Sbc>-7{B zqqls=Ij?@a$M2q(?Z4j7EuJDQS@oO~GaKyZEE~`ose61wElTy+CifeCxBwv2?I&K} zx_eEkGxZPZr^FcRhqQXKOh!|^+;bRf+fLOwdK+tR4$pkNCdDwp+aKK@-4R?b(N(v; zE9cIUO7XGdaB(`%g`4SsCr4k*vyy(H6-hkwqS%XXC6r)Xq277i9A%W0@EhuI=<{mB z1rZin^*ZrODU#$37eQJ1FG50NIj(pLDGwCN;@bx+;XkowBoZKgNDkj0Igdba+cW<@e;I3fAjUOsV3uBHdfTri$~s&k|>GPke5~nPL~BZ-He<(;McA{HO>N zYf+TOK1! zqf8vF6vivGxBRFhWe%Ukep9Tq#z@b8g3rhl^0=5*WOER>U3fD^r*-2%C^j7%&htsr z<_CqiL0LHRWggP{Ns61r2{zry{yxO;23O7y0Uv2ZQcim8p4K@S2`)5{cu1tlx z|ClL@eP$;aQJ^6LM%xlZKuEvbQbktstM*Th&=P&xBztYp1^$HB#dv1DNp3s z`8@<0lm{`3WKN(G{hKusK z+{$AI8BrPoj~_w>Oa9Ggwx&Z_vE7(y012c9X=9NaNq zw0sM_H*ncKaQk=MegR^)*fD~5$nfVWb_p4R8ReY}@2seUDD@FN!kmGn8!wO-gTO*7NeHz4El3OB*fAQ zh3YiYD|#N?jE&2lth%=Ix;CIYSTCdW>4eigr_+K#XD9T*LT7m{3VB^=>#Mn2^TASG zaz=@vQd_Uwv2D`k(-gN(phCRoa0FuM_p%16z0aaxw3IV=jv@$Hlxc0HQh7@-R#QzZMNOih>qVU)hdj9*rOjin{=m`V?xnYcZBoRNZmyh z3VUOLKbTM|O?<&(;dvsM>_r?J@)*TBln6b++xEmawYo^#fWlM^>%#M${+IO%3fqx|0T%N}Y8fZI^-9RAwZAJGq~x zTtcXRuwMoO@NPMduN;fhk%Dfir^Md$B#yhA&rA zCBOoG;<)X4F?P!<%#h<0IgHx*L9bQz$z;zgAO+yF`0Jj9RaaM1tuwT{VcxbNvO;!U zgqhRVC5bfRnpGcw9o1!{#&@p@?Gaa{8s1}`<`tWdvx!-p3h)m)#cF8nK`b6VF2Sfj zP&bDi4LX?YbqU*OrQ~k1x`0AFrtD@rhMk#6ri zFrk$H6?LU|yH(4~{HiBAUbm~Vr(szMJ=#SBSn4RIU)GCSx@$q=C)qtHek8MwKaq3& zWY-pQAf8xOGH@tdcOZ(nA}YEfiD|T)yi$tpiOYB=MtLRekZhfOx|;VmLCBey)qA^~ zS2z{<|7d#;xSHShfBb|r7401@O{GbDr@fbyPJ8dEfwXr@8WN=~v`dAS(Ugi*nkpKk z5?cQE3(-sG@Ok@xf9Lb)^X{CZ>v`SRzOQ?{?kdnDS8z5iif5n3i3#LNeioJ$8EAg_ zf!uzR%PQ;CqlqS;drk8W44r)Rk#l`1;9P2pR?5dzPUfKyPUcB!t}pj!l7+E5WLPE3 zG_iQx8hkor@7{cUX{g-1MCV!a`}1Rr?Aa2p>#XXdOv+4Z=T;j^bHk9c0!CNgOYM^l z)EJ#G|NNQJf1NFFt!@4t_vzk^$;v8>g_?=8zPqtru`jIX`>c@+Z>}7#Pt~Mp9zd>^ zPI?Y7^h8SEj_H<8Tf-XKBzF25vUYZw$2VmDZlhZVpW1E4={{}b{WI(qTC`+W7~>_B zWb_^@Xv#YDoZjzN%ZOLXLGzkOja|n0NOR*Yp+)X2|NFFG@)jb~&Pt_EUtXoj>&%c! zl(P`pTg5;6k){quFC*Y{fjLI7XnDBXxqL*p(qhD=V^aEK?M8~!vK6#B%r>XYolNja8JLEi)<#Qwxv8lDWuGg)UkrlHlE3z-#n4ih3hpi;6 zGh9uW65peBi>gXpuYED04#Tn$#QlQ9v>|sa0 zF0Zy^ywj$CY2oXxr(^w}u!5R8>?9+E7|q1FZq+H<`|#dmNjFAja%g#fp{fbEW#zas zcA6)@j8NhslJS_ROis0M=PUdP4^8hcszIBonUR=pW3np__)G2zY$4V;w93Z1S3^#H zTzizqkyPP8$)TD3>Y8yrX$0ZsUa~=-RU*yx>(&D2?&!VC&5Si#?-`-jSf^PWxtu^rr3beDq&ko3Ued8JLZ@FXQCywp1s1+Fz?4aqnUr zJA*tkgW6={L5ZmfvtBDAta~v7oRXf$bQWJ2vz6d&k7g&L_4IS3A(h6_EJ ziC%k7M@Zx@4wed$x34)8Y_iAR5mj3!hx%Nm3d4*(pt)s9y1kA0dr8ashmMu3rJ1Mo z_Lh~7vUZOKIFZG*=b34nvMk%8mW&aVtbb*YmTV*@SxBjX<88+j{&{|!-4o8;#r8r8 zu47u(pEYBrb2F}sc8rVP^SkGM&;8vKv5mDQ@^gjobu1#7IrM5dlCqOmMlyqgXAj>;UTf@W{3z$z3I^wQGjfUX z4X5gFq+{0Gh6hmN3+pynrF6X2t1%R6O`8{_`k0$dd&KsZdCCA4_uWfkCttF;X?pA{ zyK?)Y)Wcp!KmFT0OnpP=1M}^3opj4H#xb~$7Z5PL=igUU${t>qN`$+6h@I~a=LHAq ziqI!jAJcBXXNX|ftCSnCnNNE@cIH+SkC!8>TjuTB4x-aSvbkerDi?#Y4n|{>K5$dj zZq&x?S~%5!SC_P)B!z2>bDNaYT&{uo25DVOVG#cF;4u-LS+KE9Mq00d|47_Yg;yiJ3=S$(v>-5e4q6 zMid47HM*{afuFi#lwRjgGRR)dxT!m(Ad;EiZl_1{>7`S*6Q2V1UG~S-X*F!MYWp5l zHrel?v~)Ti>Rxw!uupF-?o@Y@^n(YKX%#dk2SNyrf7}#Nrajon+7C5hDhVBmTYYxs{|F~5> zM$g_GJmB$Fk0^_3UQP@N73)Q@PTtBO%mCeIOvWyA{B(eu&K z4*Qo95|P-6bvAVI$h{ia4AB+{z4(O4MjPI9yBpt{BD8r4FiY@{m-re)(~)$@WToPd zBWVs0#O?XON|*SdI{GkEueD!qkl-~d0UXthwLV3GTht%K#j+hQK7G*9D|__4!v`XRqEf=q-cEt|tyW+ks8+RC+y znDkB%rm{e>ls38YJlGXPR_xzBV40ehmSdmc6%(9u*#MtHFH^HUr;1+1)>m1`Z9KTn z&hEH!5R)34L2j^|d&oY$E4~wynmw9WEsqG|R;%*HMGD>yYVx7@do_y8Pn{CxnK}0jTFX-dZ` z2P!|1&uI`fx?dURQkm5H>RN`pSlY&##wHZAWK~)(@55#grHZR(9SXE~ zj5cG*Fha_u7|w9=woZm)dtYIQGLUDoy}#Sq_+b>TNn;z)z~+4H_^77^QjLqv2a}q# zE;5_wR(^ubOkog5OMWt$;%shmDZV?q^rjLh2!hSy82p#nN_^i4Vap01M9S^s5g7d-Cpa(^-Z=4ex=l?3e@>e+ z`@xr~ucQTbmY=F^Y4-Q^6P$LI@XR}wh;z$FwKn&0cfD9dutC03|E+?c9Ltc)wuRbk zj9nLriW*L2J=BtppPz7CJ;SzONLr-NaYIE+JtVOVv%>pn!`Uj`_4maxCwj4CrN<-6 zZig|^(GA)kOFtJUD5*b3bHm`p<@_ksCO-as@1Gw3d{=4V^1-lO4odkFVWXFAKKBy% z71KUzTRB-dOSvN4eCIr)>3QOd9MlLu53x8aLD$`acd;JLA0LehIDfb7QhcD_2YHd` zaf)grlU|Wk#<=%oiCm zuh_Ht);y(6FAa~~xf@)m{U$}eTE*9}jpG6!X#jO>|S8GB&Rj zPH{+#47daf#<_fTrFIEc2(~RDt?C~Y=2)HcXi%)K*!4CTk4^1FQPCmY<*DfO)&=3h zQP0sr+`6LUSg}OIOEk2MbrZp#7#vNm_bD61UVbtdf!jQ(yMKZ-`~$A+X3epz7VP4X zYv#9f)Xk7w{yhd$t$FTK8OPN>$*_;{KcYVxN3SoIkmBcb+z9V;E$zlTb6d+P%*g_S zh|_sjsTJE7xs>nWc=**e4zJw#B<*)MxJc;p$pGhUwz>J09#gsgvz7IILgQ3}^7L87 z0Z*_u){(al&wVP-RN$X`zjF1<+N{&dl?3j^6ZBb0h1X0oUx|>v87tb`>Gp~5@#iZK z?q91`Hi*1^VpeGRODY|?PeIhp<0H>DMYKMNd1*elKr+SisU^fY$2+Lc3~R4}e{!kx zd^2q{d(Wa;>(T&zK0d7bkP$J5)DoM7%c--jd)Tt%#`KAG%;al{z>_=6~irkGxb`2}$DQ4Lg{Bckn5{GCxgVzCDdUdS*8Hbl)hGNnt~qPfOSf zyE|mJm6t;2>e;A9h(0>6xhi$mPdvJ9IbBZwes#eF@qXe0qH|P8+&}-CowPEC!LVPZ zV1dB2yL?v7ixYIu6>2NyJ|E$Fm3!^X0}5rk8h?5HJFA1Q2eAAG_J$1zv%T-6BGk}{ z;8;+#QNU_XmB{Gw%vpSLB`7T+`qrd}pI(tV72|QnOXbs>uGt3-K)vEm3*rGx zFPm3$VG4zcVf(6E0j>0*uK5#FydE+!hZE1_a$L786Yet6C*g}u zN>^dCGc>fV$Ch@M&pe?TIe2$&?x=M(?#ZUL>4}q=)|5ixd_%G^rI~cOM3_7qiW`A` z2GqmOhKC52qF)4M1X@?f-1P}~bO>{H3d?24gDGA8ge18}Qp?TaN6sh9xe^Y#BWq&0 zK5e|bk=z-Z=W|nh=omSBP+6TvG4`>uM+788FPh_$g+)d8q{Q+9KC?P{+I6ywWM zPOhl>RGz%Xqk}9i(;D5gSIgIK!1l!5Ub0fN`V)oyp*U8fa|J#O*W+v>98*iy_i&H6 zddR9P(;gi0>cg(^4iuT6UEjtp7fjuo_0k7_XMd^`lYg@qR;YF7X)u7tIaBs#Tn$-wkLY(kiVWJ%QN zIVyF%0_z4BMMt8ivr*ESZ-sJu_%l;kwLT;-;JoKbv`Hr>3fVO!mei_Z<6-NL+5A2& zuE5ctBknp`VBePmNmLk^RjyNw^Xo^OI$YCVRSgD&z49K|Agdj*TZzgyr>-oUAD`0< zJXO@+cL7UdMxg&id}R38kjC zIfd6T7@ouL#nmy?kindMa<2Ik!kx*A{mqntrSp8t%NNRrviUnShr=HAt|5E$&6G@! z8Sw4?=w?yAIPwnIcs{ztnYWQ- z(oepIOBX^^{El1hrb+XRs&R?!9=Vs&?qrj5ojur*PqR*FJM4{OtFfs`r?NjOHh0)x)sYQMdqPo#r|_N#`45OymY^unUK|lYUB4cKCvTi z(6ryoh;vN@XJKN3x=NDs&xk)1#;m1Xf0avxSO_@zzuUj%KUmb@=@b(o3U zdCavgX4>bSKwXomc+8T|W$sUYEF9@R!spXdalPG>%(FhGouV<<9kO?m+C$rUgp8DK z?2)i99g8<8#$0~mP|0Sk9U`l z*0j8QqdZn7_ScvTBc@LN&5aNIuf5n;ZcB<|6sNrWTH9=e(s8}9nZaUUXx?XVp2?>@ zTKV$ZPd9aj5@x(_Fde~rGM9W?Zg6&DJ>o^HL*J*ghIOH^y-vdV98V1*NZc(BFk~M{ z-ycG1N8ZdXK~p^;vp(}rlDr=AWuo33}8XkSizk{8cIqA*AzOkp|LO=C~lHcQDalQYNev&-)itgu#P4*SPqOXKd8QNTCDZmHXnLK2F zYU%uG1D=YrwZ5AzxLEJ|+I)-_IHs<-e^br73UAi!l3POhxmK?lhXgH>{nwdUm}0p1 z7mkJGyh;{mb1Hk)qEEk0`;db8s_LF-mQBRhb6@2%%D7sv^9ijx+f&yD8My=Tul{tk;>xH~6{mX@96X#V)2WF64m zY+=0F>T}a<-z*hhb?r7JtlNCcmP4UUfn~wIelX^iH!uhkZ zm=|Ua;EN4RiYmPkb)Kms9*;L=xoxmYI&$vdICERcXX#LZlaDHjk3mgY!!69ta5W-PoF0tO{pyf zy-h02VHwFQk8mlE9wN9e<7UTt=v@woP7rATe7W!}+oL1GU7N zM0&2)6Pw>2?_)R`L~svuIk8|DPX0bKLvx?Ww@oYCHmrQV>+rj46oYLmI);>iUG4SW zxjln~xoVf+W?ja5kD{)m=3@B7#a)MWw%4btQ~m)4#K(%GxPUz>s*bU2J;Dy>m_c z{Zil+_p@K#d(#tl3*M!=#*&5|FP|vzCg;o3@p^K9{+2=8&BqHb$Ujdo&|CR(lV1}h z^|}3+K9f)*!pi4%JAIjWn)z!Ho@1iN1bxnFx_k~gZtZ2+v99ytLj>M)3tvLUv+v>! z(|GbY<>&Yr1%xa*x_B0^D4N+j4YhZkq!7$7biAFWYTaI zy%_4e_0o-H@Dh7k4yFC+0*g*U5;wU-duNj)w)d);9A_Vq_lO8q=h2rY8C=YE8Wpr? zpF3yBf0%F5*MQIR5@iTaJr%}q6xs9M8@$@SWuitwPWw0xC2AUR*0?p?UwHr2h-^T5zA&2Gc z&^*CFwx5cf% zxm5}4+!7g{2b@5B7ed~xws^{Xt=OX=OM4n&m4(vZcYNed`ya7LM zc#2diZPdu)q=MsmiAkQ-8Tq^}O|85N602SVF0DK=UXMr(ojfn4H%VDXGsLA1Wq4_% z#~pd=kvio$(8B!g`bY7*Sv}-$l$GDJza7Ul*KzDi#I5Tx7002JaJ>J z1|wU>r|aqJc+7dM=66}MAsSf-7VI{D&cX1jPTbk5%bWw#$@MRzlkptggYN~``+v&) zynC^^{?lW7QKlRrCsEuXMggbw;BvpG;W%gI#)QKe!Zps_4K>qIckM63Oc6m`(>`ZY z*&=+% zp@!q!96`tBG<3LLm_ePPS7LTCh2^6ShiIdyUIv`=~!{buX_j!9o+Yl0Xy6y;f9QpPOB^*4naQg|8KRG;W~U=2?#s=ddP4WwFYBSJ^_X$_ zFlLf0=WD*W`>I{nLyR;V z0cJFMz8U+X*zqX4mxD6qG(Tu`4svH?FuW}?xqI%BIu1#jzYoUw6Uzd@BQF{z?T;Cn zV4cRpe&WoK;&kr5kj=T_8?JX1^WJjZJWGAmq`6^1%;&?}vhFHIKvZD(SCM6cS2^Av z*4bX=jXd4GipY+8Ber^2%#2+uc{32_`p{wN4a?qAjL(`OR|td=5_Urh%41#0xESyE z30EvS_f=fvBE|C4&C#Q4?tFEOeEtfpOj~w#w^wGDYwFj^*I6b>wV4=WT?tnAU1*bI zI0)M0Db2$)B^~!oXSk7{x+Nt*)F(U~7JFLi(QRV^R@OxE>a4w(IhBlyoa@{J8aVHD zY}drfH!ub^mnH0qXyRm)eS`5=a8p(LP9~7+wyfav1|llXwtSX(;ron9SLn&i^Vii? zZV16AyYJYBXooRRYCmn(4=ZB5>}$}mK7uhrkNC(Wt;u}$UyQELW80`CEaL&$$zm{o2n9li#ftK zasnEqV}f5CF)%xlJix3xAH+O$$AhN+fUki6ZlW3m!KkuxyG3W_xnmr+2?27A>SoEOPf$U@Y{p0&L zBzld!KSb;4b~0kyn;o^YnkPZJMwY4#v=WskI%dCe5Sh0Yd4oMD$9OYct@IUt%b7Ps zvpGdKt`ZMA4i@`|2`+Z}3Jeyv$ei3&l`eT=R*yV$ z^FU1L=jEzHn0`)L`>tNKuX0^dly$yHrsWhy5*>1+Q+F4o0{+RDNINsd1p(QvQsh8m zY`2%7lGxmyc}q6o_J=m%G0Nf$cP9AmL=1`t@v(9`P+}aeoM)_-98lzC_&i!wdPta= z0{=m4&-jtC>CAxG;$(MQhmRkrVyK-om7~l~Ira8nAE|X;6P6KPugTeEGBnh0yI96Y zV$n5Gw#@Iga+C8Q9qUVWXWOnQbv}u&p`JSLT*TY$PWtx{vb|~3la1;k6C4w^wYzby zj5k0Cr&+e*eS#P62vQ<{KwENGha!k%=x3I~A*CjLH6`hL3U z_rq&wR=$zu=9cd6wq~{twjRFF14wMmEw`O^`kjgk>YhJJDpK1?Ykw!L=w#*mz3gN{ z_qCp-o4c*E)3$p!HNQO>FT-ZAxZ-&s79rioYvdP3pImKKLYA<4NOc>f(JHq(l`_4J zyg$`IxRBla_EyW8{A(#PbiS#+?^PF9HWzUb)_2Gy51*sm`w?fA73tzBN+Mh$&wT1c zL}x*X(xtOrHh9blpDsVCW?f0)BR-J*i9dH% z`8KZIT{22un-(i8W&$0huqNHY>rdRq)Th3pOQ@9UE!v$l6^N3ff&)so8DL}SY_%+(@1 zk1))&y&*=AgR(lnMkIJ(d1v|`jVUZ3*KvLuOTBXjjxOL&VEqA7_%4T^>HY-uN= z+HsjFMbm4qG^9)qDOc0@Vr1yVh6kR1v*yZN7A4Q@o7z4)xy~!$qS+_Kty~|_%XC-C z4CACSb4u~!$SbT~K1vhM2zq4|s<|Rx)&zd;7-oy@Ige>m^VE`OReh<^^ou@yW|(=j zjr_x}2L9m#Pv`Ylu~sIlZqDD=Ch};wPQOc)cZ2rivetdu$&1qomU6G3A2y|b;%Zu= z!X6|vMiC&QyQ_R`k0BMGL0ZuJL{D6mi4FWxeTFXGT5XFluBHMl7fiJ-w>yMIY@@9Ln1|S&3LfHx|X}r zI02*c#f#d-hl73(i>c*d}ZqwlBMm}Nx-2h%TOJ=oJLw@#MbV8hQcLvI>=HpJ)M zY^C5$)ueN`eLr3GdsmaWG2C%ICK~(Ep5_x6sIdHV}gifG;TXE9hgGUpaZv5^ zHC_i>=1bG0Mpf-p<@%JA>Uc8uqYcZXL>#~77a_Pt!? zP9osBNvXs_e4)h0jy+jTJ*K&oZEr3QSdq$|&(BTNk70MNl_8W_JM^kIgAw0xY~Hu@ zm=o#orkQf5#qJr0^ZIUf4F}bD9Bm5|^f~StaP!o6+Ga=#`e&{)4(caWXOmEBjWM@> z-NS!JOf0*zKvPCQx%;MecL&k+GoAxx{b%D+@M$gdLI;zNPP5Cqg8n|$+Bi5e%?#PeffA0g|0Q*FtyF$TWOSPu^)~Hst83rZ~H(+(A3~pXrKs$1Reigm2t)g&eQYi^cm^ySpA&GX5)Mj%~OIbxRojCD}=NvJ1C0`eGPv^DH0P zO>xt4U$~4%<*iPUd1=Kke(>nQ-G)UcyFbStA-ZEp`JBkE>M5hSh}Yx(pkiLSCOS&L z4>zI%f(GL9ENC9kMf&1J<-4gpW|dsJ&U(T8q&!X@rKrf-lj$?pRhg0+JTBr|M+neR zcd>ntzn=Z1+d}@%jP%P7B|2{935oip#7Ac+=aTSg`A8~d-B<+^I=`4c<|&Cmu3~s6 z=5!jIc@Rk^!rt_Bqg%H7*2shbGSt2~?aS9R?h5USQ&TJgcZ|m-bxZ49W_<7G-pkPt zyDU57neK!|m)@zX^UN-p#kVCZa5jhPM&PiMOWEryUPeM(%+>{VcN>W$o_ZkmuKC)ZV#Pu*cO3r`i2l_K*^M1veneR?ND$MO=` zV~-se7nS16_HBtxH+^v`A%lOf&0dorazU>H%rAoPP-~`bWNDBiRxaM?$2%2f{phgG z(&!A4Qf;mKJ&Z%=9x3KXUSoHT9W{i`{!Vjj`NsVayo&aykQz zjpYUBntd*8G@OS==O z4JPZOC7JpUt*nWkTeEq$uc4)@`tEr~@I10v$*&L3B`$kC6QRMmMP_~bAPtV!^Zb~E z(KM<)Qk=c^BySC7wY*It_SEi?YptEVYWY-d!a6trujs?^=i_)vb==)?w^{q{#p|Q}ys<91|u&&hzn15%joy49T3&OV@G%Bq{Foq0sYhmgm=fTG9?kedC2C_ zNP=uO-oQBtu6xM}EA(J|5^VD>&roN6%FA^M-)ijpjR*TK82ey@=$i~~J@~a<^7jXp zs{fxw;GdTt6eoVm`j5U24qv!hA~yT7?75whV>&TEcBH8s>*2;R&FhCr1FEVFySQpz z#m~vDtKEAlgnMsc_vh=)FRu^^?2QaNuOisAJ|!Viw)Sxl+^X)B-SdF$l#}T`{VO#y z?RWX8I~|_87RS!wS70e|ti>aT-_!8w++|6^j|#|{+_Vr)dcr3j{kW`GC`chpRP)`} zurjmLMM-0dnX^1c+3}w#(xf-J7%1H40@&PHq`Habl+_Z8W+xHvx~!N=1XWK4~e zZPBAtHOj2HvU#A(XTPf$?%r~3v8-iXr4hV5UMyY#&15XTx)kH7!-sQe@yA_VI0Ygq z6&(&1=MX&;L+Z-2t$ay&I7pGA$ne^H(yBgSe9ozc*7sP9JgpI3TK~$^#@H}R>wyKa zo2FscKaHs2$t-!3XA;ESxJK;eovSuUelGSz8+S%~?pd?LC9%TB$3OMH$q_s^hF`pE zm3LLo*?-rXWYlpV-*|VEM#Iu!egvLDdpAqx2Ikr3q1s(_D_C{GOUH*ALx_Af12BeJ zLoO?iDIFMQ4;idB*rgxkl1E~~rhAKYES;GrTkvjv-+L&>vl?|;OoAN03EPnSdyaSb zKeI5j6AEB@za|s)Nt*WH;dYO{rnA&gbm?Ua_T|So_T9iFl-gg6dx+>5m6C0_)`;L` z$GdJXMcxS>4m?c1toWgUa5Rj_+FesAd|&8HLr433$NFYjRa3y%4A4gK`P4K!HMj(L`p&h<-*o}`O_>^<|{$Z>9H| za!9-0akRWMG=!aVbuxuRT_}T=qEq{Iy!C7M^vniv&G_?TO1x2BF6VD%u$UgW{Fu*u zbYlF`Yrd&h&&e&sRY-*7TiR?JtNUg3T|93nGV)=TEx7LLNjq)c%*)Eu#v#wt zEit8@GNrZGX)!THKhKP}`e^I@h^W`fB!<-&n1%1}`a*>(@$F`85hZdHGB86r@$G>( z7`sRi-{(oUeq0j*zWVmUK>&k>y;S9Nq_`B-$v{`Y{44WsZ7yxY356EjITP>T;B)ZL zpMfip`C&xPp(i3`?qTZ%ni=2Q48J`@d%JcZHcPW+WkLY0hd{f~s@bnsHNZqMPKZru zq`AGe2lziNOLJ#83nq1!@AHe_iMv^l5mTq zq_w3R6uFpqchZNRZ)TplJ~IsHV*rDM&Z+-;jev9QXz0Vmv-RYq?W}*(zg$#&CZJah zevbU23x1;jhKYvs7V9$3P98{Gr>#}@-)X-fd`j&PlSAwhq$lgtNN` z6ZkLGOWG+Ii2EV==as?$p&kfE0LJ|Xu%i_Xf||33t(C1g(gQS~ezd5xJ$$zggKQrJ zWH?K8w-??L0Mk5(KtNBT{Pl_j-i8K3#TjW~>9$?7-#yBv)1!siITA&4OBpvyq@y-q%-h!72DRAOPtV>k1-5Djq72*_&N2T7Fx15J+Fues z13EbfOjGaIFu-qOZ2y5c6N3I8d%^AunP|@v~7@XmfwvWT?8OP&Tl>d`f}XirO6^_>8c^Uz8xN9+WG|w zU+55mn;%nHFd`5=ClLr>U)x^Q;%E`JV$4n>gM_iyUuAzj5Cj&mV!>?$5eR29v?O(q z?%%_?w5P2D@J}U62M1p>OQh3IjBlY)RF=>VxMVnRNvNs*>*Z&G7Gs;hQBy69en80p z#C;nW46wy*FA+PmRJViyl97ky)}w8=M=FTl(&8`^NkEwy@C?sFRStip%%qLOb@#ADn?v63JD4mB z2E_>mCHe~y{1yY2DE?>PVv@GC*0J>QKojU8lltnG8Mg$G#6jGEXDbnRv`AY?R^0`P z9qxbjG;ahw0SQ2O1&kIxmUu6;2wSS(%7?O^j*hY>mBl)Gr4Bya8$f(P!H$$qy~S&XC8X=w#;XgGMP34oBl+ zco_&xnIHqhgWmN(v^ZNL`!)j9UbtCUc$NjIAr#O)x{Z4T;%3NS>24R$PV!LEKzW|M z5RyMXkU!iNk4F5jQ0Mr}6kl?x)zlauL%Y?R^wxs_;e<$})&{Yr$tdjzqQvqdYz^DiGqot0zl0o??WM$Gw_aEoCwvP=$|F}nG zkP#G#ABldKo#^0yL*F?%NOnm>GK;QYWLdzy;cj?;0xkV5-Dp75CMgS~%g=4U+u4WQ zr1!eiTO6QzH}C_G9&s~h$^Tfu{vOJAvJKIdTNRgC235f&S_Favrj&(Qv~*={kq*w* zTg;;-e8O}|um~_~2SO7(#fp7FOL&XqPrp`!<~2@Mw$`3*-zGVVPVOE^C$RjF8nj^j z7!q>74q#^RTFQ70Ehq|q|88HXF*@#DD69mD6$uQ98748y4fGg4icHiboeoNTJ_cC6 z24Wyw2~L<8=qdxK*w~U6s@XQA-K%_`*(w;owXr9DpKX7|LQ8my=#~;t^K7!mp#3=D z83EF!GE5AF9B4`ZUbccMF}#k2eE1KO2gs3g(~b^#17LsPY-%vz1}?O~C<6xQzM_~W zePcmp=b#~MT~|lSAz)ubKv6)X+g{~hK7*!&+ma)!u=<7#wS0bj3ZbH#bX?838h92L z-1JO?KnQKaL?HI^p+!Yu)j#G6JBJ3vuTiDZ&C}p2=`t|wgBSBNU>^pWq5Uj?zju{( zQihCBTlk|2D-fC}P#QdIW$UA*yfqnv&B{>Ik3D3#&j5(W0dNm*DRCI0rT@F(p(ZW+ zq=+7f_}h~Q;kDtgIa<=NjtSHEcTjpa1G5D*ajX1nNFX7wDJ77g;N`ThC0d+q^E0Mx zzoSoskTM1`ZQfr8!de9lPI!b|v_*@w6%oEwp?}X+gO%aW`#?^ar9vP;pJdzXlLuOi z?cofyGBEe2>sAA0Sb~fKR|aDcTC&>&^ShAHxm!%$jpWM!X9UCGk}oDmQiRbaHG!qC!283TWY zVDPwU4@D;nsKw~)hQ8(ZX*!ff6pTsE%MGW{-xb?=*dIF2!OH(P~g4niA=O8 z+spyXr9mIXL(39sJ?|U{Wa}3dS06_M5k3YYgvYV20<;jn2mPOBz7qp7KB>-XmtoKu zZ$13GuigihEt-@Fi~f);?4%9F;o4LATAENW1N_4y{+Bwmw6}r`kPlP_d)R)fiT^NZ zgpg+4ETfbGN-l7r<1kAvzxP+9t%&pImKp?8p<0(i17NO#FaYGW?Pb;QR~U5j_rBNH z-;@A?8XzyiE1wrle$cw^g`*5+kccAa zHkN^xAqoH(ToawGXo0qLz7^D%wm#57TJIbWRHRlC9(fCOZ0bNk0k4PJ+R?)NtmMAs zcvSj;Jfg5u+JGF8UIRLTmvYKoXi0A|yuAUzzms)HLIqBoS&5O6#KYAtvSR2e`^9c5vSUNZKhYPTkUL_mdwkcLU- zY+x3z!4JF$YyFBAc>CbC{f@rE_&DNuF%KZ@1$u(l`}|@FI_-+=b7W?U|7OnSnvkdVbDAM-;kJKiuyGobk+oB=-Xb4;wW*PEWhuz+^*f{ z( z1;ir?@=#>l`7x9=nY5kF?JYgPGzvvi7P7LEFRawh01H-t1(*jSB&5-@09LDlu7 z&S?OXFDFP*{}l{W-0mPmpcy*)8ijSS@R$)0ZxARY;ALLLiT}>UPO(B^s0HbF4>TbW z834x^Hc}6j|Bk`*Q?CCoT(M74lAb{5FF=w|gs~E-hL)9`*2@G=2kiV5y_DP7XNEyV zi#P*d;q68*&Hn=X2VX)_Dnc&w=&D8#8yK)Nurheoo!9;k$UhI_{Jtu#C+k#P3+S7I zc?i5;;HCE;=zlZc|02;xbOcP0P2~WaIt^1~fgxI4v z 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 diff --git a/plugins/ActionBarSherlock/library/pom.xml b/plugins/ActionBarSherlock/library/pom.xml deleted file mode 100644 index 3b6ce40ce..000000000 --- a/plugins/ActionBarSherlock/library/pom.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - 4.0.0 - - actionbarsherlock - ActionBarSherlock - apklib - - - com.actionbarsherlock - parent - 4.2.0 - ../pom.xml - - - - - com.google.android - android - provided - - - com.google.android - support-v4 - - - - junit - junit - test - - - - - src - test - - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - true - - ignored - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - - - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - 1.4.0 - - - process-sources - - replace - - - - - false - target/generated-sources/r/com/actionbarsherlock/R.java - target/generated-sources/r/com/actionbarsherlock/R.java - false - static final int - static int - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - ../checkstyle.xml - - - - verify - - checkstyle - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.7 - - - package - - attach-artifact - - - - - jar - ${project.build.directory}/${project.build.finalName}.jar - - - - - - - - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - [1.4.0,) - - replace - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/project.properties b/plugins/ActionBarSherlock/library/project.properties deleted file mode 100644 index c57400d00..000000000 --- a/plugins/ActionBarSherlock/library/project.properties +++ /dev/null @@ -1,12 +0,0 @@ -# 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-19 diff --git a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml b/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml deleted file mode 100644 index ea7459aaf..000000000 --- a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml b/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml deleted file mode 100644 index 0edb33b4b..000000000 --- a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml b/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml deleted file mode 100644 index 2bcfd0b63..000000000 --- a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml b/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml deleted file mode 100644 index 198384fed..000000000 --- a/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png deleted file mode 100644 index 769463b369a5185ba2d2fdf26abf058086ebcd08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S!aZFaLn02py|Iz^fCC51!MDwC ze!c%VXGhEQ)_dJsezHtpNMD|7Dac@a*_ZJyulFV2w{5C|YCbaz5)ZX-3ak0tIJ#lm tp_aeGY*)k&iW*FhzahTiJD1r}=BlLiI{(TJ=>e@^@O1TaS?83{1OUpzopr0A6)2vH$=8 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png deleted file mode 100644 index 73050476e77aa798919b829a5566973e231f9d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S!aZFaLn02py|Iz^fCC51!MFRR zxpqaJ>-4UOe6iPKwm$=BLD{Wo!i)yScSSDT-Jo*!N?wFe;-MB!VKtu_20%tEPqwzt q4f{lgTEQ5`;-9UxjMeKCf^DQ_uhd?;-Btm#g2B_(&t;ucLK6V6dokDm diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png deleted file mode 100644 index 712a551ece87b2544433ac982382a087e7f1731d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S{5)M8Ln02py}Xf^L4oIp!}}xu zHrx6hVG;aws8xB@i!KMDZA_cCWy>wsRQS4KRST!En$HY_#6vK~{lt8cLjun}a%VT6 c)z9eScC>M27UGHi05qAw)78&qol`;+0QSr+Bme*a diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png deleted file mode 100644 index bf3b9438b16543294498ba27e51d4e878c8ead5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd_7$pLn02py}Xh4fCCS+;oB*H z(}QQZt5vXQMa=PTZk@YrXXvE3+ofW5$)(cU#3WF_jrSY!c@8l>`*HAE!gKCvr?`99 W=bm|#aNiDSFoUP7pUXO@geCw#94y)Z diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png deleted file mode 100644 index 81b87b86c959a98c478177270c979763831ebf66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2863 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 N002ovPDHLkV1kHdRS^IH diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png deleted file mode 100644 index 8fc83e22efde5509c563c97a836d869d05ff5dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2859 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 JPDHLkV1neRPs;!R diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png deleted file mode 100644 index cbbaec588ec98bbc8a518a9ab5a9c469482341ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0XIkLn02py}Xe3KmgB?fcJu8 z^Zp*+-L#E6MBZg;W9F9wttxZ4PHc?!oG~+pYe(tbxxSpjYCbaz5)ZY&8G8*Bq7ylO npZ&2~Yqrog$!|3Wm+fFU5UE)t_U_Fapd}2Ru6{1-oD!M-^V;Vpy{TG>rs2jRbt|WpWjh#Ji#?9Gi^wblTEgJz>gTe~DWM4fZg4bX diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png deleted file mode 100644 index 1e39572224b24a81ed4d73923280ba2724dbaf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sf;?RuLn02py|Iy(L4oIp!})_Q zZ}wlfoYKNk`|wbZR*CB+2cd0Do4#G+S+1#YsD)El&1Z%|BAjt`!_S2)TNKYc{m-!5 f_v_(jT(cfAPEEXE)c4^Y$T|j3S3j3^P6 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png deleted file mode 100644 index a16db853e94af78c0739d9b89b578e2a8021c856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd^}woLn02py|j?`fP(zopr08IHUH2?qr diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png deleted file mode 100644 index 0eff695d82911a73874d871f3a7b23b71dd8ab44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sl001;Ln02py?l}LfC5j;!{`N< zEvnsL$t-6rWU%$psDGg1|4DLDj`q~RzPqNgR|nl=*Rt6dx_ol~p-I||JQ4;82O1ce y*`SQyBHQ|!3>bf({j~je;Zla%ZD->HG+$+yO5M3zoXrBXjlt8^&t;ucLK6T4R5w)s diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png deleted file mode 100644 index 219b170fa67aa2ef8e0b11ebff90c1629ba7e97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py?l|AL4l*?;q8?- zrB_<6lUu~-<@8GYocm9fskyGHQx2!G9uAwU_k&&MlS%_4GaHYDLBatTBRp}nY76HL mkjg^D5fnx&0glSHJj>3%>1Jqp^q#PeS;bnL@oAJ;NJ=s*Cb_P#ZKbLh* G2~7YBfgFPX diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png deleted file mode 100644 index 66adffed632f0f6267afe6dc2f518adb6a83ca4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Qo!3HFq_#{<Lb diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png deleted file mode 100644 index 1d836f65a1fffea301e9cf36770b21b48b3b8132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SVmw_OLn02py|R(B!9jra;>r_8 z?%b*io|Yn;UGT9};ZTu}!9}%xc^%IgtXD4oJ@0X-F7B%4f|j+c$=0hv54CU#tNF|@ sNQ5wMgi8eI0r?xYZ}@0_Yf6jsMX$B_pXOhT0oudh>FVdQ&MBb@0DzD;x&QzG diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png deleted file mode 100644 index 5818666d4e64b93da73bc3d6dc2764bcb500359c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py|R(>fCCT9!M7)Q zv diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png deleted file mode 100644 index 564fb34b4308750b6922f320e9e114b080ecd538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SqC8z3Ln02py}XdO!9jra;!2L@ z<=I|~`ucZlc5hPnsi>TGwM)Is^N?0TPy5{UQpwgqqAoKG5)ZX-3ak0R7;B{1mWZ}( p*lxaUe)ue*Z}vC-G%ee~_}P|!&DqTD7lF1gc)I$ztaD0e0st(KG%NrB diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png deleted file mode 100644 index ae21b760fb1ebecac3389164251b0fa14f580f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SqC8z3Ln02py>gKAfB^?4dC zy{Qwe+I<(;Zrk3}qFy7o$Hqotreyxi(D>i`gF-*@tj&^T;Xws!Omj@dZ?l#4Y_?*} ivA^-x{8q}NM@;fbHo20HF^oW47(8A5T-G@yGywny6)bE3 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index 79e56f522b2837bd9f579b28f037ad5eafaaee8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1414 zcmV;11$p|3P)cSnqT^=WQ7*OFqW%ysfqGq3fLYCng$eebY1E zq0h)!qMt>^T{!1KLrdv5=!(bMwnfb7mMF4BgVA@!3k##^X|etG%o8VLfn)&kp1$5* zAHx|3EF9@?)w)=}!OothSF(h}LSVs2n}u~V8rR2gA&m?6GFm9LT5i!5ovh2$`aOLf zDMwpCv(UIN+s(qhT71rU;E=VYR%2(wIy9)U9BqNMU?EvKj~0!zxmxOREjkZzh+iq_n}2*GaEP(@ILD!5 zWBguqUH^M`clY;tz5a@wsI&tR0g7j89WEv$&WS`s3jmAj>+65+@9$R+4-crSDsl+t zoXD~ai^by4tE;Qe>-G9CHN@f2j4rXz#$jzQA^^+B$H$Mix3`1-5a+ZsO@p#5Q53}= z0G4QnFC7vyL_!;@%<@Jv>_k)mSUx>Hz18n=PE3d}%kYsC@*I)N0NNv^lI%s;wg9j! z%knLLgEIoQ+bysY63^&#(^_eOc(NT6QxTdoZI(#S<~ro`ne!tS(gH7T&zUX-UZRk7 zy|5!F77`FowzZg?X(M)KAw}<4SRP51e8qZ>m)V;$Z3?tS#CiaZ^hhEi?U_=yRh(%c zcGk9kwMUBGYjYt@pHyCSltyExNUHHFevMy@-l#r~QEjQ;(4?Q~r4samHh{FF{bU7StYxgeBAZQ`6E7N`VLYGS_ z;oj>aHT`D+d1$*FJhVBd!G+`uf(ywR1Q(Js2reXN5G)~C&xiARXWFDHmGF81Z6U>K z;#g%)oXa8RP+ENtZO$MZBP0)Pm&4Jv?h_KbHF>VdnKo?a-t;CVB(9^gh389`0#_~3 z>r7%ovdX{d8amFjk%uF>Vp~*9sp-GKg_vAO(?{&AZLdjA|Mdo3?oA8H>)1>mc|==# zB~EQxV&cD40$n%8&w#s-rjOWJ+ddiIQXYxR!^y#)tE&3)24CJ80l~J_MCXPu>Ml3AI+9BHcJ4%0r(Kw z@2dYHj4#nGKH!fqjRVUuh**Aw_CvMrs{b>Lm!YwzO4di>6N@*}Phg5Tw&B1fy2S@v zNaMh=r`Sx3>1SxA8q+hl==5I;NtblfC(XkF^KkH7ZKuDGcq0~@mC!ryi=K7WXgde? zOwz>rq{P&!A!(hIr~D!&pe-W#G7`?LQYh|`P7hzs(O!weT#2|xih3m$l64(P7wFd8 z$(YnkvI-Blh{l8EAha{kf+|%%mTX6hk;YCcRo{6`6g>|oKBz>Tb24JLyVyI4p!izS z!8wv9b%$RIiIZ@y?B&nGjRPyvaF~-xlb-U|=!P~^8?n&FNw@wIvQA!p;xDy1AK0dR zu~CaAl^btMM>A?9->NQ&|AnVmzdt!!WF>xutSl`;$84s2a_=ari#ecl- zo|KSyJXTD=1$2JI1Ql!6el7Y8-dCZ-i%gs^mMBu<;eLzP8a;YIXA&Hxi>7JtAFa#2 UvCQ(L;{X5v07*qoM6N<$g1g$KMgRZ+ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index e029f210b9a81ed4765d31e90b6e49dc8aa37bed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1537 zcmV+c2LAbpP)P*hY@RCILOyI+)4*Y%ioMH6eaT8-v42qXrI z0|4iGEk=d4Xm52^#H?WUz%bBygG}I|;L!cJM*+u%I9T*&&%x@0sx#0Qk0mTmeRX1h$MIxNMY&% zsz{Hz01C^N@8p~dFgXbIRub%{CUOKKzAQ3rfl0r3M&j^DZL~BnC0R+zNTfH*0>l>% z6xe!^4oO*vg0sbY%(i4Znw@-;nUbs&1zN~PIe02zy)Qcz&8uA?+OU=`?e2Zs5}uJN0M*6C#a{)YX?>^k&iO8v%U{pV&i+9YXUL@sAe1fQs10%V6ikBo z^7Qod_s{$xhgN}Tci-i5`3pX{;N4;1Au(Bm7x@)z#1I9LmdL~RrF4uC5rsHs>tE+w zbjvJ)LKv+{MYbuBrU=TBLj=6Xm=@t7;baF+QjNr0K02$09MPPz_Q^dZ5CLh8#Oov4 z0!TsP8|Jz<^->fRi@r;w5OrSCkw6L?N(J|#V;?nA78HxV{Q97DD=gWeOHxKs4U)p3 zSoD>;waz;geHn?ahed6Tq%7rduPgn zV$nDE$&ajtWS5-`4=n>hvFJNE&bxxNGnt2!k)T-g9UO0!_0BFb6cm%bLuC>qYeBK* zyN@VHxuTkNE#cFa@PaJz!! z*)p0eo;YjAyoc}Lcn`@)ql2XA#Le!l%y)3C`#|D`qk*LC#Leoh&{v9irz@IDt(4j|E-ey3YJCdAoj z17Q35`nvale)TKB+I=4%AAxk%w!OMGAf++t+Mb@Cemp-vW4j&J%V|A%#TR&cd&9%S z1Mctdf1tZ-6W>Id5JKwGXhvG!+}wOSKR^Gos;Zyq!S}5X*>+05G4|7V9G{hQ?!VjH z+iw8YkTX)YMrymYx~{`?w$U_yh$q-O1#m*zu<(hQDx}lJ70s)V5Io{ZN7v2rMwVC7 zhTm_2@1*&pTK&uP8_~o&lye*5+om^+1{h zqafFH?O0X{OUO1M^YAPb=F`bd6<0LB=s!LE=ilN39Gach?DYt$CL6UhXTc;$2zpT2dqqQrIZWT*_yH->_|IcgE|Y&S_AJ4lX{3 zlIkT6RWeyS^JtZ1q^3@yK=Cm?J&*-y*C;dpYgTSF&bztX%>V7a(kL+ra#JUT-|=or zs-McUNbE?uO3e#!@v#wf-Fu%ryG^`~69lNs`%MmnTRbrM$471B$+eE{K4hK$mCQ9h-Z$E`tJc<=E)8`p?U8s&`700000NkvXXu0mjfb2aWW diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png deleted file mode 100644 index 897a1c11a06923f0ee630a3ec44b40118c1fa4d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%PDdAc};Se)*?;+-wxD8l++z18QgepiI9o*=R4AA9|r|3}>uTm;M6YILUxmVi!uBjgaN)~;(wEWpmNk!cW z(d%Z<{E>P~YK!lT=8FgRsYuTJwQ$0$u+I~@?rdLb^6_f+5jpHV#tRQqPS1ijb30F2_W#pYUFO#_XV=?h zOHP?#2^DqDa diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png deleted file mode 100644 index 0c89f71407e8d51f92ff6a10b1ae40ec902aa04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%P{dAc};Se%}E<)W9gqsXz3_j5LNPFu1pO1DK} z+N#=yeg8w_ofMzAMJao1SUGXl-8U7Joy@GYEX@zknfd?wSxaLcYqyHhr&soQ-EO{p zw!~UfNcQJK)l+|B(yvWaZRmKvsC8=g<+E=!6%t;!XnxPxBUZuOVKlwt*0FipR-Y02 zmCh$xWIQ?dubRMH%k4r1TjlOEFztJ(`Lu4f+1J+&0<|T}CPeP?x_?Pcpm5>hNwa5M zzkQR1sjpY$)<2WmGuJ)*zvffcmaNUK`~10Vr~dw8eVc_z%*|+OqxE^sCGQ0OTrOO6 z<>J@Zf0Ym33CMeTp!xW+<7NU=B(%1ExnpuV-^$?oQTEn-hjMN&=46?A$U{|X$JUzr zjr;q)=$3Bvc`c`@@Ze;4?7{TSRWGgUnXHd<-`o)9JVUa&78r!8C9V-ADTyViR>?)F zK#IZ0z|c_Fz+BhBFvQT<%Fw{d$P~!6GB7Z{-*6d4LvDUbW?Cg~4NgrK`9KYlARB`7 r(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6)||a`njxgN@xNAF&x-_ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png deleted file mode 100644 index d8662e3f0fdae62cdee68c184a30fa9e421dc338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3Cn7d>4ZLn02pop#z!+EApeUwz>goe2TrwSq2J zirU3kvaXhOUTIG}?do{Paly7dd_m%&JI?q_-onB2%KO8{j^-Q>wzNlYp6R5&dH;Rm z|KbvtPbZZ7*R_9QUBqkhp({MdL+G`PeiKVkcC&4Y!{nAd6Z!S-oqj3U!mzMkIqyf? zf)_G(nEp@p{`aZ-I!9g5h7aq1927O&FPT&GvG@NuQA5$TGve!iOqW^IxiY{>!{pzO z!{3V<)Sk6$zkBfg;!caFvF0E2Z#WAV9{aHQL)vPusEmizHw=GVH2J}B^#kKc_ZNxM zzDF#RGe0;TaIo&I-m~b0*sP8To$2@Yde+QKc8kg_`XHU5q@;HFk@ug+O{X5aZ~nk~ zjknIKwfM~0Z^b864VUMM@zwGAdYt)v<(Nz4IlImB@8#qJ%zn(A@Z29bd}4MpKn$sTM506307QmPCTFYr(@#O zpZ-(V%YE!?30QE(DXivDMdI0PFM+AKOT1>hnX-6tX;O6(d#2d)iSBZ_kN7m7WzTRr zzEA`h)2bz|5hW>!C8<`)MX5lF!N|bSP}jgh*T6i)(9Fuf$jaCl$hI;t2>JhQGm3`X z{FKbJN)!#IR;K1a1kqq?mJtlpAPKS|I6tkVJh3R1!7(L2DOJHUH!(dmC^a#qvhZZ8 Q4Nwt-r>mdKI;Vst0K3d3fB*mh diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png deleted file mode 100644 index ed03f620f8ef9e969d0471ab76329038e25c9f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 737 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3CnFFjoxLn02py%z6(IY8q0$M=`{k_{&Q=;t<2 zt8!*r>&D`|W2$+>pS=eAb}M##+^cbdA4dCLPr0$oL~Mm8Bn#4$+9@L$(#*Pp%fW0&@t4F~+Q4$6OeIrG`|nG22@uVa-C zJ=H0n)NABBE9V2ZrDh$}Ob?>#U7^{{%b z^;_|*S@)*|RLscvyw85$_Y2}8p?L-UY)vO;|NFUQJ(sNEA?BESpVrme#d7mboB7l} z-Tl+e|M{(6F|!lpnSU$jtXi?CXvKcs<;$n_y<4FKOaZDTt`Q|Ei6yC4$wjF^iowXh z&`{UFLf61N#L&#jz{twj7|6CVFbMhoZ8M67-29Zxv`Q2WrdForKm^fXYnBlV)F276 tAviy+q&%@GmBBG3KPgqgGdD3kH7GSPrLyp3str&PgQu&X%Q~loCIB{EJ2wCT diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png deleted file mode 100644 index d97c342d53690e6d286efbe5f37562747a49b96d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1774 zcmVU8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZyw(kRs!-6#o(LP%Wr3O<1=S3ZFo9z$bj(u70=3}tI#6DWj&F;Ob99q4>t z7t_JEGi|0s7bcyiT{LI@zd7fguOSTo_Tn%A3;+W_$om&@e+U59{C2xK>{t*000Isi zc-XLE_dt-QB?k*OY(G1$>uu7@#B2;ALf{;yd>Fer3 zxz>Q~gZLw#9*+Wwy1biLp*!&n>VXAqU0c|%HDJZ1jZ6!oDKES7+VWmrg9gjr1HUt9 z$&h=(yP22-u6mx^E9uZ+0pKCX;bJ-&1r%+uT+pDpXT$;nS`cq%Mnv${vs}4kKnFnO zP;ojL1*vOGZSwsAS`q0H5q$MLS1wr~GAT|cBOrBcX}?{*UqB~HsT)hjem%$S zQCYe=d4(eMUA?{!rJtE>6>2uC>s{nMUVQiovq!7(tSuZUVsBCpu612n+{HyeG&{C3 zg%Qx;Ym2+tg`4}D-D9)knmeH3*ac5hx88#8rcKL0fWiC005AajcYxmm08)I=nXx}} QjQ{`u07*qoM6N<$g6k0wDF6Tf diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png deleted file mode 100644 index 33ad8d4b891b14d934e470b2222571ea859c77a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1945 zcmV;K2WI$*P)U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ<`$>NYxmjX{xd; z@m&{rFo*<6ia-&%?9S}Yj1NoMU6_?!qi=gB^D?>lzI)G{bI*)0`G1E*K~NAB1j^1w z0>tKJZeH2PwwY!w0t6BY3JN+p33SuQLYI(HkdcX#K*!j*7|BwgVB_Kabv%L#JBpC9 z;EQnJ<+1&B?8Szh`#X@?^XlV2b_Y-K5FTsACcc7-srF!J%cFRa5f;nX88so}^!n$z zoaNXjzHYk7GONT$qz7ti^`5C0{0Fct&sMz04AGszwAz7*v3&RHh^`S091pfpv3(b5 z_*4F8KwG3jHT04 zL)Y{;8%;+;M^cIuK77Jo4_dVE!}GH&5hG!l3Z``(DA*|D!7J6TwaW^Q$!{BPvBY1f zfE_QM@bQ{@gcj@j`1~x3tfQh^)q%AjL($PLWE_*Djkj1Kg2074d~6f{Nje^K7u;94 zsJv3$@rsafhDHP55kG-dHIPmFAA9=;s{MWcddV( zJFI2mtpvLr*Csj|Q8r$mAN(8x6+<_AKkZ*4LX3DO{@?b4Jsi2Lc%zUffeHejlb9+rq0PNT9OD z;u|vq-{=}^jSayj%5h_}ZkgGdzKgPOi{A&T+VkZWUN=qCxUcB??b4_oXFbpmY{r8l zAAy7`+*;!URqf8e1DIx-VoXo49%u+2!egDT);TPBON$juHQN2v;6f%oLvg2T=HjTH zV68;SR?~`g%UoVKaQk-bqv^ppmWX8HlM0b+kmj2@1ok$Lvua%nR#_xaD8_}Gdqhyt zw&OGA*(k-%DiJgiJLg#o1Tr!L6T|w0FfHFCBm_osWr=J^mg5%t6~${t-Jw00000NkvXXu0mjfxs7-r diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png deleted file mode 100644 index 3edbd740858acce452a65675b594d87cd85c4cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1504 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8nflaTYtD^x(vzwcwbv89=@ zo12R>knQRQ)9aa6T#}fVoC>oy6KF3~uNhvwR?bDKi6!|(A^G_^uoMuGkzbNuoRMFk z;2dnK;G3A7nFr#7q6gwzm(-%nveXo}qWoM1aQIqfVzJ-F(A>z`+0Dqw5#euVHw$9} zR|{85phuLTdQ->=Gku_A^g)RODY3wWfGH5fgeQF<2cCIS^ME;~2$(fE*e!Y)7?=b+ zT^vIyZoLURops1T#P^YM)`G6?uC=+kf7_B4{*@J9^x)duU6<$Tu^imLQtVB+#DuWI zKp&sr#e2ikRF+h_7hGg6C3|* z?e*8ufgcND|MEKid{9C;-~RZ9Bc^sP~EP3ND_zG5Dxwk6j&$wE~4;Qc*`ssan{ zzn`9=dZ&RsirvSfCP;`whUHEmQ}f9$MSB`#rfaa*Eq?H{s4_-JY+eJUGP9%1oq zJCJw4f2WB2si`MZ$~H#$*nP`3S@opI(pSE?i0N0@>$2Vb7oL|#u)gB_!dQ1$La5q` zDeOVQ4#QJ|EiB?JGJhRxA5Ld^&RpYp@TAicHpRs4(vR3C88QC9{5(weR))#4lPN-s z1=7=NbKU$Nr0Hgbao(RTxaH2IZ#(aDrMoH3_0umA{h;I6BI6;^&o0#XM(`ImzsjuT zTnrQ3)U=jJbp=fS?83{ F1OTcH9Pt1E diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png deleted file mode 100644 index 90db01b5bcf1246d6a94e83930cac63c93a6cf83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1540 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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png deleted file mode 100644 index 2abc45809c62513224e9d695542cb8dd8e8087b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezt=sPZ!6KjC*gdALL|E;9+*q=6m<7 zlueVX_4IZHnJ0qE#_rG0T(kiyWMEjjhCTn?qu5pu`=4q}27?c$C=-xvpo(CHaDZeV Zn6Yoz!5==w*?y}vd$@?2>|OKBsl;8 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png deleted file mode 100644 index bb6aef1d069a14a7fc1cea9780c919c61679e4fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtXipc%kc@k8uWjUIP~c#3xZ62X z=G4p^oaPsfxfS0Jish)R3f(&WG9yqa14Evg(y_dGGlfCy2iXqR3?>_SEs{VyhV?DH iJ0OaDc|iOR772{!kNsXaOPT8&i0|p@=d#Wzp$Py$I4IEo diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png deleted file mode 100644 index 6f747c8f065940a8844587c682fb3c9443ad1ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmV;^0WAKBP)SO)@i{}u0qYYqHziBfu2L*;{L?D;GxhmUqDjP ziMkTn=nm+BxmDP>FsP2fGnnz3AAnfGAiD%ptMDlguG*u-2|uL;kN%Xenfoz6Wm9neQuJ_f08buH`WL4SA>8mzG9{4uwy+$BT^9a|eO3@D0j4;gS>^u3i8D002ov JPDHLkV1mHE(I@}_ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png deleted file mode 100644 index 682b2fdec4cdcffe042a0eaba5574fcb553c6fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 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 AsQ>@~ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png deleted file mode 100644 index 3481c982862cd524654e200187445a774446567f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1833 zcmbVNX;2eq7~YUb1P`!K89?kB6p2E1Hz5g$1PR%s1`Ngo6*2bY*3mT(eCwGjDt30z@ADk&)ul!ycbSpXq2nas~26ecnniH=emg*g*#j@Uj16nB_N zi=DC%Hqg(A)tr+Y(ebG%LzlQPJO*&###LsqLlu9w;l%7DLh{2@p8E^+tOq!T_lW zAkrjQDugA;2orvi3RR;rF{(mPu~6K{@h+@VEmI|-Ny!?GN`oM%Mu|v7GKol|K~;>b z*7RYuHV1{-On9GN3uBkTDuptM`n_1Wio`LBAhQXgsILR`g#<-73JE)?GKxVRX0q7) zdw+ReMT_F3WiD>kkc1U{nP0i(9rjT~DpaX7!gS@^xK)~D5v)#TJVPYB*I4ua$r;2r z1NocdKh4s2#B`uveAD{O=FRZnHfCZ-W;Dvr_J%MMH(iS=vz?dnp7r*Q|0OM8=!_4l zs;ZL3zhAiUWdL6Q-YyURf{oFuq)uPWZD82qEi67Cysi1BvmZvMgw)Irq>e&MQ~pM`Lu=nbBxwasjL&Tsbadl%z!58�PUR2s z;--Gn6L-Y44d%`7eX(hACTrQSaf!p)CX^44OWKiL4CvZ6umi8K5;zZ2#*ykw_khy5-2;-x4w&2R z09{9x#xx})BvjJ}TI2cLeM%Juon}o2C0ni%oPP$#W_j{v7Fn&)Y4-+12-XAz2ixMp zdk-dG3-j7Z^7|(bZX9v*jq7?`Wn~?YeZGM=J3B9(I(X1G#M{BXSmw#wPX}s^Mx$a& zd* zptYy_ughebWX6!_=*!|<*LPvVhwlqoZlfEYtjvv>6wjfX3p_g?JMFdJ!co__^o#We zw=b#O^i`T}%SWdnY zptrVi4hONM1>8N+Q_^*Hw7fWo0bv~uaDGTec^ju?7ft7iw};GWFmT;t zmqkFIFYh$^o^;LBh6ZkJNGZ)@ubCQlP9ArdMLX{p^!g2)d{G45wZD$82#Akx7wY?a zz21Agb)mdb(PM7iyy?!^d2(dCvbWL2&n$1d$2oqkM7b5PX3wkWY%R=ajlH#S8mQ3! ge6yDA3jkPwzzE(HQ|OAY)&8HCR-J`5r{^yG7imhbuK)l5 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png deleted file mode 100644 index 4ea7afa00e2bfe057472ed5a196080fc80ad7383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png deleted file mode 100644 index 986ab0b9746301f2dd9401829da09e00995621b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png deleted file mode 100644 index 0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png deleted file mode 100644 index 516f5c7399c853d112a31d1e17c8c7f17180f9bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QpO1)z4*}Q$iB}R!lH3 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png deleted file mode 100644 index 4ea7afa00e2bfe057472ed5a196080fc80ad7383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png deleted file mode 100644 index 5654cd69429fd0a3502a05b5f827bffab89cc7e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png deleted file mode 100644 index 5654cd69429fd0a3502a05b5f827bffab89cc7e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index f6fd30dcdc9c39c836e509486854f9da03486892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=k!3HF){@Qy1DVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png deleted file mode 100644 index 4d3d208578c61662986fdc16bd15c69759b48d6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmV;L17-Y)P)!ytdud6iMT7O&4bD*mP3eKws)UN7D2k#e z%DbYt@4NEYnkjlINEK7=*RV3zwml#Px9r!q%}Y$QM*NqHEZ-wscn^ zf4p9=Kg#ZZAKY%YZvc!aCbL}F6eGxtBSzy=smEUmc6C{?q1YCQrid~5o$!73+BeU$Ee{DI^Yo4#-o87 zao*xiE9Z<+s}ttlWw19HGlEA1nW09+*~|#}a;CkeJh%bU1g9CP5h0^O2}4Hs%y=Lc z5q!OY8j*^uk~rBBK?ljmh#jL84Ev;rDo>_H#K|6e%Mo=CgLzw$rI$Y4Z-kUy6U47Z zMI2w^tmuV~pH%tJq!^(yWY-hbFl2;G2g)+VPqud2Sicc+jL>MvBTKK;HbN#jlrS<8 zl+;FqdPULzJ~Kh_!?j8>!xs^*nQAm$#290~ue;BBnY1w&wMw4#m(pwEDZd_oY1{Ux z>$>N)H(eWD*FCpw`-IsDKF28-6~1bz!JGs-W6Z&R1n>#KR{&q8us99Q}8ID#(NJr3oa@N-D4Rc$qhA--bT2} z_Wpf@Z`4749}#V+fwWJz^oyZKO1~J&exY-1*Kg?D$hu!fixvAiNfpmG;mo&f5BSEA wlE;@gYed_N;JFm#Y)Zw{1W}kQU9GkF3xsHEK4Myn7XSbN07*qoM6N<$g18=|djJ3c diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png deleted file mode 100644 index 924a99d173082ba58ca7527822359f228bb14dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmV+=1ls$FP)#d)-&;4-At916hopygyW1WQa|lkCWZ4-q&QLYwjy>%Jd>?UvK6*fy zdt!`Ep~K-gOUxeEG;B7TCA&L&Y`5FR`f3tF5S^VH!lJsKJqkfK0&PN7nPcRS?`4Ev z7V~vPKouy~L@5%v*=&-(hy0cgM*ETwjWz&8F3NVhH7#V4$3+kVgi2lPw-adOTXm|2 z;f`P0rx+seIw-H@dwPaOx@-q(hY$i2BS4u1XM~+%LI5%mN(D;0XOsl63U@~43e6EU z5mrW96C~;L2O}H%p$jmGc5)7LM&^oyAacV=14{s_wp`K^YIpyDFEM02mXk3OSEw-p zdORS~SGTvf|Cjl{`o#71_3u-2KzcK(ZU7La5JAil5&>9olp#5yVJhG_L?OnQ2x7(v zIfg2+Q2z$cZ7gkJK~)>%8)`3CJSNBlBGKwWz;6QnLDPCN+(q9 zAJ*09wM4d_hZLYxWa z2;mvCbu@F-B1H21)loz{?U-+?@nqk8kw`Vm31QkJFg_V%{OMfZr8mlq(-<|uJGVoHpVClAlh&-bsduQ(hI zi(GsU`1tt1hf_X{d`3<68b|S{tXYwd2YXzXl8Izg4y^21 zp<@H92ON{kB3P1HizBE$;EP~xzks74y{^`3Ur7(FmPO0@t2+WXW`VN|Gc9|AJ43ds z=_5ZJGT6$YN8bIa6HYZ^jFIn`&>W#9La9l$?6@3`ET&WsUkjFK0@?|yO)(6`*1l_s~_L1z$~& z@jZM)qqe)$B+Pe}79nG2sji9uR0#8Z){~%#a(p4yPG;@1CipK8G=YCTO^$u*mj`Me f=rGa5Ym5<}3Pv>t$oVA_00000NkvXXu0mjf+qu}} diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png deleted file mode 100644 index 310c368e7a68479307866c479d1e4eefcf5db311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`h^LEVh{nXLlN`Ak3Qu?vqkba5WyT9CKZ;N%wBhP~?hKK2LK3q{Q@b8ror6q0>Kp=4vJYD@<);T3K0RYm>I5PkM diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png deleted file mode 100644 index 70cb7fc7e0bcfb850d4b365f1bccb5b743913e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`fTxRNh{nXLlN`Ak40u@7AASF0zb~yy)74d)-}Q|XM+&=H%L1l~ z70X`DZ5Q8J;=>T6aJiv_zhUdQx9rw$B!4Wi^!v;8!uD-LM?h!CZ3$B@rZO?tz^Iy& QK(iSCDOJO>Ym5d24oA2hD9A9kkZ#C-ocYxQulY$%dG^s1`jD zWrBMf{hI5z?Ps6d&cAMwxpu9tAQSLC;sV+l?CI!atlqGv_K~X}S&7D6#irA$G%zcr zGa^}SvXODrvrsWB#ZkB-c}-Y}>Q0!#L#9IQCX$ZI#7DnF9fJ8(R=8iR{NJvIR3GfdBS0fGXvSYugM@B@Fy~s_l`Jy)|ccqHxmVzApHz{x4N{y z#Xj0V$LH=@zsWY)$4Z)6--edG^VYGh&b$}$F3XeLt5=Uu0`p37@FaypB&t$KuAm9R zq*|yt7WOdr(m%g{dU1bs0-qy(nh~3JDc<<|K^(;cR4G!8UrKd|p;N zi5zZftW#Kk#vM}fdS+hLQ#;Dq?H?_`8P1nhqmR=j>Au${MMR)hh&5HCA z?cjx6pHV1ZFFx`ra1m|YMALE$u3RAxZp(6Eus@DJwzn!G7Cw2Mm%K&AN5Ia`DuuPd r`dvHM#yxB2nYDo;0!e2cs)*3P7gB8$K+RT%00000NkvXXu0mjfr&_ZI diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png deleted file mode 100644 index 1c269205e874bc6addc308efe5be4fb7c5da0edc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmV;G18V$CDOJO>Ym5d24oA2hD9A9kkZ#C-ocYxQulY$%dG^s1`jD zWrBMf{hI5z?Ps6d&cAMwxpu9tAQSLC;sV+l?CI!atlqGv_K~X}S&7D6#irA$G%zcr zGa^}SvXODrvrsWB#ZkB-c}-Y}>Q0!#L#9IQCX$ZI#7DnF9fJ8(R=8iR{NJvIR3GfdBS0fGXvSYugM@B@Fy~s_l`Jy)|ccqHxmVzApHz{x4N{y z#Xj0V$LH=@zsWY)$4Z)6--edG^VYGh&b$}$F3XeLt5=Uu0`p37@FaypB&t$KuAm9R zq*|yt7WOdr(m%g{dU1bs0-qy(nh~3JDc<<|K^(;cR4G!8UrKd|p;N zi5zZftW#Kk#vM}fdS+hLQ#;Dq?H?_`8P1nhqmR=j>Au${MMR)hh&5HCA z?cjx6pHV1ZFFx`ra1m|YMALE$u3RAxZp(6Eus@DJwzn!G7Cw2Mm%K&AN5Ia`DuuPd r`dvHM#yxB2nYDo;0!e2cs)*3P7gB8$K+RT%00000NkvXXu0mjfr&_ZI diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png deleted file mode 100644 index 40d0d1645cbf05e30bf092ace45403281da7f318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`oTrOph{nXLlMZq=7znVWA2oV&$ZSjW?F|h7ziq5jS#e}ezd(V) z{M(JTeF@SBrcbxn{QE=WZYK^04VRD=846z*9&b9ovtVvpnl(eT%D#{N!SzC3^S3#* f<|u1MCr7h0-;i__`(soEw28sf)z4*}Q$iB}%FaDT diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png deleted file mode 100644 index 40d0d1645cbf05e30bf092ace45403281da7f318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`oTrOph{nXLlMZq=7znVWA2oV&$ZSjW?F|h7ziq5jS#e}ezd(V) z{M(JTeF@SBrcbxn{QE=WZYK^04VRD=846z*9&b9ovtVvpnl(eT%D#{N!SzC3^S3#* f<|u1MCr7h0-;i__`(soEw28sf)z4*}Q$iB}%FaDT diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png deleted file mode 100644 index c8358e9cefce502030416e05dc8faff139b886b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmV++2;TRJP)YIdx5%v}IY-E={))x>B}kD^;1aO=v<01PBB|;(|LQ1lm?k zLWq;Nn-CY=ae0(~!^>I`t6s zs-B%JpquWw-vVT&b%#DKYKZiAR|9AYVtSC>+D1~E4^t2*_YE}4C7t2scS_b&i9ji7 zBYSvMwdlT0Go+O!I1;=rq$n|BisnJx=53v0;@hqm(7l)*=4rJMo!clNrP~Z@m{E-} z^JZ{ZNHx@{flX?mQSo``X|C|5u79fpM_&?X60Kt|A5rbxJ7+XZpRQ<_6xsZ!_#wo! zj#h1_U5!M-Io2>ob>UEYg+LRijsxnVI$Sub8=TigMynU~iXTIjns`*ZXjCM8l?je< z^3e1OfW}cB&*(9#LY#4(p+|S(CFYo)RH;RK=~N=zD5YZ@e|b@)#etF>)Z-yez@UzD zxn@bF&zGN~8oIPk4dfy-rEX5Ww8$EZ0F70%U;9F1W%-Z($&Ga-Maup1vncKQ7_DKl zn9!@7d$FjFqs1PKM)U|Dr6$Db)oTnV%fNxx{Okxr+DM%Qs^$R=K0p5VBBLXP|Go*uWAqrP!s#9EjG3Y5H)_%&0w$xIP8)2<gS?toB)4w_5VP~5v52jeNf?a@l%z&Ft# z7nB8|dUgD~fFBhAa+9}!Fnz66uJJUZMq$&Z-=x+YQJfJpw%hO;S zbE}u#&MHNeP>Upl#AP)>l0hdeKfNO4(#tQm-Akeu&02@RbFR7XY>6_k1%f(YAT(#fsAW zCKBlg4QBOIpq?mn>zJh1X=9x9hp4F}kQ(@481j?!sz3o)0BA?xOCB;{@vwLHR_qA* zZA`n>5_V~?==zrnj46C`9p$WNjB&zGc+-W7;QUT(*KSn_p>ds2!NyfVppL*7{NFHR zx3J%}=U0sLd(^D`)P?PxcXaJb1;-WXet3d^dmIcA@AOk%p(p(THF8j!=km|#V)bYd zpicX$PljfTc@O)})|@FD=Z~mC2i2imPj;N6y7k2(V~h2N*p=p#-z6}HxcB*hYkSJV z`IFSdb9yY-P}dA6b@>ZL?=z9&3we?^d^OD4aqs1Mx13&f#Qiy{cDn?wohTPSPjL-WpW1m}O&Ju5YPHyotYlm=9`GcY zrwYvY8;-f&ZSM33oCpsge2-Ip%afm3V!sl6q6gM{kN3J3%|Xrhwg)`uVUIiGY!FzE zIO3Qa-0aQX;)a}NjB&uQ|K;9KmvHqg(MeCoc*sw<&DEj$2|GyBp7MmJgBi=!jyvfZ z$6Ymtf^mwAKHp@Hd-~&L-Nsi~>l_hPjymE9wjDU*%(E+7 za!uA`P2O+vKSpg~;?JJlUH||9C3HntbYx+4WjbSWWnpw>05UK!F)c7SEiyAyF*Z6g zGdeOeEigAaFfi_TCsF_a03~!qSaf7zbY(hiZ)9m^c>ppnF)=MLI4v?WR53O>Gc!6e zGc7PTIxsMwC7)_* diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png deleted file mode 100644 index f62f74bb38e8818fd970b7ec1f7862e543cc9d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1811 zcmV+u2kiKXP)Q(x@RlU0R z*6*F+o^#JDHf2*b#j2Gf_PMBSbuGRn) zDJUkGcinCw!4`)d@_D~EMJnC5dvGXBz z^GjW6Gg4BPB{MBwxqQWN<0fP#?6J=Sj@WNJ!AH@8Kl`>9L$xnJF(@mqT0WPnt1qF1 z=Fx+;deGw@bGK5OQ+L*P{Upq+6DX1yGQbK>T~%EkI?XGa@}$o>ppa%>^8?Sie*2l7 zfHK3%D>%7|N++0Avr7*8vd@}G^Jo0fcfyUHfnsLZ&jU?a6Rn7I58e-AIzUHA66jy!AvGyBgcAIA_8&ya%2-o5w@+x^Frq z7x5uqjDu?ciVPZ-34&-=b^T>U$i3owu8N|PCmm@W9a)>Z@0e@OLVt>;Q1iTBsK`Y- zJ#Dm0pva)1q@Sv}wFUZZ<(6Yki*muoJ=kjDtmVDYq#tH=k$<|@5vTpkf+%-~CzQJb zDj5=FGBxvks&SW*YJTnCqA2*7ySf013>jGQpITpe;Jn|eigLRhZQhTXHIx~a$pm$C z{nZbIsz13R7nL1tHd-@KF*$Um(og?cC1;!x<)VYeI|B_UB@HdgHw5UWlj@?}cDp+O zMal|-j9w2i9i`?Cb8^v;J)JZZ3@FG_LfsGv{MVdZZorO4w{8Y134%<%0TH$=m)%OW z_@u(SziK>nET6ihG`KOcU?%zJh~m2+ycN)r5;qQq+h%%Xy;f)Ejn0a3UnsuS^+vZqWP#0th z#x}@k!|oI0qU+rNRV>J4GUFR$v|a9z%jMoM-5IE6CMAy{ll?bZ%p5f-7cDwzt|L%b z^86*Y-fp1pM3X+OAj(~JqWJ*PYCpbZCY5MgZSAj)V(>vz$zUg(ZywPKsOqx1Or~s4 ztCPVxWShrQgx&N<^IZW2u9-7hOofKj5BzxpoW= zdO}GqH|+&2+j}j6LUh@cv}2FCzaLvtWZ?^TwHb8;v&L-C`+P^-e$fT!yBz5Da{oL7hj@h;h3%R$P7X_J;dmT2? z8&V8*_<~22M7c%3b3D}BjlNwczv7fZds1ebGU8;svesTmESU0X4=BlHYF_eOt8iaY zL0I~yq8N;M$m4dU73%)xM=srNe&@#dxWo1;CZw8+{^f0pouFbc zV#*`lZz%0)HGlQf<_c&{Ktx7;z}?CzodgvZopY&OUp7)Q;eaFVO?})iuy4L9j zyLs2K^qSz1EvYP7>Ws{|~_-QddT;IiL%she&}m+lY?b~t3u zik_CPT+O0+6?K`iA!CLOr{nnY$OW(ay)*42s|TRe$lC9I+YPJ$b-IG8H~q!myML>= zroa>ruDyrb zV`&jHgSNQCgmI$=lu=hRYuXKOo3_xM&-4jsmA;l<3@^Ph&(-?zXM#=Hludb0$^QZH zs3&Vcm*{c;001R)MObuXVRU6WV{&C-bY%cCFflPLFgPtTGgL7)Ix{mmGBYhOH##sd z?sz9s0000bbVXQnWMOn=I&E)cX=Zr$HaasiIx;gYFgH3dFrOu# z?f?J)8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?002ovPDHLkV1l}_ BPJaLZ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png deleted file mode 100644 index eb28ff9a5516c15667fa8fafbc22d608d1f77a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?o1QL?ArY-_Z*Jr|WFXM+FkX}IYI~tj_}8!bFJ^a4j((ibs-&WN zGIsXEx)Wtn`lnsEAmpSFI79ccn9RKAsn<`<tk;t}o>yjV{qp%WbL{dki&M)*dw`x~@O1TaS?83{1OTcY Bcf0@q diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png deleted file mode 100644 index d281adb553af892f758407b846bf31810b9d776b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?Tb?eCArY-_Z*Jr|WFXM+FkX}IYP%rckLbO*zpbz{y7bYSIrPClD)2Hc3qcaC*%7oYhKR%+5DyWbJ~oU4#{OKNlluqE0VJm zR?Ud&kaA;Q)O4{aB-unUR3g{I@EB82%f_aZWF5r`AFqi`v@HN~5*v&Qo>cRA$gv99 zHaapFv&*%1#4~?bwda`9)~}vNKHF@K`t|cGZ}Xb{RR4x!PC{xWt~$(69DLj BcXj{( diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png deleted file mode 100644 index b2985860907ac324b509b76731e8ef9e01bcef39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?E1oWnArY-_Z#r@{8;G<#%>2r*^uo7)-)HXL@_O1Ny%Iq#{YfeF z(mvLmIJH1t&`=}DOJmBWhqv04yB582t6X;JXNKdwfEg3JZl{PztUeIIdQ8h8YDr!LqoiBzejNy&kDcJs%rP689)vmGI{X_;^jtl6gm^<0^v)GdFRa+YOJx z7F>vKtz@b&Rr+MtRJ_Cdn)*bIu9V&{pI@`*?C`z(Yf|Vzp#K;=UHx3vIVCg!08ssU A5dZ)H diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png deleted file mode 100644 index 4215396dd4e51fea9239323d313b72fde0ba86d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?E1oWnArY-_Z#r@{8;G<#%>2r*^ujlV;{V25Ur(E)S0c!zKPhEi z+Q+&RrxwTy8fpZ2X-wJl@K&30*P>T$mCG*u%y7IHFk@oZ?G!PI)dwP2k7*f%?N0KT z=P~Pe`QZt37-AUDv?qm~sFi(Y>bsQr3FCw4S+92))lbOG-Y30G>`_~0 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png deleted file mode 100644 index a280eabf59b5eb69fa2a84280402b63d5e1bb8f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9q_DjO#pI977^n-`=$MKI|ZI{A2#4tV=npb9cQAXy4X!_bwM}{Q4K( z1sl8bnxc=22fURRmTQmkS`l-5N%{4LzmAq3{WkJ?oSyR(lyW*m>cW(jDj1r7drC_% z+Ahf4U7%?EfVHA#U$%eE)HUhV{* zGqMRv58QeS1t+_UJh{!Nwtjop`q`x&KXzE!mvvsrOU)9V|3+xFYu0w7ttSN+pN66C zV4oMA@AG&3wK%+`$wcPZ<#Ux2T-c9-*heq_yZUm|{V%D1UlxhJm0zYfUETgVr;hpA zt-Fj|Jsx=O$lYh^6WL+vBibSA6WURD#!g`Ij9SHG25Jg!2FnzxlYN}N9h%V=a_mM! z$e|leQ;yweap>IrEpmd};fhV2Zrn5uN|m^)*v*dyQIi{G2ej@g`j zy#1roz10ezmNeBYwbLI^0W9{MT&2dcxOa)`zb@?O?Gu2 z*S413TzCHUdV}>`f)DaiKP_4HkL&Y-WAl>F%y}d1AGY65et#XKh5dqWo7Y|}14bu< Mr>mdKI;Vst0N8Ej(f|Me diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png deleted file mode 100644 index f8d619b4d47ab5b104d6b1042c27fb16a3beca47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523 zcmV+m0`&cfP)C3<00004b3#c}2nYxW zdK`GU$CA-E+tg1FUj3CV1Ez}l7r{NB_YWZ zgb+-Kh;2qAgunr)owSNT9jE|#(}iQ{0=K~F)j_f4%AIwfW*LI4SCjSena$3zhl@?`-N)f>fC&00iU>|7tSL}YGdG832Z z7Ry93w=$W@5~IozqskJa$`YfBUCf~8@-tLEe(Yg7ZJ&$d5^vAJVlkbz&)H#>=1rCU z=lI*@D9QucAy4<)W_$YF0~q6}sI5vC!>ie*fX@E1>5KTAKqegRE>ywO`Fw(I}^ N002ovPDHLkV1grX;W+>R diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png deleted file mode 100644 index 955a2f34061ae8ac853050da355f89409fa0a784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0WbcEP)C3<00004b3#c}2nYxW zd0`Pl=$b2!s#>@tS z$Y#JV#)+K6SU+tW#+_RkXYzpRi_e9eTN!5>F{(z4su81V#Hi{OLkTB`etUYuM1<4( zFh4)_STHCiBAh-(+2ze7j|0M$*V@)G5^^0JhFHh^fzV_7Tf?-4Si|T*tYCB@#xY$W zMloF>#xN!zMlhxzoiQdMoiL^$+87%UEsQNlYm7|@05m?}iO1-}bYl(D3Ue3c7gw}A zD?zp;CtICi-;5NDtN#ybjCs$)&yQmArGt<$4!&l7(HXO5p7J23`oDJvMC3<00004b3#c}2nYxW zdPRE!~6H3V|7LaeL+kwzxO}{DvWjdA^uWhB*Ox4MVbeVt$Spwgkx< z!VkuXjKgSuY)h6Hw=%|LL;AyKLdLC(F?ASO9Y$7%k=0>jHH%rr7Kwb5&>UvDaCo}j z=j+357qeVAJX{{~a_138(!I8ROa__X7ee%7enXtUzOE0mAw(ah0z?m{B1Ao=21G5U zCPW=Z0YnW(5u`pwA*3EgF{C<11Ed;86J&FYMhHOp8-||_vny?o%`ne52fWVraQiWC zKdv-wupMF9(yd;3%<<_PN8|TOh%C!a80|#$F{54SO;q)d{~Z)(nS?QFWpYf|szS`q zFpt2hCCEz5&mZk`@i_(t4MLWruXxh=CcXUn1{k8P{&E{)e*gdg07*qoM6N<$f@(ay AcmMzZ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png deleted file mode 100644 index 673e3bf10d60cc54b6dfef2fcda24575073adf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgJWBc+iXw=G=Ra=)z4*}Q$iB}l;b6k diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png deleted file mode 100644 index d57df98b501944b4ba63623766c396b5bccc29ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg}h~fd(*my85}Sb4q9e0H>EG$N&HU diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png deleted file mode 100644 index aadc6f87b21d7d5139f3bfe860f4c289f75d241f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&XV^0^y5RRG22KRnVX>4qKXwM^^Uwi5RN2-aD!@msM(PItf+&Xuw+O+F;e0P1D%boFyt=akR{ E0I7Z;-v9sr diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png deleted file mode 100644 index 4be4af5fab3a09cce65144c747f24c6ade600359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DPvC;#}JM4$v^)8w`Z37Am6po z+v)2g(?$k`c>N1yj{}(xupO|Bb9m#eWaid)`oBujjyMLj^RWk-B)8T8wKI6S`njxg HN@xNA1NtG- diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png deleted file mode 100644 index e72193f5921ec091dcbdb7a6da540c6ae62a0abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DLqdY#}JM4$v^)8w`Z37Am6po z+v)2g(?*5`F8a+MS1=|pKR7U*C#OeuU+2*R28QEj<(b@LKCA=kWbkzLb6Mw<&;$Tx C%ODE? diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png deleted file mode 100644 index 8f20b9d2673d84e22fe4f92da5c6fba5524bd7c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DN9cm#}JM4$v^)8w`Z37Am6po z+v)2g(?$k`;P+>Y&mX9;kTm#w#$Mr{KU16J0f(K87k2#dS899B%AjFfa`@;vsXm|~ N44$rjF6*2UngAGyC2#-$ diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png deleted file mode 100644 index 04f657e1db10e9694c00a2d0240c4dd96a062c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DKk$O#}JM4$q6$m+Zg$O@E^Uw z81lZJ?Gxk7s`Po4Y{w3tY?zt;Z*oT>n?b-q29KD3>Vk*AGBMnIke8aaIU*2f0)wZk KpUXO@geCxD+9O{8 diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png deleted file mode 100644 index 99309ef6d3e32a2d3303400aa061e0508a70f758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DN9cm#}JM4$v^)8w`Z37Am6po z+v)2g(?*7dS92?$NlFNF3%qKd&uD!9kGjy}NRLj&jF%7WCrYdnXQ&Wp*=?oVF$ZV} NgQu&X%Q~loCII6IBdP!Z diff --git a/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png deleted file mode 100644 index 9bde7fbdce15a1c2873eb0779ffc0617fd9b15c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DRWO3#}JM4$q6$m+Zg$O@E^Uw z81lZJ?bE^f8J_14%!p_Ru>Zp|qw<;kM2WLbT|5rH?EgED6zpZtm|hnx*$^-bXas|& LtDnm{r-UW|n`=evwJLPDoBk{4*AEnmdKI;Vst0H2gA*Z=?k diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png deleted file mode 100644 index 0706c8af658bde9602634950dfe3d5fa5886163f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyUfsxfz<`JK;_Z5A z-Y@ApO*&r-OgQM+#9X>wkYiu(tId138dhyGKCm}H$eLN@qysZ=3D*)nlM7YC@0xyy hn}nCMmBhQI$CPR`ipOiMnG7_T!PC{xWt~$(698&aE5rZ* diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png deleted file mode 100644 index d814d02d31183b8f00f475a05c124004983d9eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9EC|%_%783w8jlt8^&t;ucLK6TeKPwmj diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png deleted file mode 100644 index b139c8e49168e4404df0a46b30a4b30e90c1ccff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECY>s_{MVWOZ(=mjBT1_sGr W&p6(H%v1uJ#^CAd=d#Wzp$P!PC@9VV diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png deleted file mode 100644 index 738cb38d072137cb68723c576a801e3f3471bd3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2849 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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png deleted file mode 100644 index 2ed75a767a87ac573cb7306686035f2100459fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)n!3HFaZu8v$Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#4jVIz7XKNB(EC6kA5Ry@5Rc=@2?~6F)PwUxdYTwn zdMu8}YM6Xys1i$1bTr(^uv&TM3(=CrV!crU$Q6V-%Qg7n#gTe~DWM4fl0G)# diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png deleted file mode 100644 index 743d00b6cd7e446c7badca9dd11d1579404569cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyUQ!e~V8Fq8aW6aH z`M>?!MSK0VJ5DH+1)MRKpSquM-S5BdOIN+&sn~jE%jQNlsf-1UY_}X6mMgq#dKVMx ha^q%Y#@a>3az|3`-r6;1y%^A322WQ%mvv4FO#tkfF|q&v diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png deleted file mode 100644 index 17c1fb921f9b7b46aaeefe7afb8302874fb0abd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyURua|z<`JK;_Z5y z;?s*`91mY+Vs~LvSAIRQ|I~ek>wo_(4hk(}+Y^;`>!t%UugL`m=C=w5f(6PQ%h%~C hy?JA^CG4Uk|5eN5b2qlEYyz6g;OXk;vd$@?2>`YpFM0p~ diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png deleted file mode 100644 index ddfc8e3d5c4131f2460254f183938477fc5a0679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rhed`}n05R21qr&#kfCPg`@kT=WR_nY-)l@u)2m z9YjR(TNrC5J8zlf@MOx-MX#^q?zd~tP;1Ok`WbQLQ#YGy{=Yfu7pEGW;JmVaai5Cr S@!LSF89ZJ6T-G@yGywoUXh2*5 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png deleted file mode 100644 index 007a4b239244212339b817f8de9474a4dc34fde0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyURua|z<`JK;_L&H z*gyPBj&nSGnTg$nOT)YjBQU;+O3-o%)BNS9GKrK90(RDcPwA0 ir}XBH&6co>lKfV`a~Jh`>I4G~X7F_Nb6Mw<&;$VSc`p(G diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png deleted file mode 100644 index ad6e1a4d9f3c81e20676f979a53cea2084ce903d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyUQ!e~V8Fq8aqs`F z7bNtyi1zwxcbrft3piseKXpIjy5E1@m#%ulQ?d2Tmd%Z9QW*;x*={*DELV8f^e!gW h<;Km*jJ1o5{)rFFF7K diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png deleted file mode 100644 index 0ad6c888b4c7e436e7d7c78432dbfdaecc95a7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*fBgS%&%9ECxB?U?=uVx Y$^4u51wHGE0Gi0)>FVdQ&MBb@0N@ZURR910 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png deleted file mode 100644 index 19b50abcb536602cf2cd36d5a19805464988bd20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECmdKI;Vst03^XH%m4rY diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png deleted file mode 100644 index 5461b9c00fd3fc513aa4465682e70e87cca36a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQaYY4jv*T7lQS|h5*V8PD@dJb zGfWV2j%0YY@&Et-(u-Ft=sZxsVYp-gbGr;f^5z}?TUWk$0o2Ff>FVdQ&MBb@07WJt A3jhEB diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png deleted file mode 100644 index 5dc6f804aea8ca344275ac6eb497b6bfe0f117f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQd*uajv*T7lQS|h5*V8PD@dJb xGfWV2j%0Xds4&4P&{4SYp+J&{BRiiZ!)425)ejdW>;mdy@O1TaS?83{1ORBM8sz{0 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png deleted file mode 100644 index a70b53c59af769e3c98973ad9718670ce27259ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQYM}*jv*T7lYjjGZ_h07hy7xL zS%<;BUsuG{45zRSgeB^>bP0l+XkK D`1l&; diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png deleted file mode 100644 index 85d7aadd4dfb619883f68f1cc63e629698b5dab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQbwLGjv*T7lQS|h5*V8PD@dJT z6Fe3@|6GeFPb#ATqtK84|Mweqan0i3X%}$jvMQLwz#trO`SaWQ^{znO44$rjF6*2U FngE5o9^U`} diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png deleted file mode 100644 index f7b01e012f895bfe2c4241e1d48771fc372b35cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQU;zbjv*T7lQS|h5*V8PD@dJT z6Fe3@|6GeFPb#ATqY%TTAPubyB?B2J9?cgAJee4pt{u!zH{AaisF%Uh)z4*}Q$iB} D0X-aq diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png deleted file mode 100644 index d8f1c8bd54f4f091e79389603095c99cf825cb6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*Gcqy~4zxBtu(zuW zGMHg-@7EW5UBeRx4_{GYv)%pQnG{Mujhr&UNqv-pZ`Il{xB Xs2c0@Tz2whppguou6{1-oD!Md5lfPH{+~ zs&ZK!$GJ#`+OXn)bEl7O^s7vMLr%~_eO6@BP#xDsWzJIxbKZ~=QHwoEqiCN;6|k~9&?6VGu8wVeg}kjlqBUkXd|o%rApJ7Xx?SmelE6^*`N?mP%?P7H@yM z@176Te{31>^aeVqCP$2D`iM8b&G*loT1#z02OAN3)TGUD#xbYXQgqexFre>@9yw_< zoN>t9>xRrEIA?_IE1YrUo=P<2hNadJXB=4rbb%a&IXb5^sO2P4AoU2`8OJ_N3+RuU z?3bPMlGWJT{|mv5xDeck3qc!^Tkv+yM^@uWqQKxnw{tZ6G_7EN(=@mR#5tHjEptZL zT?o!N^e&F18P*7EfGlP>S;He0o_$19Sz!q7up>N&hdzT z+KgUQr1}UkLQL4KR;yolWSqh_YPX?lMz7!1&pz~~fd%z~_Z{#V_yT+aKE`}mgO%s( z*Zy2en({y`_&;C`{0061zkwyNiuqzpAev$qeWYoU3d{J#NzC8IACaX$H=;%xu?3!~ z#a`2j|4di>P9KpnLiZ0Fl^vDJdHW{hJgNDYHbk!VsHwq51hhtobGl;RmY>GHkg{)E zesWUhFRGl6)Eh$fMU__)%@X*lTj%8LuWk+fh;ux9b*`$4|A#h$uKO0E`Tzg`07*qo IM6N<$f=1Pyg8%>k diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index f18050ea589eaa31233bc08e4f8a4e361747bc94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmV%vbFc60S)hq5aquQtN zO>~Q-PMt}eDy?tfo9G5^U3x~HVu{=o-l^#5`3AXbFq#7CZ= zx~R)Z%-PngELWXE=jG+4wH{HY%RHtL$z+_dj#xsD@Y&isDVlJd1j7%A; z{S3ob2!NCVl}{yrl8B^V**9f-6IC==^T()w$-W%VAY54pg(^F>UjitZxrB-eCn8Lf zB*stQ-rl}17K`6RG#lbS(&{_eIc1V`#=6_}di{5~T>e4x!ZPZXM|a{QRmt`XV*pbC z)5T)(D?{j2cRHWXf1>hHw<=z1GC@s9Ro2lk0Wc$?r`}K3Qx5<^GzKt(+iwt@SwZ#Y z1K3Z>bSEt!roEr8rydA`NJoVD>nPSV+2(05UE>4T005_GAOuI89vS#iG4B18N9tN{ z^Z@tNBTj+gCOB47*w+ z+2Hb~>!f2H1$Hq!D=_Sb+i%D|qnZ-1^bbIwX<}v&QHjdz0&e>kOOQ$(hHgzP5DjJz z0f>y6M3En>w55Wi4nf3bKUf4p>o0~xvY>6}4YBjHqH^B)8ba{Lja`ks{5OurR;$m< ZjQ=n8%sUGgc=rGR002ovPDHLkV1nUn!$<%C diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png deleted file mode 100644 index df2d3d158e201f4b5bc8f478bfe194c819c762d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah2>S z4={E+nQaFWEGuwK2hw1@3^B*n9tLu5dAc};Xq+#-xYx_sQH13|{`71Pj-*6Uoi`#n zE(U8IKgsQz<^Rb4R70ym$22iPZttV^?_#_6n&0#=x|;ZH&dfx!jETDzs(0U>)g_uQmUhGGNWo+VotE}_5b3Zj`hnf_E}Q2 zkoV^c&!VIWreR+T-g@7!2<2C~cxLXYh02~hOPyXw&7V2OC7#SEE>Kd5q8W@Hc8e16}SQ(iDxmE@S#`ha8qiD#@ zPsvQH#I3=p$s!-9K@wy`aDG}zd16s2gJVj5QmTSyZen_BP-2>S z4={E+nQaFWEGuwK2hw1@3^B*n9tLvudAc};Xq?Zzc+iX4P{i%w`)y*!lC}nMxxP5m z`ipDd|3l#c1q-`17wzs7jap-@cWTC&8}(D4%&X3GaM#!SkY4?Tswdc+PM~^5?gXjDEJr|A(9^w&s1cyzt=Kg=58+)D;SHpB%sRSHFHUToUy>RV`*x3 zp=*`d7Z@F1xvAFw#q#fW_g_%cHx(CZDFFIJwZt`|BqgyV)hf9t6-Y4{85kPs8kp-E z7={=cTNxTy8JPmPRt5&f_Zu#wXvob^$xN%nt--0uA|I$h5@bVgep*R+Vo@rCV@iHf fs)A>3VtQ&&YGO)d;mK4RpdtoOS3j3^P6 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png deleted file mode 100644 index a17b6a78920848c37a67246a76749b4cc1425a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~Ijou`Xqh{y4_R~-EgIfxwlm><>K$vu5h!wc4! z9iP>XtrZVs65@3e-rKIN%Hh(x{ewWxt1j(s|L*kJ zSoUnickXv5=i7?TNH`^EJfpg4#&4;Y0qR0+drTg2JXGfUq3}Rr;{P9f_n*&gD7KkW z&D4IqLivGGRq&kmAH6(eA0`F~7S8rex88HAVS=03cY~80?cpzkFa4S5A6;t}xJ7Q# z9-saRVPfVT##U33AAO3A+Ypl|_94?@cK)tT4*8AF;-^j1iVm!a-M-<=iX&Itr@TnW zJpXO;4EOj9!Ar}#BHVL6_dHGGELXBQqN>Q8)gj~`k@s=>rw|ur?|x;upO5s^{asBY zKb@S=&SWDRsQzHyR;N3i0@8Cfnf~0l`P3PA4VeH(Ut{H!I{}l<<aB zB5gMTgH*M|HKHUXu_VC#5QQ<|d}62BjvZR2H60 RwE-$(@O1TaS?83{1OW6u*u?+< diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png deleted file mode 100644 index b28b3b54f4c81d482f797f31936cbd4013c093b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png deleted file mode 100644 index 86944a879b986d941e6567d78fbac16c87ae9244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1869 zcmbVNc~H}M6fTFTAW9JhxeNgj51OPWje@pKfI5QEBA|d$+W@sTscjVKdVuS?9w2h9 zu!^p(ipSu+I*za)qKMZh4tTpGiYF)@D~E`is<``y;~$%us6_Qf>3EP7d8-+ zSuC3rZA?5JA2A(OQ+kfdV#CSM8yGZ;HF-*gL8aCaG%$}y)sn&B%ahe0pw$F}ae@dq z!XP8kwBcqWp)^OvsLeXHSOZQ80VZdl41u1YRX~P*0ck=rg27L`C^NTgLm=?Ugw_Rv zpPh=2hyrAkkpKi7I8Y4>VL*s*5FTG75={iSFakp`7ecs!hzR9zQ5XikJRqZH)TE#a zEcA;OvkC^&Xxe~6PXctnG=pit3hET2u2VQ z9~N<8VGzQE&zE61CKg~a1QT!t{T$!IN?{zwL_!$n$z%wEg-T!nU&6;R9*)6ME??M> zm6Ik~MXHH@T`i;g87m0=E*6y;2^CElV<>7te+5LPQ8Z;rqYQvdDF7l=YAtD5TdwDG zv>0L3E+#agMoJHS$}g(@hCVJsqzKOFTO4KL4hj`=LnW957mEdaK`0OWg4O(=oI#8; zkfk{OQ!M>kOa)q|UrV1^d~F_rWID#kv<4`i7|nFtQaL7x$+*=PcRNxkacMnTzT(!p zfRg6DJ1Y_~Z$G;tw~$ix*L@nh0_gy+q{K6=O-)U1ZBL7fiw9T#wcP7iz?I7*wg8n!aY@L* z%F1466IZ9xDGw&8Ca%%8-9N%k=5}B-gNg) zDs^~|+ru7gAfdUoeO*+YE(gj=-VB=VaaeB5#xy?WU;B+3~rnji3!zw~u|NB5xDgMA*Ab}CoKR1b4{ zl>=_SIAEWB^HRqqsb8t5;#}&X_CmjxL@oZX6x`u-Nm{2|`y?pbN5T8(*$@T`ZH%+J z9q+wi#oajjm>l)vpmE_mr&lY%70+^a$7TKT;qFtqhuwA!$jh%>ho3F4%BgGKv%2K0 z$HF4;&SJ>7KIHm~u<^wO_8Z;3y_c~N@r~v)LwjwHt(kkY;`G=_K|x(kncTb+Ti2eM z7yH!X-5fzxm)r79(!ZaTJ+c?A_7b`^xjVa7S5;ayZg6q=sKBA)LhBfI?7p4HG-EdX zGM##G-t1BC0PE-nz1YH|+GW>beOJO<&x4C?Y3_ohAr4Hb&I{K{y07O> zYq)siMdY38b0^FH-T7Vnp?+Dwy~?6uy>H4FYTQ}9{^zjW>fFu1k;Wnu$QYKv+~3MD zkL9@kLKD%Thtmq5^yY3(U$KE}2<_4f7b{3i<6pkgb<{dv;FI&fmd#{QXNuR<0GE-t|?<-_xFWf6rQD zvp1?(m;K#mK7kAc23PhCb9_I|Uwpe=_~P7`{<9hKeqT15)CmrGep&{}lJt6uiX0l6LDtGM?vvS&HSN)*I> zeOGt*EnBDP@;N{6y`LG()$~n&=KfpyvX&R-FPte;1xy60C9V-ADTyViR>?)FK#IZ0 zz|c_Fz)aW3GQ`l_%D~9V#8}q=$S`=EA9fW*LvDUbW?Cg~4U>%CWdb!wf@}!RPb(=; nEJ|f?Ovz75Rq)JBOiv9;O-!jQJeg_(RK(!v>gTe~DWM4f-EB1! diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png deleted file mode 100644 index 15b86cbb21eb3bfb82d36aa9ce750906297a9225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQ-Tee`#-|*CiUbcIg;ND=p zYvDSd^|6iLOdqf$Xmz|*HxtvIt|l!1HU7>O^~bA&&;Fj*b;Hx}3d6&UEnVN=_&rrS zyUca-tl4jMo@$nFEpTFXzIjD+{<)ibKgss#-rp9f6_EGh??g@(2S&3=!i$ftp1=NR ze5Ls1tv8DvCnWJd(z*Zhh{1dQ0Dw1}N=Vgur< zo}V(7G@F#*B=UQaz!7tS(%x&E*VO)~n0V|`)7|K^f!Elpcvl1$gq+H{_D)QEMqY%8 z_vf1aTF*LU_FtRc+)-?b!3?Ao)T}9E5o1c=IR*74~B%^nkKn;>08-nxG qO3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%F?hQAxvXq8M>Z zk&z^%c%@bRQ#)+nOe){kHaX!!Ue%|-vcG@vo7s2MJqBDZfk5<_)|-ZFZPj9NlZ$EDG$w6h z^v#+%T(e!=j16si)bzU4HWV6_^stND&E;|5`nfYv$?gux?t!>a1t>hEvKg8)f3B--`qJ5Vc+(!(3AIVr zEf|cmkv%DM(IHdcJ}Sgr>#(5~Tn4TISAy%nrQvE?Laps69ZLLT!~WS0QV)l|q?Zr( z+%hOrq1e~am)EDre9b1+$FL^?hsoiT)~9EmS!B=eNVF1PP(kFFm`ljix)2F8;hG8d=#8;jP)h%8u`(ez=ZN9^bNjAY1@m$qMwqc*3 zT<9Z^7q-4S8p!6dM-010M=(>rk1eytHi>R-cR}tW4SUbF89%`nk>dMSnMgg-f@tvLl z8zJ1Aj<77hi)&@}=LO_3nTIUJfhLK?)MTgjijKG^e1tcvx@U?wd-4zBd{w~Rm8u&) z61IEoor<-v>QlY};sLy%=GMYsYZW#7TiibW&xJ?UJ`JsgWSk4`n=4tN;yWe=Mb9;n zrw!^kvCo<)%-&D;l)PgTvU~Z|j|VKn#)IlF_j=`rkH?YbC)&niUyM-$#5;BRtd~Vt zvDwmlW4up^P2AqKxmr=aNvNMq0%A$n_A&Ybf8s&n?eE2(zp1N=^sXKmlORRu-MwkG zqSrlb4;RY>`GT2~ewsriQ0>5-Cr@@n4LZ4_+db%Z)RR$pECx zV&kKm<~rTWsF|5CovUxbAuX%rMqUY#bK_3MXl`zRlnnCM)JOk#@Q|`yZle2b!xrs+ z?}@SMBoaxAn*F`n4c~I!tWN%NL;nce-(Ln9T2XV@wz0+fUe{x3EWBVphWolE&ZMpy zk=t+u)*ULX*vshr>?xS>+y1VFi$&0ZQQaET*YU40s&SgZh;!v@8ZAA*DJJ>D=a=0< zFKXQ=k&~NZZGoK2o`n~+R8w?*R>uuBc#s$EF{m0(={u8TU3kQEm9SfChYCn7J#=g4 z(PaFJU1FFZJS#?cN?VCdd62LmX1(Q&iCokv9@0&`0c7bz75vdTSAVg)Dte++U_U8a z)M|^@vmd{xiq;M1c-`XC1_k!;*hJ-2+0wh;$&M)lJC}axPr((&K~D-GVw^}ZK>;xo z8*&r{B7jDjnH@k`96(zW%`9zDXdCl`2T+hey^ru3{!bx1A}HkS<^L~SLob9t1%PwH KV``51)Bgpr>#?r@ diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png deleted file mode 100644 index 8518498eb6c93e3d4f9f5c806362bf3117b17852..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQf4-y`wRCHWT>4=v6Z~W)^Ex~}&Cks#3Ph?YL zYs=^PA1JbT)~OR;KkxqfX5VYCuTH8yF+BVMK5jv$P8>M!p?~7X|K_(-ZNE?1#j0+Y zX}rfdsOO!o8=KoP`};Z1zsHB36rFKS#YJJm49Wj>o1-q)hN%bb=nB|jWMKUFU(#;% zzNwwTK`8{^tVraaWCe_M$vxef5w0QpFdP-veDuD zxhegZ|L;vckoBsbjg4*D|NoLZ`&-4e?`K!s|My<3S%8^2?NH;i6Q(?qt2KRNl&_PX0wV*1 z5qGtn%`^R9z@Swvag8WRNi0dVN-jzTQVd20hK9NZX1Yd}A%^Bw21ZsU#<~VThQZ_f zu&XEx;QVw%w1wevX{81fiqT9$oZHH(4a215zM2{s3I28IOo7eJ#J d>KPlRN5&o6d@ywr|9haR44$rjF6*2UngC}HDAND{ diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png deleted file mode 100644 index 6bf21e307ed392bf00fe80b162a6ce9115e62c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmV-S0ki&zP)h$s=>Sb2o({EW84x$2Sq@4Qvb1mj$j~;VIQBr2GX>%-APxay9!he7 z8W7h*gD?q**@0LXh%12j6cFzN;xHg)rA0Yl3bh0|IM)O5QD`2|BGz~0I$#-|1SL$5 zlJGbV2jtPKD8?58g7k0zp)`;V#9XwljI@z*K`Om-0V(CcdbDyt4~XM{*o)XuqGd@4 zDx{8=fp<=lEG6&%R0000-rS^s>8d@5ni2hppU0iV;YH8gwNa0%) z{Cz&}Jx|SbT`f+uL?986Pnf0|l@f5k0jz*^zeXXD13Pe$Xi*7R9^s5FmB7$P;6x!% z=kMH0V6IZ20v0@I38qpwTN6bU0_>(U;T<=GYX-1E8)QG}f-;!!681nE=wJ-aU=KPV z^-i_I3K%>@EawIsd5_!T)2R?x1}rE&N|%HcIQa;SqE5+gRv=Fy@M;YVKt`niqbhVk zpSlae%z=$G2Wp@TnqrmWnuKgf72^IDIDhdq{E7X5-;T%%62M`q*b}mOv3|8DyoG;R z;O#l^2#-VHDcnmy=|6xRPAT9SP9@+QP9YE&4z7Z?SGPkvc&h*a002ovPDHLkV1j;z BjTis` diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png deleted file mode 100644 index 4be72f108ba1a4f36da5c3a59b1ed08ddcf7cb8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280 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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png deleted file mode 100644 index 3bf8e03623c94b68d31963ffe7e59c72c3dcc059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png deleted file mode 100644 index 986ab0b9746301f2dd9401829da09e00995621b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png deleted file mode 100644 index 0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png deleted file mode 100644 index 7c0599e3a6fcce1d9b22e47bfdb63afb1d3d9c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSjZF4rt@IU_AhE`IYK8I wIB$ByaB<8!;4zVtCm{dd@wVRWcBu>u-xEd5&snyt0Gh?%>FVdQ&MBb@09FhvcK`qY diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png deleted file mode 100644 index 3bf8e03623c94b68d31963ffe7e59c72c3dcc059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png deleted file mode 100644 index 6e77525d2dbbc1673145d60d775602c85264330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png deleted file mode 100644 index 6e77525d2dbbc1673145d60d775602c85264330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index 92da2f0dd3711a2ceb843768cafd6b91a2807b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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|> diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png deleted file mode 100644 index 42cb6463e4c28c6aeffa315c4fc869867dbb6b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)-;@ diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png deleted file mode 100644 index 460ec46eb0786706610e21ac9097de489cedfc33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)!1&^00004b3#c}2nYxW zdZ_-Wf*5)VugS&t+23J}V*z%DOHb#W|`Z#l>;cJ*L_P;jGoKD8nX4Z`xH*Q>s zTvTl`b;%gqS1znaOc|u@tz3t7=|UK<9Hr>BJ|D1%4AOYzE>c>YASL1(e+Y^`_iG?7 z1UL~EK(|`0e*W#*UXt~C{TfUweyI5sSBLVgO?u)p&e9+4(C=i^T1GuQJ|j^LdEE0 zfZFjzm@Nd117_`XxKDqSoJXh_wG-}tW_yHE!!B|TSvyio<6k9eTgoG9O0aTdZJ81x zmbul8Z%fpkT#Wc{ND1L@No&VX#iPVF7hx`c0JdkE;3e2%ZBQYi%Oe#dj=&z+_I>|? zOJi$dCv)FoZJG3n&>Qp|;vSo*JOkf=A5uR{`;uV-QwsX>Ho!a31HXV*se5TxFFA=4 zo=3!%#5;D2+DO|6R;c8b^-B2j{s4XhZw!t1m&l3O!HmBwHn=!)kb6yF?kI1MVX*Vu z<6hz)DH{^YBPWDzO$|0isCW3@P>L98oO;C$E5=4jGEPjLS?XZ=13IvJLaC?O;nLn? z=e?6_T^b`&$N3sK+o1N3^-DyB&=+_N>geY)_rHdJwBJ%s{^4(_WBZ5MLQM53U4RfX laXn(LVYMe-Njr@(d;;;gyUim^Wn%yU002ovPDHLkV1m`SB-{W1 diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png deleted file mode 100644 index e84adf2d41604323cdad8b15e7034b6137e02425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720 zcmV;>0x$iEP)!1&^00004b3#c}2nYxW zd09!jyup9SJyH%;E_KZI5Ed^B*iNJmRSj zBG=jNc2B+cMg+dzb=~X>SwfDye{PH^oqQ4$1^~*55|NVv2=ckIR8XoEqC|oOgc2g; zEPA&fNb-^8#Mr1#v(VQn5UdVR@QAWs>EP1 zTHM9Zaim5tPqqk+y4R~ii**RWgPIHWkr2Q-rv~$oD_;OFg!*vQOJ?oR%RhjSvm}}N zU}~@)A@q_TOphE%y@J$^Y;2GXG*T-_?U?-%UNYKi5n>WcgjmBq)+~pV5UB*Fc4!_E zr<_OV^tE=(@|l_%K9#lBPBbeU!!Q72CYl{ozqWE(s>}kg*Xy-fB`%jskbX;(+jyxw zA`k(lb8|^3?6_RfL_?Is~gyeh`O%xX?U(f4nJ zaCd?*qxs3xYk`99o-U3d5>wYsbmTgqz{8?`Dg4L(`abqnuZs;wTVv8ZBg|GX^f4xE z5ck=nld$UVv7H|oR+P30etdkz&;0SSW2^3}yn7y4rozh{Dy3k((DE(NNCr<=KbLh* G2~7afj5MhL diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png deleted file mode 100644 index 4bb22f0e10e621ef31f16100b3f682a09565c65d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`7}o-U3d5>u0Z{Qqyy%*=eaUL!352pYN+StcB)SJP>#V9b+U;=REk xGyYWXA=VWyWA+H$a1!q?zNqxd-sOcoGlO8KcyMa*40E7i44$rjF6*2UngAF=Ek}@P)jR6%Q#K@^;MZ+DwSq^+h% zP_!xtf_Ukr^ybl{hx{k~3HlSfd-tNJf;W#6l*URbZIYUN$+x@DLlQ_#DhP=KbJ@4d z?3>3vm>B@rlxxLQd;P-m9-THgzpAxGG!1yW5D)4ffO-cU4S%t?r)YdGWOO4jhM%lT z$gSE=x_Gve0j_HeH8J^wOM08!a}xvEw9Ce~Da{Pz+J>k}@P)jR6%Q#K@^;MZ+DwSq^+h% zP_!xtf_Ukr^ybl{hx{k~3HlSfd-tNJf;W#6l*URbZIYUN$+x@DLlQ_#DhP=KbJ@4d z?3>3vm>B@rlxxLQd;P-m9-THgzpAxGG!1yW5D)4ffO-cU4S%t?r)YdGWOO4jhM%lT z$gSE=x_Gve0j_HeH8J^wOM08!a}xvEw9Ce~Da{Pz+J>4nJ zaCd?*qxs3xYk`73o-U3d5>u0Z{Qqyy%*=eaUL!352pYN+StcB)SJP>#V9b+U;=RED z2qf|=A9d?gTyt;ZSzN%FWhK6zW!r_Lk7KrU{Nfk4nJ zaCd?*qxs3xYk`73o-U3d5>u0Z{Qqyy%*=eaUL!352pYN+StcB)SJP>#V9b+U;=RED z2qf|=A9d?gTyt;ZSzN%FWhK6zW!r_Lk7KrU{Nfk&05-QPl|NEJxmot~Y-O?6i zSoE4VV50(~VFweNuSbvJvDU(em!@_Gy7>C|bVSGQC`nC9V$w5l5%vk()99rs+U}Ie z#gw!%)oQMv{^i7d*IlE3+&<@%p0;w&$@ypMpUwGhdH?7B;(g3_F4o8CEW7NhbVSM} zqSCB_!=qSev5fPtyGqA?asRjFZK+%zRmuM+<~%bCV-%Sz^PrNaaE@g9foeX-u+5!sBTi~HIW*n>)Nj7ol{rZ9-4nMT zoXaYtmP_*AdKAZAlk-GvO?pRyl>Mh8`+Nc$HY$`qPPFQpUN|M($@0weFZ=q>-Z|;k zASrkFqq&&t!{{3mN^Z2R{c=#?a3WtQ7weUk>iG|Zq$QT}pSIkU{^CTFT;9KIrmSnq zpS&#=uRnCsOK0id8}?`PEg3d8`7hvXW$egc*J6#mVt#e9_pb9<_ciuE6F6vP_s!9j z(P7T51!|6-rEWn-Z!t5pRZaT>G0pp*?o69U6_j*jr;%AU466Xxt@KxFWQ#C`^3eSLB zzg~IIvuD^d>#3#GLD3I7lf(noYc&h)3hc9G_+WKhHsZ8LoPy9%C4Uce+&;>2@bsHn&Pv7xpmx^;r<{ zyLsxJv!X1=e=@5Da9q$kdPVo-a@|{nyH;q}t$!wG=kQ6b{@GG-@nhR69M(itUsa0= zOaD6e(QK|M^YvG#-Ci16Wb}90IdQSr=Hj%|Go@_TnpsY6``Z0AtH!%8u6<>P+?BM| zqEoJFmfFoDzId)kH^*J-T zifmnxrK6#lyVy%(-Id^*OWp5Z{O|Cesp8<@8Fi79bbtkmYKdz^NlIc#s#S7PDv)9@ zGB7mMHL%n*v!UK%rs{7HZyAaH@aKEfTQc z(CR%$S?96abl05G-F(|Si_LUV;?$6kux)>%v=)2DUfpwT%PQ8|6^&m$u}%%W*3rdf zl`oQNvN&>WhAa0khnps!G6EK_TCpZ6=uP_{^)H>%wyt5X^53?*IxN|0o#E77R`PdD zm%Wa|cNB9$z_AP5mH=4J^LP6!o!<(RyDvF+#7%B*F3D>^@) zG3au=^KjWsn^#jyew;NrnOPLU6Z$MNVeT*c)9TLijM8T&&Ec75wYjFybd#W68%QTW}f06Axoa$IU9~?Nqc5iru{em z%^e?{s+j1J=mX5HswJ)wB`Jv|saDBFsX&Us$iUE0*T7QO&@#l()XLb*%EUs~z}(8f zfYD-4D2j&M{FKbJO57R>QdwRCHAsSN2+mI{DNig)WpGT%PfAtr%uP&B4N6T+sVqF1 RY6Dcn;OXk;vd$@?2>^cl_{IPL diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png deleted file mode 100644 index 29aff4d43f71a025f464587ead52aff2ecae6a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^59s(?1)eUBAs(G?r*GssWFX)$e`(35Y8e@;SI4XCdOETn3puLX+U@Np z`{}{9$F@!!Tb4}GnD8m&^|D{1rP|_tuSV&+Z=MCoD&l+{? zpGeMToA<;$LF?@fW~rUl3#RU765DB+Fm*PQ+)k?pQ&%&Ye!A+gR)$OeeXHaR#_cxq xcQACD7BHRDw&oXmu9s(?g`O^sAs(G?r*GssWFX)$e`(35d_EZ~i&w|H<&_`ZD(+MedV5zj zu-#_I+lqbxCf!wDY`(!qq|2YPZ`s2sD|KqW({JG~4*WL+Cpx;A`7$XPF&b}JE9dda zdDh0P2cC5-%kKDDBus2)4y)97FmX3?+)izQiL;plcWMSG#q&-%rTF<%+zn>y2h*Mj yizj?!^E*(P`ureMOz-ZiFXWg1cX%y7!FpSm=AYI1UI{?QGI+ZBxvX9s(?*`6+rAs(G?r#o^TG7xZ`zf?Wo$i4qI|8=SuS_>z)W_YPj?%Q>u zIp@ANM{x}Zqe@#*i-Jc_;!9;KcT)!P=e8Z65pgErb%iKSkCNb@A?yTt$n@r z2c`IHF%KKu<@hR|E_CSLV|hUMOZy3b87rAYm)KaVUb9s(?*`6+rAs(G?r#o^TG7xZ`zf?Wo$i2t+|9e$2v=&Zo&G1s6+_&pQ zbIyHljz-QjH&*S{-J;(gu&3N>@$LMyenNedpai4+B)&;SOq0|eu$bkReVyxuhm-Z9>GFCF_99MaBsxVXw=u8GrS3j3^P6KmrqN>Fc^oQq;b>Mt0(a$ z!tgX@A7RK4{kGy^A3#w21maN-UfpV|U0)B)Mu)Zk(%$xiP)OBD#retJ&sicWsshEL!WHUI0Z}S=i2Rqw=-{<_oUlU4$I1(Vt^KG}@Sd2k4!kUV zp9d;G14UN$xn@Z2Tv!X1WCiPlZi?T5Wo`s>dMMw4?2=HB&MqLoAdzh3Gg0e200000 LNkvXXu0mjf#CNP@ diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png deleted file mode 100644 index 6536ee63329bb47bec2bf2384aa494923cc2773a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmV;Z0ayNsP)Km%mHHKmbPH_0G1~QE(|Z z3L*$mIy*=P@!u2&!BHHFf;fuc0uio1*2@YRBct9{0AyU2}iGVkcWw7UUPW(q{Hz&m;6;CQrhm;h30w)z2(`W_Vv zws(S3@Pah`KM=_o2%_3&n+}O86bq(Ag>`_N^4m7drC>+{^&N;72|01L0Qm!AONf3s S@;8qF0000Km%VDkFce0=d)+vOWKIG} zhpvGvb*AhYN}o4m@H1o!d4o*tRBGZMkUCTWmkL{wB~SUlAntIEgw4Gc(!&*+NcHqe zdbonr;tjwaz@#r!B?pk5-j_#K1)p#z)*b-3QShBfQxGf+4==MNa*z{HXhG0C1P_4~ zh;-k(7eP#tUz1`!Wij$Dh)MD;xve&Fv5GXEp_kweUysY@i1cm8S?~wm($ky-rf?^L z4cuB_3%3%uz>Nj2a3et6#z@uGqTe`wK1>2-pyo{<@B~f=x)vOqS_S8F z{BbGcPm`Srko*>0TM51dS0?bbgq{a9*ucpHu=A!M^DM~~^Y@aViMI>L4{MrZFUa%^ Q4*&oF07*qoM6N<$f+pdR_W%F@ diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png deleted file mode 100644 index 6de0ba8841d25f20f12e14002ecc4c9ec6a7b2f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmV-&0ge8NP)Kmp@CxKpa3{epU;uAYD{w zoy1-2XXsG+d5c4J(@pInLg`pK=_I6J(k2d`5V?BE{Yj@j2pl)OcgK;0qd#7akgCKEJ@PeExDlrpx^Tf8?8gJ#K-Da<_nm z+&*9_w+lGPs|OtA)dC)JfQDKAb-?t#>nbk~ygr<>n4NOeOiNA8R)UE3F)|0PZr-`P z{wS3Lh~%_Rw1t=h$DO2-+|>0Ilo0LghZEP}j*Edw;7F{TKbM3p1iOHI0}cLp61dt? QIsgCw07*qoM6N<$f;wQ9<^TWy diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png deleted file mode 100644 index c9972e74bb4fc7416960e238afd47b1ac363e316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDd7^K@|x;h4Gh+(zC520Y9MizoD2>~^~(JZa^V pUoEkkaeSh9w)TUlKa6vZ+qJ0**((%Vy8umK@O1TaS?83{1OR&wE2RJc diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png deleted file mode 100644 index 587337caf74f9ba3d32ba1c7cc8fb8b0b5ba245b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo^mK6y;h4Gh+(zC53JlB#xw8$}k`45e4cLk;e3y7!_%!uv(Z^d6 t0#9x~Qa^f(Id{#0H&;LIP<)f9-+fKc+F|3Yl|VxnJYD@<);T3K0RZ_tFJ}M% diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png deleted file mode 100644 index 155c4fc753ed43185b31df3bea2af1ea5b3e7482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo@N{tu;h33haPQZY#>U2n_RP$O>mRT6my}r88lS< uMnfl1c4A|rBX^f%!~&s(1*$LFm>5oL2|PB@cz*+E5QC?ypUXO@geCw>u`ROz diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png deleted file mode 100644 index 081657ee7b828a74287d65d2f4644af9c7b55816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQih%`jv*44lYjjGZ_jMS*7QH1 z$Cu9~IqOiSz?8?{Eo||(vKg$oJDqvb4v1Q5NJR27d@z6V;avVV1E6LGPgg&ebxsLQ E0ED?8Qvd(} diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png deleted file mode 100644 index 3f312b465189caa47a7f8e4bc53c3222521e0bb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQrey_jv*44lYjjGZ_jMS*7QH1 y$CppZQKez^S5>Et`mrVp3OWu(*tYT>W@HfhtG!C@Uj!>q8-u5-pUXO@geCyVL>!s` diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png deleted file mode 100644 index b086fae8738227fc0b4f05171ded25ec1503e49d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQU;zbjv*44lYjjGZ_jMS*7QH1 z$Cu9~IqOiSz{ak|8`Hl@9XRLoNT6Brf-|eO+cr*y`8p4HWnZ4T3DnEr>FVdQ&MBb@ E0JhyB4*&oF diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png deleted file mode 100644 index 73c336a77a9c908532b5b39098c22a878e0e87bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQktGFjv*44lYjjGZ_jMS*7QH1 w$CppZQANR3w^={dWI;j4L5+C_+aEG8Z2O~g(C$e@C{PoFr>mdKI;Vst0EP1$iU0rr diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png deleted file mode 100644 index 726e0ff427cd175c9c3607e25352bd696a3152c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQbwLGjv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONwVb}j=LshAN!kv;Qt~79nzL7Xt$zT{YC1>l7eH(zf89ZJ6T-G@y GGywpjU?4sK diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png deleted file mode 100644 index 726e0ff427cd175c9c3607e25352bd696a3152c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQbwLGjv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONwVb}j=LshAN!kv;Qt~79nzL7Xt$zT{YC1>l7eH(zf89ZJ6T-G@y GGywpjU?4sK diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png deleted file mode 100644 index 1767c169eef03f3370b0f8e40f531dd481a9b82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQYM}*jv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONw%V+tnLd~`l!OqNzXB@V%srV-z^vGhE?K{(iZ(fQrP(OpGtDnm{ Hr-UW|vZo$& diff --git a/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png deleted file mode 100644 index 1767c169eef03f3370b0f8e40f531dd481a9b82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQYM}*jv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONw%V+tnLd~`l!OqNzXB@V%srV-z^vGhE?K{(iZ(fQrP(OpGtDnm{ Hr-UW|vZo$& diff --git a/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml b/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml deleted file mode 100644 index 6bcbdb83f..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png deleted file mode 100644 index 575334699663b221b5a2b3251572a7c7a23ddb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET98VX=kc@k8Z|>$jV8FrZ@U7ta z-*T0WQ@><>I%v71J%hiqt0P@2{q!E)%~9Ermd_VC*s;IdoBnhS>rHk6>|lcSgpVF9 tjEp}SQ%vGx1w)$%c)I$ztaD0e0sua~Gttc^?peW`&R>iA3bc>G)78&qol`;+04`QPF8}}l diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png deleted file mode 100644 index 8155fe840532e1d0fc25450729892ea73c4e007a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETTu&Frkc@k8Z|>$jV8FrZ@J;?q zbcL8uwC8*^`8m#29p5Ib=%`p$wC&7oqt#odO)b{rdQv>$UUk^Hs0pFVdQ&MBb@0G6aYR{#J2 diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png deleted file mode 100644 index fa4d76af93de31de153c6a7d41c05496bb14d2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETcuyC{kc@k8Z*AmdP~c#3C@cDZ z^MXtGfey<_%m2nWx~HUtq@RtOD!V+x#J|ag^QD{sZZM%<(R`m!o+Hzd-iC%RO>bP0l+XkKAqp+G diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png deleted file mode 100644 index 9a70a5d1e3ad43f632287aff78d86289259099db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2878 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 Xx&sG-cNbs*00000NkvXXu0mjfHD**$ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png deleted file mode 100644 index 6622cbad34409b2e09f69e305455482ee107baa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK-lVFc4sN{QB_B z&fog}EEk$2&*T)$|Ch61%h`96?xa8O-xitu^~t0=vn)PNZ(|U lO#br3!H&B!tiEU`L+e4N?emv^?*rP(;OXk;vd$@?2>`X4Gjad` diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png deleted file mode 100644 index c4272978338a232aa445ed5190abab61afcedb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK^^+Fc4rl_yt@$W?82D^ReIqPjo#d{bLmpkiN+x lnf&F6gB^EeSbfn>hW*nwPPt#_849$O!PC{xWt~$(697sdG9dr} diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png deleted file mode 100644 index d0df29d8b3fef9f71cda9b7a0975c68dcfb05685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmV+-0p0$IP)(^RAa&-b-qmfdL= zKY^DZ_=R_1v^+>Y{!mW=MF!v|2#Q>Q>z_&4i6T94j-Y4q`P>I~g?cE`S~^QhBCU5$ z-8a`dJ38hrt)qwm8XJx0+%VAuW=z7Jg@`1pBAUrf#Ef=wZl|UqH7RO)u1OwK(@xK~ zuV&5*5lN0GQV~igR!o15*n1TfDTP6ilQ72>QBJOyK^2jQYHlAzlrUMuFCtAA$s$=K oi)4{qME3aCu~lSF#Q4a(0o}otDK%H_Q2+n{07*qoM6N<$f*T@rc>n+a diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png deleted file mode 100644 index a0d9c1b957ea4a6ce62abd120668610d0cb2bd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK^^+Fc4rlxca~( z?t=fRa*SINS}wBuewp3mefy2x$=b4i8MC*B`RkorJG1!P69>HDUX#kpcm>9d6MZKb ky7}`x**qcrtNL{AY0h>p*ZiBQ0JN3C)78&qol`;+0O3wK)&Kwi diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png deleted file mode 100644 index d36f99fecf223779432fb843b823c04d739f05cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK-lVFc4sN{Ca;{ zvU;8e%Y`P%GdTtG|K%*$a`xS%JL%8+w?$@ueKP6JEX#C%J{El7iLS?_f2=|R(l=Qo klfOK1u;Z=_t1sHgP`H~Vw5GX>6KE@gr>mdKI;Vst03NU~l>h($ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png deleted file mode 100644 index 5ad475dc3f478734be31bc5763ff494e5f120914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETR8JSjkc@k8Z!P3yFyvu&IDfHo z*MFzV3!h#&I<8{wJG6*7%`^0A*`zgvpO3}4Jy+2bzzZhGPxw0F1DlG16;n~mnRAu= eo1*Vq{$#i=98+;OAz%&ALIzJ)KbLh*2~7aXVK40f diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png deleted file mode 100644 index 6ade5eeb37d8388813cee512f8adaad0f6c15397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETcuyC{kc@k8FE8XhU?9M9Fk3-& z>Hkf73eN%?4n{M7dy#!$d2ZSCCv)eTUt5@6!ODmi{A7$QW>Hb7V|gN6#Q)yLqkTHN Y-hRf#&+ODnfL1Yhy85}Sb4q9e0PNo==Kufz diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png deleted file mode 100644 index 719b9234df6fefc32c628a212141681df3414d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETB2O2`kc@k8Z(Za)puoZEAojv! z?q20mzFS+?F-&~oGw)ovvN+_p>pJvXn6S<7W@Fox#)9&t;ucLK6T;ku_WZ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png deleted file mode 100644 index 6da264db26b5debc433e570e454f7ad596d3609c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETbWaz@kc@k8Z*Aml2;gwNxP9_w z>q*543$-17oYd6QwPclDxvFIP6Y06uZ3-`2R5T~}Ha6e^YubHkRDB$o9=Xj@xc>Lb i$;LIUf5PjFDj6>?G+3v-_OK(+N(N6?KbLh*2~7a3Fg*4E diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png deleted file mode 100644 index 7ef2db75e273c3a4fa34a867d43714d47b67dfd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DHBf@#}JFt$r%|L2@FmD6{OlE zCs-P=E^ay;FECBu-~a#X*$!!Fy;QT1l2!H>nDyu1;UEQuS2t(=%(&d{0o2dn>FVdQ I&MBb@0Ph$gIRF3v diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png deleted file mode 100644 index 2283b4c01f31c24c241101989a028a28e662ff2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DPvC;#}JFt$r%|L2@FmD6{OlE zCs-P=E^ay;FECA@!GWvmzw+t@{SPuqdTbmsKKbP0l+XkKVJ9JJ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png deleted file mode 100644 index 3c909b51306d684dc9fc4deb674ab1e1feb7004e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#xSIG!$!Ar_~TGcqy~7@GboNVOeo z`FL&lz5>PtO@Rj=>T@VLG&w|ZbqQ*{RI`whRrVK{_2=K=E+vL!&S{*=@1z8QW-xfV L`njxgN@xNAaNr>U diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png deleted file mode 100644 index 131d1030c9d5b447ef62fc8e336d9d3950ff7519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DJxGG#}JFt$r%|L2@FmD6{Ok@ zwtT#{-1s4r1MA|Z!|?(x4J`lv|6k8`NJHzTnuV0CvcJHrKmQJQDKT8Re5&^Sxg#LM O7(8A5T-G@yGywoD=q9NE diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png deleted file mode 100644 index 3e7dcdfdbaf66d51a90633e6f601bfe71b0c5069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#xSIG!$!Ar_~TGcqy~7@GboNVOeo z`FL%)@k1sD*2PVS;{{wASQ@v8h$x3#@+~m2a+{}M^7C)Is4GMKie-X3Pa7xz&0z3! L^>bP0l+XkKapWP} diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png deleted file mode 100644 index 0bd09806f5c85ad3a33ec80c2a526e9dba34d1f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETTu&Frkc@k8uN>rTFyLXm;P>R{ z?#-o|?nQl9Ua&YVWQl+9{Kh9CkJo#*NAA>4+xPwD`<&mEu1}vZI664|W68WNxRjX* q7uY2C$wZnF2qKv(-xu6mlE@I5@4DcHNa}B(#SEUVelF{r5}E+w(lnv~ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png deleted file mode 100644 index 43ed26d4784aa508b93551bdb0359b959bd2c91b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET3{Mxwkc@k8uUzCjV8Fq8;LR1* z*j37dP53cYgnN@8iE~W|ez(m3TTj;06C0 vR9@;$usQD^o~Q2-Eg&#Ke!|DE+S9qyz8u@<_Da1C=l}*!S3j3^P6YLYC-!V(AVEFG+v!>way|q9)89ZJ6T-G@yGywpFG&bP? diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index f4970ad1c3278235157ac72f71fc98f159fdc439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmV-#2$1)QP)7pj*K04R=GS>IExgb+dqA%qY@2qDDdSi?}MdX75WMJ|ri_~yampZf~b zyDwJPzURp0aERFLx!K0Z6`{S(+b^7Rq0fZm(kDLm@P!|`&m~8kF)y`OQ+*6SLgj(n*c6WFZ`T<6tC6A%w8 z+L+Kg_>sWYRhaz=AtQLA^@LuUvKr4zS(=h&ATdHMd1uOv+V9M9YYe+zz%fKlM3B!~ zyq*EP{ZyC9dltDoQc<8ZrM^eE_Hte#g^dKR2>{;+o?xX#_XJ<6fcSW3 z(2+n3e1qrFpfvl1x~?#Fy4|E$M6lRgKuT?d8dD>b&VB465lv_ms575+OWy%#u@k+N zI%?Q+K~hGrT_7#|a=gF%@ZrOc@87@w`1bAFU(2$bW3Gd+|4`xmgT=9~$+>Rd`_AEe z?tAPdzh~^4zVA1WkB@)c-QE59<;$19v5OvFA}vv41E1cCHa5&@4N;9-`R?7jpWeKA z^Yg>QL%m+FvDt*4cRX_bt0?zBkB(K>DX%%#=N+5R(_-8y- zVb>j!?$Wbc5y%%}IfCs9*+@_USOKV3tJQDczI|KW-rgqvI6{s^UDwxjUH<~$ckEhw z$wzfwA%@V6dv=Zxn=8;sa(#b)ziOIh-@k{Dz1VCvD9chBW?(0HZ$3-*gQG?|lNRhy zsce!AuP~V46@dEg?(QVrAwo2L-=l3?V9=qSyONQk&Kv_~&Lf1nMm8E$0BV|mEX9~d zNP}Lf5}1xu21h4T$+9&-HQuut%PRmY8i6duXoOerBY}OxLGlJ5BU$zc%^yh8OvsW{ z7(^}+!OmYLNsSuWi7|-^5)oDyq5>gHA{u-eOKk`#f#=$OmM4_(@m{kC%_W5DAmmhR z=d>`52C;YCwuB;r{%j}Ebe_P7K+b^`h8A8*tydWpwYtuV2y(IKDEl%UBLZ0(i3V1m zfUn~Tp;05RlF3Ax+6Y;a8pF(Tjoo`iqE#Ca+!sAl5kbmO&cKL3&H*nkK%{gluy`-t zg(lV{G7z#PI)C*NX293=me{C~cPz9KvLxQ9W=NZ^Ugspsp|?>vp+=TQM}wGdXLXG{ zVi`Ci0$G}v=(F^hV}w+)Oe2t`iJ2g)`#yKX$5zN3ft&-L4rl3d-=WWF22RL{IarUJ z10V#?jlh->hk8-+(B={{f_KC0$_Y6UbF}H| z)iXk95=}<}9Szz&zBnPrq{TEU=*R&0y55rN8c7*TmhI~1gq#|$ON79_OO5CMyD7gV z9}@irgLxzpwBV#1S)NvH5*4HjnIZdKqfiE}-PZx=`o6zC@DCwmFGlT6G>P~~(uABG zK}Q3f7d(yIx@nqEUDtg*;O`-1HeJ_!ZJOp2fHih{)cJyq3PN^{5b9^?iHmLcxw*Od zt7)3gecv~S{b_{c(f57RG|lImo14Ed?FxBAs6Zqt*x!B;W5{pK*JF7#9(y&G-;L+K zAIl#wtZ4Xp+<&dElXaOZRbPeOuW5VVgIpFOP7$z(T3Yv~vHW)|AI5VJTZ64^6BEBSg#y zGM}I)%~}j17KiFDEnOcuUt#E@>0HCEcF3*~0j6Ce`xZm1O5Ih`IeuTN+ty1RWW4eh`~TOU@&BM)3MkQgMM@bdYm8B8c#1 z#@ViWE78D40!D<(#Tx`hXJ-KSDrqoae31hLi8 z$z>DjeP}^jBk1AK*j$2rhW(rzJ{2JYJMmiAitr^tE-^SXloO=ZTOgN*_a2ZHvyBd7 z1l@JghOv{s(P7lwc?A9CfSo}^z#H{B))n$biD&`>gkS9e;$0Z5~J8tXRDNuF002ovPDHLkV1mNB_TK;i diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index 172fc3b5e3caf3357e706be2a1f0d91f357c8e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 zcmV2ok^m97efLZMJ76bgmHN3TVPgynL1iZF^o zv0AMLkI|bD5@Z+S7;_RWD$X2Q#-Gi>; z=tN2`078B~PH0>efZ`B@1i||(&~g>qMGRTwTrQXXbnj39hPAQB*)bIg_=HbA_WGzO zR;yL=j9HSDjSEl*;KYv!A@o|O_=;IUA}l9+ObGitX|Dzg#M7mV*iktr2nZlVbl%^^ zH53Ym36TIhGR!|u7{3PC~!L=Y2z z32ZT8B;zY)i(nCqF!62X25hwu6@!!-aVKznAwf{$S4ay%(<6lhDJ|l}=KVE%xD;tO zjxokGV%Vil6ww-?fi&aiwtz1TI;KLw!36;9iSC?$w}w5ZTIo^H5hBZ^Apum+pFjWp*|TRqUSD7TX^iIhX;RaeQQ zE(9uq^MWzvYwRam(2Co38gn;jAmP?U& z&MGvUhjxmcRMYbSg3kR zZt4g}LPgLEq&hYm(J$si0u;4;IwvxY6?fp6l#|X8fH;pmq-q5ISi1H|(Ge;Lg>w@fkyi)P5d7;2~0$MDQ@!DE$`cg61AQt41xJiqTo9Dlsio7bTA}sD9BZvH#!%wZ zmJ%ND@1^DnZ%X(Ld?$$A6k0J~NE59ixD&!XX{j@~=b>7mwKZvxCyp*B)cAo?C*Y0% z?1kZeY?X^e-9W)XxdpU^5OahW`IAUpYa}@W?W5#&t4q8l2swcYLBS!VH7P;dBP@_? zQAk2?GdMjs_n0oBI`TV#(4X2ifxe2hDg*@upKxQ&K(mtAk|`HJPz)_1HaAZ&&GHf7 zsz6IO?f{EsSe^=LZJ-DtRGZRNi3)(P24xANDG)6Gj(#dNGOP_9D0K*+?F8HR`Nj#&1(CYoj<+oYNw{1t4Y0L^ri-RBp`1VD6hPVuR0IkNiMUb`EeV02O|F6c zauGd$;Lv5&C{!~b&}Udb7lOKhLPE$D=wt2>b>Q`^nt&r(EH@_=La)06a5Fwnfw+Sp z&{C)%=8X_pC077s0o1}imRwSiS1dcYq8ac~BtElCsZ+`Ul=zAmLOFfPAwvBY@Kn$$ zk{zOiq+$R>LAX{rQ>;#)$VHAb@IJ99w*HlMq6mNtA~I*7`@~Y7+@e^8prDZQ`Pk}@ zSYXq1DD{)3Sw!SFBRAo~AvKngUU3Lg#cu0$<^+@bU0;P_H1st~XDv}F6a(QX9$Rbi YKbh+rFQXz7g8%>k07*qoM6N<$g2q=E^8f$< diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png deleted file mode 100644 index 8ded62fb7b6a27a86f7b532c9a2b5a4ae999d34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOTTd6q5Rc^#N8xy%NgI}`eR{7o3SVw~oLF?DlhO#(rS&-V`^Q!s%)gPgzJD$(6 zlPX(2b^RHIj&o60rR$>g!|G>TRxtl*e|^4a{T&6ax|r;1#_KA};b_owfAXfrk8RFR$o&QDy{Vn>#x#sulW#~7Jq)- z)TH!~FS$Xsf0AE4joN$h`JQ|K8Rwjx@86b-rgDVb@NxHUL6S>yvXNP=t#&QB{TPb^Ah ka7@WhN>%X8O-xS>N=;0uEIgTN160J|>FVdQ&MBb@0GkggF#rGn diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png deleted file mode 100644 index 517e9f72d0c8d28a22360ad5d73476c25fd4db33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOTu&Fr5Rcj%_$5Ae=jmr`i z3DvOQxBn=~BCIDR#iS^(^w0Zu6&JUPm!vIx7~`u}yzledo5s8M7#uS86ZssvI8sdD z&xg3?2M7HpA7}46mr}+fqP5gidGgVwQ1_}WN$aob&9(OVStj}6Xj_!ShugM~J~IZM zU$@KD($sJ1b4JGMs?Xp43SH*aH+p$-+40a@k*+<>G~DD-|-{tS&vG^x*%GGq=j0Y+3zJN#Vil?OA~@ zukBM`R53;FYi;h*X6Nv`Uq9z3iuI~5j`7&H`BAcUqjcZh^7x-d8^2$_pe40Fq;EPa z%hqE7x*0h;3a++#0KFc4?e_Zv*^k$mEo1DpzWsL9`(v*67M^+IpR-MVa>nHwC6*2c zw&pTkoOQ_aoMO7bofkh1@}JI}ZKA~9;BBq7`S!))DS4@K0yY}FSDK>kZ?)HK*JGG& z7n!~MQ}4z!!HZux9M^8s)pB{g?A$cwGrvCg`RlIwI(LVEXW4OK`|IMz?e(5Emfz@% z$^^!kYKdz^NlIc#s#S7PDv)9@GB7mMH89sTFbpv?wlXxZGBO2ntqcr|?>AgV(U6;; zl9^VCTZ2=RMLtl2B*=!~{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^!jq{sKt&9mu6{1- HoD!MOjfK$EgnR$;T z=N`Kp(hSrM@CU%evd=bf=-4w^bQmnuhmUH-jd<6WZ; zHl4_>Rk2U@t}L_t|AiwlQ891B3C|YS1B^O3M@oxo5*z)LB91b?+QOQX_r0yH)YX2= zvK_aW4}ZVF|MIp0)1X?{@CS{e_APBtKk;H~nV$PVB{N8HV+L1tOj6 z``KDz%d4l`HAyHPxAByb%b6xG^S8m<-YfXS7v>b+zlZNGcwheZcvv-P0dQ7=MviH9v^t)=yc559VF`j43j z_pMt2oAX|`goy_Fm~UMa9d%t_^^2qU)cXl;U0e%IRZSM> z>7Ksk_VioOmKv*1mN|c~ELg&~mMikt+LpAdYoES)QG3#uo404uV`0ytJ&!XS^rKz< zU6j9{ob*(;{k73gyQmwdmG2d+82l2_J(5-Z=Epp_^THpe+eb5HIvzUo?fW(va5{7P zd0GD0trC|9zjsRjleub%YeY#(Vo9o1a#1RfVlXl=G}JY)&^0g*F*LI>FtRc>2C}UT z3_|{Y+l-q7HAsSN2+mI{DNig)WpGT%PfAtr%uP&B Z4N6T+sVqF1Y6Dcn;OXk;vd$@?2>?&0tquSH diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png deleted file mode 100644 index bb19810bc2062509e4e4968099a359ad73818728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfwTh{zxw0jNgl<&3j(^ zeD(x}!be9sh1LD$__>xwFX-mty1-MRJ?GVgBPRYo&#phmts!D?ltV3&FI%+a$=z1Z zV;YHl1iMSDgJ+|>#46F---v^ z=n46F|IdfFb=)S0I4Coo@!g}n4Nex)S*)#RZPN@k9D49tzo1o|L;8h-cSg(aGrNAg7qQ^lmAJNnY2BwD zmg$yB$_Kc(9`bFT@$ln4rdg7D8~IZ-f3I60`0mq%qw5167@Xn!BqR{_Lfuy~aYE2x zQ4_Q6{SU<2c z;lT8&TH+c}l9E`GYL#4+3Zxi}3=9o*4J>pG%tH*#tPG5-jE#Y8D+7a&|KB#FXvob^ z$xN$6(O_z2Y7RsY4Yp<(!9Wd?ARB`7(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c P6)||a`njxgN@xNAiwS~- diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png deleted file mode 100644 index e35c5f05efdaecd358f87fbaae543f8e5d5d0331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2531 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 WVgEmns=9(>1^{ytE8}V-6#hTCp0D=+ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png deleted file mode 100644 index 7fd7aeb2a63980f5c7459b96ae175b875f27add3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1315 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq0wlddc6tLTrX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez1K-K5QyCaov^`xMLp+YZo#ve{ohs5cKmXZmZ>G$w-JO@O z_$Dncy|l#DX=;KaYmSzf&V&g+I5)gx(wb5qs1h)7!mfsR25uDCBNMaEYi!b%Lx%#0Z>6%}_Ke;bM=$-hufo^&&725YD$vGBuUKV?<1 zW5r*8XXtLO5$#WZeo|;mb85TEyq_Keb3$U;>HYFK{YX}hy1N)ld|`iZ8c+f zaW}0jS<%V*aZgCBwd%4 z`mTTDHix9d^392b?Js?F`)aOklAwYhQ$?F@yb$ytH>J_Jb{Z~vrG;$w0s zy7gpFZTnjBVEMK z?u*UK{&)=cU7rs=ddas!yNA5%MN;fAeO3GpiZ3y(^OR`LtKE&RYG` z%T6M0Q((r64h>88-;=&fKXORn&)Y9<7j0ADM4op#Evb9DEVE3OxuAOMwTp8T79Bpj z^46Bw7ia(6t$e=h^6Gq+^)tU-Y>!_fu&_#YcJ0QCjvJ3m`|4emd(8LrvxuLIduy^w zKRn;Ob&-9_RrP6hYo5j|+EK9n+eN__H(s3nbj~C7+}RUuX{m{weGosZ*S#`Yezasg(E; z?-{fhY+_DS&eu;5`_fikR9#fupz-tEU2!F+6F=1F&8oh6DP7e>i}j<0lm5=$VtqvCS7PaJ&waLQ0xVeA<2r9FV_>h2sIGsVSbJsf1ID=TJ5=|I z&X8~@c`+{`NhyHi(Rj}}j=t-itc?USbMMp?m=EB?(?e-29Zxv`X9>CKeyCDB6UQN6rr@v)_sLiS3~Qp ztEzq2)O|!<>xiRNElR1gi&m6P`)xn$hne5Zy#N2rd-GvpEU{+CMPx+)0Kjn+5^l}o zg&!d#$jfNkdNdFGu4pqj;P63GZxgQ*_CY#Oc|`sUQ?}=CKZgE3#v~qpdI6&Bx^w_Q zunGk?wncWWW;l7-UI#@tQM0)~HL81;)HPu;pVQ0pgJQPrfpMpp=aU0}M<~a{2nw%n zU`-fLR8Od%K$J#9U{=UTI40i8@}fD@+Oa6N|E1RI6sbQ)pL!RfOePt0E*?-w>vc`F zFLoR~H8O{D0Fhbf&d=`-+1DWWi~EgA3{w%CBurf@x&z#)AS%CTjBJ;NXfEz(-q*!r&D zRZs9Vt%N#~h`fZ2dF&WAUxzdNEE zLcQ7z)<&U)d{TxG*7ZfZU%dui_e8AOG#Zu1*(e!@&OEmtgjVAmsh>Px!}hna+U*4u z-(P@*kBOd~_&ckM8!+$m47a*D-IZ(wJ}aDF{e;O>YW!u636JA2%GNI#9Kc(nk+Ttf zZ5oR_VO!WXDMZ#m`6;XjkCv`_D6eahzuUOoqFaafSiYTac<;TmC>LuaHD30rCoEXh zD5R1Oih#JsO2+Mq%9NFu7{5RCprvtcFS~~}?Jc*n#%9=R+B~=%4@*03!EPJP0MrnJ8N%7FfRW&1jKLlO`E6 z2Nzeo&ri0;XG#nsf-QzGDH@1K!SO+oQz;nwgfHIg%HhTbyKTOO$NB{~co(lFCB3>E zA&~-M`}RVuy48f;Y-C?8l|c;|{QHGA&~=s7pAt2h>u zaS=yuntEie>)yAC_-npL!3zTFzOgLKZ}$=3sW+~_Ul7!!J>-L1jXDCh?L;zNtpzrIp_ZRL}JEMXYA5@jiafE19#aIkmj zpOVnI=5TB*VZwzSHn(G2*x&nZOKW`I9?Av!cNOvbi#$Fwg7v#&)Ar=Xmc9st_ZL_3 z{@58B!k$KOp%D%6encJsnot-_4XUH2sc#F@HGpawXltoKc?EQiVmJC91DQf_cccHm zAysqDoo4|5*kD6(qXoG55dp>oiYrkGMRp+(t%)uKx-Xk($P)oj2rRtP1Q-4<4m6z) diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png deleted file mode 100644 index 1e2dcfa02057f16f9f89e31fada93991c4eb9ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png deleted file mode 100644 index a92fb1d4af622cfad770d7c494121719a7896e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=d7dtgAr-gYUQ-leFyLX@@b&p` z%gbN)&SLHDYV<0q^J4_6fq?|&@*V6j4#NRakTDF}Z~@#RP$drMna{J{ZM0wU(H|t@ M>FVdQ&MBb@0L8N*<^TWy diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png deleted file mode 100644 index 930ca8d95e8bee5a1240fba645d9dab919abd734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=^`0({Ar-gYUf;;epuoZ6aJO@& z%&D0-IKvGL&8p&qV;O7KuliPO1yl(K>(rHwor_8Hg9|Y9Gj8!^hz0Vk4~QZ}ABcvv nF)(akj$uTI?LshtEWgbR4Rf6*RPme*0Ev6L`njxgN@xNAEX^ml diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png deleted file mode 100644 index 45a0f1da0d01b7c0ba53830285c67d629bd0774a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~2MoaSW-r^>)^McjrWjeSoS8SCOEBs|%|?VJ7D=T9Yz_dLJ8 zJ9zK=&-=vhubx}{vF6<8-!m`2Et8%6G=f2_fi-~)r;kY>>MAgRkm@i7CT&PKJ^T(I*&Av>d6O5U0r~;hkX|;LrY6t%e!5sze0;lgN zzhmA1v9d1mdTWRDgJXqP4j5dhQr@DSSRpJN-*(9Bjp4$N@%tt%vt{r<#9TCmVT&q5 zPY_dpf5x8W&TrHi1EzgwuzL61gP~v}`*h7_ev9YX^%66WzmeOz)Rwd1sPzfWyZX+; ziqW^(w(Z~haJj|{8OsISSA~|G@%CQ8Y_d#7=yl$KAFm&t%#H|W$kcQ2;yBguIO76W zkG?He)AQ@KipLqRU6Nb%FPk$;xS@jW=|$x{C80dl?QT)`*~FQi^@N=fie6YGbN2D| z=`W4NG-chmgqp9bsxquQQuyVroI59@gwb7QnV5NMi~&p85J-Uv+l!N+#T%5W;<7yr4}f9Ow$JGA?da_{7}kE@t}@ET5LG{B2CIDTQC8`Twj U_qmZcFi|piy85}Sb4q9e0Mf@O?f?J) diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png deleted file mode 100644 index 528e554abe239137182dd9069d1fa4ba02a109a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmV;Y16cftP)=+L@6RIMT%_@p^A^X5UDRjLANf13Pq%);A`Pd+=!;23pXx; zAif`nPef)@LW&ftmV!!=U?`shr5Kn0)zPywg_Q~)Xf6@UsrA5Be7{a=6EByPs``206cpncnr4<@!q@mA~gUzaA3%HTX+%kDFHYT5Qf!vm`Me|1djAs_x*GR z&!z%kGhWI$<|3X<1;9qUl5@-=4yFR&S{y_@$C%@oE<1op+>aXzjC~!)$_ii$_F+%K z@y9V;#ya3q+!Mu4ce-D|$M^yJarJ;X=I|E&DieT9a7UE58@rw_;mfG%mg3n4+>X7G zDINV8W$>{wd4UPs8tHyn<_K%Vx4t-F{HB0#CbHyT8aIH=*w&T4zhI%?@Yvw4$UHw9 zfiH|AwZ;Wt3m(R<9MXfe~y?7+&yyx)=z7N}~%m5B!YmPaWaH#7@Q+5E; zIqP##(=Vn1;7AlEd2}e2K@tF-TcIq?su`V~Rw@AYX?JP!=ya5wR`qE`V>4fQR+^F$GWKC7sT4IxUFgD9>&BxJs0#D$E0dq8B&$(De03B_O{zBGgT!>|}k{a55 z!O~xj?u?9>EHL(EoJ!?lWDg$AX}pf&%~Sx?@v3~6qvvqAx*Saezy`dwo-+WR!8JMF zpTip|0k{c|kLwhu)oQ!f;y+34?@=W6(zkfKXdO_i)poDN4CtH&58$o=8{em4rdmY+ zbb?>20J>f0o#8w;#fEn(4AdV*y+C*HYaPJI-C#EObp@bT@IwJeLH&YX7XStYpFDt- zf=?R2Fu^AaVA$Z31du2AoO(cqH+@Lz(5e*i5O+3-*HCUO7(002ov JPDHLkV1h8vxv&5L diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png deleted file mode 100644 index 998f91be9c4dff50a3ac354a3810a2afe39fe32b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3784 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 Z$DPpsU&xgE;c;3340Mc9_1aGO{{Rgi%2xmY diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png deleted file mode 100644 index a4cdf1c7927896d70e6b9f6af2eaa64b1bb41707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3037 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 S!l#~*4goMWSah`&G3sAAl9aOm diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png deleted file mode 100644 index eda10e6123e1e1383c4617228ec0c96680d60dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX30u5yFboFyt=akR{ E00Z(eO#lD@ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png deleted file mode 100644 index eda10e6123e1e1383c4617228ec0c96680d60dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png deleted file mode 100644 index e4b33935a3aa4f1af3fa9e9e199b5c47d43f4b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn2vPZ!4!jfu$y_kK-b diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index 88726b69160589c8545759440e8d4e69dc984c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^azGr$!3HF6SgS1tQk(@Ik;M!Q+?^oIXnykaTA*No zr;B4qM&sKXhJ1$tcw7#es=J@sd2yMiyW@jyg@u(=2qh%>1r1WJE1Ls*cJ{|veUO|(2?8OR-p?Vt(<)KXNk*dJ1<_`!jRpab6RMK;Rk47fDU#NEX#7yk4(~&Fr}L7DZp)K} zK)DDZgb+dqA%qY@2q7)3S*px^wsY!a9l?~jW2$HoDfOAoDc4?$q=mJH$Q@HesW|pH zEqI5t5pt#=^`ykNb$bDA+g_!6r>E#0Ebxb)V~E)@66{HSu%o+0#^7QK=<56_<*0g z4?VWXMFRkJB8s~XX6q}?LEeWW=Ef--P!X+fp` zQ#hbt=1@CWv@?Vrj0n$wG-wfB>s2&!$QdDJ0ulZgw-cuRiR{Y>^Hj3K6cvDZyr8vA z8lxp5*y$r9!v6G_XAF7`2PhmT)XW;J_(x39;8bKfgMu`e! zU+jWXwIOOF0-q>8C*JQsY~7_bBCuA z|Ap1-2&vJi9g(t&*dI@qVtrbEm_q)8uxlUymW^N&DQrSTF2REQdw9B(B*Fk-L?96w zfdFVX0=tCgq*<4>5rKwy4p!?>V+1b~mqyqhPm^M8N}pNlWK7Aa(;L|rtB1{dT%;u; z=)dm(?jeLfE6zhUB!2hW01y9MdY)1v=ujhBx3b+Xm&>Pd9KV)clx)K|j$bdA%O^}( zPFj=H`w_B~E-2}`eIdjBd_I2}hT(GvVW{|jkQIawhG7^!pU>wnc#H_%SRreOrJP6k z#f!~#`~_1^!^gPqw^)9R`+vop3DslHn(o!PiI0dTt@|45Za=)m1`%IwEW{fV$LVaF zE9RVsAMaWMjZlg;f(R_4iy{7r`=s=`3SdP<&^M)TPHqgUw5?z25;3$902*NlyMU*S zpa+j$RH$BIEX`7~H`b|A%pl=Pj|o!QHv-L&MvImjnCmfv9y@5Gq|A_|G$L4MNvqdg zg%(@J38}FG4N!(%uhEggMhM*%9HY#I^l zO-Wr$p$z~$ref=30GgqO)XJdORd}!BEq>NeB8p9{v^kJo2|NxCQwf^HCpGf6X;Wp4 zg!hgmb$FtdtQ>ASMriqL^@|$FBEhNWjw@zMktp~+Gzo9nO1w>OhBUKE#}ER(1L)vD UI+1b(O8@`>07*qoM6N<$f~tseq5uE@ diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png deleted file mode 100644 index 93066c8403ddaac9b19571152ef499620bcc0e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcmV+q2JrcbP)ZMyJc+a5x+ehm5NR9U3;9%`Hyz-(tJnPJWK72_ZxFO$7HJ!wl=MA(TM` z5z;&LLlB#EA&f^$3`&>pe6X)LdJ&`vfROKm-xd+jMbSqLMZ|438|}{L$EEgM9M^%w zHa{i`W4qmEM~t#0eOdu-0W1NOh@<%YUknyuBI#0I?3#!O*zRI&T@|+kOaOda%IhNv zM;99T5trXGZJ+ZJPec%b)$c$hhFbzf1btKUoQ@WxJHBtqt%Djjh@==IkkXLZmr_R= zETUs(|D2YHL30h7B}jQ1@s(0WN*y++$>%9Px0_7;Q^61da}ymGVa5oGC6I`(Se|An zXj@SBzbdSFK)Um(Fw#d8Mr2~>phE(63xW_TA*G~C`G7107k~`S4FDISDe;mJcscGO zI_^QW2+SjBmZ1U=9v>gytZ(L+77q^(-%!w_2qCD0PZix`L1IaO$h(b>d0@F@G3Eaa zi55W^GL}q#AgNiNjxa=>FZdR(r+ zxE>NCSff^sd0^fBMHn)m#E-cU=7+{dF-K!9f{S1|kOWYSoDj6e26s~&lfViRc^MJj z^>Y9iF9eSfmVwbcxJ7UPa3MH8F;)otZ%)TN7|p{_AvpQV#UO5SLMWM?>!O$+C0vaD z8(N!X1GsBg3ar^sKmkXku0dO*!9}nfXnYiL)Hg=pYKs73(^zvc9aG}t;{#B5>C;Y2 z2$?l`wfXukgc)%>9s%7AsDyH^rRNDOAHyeHMgYzG`@1jfJOi4h!RzZQK)65|cOA0& z28%R3H(uBEzOL&YU%_z=>~=fscDp^gsmfTk*1@j+TejVzGC zpG{n`bp4r^(iKT*Io^&x%OHc_WZd_EkhCG`k)*sFZ|A&V23>!#)HToxrIRJ-1q1Q~ z3qHxB_z~+bgihSWK3otqlC9O%9BoMC(eAot5j0oOB3|pwbjUE4*ONZd@_Kxq z*B8(0XhE_FfV`ZZwcn~gXn8&5;sQ&h03_lPHzc@QD2L`A0DB!p$qE$r97Hn6cmgfM z$;^GEI@&qEx+o;VEJ0ZAK#dKOL6F|xU|IwgE6|`&x_D{{k^myy5)6fQcS{yR>LIlD zb0eL(UISu`k;Dp-=L_3_9uII4xG36?ZZ5uUxd1Up2yq&z=dNHjN&oIh<{D_CLJUbUG4w?002ovPDHLkV1n`$ Bwt@fv diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png deleted file mode 100644 index 345f5d3067c1b5a2b13f7234238468e8083e75e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTMQc)B=-SoFS~;>gutz{8S$H2ll||1$b2>+ab^8r zChoU9-sVBr1cr+EHAcpdxgPN?*fw!WN@w!F_di=AUe22-xp-2_jNr43yl#?i1$i|o QK(iS+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTPFdAc};SoFS~;>gutz{8S$^!?BO&wHlFT~V_1=)TZ8!I{mdT_A)Z zztl5%UbEjFE&+!7%~#Kq{9)d)y{;#I@4EEH*bSem)2!T7Pp)1*OL*gdvC7^*b6)~Y OX7F_Nb6Mw<&;$Uil{z^9 diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png deleted file mode 100644 index c6c3f1ec248835c16ee8a8f9d253769ea4196468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmV+&1>*XNP)>2T29Hys?P&Vm zZA9*OOSNlf`Pu!y*8AUEO|D+e=9Pi3BR)agfw#}SukU>S5_JQH{fFX7qt#y26-7>F z^lg#%AL~){ay($Vl%dNK|ns=8F95J5u4IuT)_iO}FO5AO!x2YA-ev{((MiCMb95Z27y1N{d~<$0ZOiAzT-4$^Y~d8=D&GctVLiOE-HZCX=>916 zaB}eD93BUF6!cN|FY@&i`W7!}IIL?H*U-;b(9ZeC>T4fo-D~%;%Al$SM;o1{CK^c@ zLsL?U%;F5uW`mKV6p@jG8Wm~81rvcAg~E0r38^#=q@={j6{7*N{-mRal zZyi757l1u@+(UUVUpKQfbx4*^AEZ`NBGTk&djR!;W=;+8vR!2ZvkZUiF_Uw;@^@UHY_tFNo|bZ|HqK}~Z_0kB z>1@!nFOf~^{KOi&lvG5Os4i`3m5LaZ>S{(}C2cS_3u25qx+GSC0x^F*mC<6C%zjX} z`(@Gi@=yT|C0D;bu>bAn+W30Hh5ZfH4VVpRc=$wP71`a_ciV~TTQkNXRQHQat7toU zZx*3Z?Q~QYQO|ZUR_Tl#qXtzIiPWWo(#}&aV(i6KuEST$lYVRUVscgaEz?@VCh+@z zYdAdahv=OS&fP(?9$16?`l0%F3gfnP`B71?hw4@2e4pjZouU=>X|R*`N-YD-DJj}uU$#5 zV>X}RzD~bXHhFf?KK=4JTCWrMiS*`U`G2n9l*Y@cp7B$uQwuKJNIF$*XNP)>2T29Hys?P&Vm zZA9*OOSNlf`Pu!y*8AUEO|D+e=9Pi3BR)agfw#}SukU>S5_JQH{fFX7qt#y26-7>F z^lg#%AL~){ay($Vl%dNK|ns=8F95J5u4IuT)_iO}FO5AO!x2YA-ev{((MiCMb95Z27y1N{d~<$0ZOiAzT-4$^Y~d8=D&GctVLiOE-HZCX=>916 zaB}eD93BUF6!cN|FY@&i`W7!}IIL?H*U-;b(9ZeC>T4fo-D~%;%Al$SM;o1{CK^c@ zLsL?U%;F5uW`mKV6p@jG8Wm~81rvcAg~E0r38^#=q@={j6{7*N{-mRal zZyi757l1u@+(UUVUpKQfbx4*^AEZ`NBGTk&djR!;W=;+8vR!2ZvkZUiF_Uw;@^@UHY_tFNo|bZ|HqK}~Z_0kB z>1@!nFOf~^{KOi&lvG5Os4i`3m5LaZ>S{(}C2cS_3u25qx+GSC0x^F*mC<6C%zjX} z`(@Gi@=yT|C0D;bu>bAn+W30Hh5ZfH4VVpRc=$wP71`a_ciV~TTQkNXRQHQat7toU zZx*3Z?Q~QYQO|ZUR_Tl#qXtzIiPWWo(#}&aV(i6KuEST$lYVRUVscgaEz?@VCh+@z zYdAdahv=OS&fP(?9$16?`l0%F3gfnP`B71?hw4@2e4pjZouU=>X|R*`N-YD-DJj}uU$#5 zV>X}RzD~bXHhFf?KK=4JTCWrMiS*`U`G2n9l*Y@cp7B$uQwuKJNIF$+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTN5dAc};So9|U`2XLYnVI=;y-5$#f-D2o4GsT&Tr`prfMCHsr=)`p zy9zZlQWAk&gL|Kjh|gcN+0MxMkn!S`=@A+#%ic(Om>d23|9^ht#EF9It^fc3f1ZP3 Y!dJ=4-o~HPfwnMsy85}Sb4q9e06h#o+yDRo diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png deleted file mode 100644 index 205b66e2cdef686c5ed6369b14e64b38d0182984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTN5dAc};So9|U`2XLYnVI=;y-5$#f-D2o4GsT&Tr`prfMCHsr=)`p zy9zZlQWAk&gL|Kjh|gcN+0MxMkn!S`=@A+#%ic(Om>d23|9^ht#EF9It^fc3f1ZP3 Y!dJ=4-o~HPfwnMsy85}Sb4q9e06h#o+yDRo diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png deleted file mode 100644 index 19517c4b0aee1010c7041a76089fdfdbfa495e80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2769 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 diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png deleted file mode 100644 index d8929fcd1864e92c78f24d34bb07ac0304bf5ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P)%)khMb;v@5Yo)-?A$vWI3J{&4Tqm)VM&;#i3-!rXQ;}}A|kSK_xLoQ9!D=| zrQuRX_jo!D&!*woG(4MzXVdU(8lG)+!_Dl;%pOYTRyEwrUVwMtwRCnh!_9059DxJy zTsprAUsT~zdJlX8e>K+(FMd_}2<&RF8#?@^bn(8vHtbfpl-_eLJ!>=!D!!z&OE12( zv`a1CqqIva-mA1rDc-ZR3oqWgvUXO(tc zif5K~i;HKMc8iLSDD9eyk1Fk&iksP%L8V=5@ekmQ^NVfO%k2z5z^Qbob@&(X-FR)u p3HS~A?&0(Ut%!)oJooy?_kZokYAURbJh}h?002ovPDHLkV1n7-uz&yn diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png deleted file mode 100644 index 9174c4e4bc984a89e1ed643bc66b1569466ef52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmV;50d@X~P)pS_@$ zhD#gW|+S$zvH?tjZ06u}I z+WCj@MGelS_rM46*K*DD;uob4z^?VWsl%^ISMTdf({7b>={={?i$=qw;%iE~^x|tv zyVT+%O1re;qe{D!;v-AD@ZzIOyU^khrCnI@sM0Q^cw}ieym)kJH?(+0X*aBRR%th+ zcxGw0x_EYJx2pJz(yqJstkSNlxS72&skG}Y{tg(Y7u%+n+Xa4rW9?Ay@Gs!I^V*st o@Ei2q)9D9V5fPDPZuO7v|4Ms3SH1lZVgLXD07*qoM6N<$f(F>P&Hw-a diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png deleted file mode 100644 index 3015d307088f12d52a9e99ff4575fd2153127e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmV-@0fPRCP)hG*08Y#N?T!?S64w!;lKvy+*1?>p3RGdlx#190x$dzj&7b^-9QUftoB@I?dG z(l;!l|3;oEFaA*ajtwD8hd-6>9*;+5M`bO2!%}+FXrQS0p3;u)|QJUO}XO$+G;+dssck%4fw5xbU zX__uxRhp)XSC*#P;_m>iSbo@k`^^CW{9xcU{p|2h0AG{O_A~&$L7!btFK9(XM7DX= bKfeD1Etg?&Fp}qT00000NkvXXu0mjfW#pxI diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png deleted file mode 100644 index 126637d1194f1d6609787774fb140818eaa4ba1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmV-@0fPRCP)hG*08Y#N?T!?S64w!;lKvy+*1?>p3RGdlx#190x$dzj&7b^-9QUftoB@I?dG z(l;!l|3;oEFaA*ajtwD8hd-6>9*;+5M`bO2!%}+FXrQS0p3;u)|QJUO}XO$+G;+dssck%4fw5xbU zX__uxRhp)XSC*#P;_m>iSbo@k`^^CW{9xcU{p|2h0AG{O_A~&$L7!btFK9(XM7DX= bKfeD1iaRu(IeFS@00000NkvXXu0mjfR7Ip< diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png deleted file mode 100644 index d45c7a864d9b36fc5d06ef7650bd22c228e3533e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmV;Z0$2TsP)JMg@Fn128fNR{httc z2n-9ae~A~-WYQOAyjJ3`v+tFS>H?h>cjZI44!YCDJ4vU-UH-NFC!H?dNqTY9^x~%J z#ZA+To2C~xO)qX5=ft;__PrJUYC9#q>!rbyQFMFHPb=3hoe|&n)9~p|baWUbMthlMtLL6k^E5&wx9H zfkWKo4DxGy27JSv%4KLW#~I|sPnXY+fCHfNj(}ks%-+uyBgtHbMG(R)| O00009q_DOpcx|jv*P1Z)f>u3p>g<+)ulGcHZsoOUd0`v$ideb3Xs*rv6J! zg}R0?Ejbavstni13%M+(h~#=Y?=G{+sY|c-R?LyC;M~J_EGz53I-4BR z+cU4@A4T%4{LQ{7{nooe_R?;9Ufq56+wp;!Z_W|LdHU^V zuiix!E)rt*mg%eid+||lw)K3kxzR2XQeoHKTo0e>Tz_Z7KF;I+KDl^G6{a%9AKj}v z@Aq1v55LRoZXbD)<16^lF!*Li$^7}+)mu{zFEMCaSs}k;w&aatvA+!FKCV6>P_Fen z(L?roLe!sxPkWei7+T9&rtD<0W7^%ZdcE}hdZyQpKhHVIBAEwFVGN$GelF{r5}E)^ Cjyh@p diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png deleted file mode 100644 index 2cb34d7f60401a563454c03e266cc5181d9de996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmV-n0-pVeP)%5ec8;(Nh#y0Zthco9&fD+Scz(J_kqCSd>@N)Jrb#iJx@ z@geV)|0U|;Q8J4AW)%0$DDIn4+&81RZ$@$73{E^#CTa6Odr;zqGLyGk)zfLB)26Y5 z5#LU9dOW?JALQjc$4r{WH?GVFg))<)qMW_Ts@W~*Hgkd(m(u%LwVNxGwVfAK{BG$~ zHD4Zg33jP$CptYU%GrKa?RJ%hK*cvHEqE`!X=%Z0aT}!tZ^dnu7Q7Uk{&1!u)wl@^>7cUfAnUfgwQ!D?|Ir3GuneU%oh6!%$L*todw(!xf?LzEVJ7Y|ih z=v92GOd6`R(5v{nqI~u|T|T)5eQi`_Q>fI*QllCl)AthpQf>YCTIE0c%xyxW%x|6C zG>z*e{-?!>T@(EFL|;a6&!||%qb(l4cp2298zt1@mjOk(atXEgIq-{NzY%9xIi5qk vb6%{!-vcjz*7vDBaRYn@J|M2KzWDwRiVUw(_ikNA00000NkvXXu0mjfOP&sp diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png deleted file mode 100644 index 82f752fdc28390f1dae188e66886f9fee783b4f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmV-g0;TXoV&|>P?2N3a|H=XkIpb%g2C{mUcD8z%K5!WW71`A3B@}P?c zNzmeTUM-&`=;A@rh-=e`Ytx8p(}-)+h-=e`Yg0e*Nfwct-zMuNo?gfN+FNCOm6(Rs zNBrh8;rK_F^Mfu~8k>e2?@WdCI_7lHVR+IZj_>A~;=j0*zBpPVOJB@8&9C^w(v!^i zcs#`4qjGbZa60I4akN%e8hjOBptPW0e8JL!ZgC5x1-;^yN((y0EtVGC7q?tma9i9# zX~A7_N2LWf#T}Lw>=$=jTCiJOp|oJHxKe4sPI1N3!s5l1OACt?_fT4>Uffe@p<40r zRpP6(P_6jSy?2bx-x9}n#O>6o(Q^BiC^BxWR1^RB?JvEr|0>Nj5k)!eSD9&8HSzXK z2sbij-vth4?P;pL%~0mos(Tg<|DAn;kcS obzts&Y9%t@53qx{hWg?AJqc6disFjI`v3p{07*qoM6N<$f`4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5@_=ERFyG diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png deleted file mode 100644 index e4229f26b2771d884934b80d0056b8dd66d10edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8+o-U3d5>t~6?){q5*x2~c-l(n1@K5>ymj5$1a2Oc?!34d7Ck`Aq skg(^gW|wXH-lZoEvTk@AJm}J3sQWAGentL}KF}BjPgg&ebxsLQ0KFYBT>t<8 diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png deleted file mode 100644 index e862cb12154541c150fb2d9bb98872bcff506317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5m8aUV+M1MLNsm8aUV+8udAXlQhooEaFu)>JVsC;_i|1;&qn1z`CMwWxmD@8>XG@5j{z4 Z4Ch(42+t_Fa};PGgQu&X%Q~loCICWDCD8x? diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png deleted file mode 100644 index 98f4871bb52aa7c60414b62dc102a63025d14b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq+C2*978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v1b%el;0fY!m7fYzsPhAkg_?o6!P}0Ord_0t$qVOiDg+P{Wat YL8LkPQkkjERiJqcp00i_>zopr0H|OnC;$Ke diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png deleted file mode 100644 index 733373ed38d92906a3f639124b60d39cfe3ea469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq})7R978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v20J8xM$gbsA4Oq2MIp#mnr@>uNTIF}6W!#;>-fvxg@opE#)D b$jGop@Lc3+&hjll6B#^R{an^LB{Ts5lN~2O diff --git a/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png b/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png deleted file mode 100644 index 0c6bb036dbff7c452df0032fac9daaaf3ed36cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq})AS978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v9t$CDZ2p!k(eA~|x?WSsfj bIFlKwHfSC=yJ^W9ppguou6{1-oD!Mm8aUVm(v9t$CDZ2p!k(eA~|x?WSsfj bIFlKwHfSC=yJ^W9ppguou6{1-oD!Mm8aUV)4xTaopEyItdE!^$Tn)$h3#7aBEDrH5l{lPKbU~WStl#0CqS)dY aj0`i|)DAxoJGT#LAcLo?pUXO@geCyp{V3}I diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml deleted file mode 100644 index 85c2c0212..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml deleted file mode 100644 index 85c2c0212..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml deleted file mode 100644 index cab896283..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml deleted file mode 100644 index 42ba8a0df..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml deleted file mode 100644 index a16f4b22e..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml deleted file mode 100644 index 256de80fb..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml deleted file mode 100644 index 2588a492d..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml deleted file mode 100644 index e2078c967..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml deleted file mode 100644 index d99b7a426..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml deleted file mode 100644 index da5fb2e86..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml deleted file mode 100644 index b2ce4f0f7..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml deleted file mode 100644 index d7e31b1d1..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml deleted file mode 100644 index 08b8b12f3..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml deleted file mode 100644 index ada490bf9..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml deleted file mode 100644 index bd19140ab..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml deleted file mode 100644 index 321f07c8b..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml deleted file mode 100644 index 6d4814f86..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml deleted file mode 100644 index 26284187a..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml deleted file mode 100644 index 0d00c5878..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml deleted file mode 100644 index 4af5e22a9..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml deleted file mode 100644 index b78508478..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml deleted file mode 100644 index d34e20811..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml deleted file mode 100644 index b6d58c040..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml deleted file mode 100644 index 3d6acf808..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml deleted file mode 100644 index 05ff4eda5..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml b/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml deleted file mode 100644 index f6d61e57a..000000000 --- a/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml b/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml deleted file mode 100644 index 8811dad8d..000000000 --- a/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml b/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml deleted file mode 100644 index 6c183c059..000000000 --- a/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml b/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml deleted file mode 100644 index 61dc02527..000000000 --- a/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml b/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml deleted file mode 100644 index 040df44ab..000000000 --- a/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml b/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml deleted file mode 100644 index c64ef141b..000000000 --- a/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml deleted file mode 100644 index 5c1e9ec4b..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml deleted file mode 100644 index f46f7a044..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml deleted file mode 100644 index 0d51220c9..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml deleted file mode 100644 index dd69acada..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml deleted file mode 100644 index 13149fd63..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml deleted file mode 100644 index a6f8e53f8..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml deleted file mode 100644 index 7168dc77f..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml b/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml deleted file mode 100644 index 875ec3e1b..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml b/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml deleted file mode 100644 index 6a0ac9ece..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml b/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml deleted file mode 100644 index b430032a1..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml b/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml deleted file mode 100644 index ab2b0ee6c..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml b/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml deleted file mode 100644 index 39aca3a8d..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml b/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml deleted file mode 100644 index 55ab28a24..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml b/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml deleted file mode 100644 index 147f36fe8..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml b/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml deleted file mode 100644 index ff54bbecd..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml b/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml deleted file mode 100644 index d42425ad3..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml b/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml deleted file mode 100644 index 1fb82fe9a..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml b/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml deleted file mode 100644 index 0961ef561..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml b/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml deleted file mode 100644 index 33e2dea0d..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml b/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml deleted file mode 100644 index f8b9fb185..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml b/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml deleted file mode 100644 index e1d3dc49c..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml b/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml deleted file mode 100644 index 6ba319121..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml b/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml deleted file mode 100644 index 8fc0eb12c..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml b/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml deleted file mode 100644 index a6c6252d2..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml b/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml deleted file mode 100644 index bea740178..000000000 --- a/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml deleted file mode 100644 index 502cc16a3..000000000 --- a/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 40dip - - 4dip - - 16dp - - 12dp - - -2dp - - 4dip - diff --git a/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 3312cfa7f..000000000 --- a/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 48dip - - 8dip - - 18dp - - 14dp - - -3dp - - 5dip - diff --git a/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 502cc16a3..000000000 --- a/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 40dip - - 4dip - - 16dp - - 12dp - - -2dp - - 4dip - diff --git a/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 3312cfa7f..000000000 --- a/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 48dip - - 8dip - - 18dp - - 14dp - - -3dp - - 5dip - diff --git a/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml deleted file mode 100644 index 35910333b..000000000 --- a/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 56dip - - 4dip - - 18dp - - 14dp - - -3dp - - 9dip - - - 64dip - diff --git a/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml deleted file mode 100644 index 63b12f7f3..000000000 --- a/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 55% - - 80% - diff --git a/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml b/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml deleted file mode 100644 index 7a48e1542..000000000 --- a/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - false - diff --git a/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml deleted file mode 100644 index f67853817..000000000 --- a/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - 56dip - - 4dip - - 18dp - - 14dp - - -3dp - - 9dip - - 5 - - - 64dip - diff --git a/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml b/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml deleted file mode 100644 index 03473572c..000000000 --- a/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml b/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml deleted file mode 100644 index 88a60dd92..000000000 --- a/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml b/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml deleted file mode 100644 index 5fac1ab58..000000000 --- a/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml deleted file mode 100644 index 6f49d7e47..000000000 --- a/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 3 - diff --git a/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml b/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml deleted file mode 100644 index 3eaf4aee9..000000000 --- a/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - true - false - diff --git a/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml b/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml deleted file mode 100644 index 88357b0a7..000000000 --- a/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - true - - diff --git a/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml deleted file mode 100644 index 2fd4deea2..000000000 --- a/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 4 - diff --git a/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml deleted file mode 100644 index b085952d3..000000000 --- a/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 5 - diff --git a/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml deleted file mode 100644 index bfc535de1..000000000 --- a/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - 56dip - - 4dip - - 18dp - - 14dp - - -3dp - - 9dip - - - 64dip - - - 45% - - 72% - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml b/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml deleted file mode 100644 index 32631ca8d..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__bools.xml b/plugins/ActionBarSherlock/library/res/values/abs__bools.xml deleted file mode 100644 index 0b432448d..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__bools.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - false - true - true - - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__colors.xml b/plugins/ActionBarSherlock/library/res/values/abs__colors.xml deleted file mode 100644 index 625c632ff..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__colors.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - #ff000000 - #fff3f3f3 - @color/abs__background_holo_light - @color/abs__background_holo_dark - #ff4c4c4c - #ffb2b2b2 - @color/abs__bright_foreground_holo_light - @color/abs__bright_foreground_holo_dark - #ff33b5e5 - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__config.xml b/plugins/ActionBarSherlock/library/res/values/abs__config.xml deleted file mode 100644 index 4c7b5d459..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__config.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - 320dp - - - false - - - true - - - false - - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml b/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml deleted file mode 100644 index 831289e07..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - 48dip - - 8dip - - 18dp - - 14dp - - -3dp - - 5dip - - 2 - - - 56dip - - - 64dip - - - 65% - - 95% - - - - 8dip - - - 8dip - - - 32dip - - - - 160dip - - - 320dip - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__ids.xml b/plugins/ActionBarSherlock/library/res/values/abs__ids.xml deleted file mode 100644 index f9f56045b..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__ids.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__strings.xml b/plugins/ActionBarSherlock/library/res/values/abs__strings.xml deleted file mode 100644 index 06a2a2af4..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__strings.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Navigate home - - Navigate up - - More options - - - Done - - - See all... - - Select activity - - Share with... - - Choose an application - - Share with - - Share with %s - - - Search - - Search query - - Clear query - - Submit query - - Voice search - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__styles.xml b/plugins/ActionBarSherlock/library/res/values/abs__styles.xml deleted file mode 100644 index 45a18c183..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__styles.xml +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/res/values/abs__themes.xml b/plugins/ActionBarSherlock/library/res/values/abs__themes.xml deleted file mode 100644 index 634fa798b..000000000 --- a/plugins/ActionBarSherlock/library/res/values/abs__themes.xml +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java b/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java deleted file mode 100644 index d93de4c6a..000000000 --- a/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java +++ /dev/null @@ -1,144 +0,0 @@ -package android.support.v4.app; - -import android.util.Log; -import android.view.View; -import android.view.Window; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import java.util.ArrayList; - -/** I'm in ur package. Stealing ur variables. */ -public abstract class Watson extends FragmentActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener { - private static final boolean DEBUG = false; - private static final String TAG = "Watson"; - - /** Fragment interface for menu creation callback. */ - public interface OnCreateOptionsMenuListener { - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater); - } - /** Fragment interface for menu preparation callback. */ - public interface OnPrepareOptionsMenuListener { - public void onPrepareOptionsMenu(Menu menu); - } - /** Fragment interface for menu item selection callback. */ - public interface OnOptionsItemSelectedListener { - public boolean onOptionsItemSelected(MenuItem item); - } - - private ArrayList mCreatedMenus; - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean result = onCreateOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] activity create result: " + result); - - MenuInflater inflater = getSupportMenuInflater(); - boolean show = false; - ArrayList newMenus = null; - if (mFragments.mAdded != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnCreateOptionsMenuListener) { - show = true; - ((OnCreateOptionsMenuListener)f).onCreateOptionsMenu(menu, inflater); - if (newMenus == null) { - newMenus = new ArrayList(); - } - newMenus.add(f); - } - } - } - - if (mCreatedMenus != null) { - for (int i = 0; i < mCreatedMenus.size(); i++) { - Fragment f = mCreatedMenus.get(i); - if (newMenus == null || !newMenus.contains(f)) { - f.onDestroyOptionsMenu(); - } - } - } - - mCreatedMenus = newMenus; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); - result |= show; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); - return result; - } - return false; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean result = onPrepareOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onPreparePanel] activity prepare result: " + result); - - boolean show = false; - if (mFragments.mAdded != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnPrepareOptionsMenuListener) { - show = true; - ((OnPrepareOptionsMenuListener)f).onPrepareOptionsMenu(menu); - } - } - } - - if (DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); - result |= show; - - result &= menu.hasVisibleItems(); - if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); - return result; - } - return false; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - if (onOptionsItemSelected(item)) { - return true; - } - - if (mFragments.mAdded != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnOptionsItemSelectedListener) { - if (((OnOptionsItemSelectedListener)f).onOptionsItemSelected(item)) { - return true; - } - } - } - } - } - return false; - } - - public abstract boolean onCreateOptionsMenu(Menu menu); - - public abstract boolean onPrepareOptionsMenu(Menu menu); - - public abstract boolean onOptionsItemSelected(MenuItem item); - - public abstract MenuInflater getSupportMenuInflater(); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java deleted file mode 100644 index ab160f836..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java +++ /dev/null @@ -1,794 +0,0 @@ -package com.actionbarsherlock; - -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.Iterator; -import android.app.Activity; -import android.content.Context; -import android.content.res.Configuration; -import android.os.Build; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.ActionBarSherlockCompat; -import com.actionbarsherlock.internal.ActionBarSherlockNative; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -/** - *

Helper for implementing the action bar design pattern across all versions - * of Android.

- * - *

This class will manage interaction with a custom action bar based on the - * Android 4.0 source code. The exposed API mirrors that of its native - * counterpart and you should refer to its documentation for instruction.

- * - * @author Jake Wharton - */ -public abstract class ActionBarSherlock { - protected static final String TAG = "ActionBarSherlock"; - protected static final boolean DEBUG = false; - - private static final Class[] CONSTRUCTOR_ARGS = new Class[] { Activity.class, int.class }; - private static final HashMap> IMPLEMENTATIONS = - new HashMap>(); - - static { - //Register our two built-in implementations - registerImplementation(ActionBarSherlockCompat.class); - registerImplementation(ActionBarSherlockNative.class); - } - - - /** - *

Denotes an implementation of ActionBarSherlock which provides an - * action bar-enhanced experience.

- */ - @Target(ElementType.TYPE) - @Retention(RetentionPolicy.RUNTIME) - public @interface Implementation { - static final int DEFAULT_API = -1; - static final int DEFAULT_DPI = -1; - - int api() default DEFAULT_API; - int dpi() default DEFAULT_DPI; - } - - - /** Activity interface for menu creation callback. */ - public interface OnCreatePanelMenuListener { - public boolean onCreatePanelMenu(int featureId, Menu menu); - } - /** Activity interface for menu creation callback. */ - public interface OnCreateOptionsMenuListener { - public boolean onCreateOptionsMenu(Menu menu); - } - /** Activity interface for menu item selection callback. */ - public interface OnMenuItemSelectedListener { - public boolean onMenuItemSelected(int featureId, MenuItem item); - } - /** Activity interface for menu item selection callback. */ - public interface OnOptionsItemSelectedListener { - public boolean onOptionsItemSelected(MenuItem item); - } - /** Activity interface for menu preparation callback. */ - public interface OnPreparePanelListener { - public boolean onPreparePanel(int featureId, View view, Menu menu); - } - /** Activity interface for menu preparation callback. */ - public interface OnPrepareOptionsMenuListener { - public boolean onPrepareOptionsMenu(Menu menu); - } - /** Activity interface for action mode finished callback. */ - public interface OnActionModeFinishedListener { - public void onActionModeFinished(ActionMode mode); - } - /** Activity interface for action mode started callback. */ - public interface OnActionModeStartedListener { - public void onActionModeStarted(ActionMode mode); - } - - - /** - * If set, the logic in these classes will assume that an {@link Activity} - * is dispatching all of the required events to the class. This flag should - * only be used internally or if you are creating your own base activity - * modeled after one of the included types (e.g., {@code SherlockActivity}). - */ - public static final int FLAG_DELEGATE = 1; - - - /** - * Register an ActionBarSherlock implementation. - * - * @param implementationClass Target implementation class which extends - * {@link ActionBarSherlock}. This class must also be annotated with - * {@link Implementation}. - */ - public static void registerImplementation(Class implementationClass) { - if (!implementationClass.isAnnotationPresent(Implementation.class)) { - throw new IllegalArgumentException("Class " + implementationClass.getSimpleName() + " is not annotated with @Implementation"); - } else if (IMPLEMENTATIONS.containsValue(implementationClass)) { - if (DEBUG) Log.w(TAG, "Class " + implementationClass.getSimpleName() + " already registered"); - return; - } - - Implementation impl = implementationClass.getAnnotation(Implementation.class); - if (DEBUG) Log.i(TAG, "Registering " + implementationClass.getSimpleName() + " with qualifier " + impl); - IMPLEMENTATIONS.put(impl, implementationClass); - } - - /** - * Unregister an ActionBarSherlock implementation. This should be - * considered very volatile and you should only use it if you know what - * you are doing. You have been warned. - * - * @param implementationClass Target implementation class. - * @return Boolean indicating whether the class was removed. - */ - public static boolean unregisterImplementation(Class implementationClass) { - return IMPLEMENTATIONS.values().remove(implementationClass); - } - - /** - * Wrap an activity with an action bar abstraction which will enable the - * use of a custom implementation on platforms where a native version does - * not exist. - * - * @param activity Activity to wrap. - * @return Instance to interact with the action bar. - */ - public static ActionBarSherlock wrap(Activity activity) { - return wrap(activity, 0); - } - - /** - * Wrap an activity with an action bar abstraction which will enable the - * use of a custom implementation on platforms where a native version does - * not exist. - * - * @param activity Owning activity. - * @param flags Option flags to control behavior. - * @return Instance to interact with the action bar. - */ - public static ActionBarSherlock wrap(Activity activity, int flags) { - //Create a local implementation map we can modify - HashMap> impls = - new HashMap>(IMPLEMENTATIONS); - boolean hasQualfier; - - /* DPI FILTERING */ - hasQualfier = false; - for (Implementation key : impls.keySet()) { - //Only honor TVDPI as a specific qualifier - if (key.dpi() == DisplayMetrics.DENSITY_TV) { - hasQualfier = true; - break; - } - } - if (hasQualfier) { - final boolean isTvDpi = activity.getResources().getDisplayMetrics().densityDpi == DisplayMetrics.DENSITY_TV; - for (Iterator keys = impls.keySet().iterator(); keys.hasNext(); ) { - int keyDpi = keys.next().dpi(); - if ((isTvDpi && keyDpi != DisplayMetrics.DENSITY_TV) - || (!isTvDpi && keyDpi == DisplayMetrics.DENSITY_TV)) { - keys.remove(); - } - } - } - - /* API FILTERING */ - hasQualfier = false; - for (Implementation key : impls.keySet()) { - if (key.api() != Implementation.DEFAULT_API) { - hasQualfier = true; - break; - } - } - if (hasQualfier) { - final int runtimeApi = Build.VERSION.SDK_INT; - int bestApi = 0; - for (Iterator keys = impls.keySet().iterator(); keys.hasNext(); ) { - int keyApi = keys.next().api(); - if (keyApi > runtimeApi) { - keys.remove(); - } else if (keyApi > bestApi) { - bestApi = keyApi; - } - } - for (Iterator keys = impls.keySet().iterator(); keys.hasNext(); ) { - if (keys.next().api() != bestApi) { - keys.remove(); - } - } - } - - if (impls.size() > 1) { - throw new IllegalStateException("More than one implementation matches configuration."); - } - if (impls.isEmpty()) { - throw new IllegalStateException("No implementations match configuration."); - } - Class impl = impls.values().iterator().next(); - if (DEBUG) Log.i(TAG, "Using implementation: " + impl.getSimpleName()); - - try { - Constructor ctor = impl.getConstructor(CONSTRUCTOR_ARGS); - return ctor.newInstance(activity, flags); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - - /** Activity which is displaying the action bar. Also used for context. */ - protected final Activity mActivity; - /** Whether delegating actions for the activity or managing ourselves. */ - protected final boolean mIsDelegate; - - /** Reference to our custom menu inflater which supports action items. */ - protected MenuInflater mMenuInflater; - - - - protected ActionBarSherlock(Activity activity, int flags) { - if (DEBUG) Log.d(TAG, "[] activity: " + activity + ", flags: " + flags); - - mActivity = activity; - mIsDelegate = (flags & FLAG_DELEGATE) != 0; - } - - - /** - * Get the current action bar instance. - * - * @return Action bar instance. - */ - public abstract ActionBar getActionBar(); - - - /////////////////////////////////////////////////////////////////////////// - // Lifecycle and interaction callbacks when delegating - /////////////////////////////////////////////////////////////////////////// - - /** - * Notify action bar of a configuration change event. Should be dispatched - * after the call to the superclass implementation. - * - *
-     * @Override
-     * public void onConfigurationChanged(Configuration newConfig) {
-     *     super.onConfigurationChanged(newConfig);
-     *     mSherlock.dispatchConfigurationChanged(newConfig);
-     * }
-     * 
- * - * @param newConfig The new device configuration. - */ - public void dispatchConfigurationChanged(Configuration newConfig) {} - - /** - * Notify the action bar that the activity has finished its resuming. This - * should be dispatched after the call to the superclass implementation. - * - *
-     * @Override
-     * protected void onPostResume() {
-     *     super.onPostResume();
-     *     mSherlock.dispatchPostResume();
-     * }
-     * 
- */ - public void dispatchPostResume() {} - - /** - * Notify the action bar that the activity is pausing. This should be - * dispatched before the call to the superclass implementation. - * - *
-     * @Override
-     * protected void onPause() {
-     *     mSherlock.dispatchPause();
-     *     super.onPause();
-     * }
-     * 
- */ - public void dispatchPause() {} - - /** - * Notify the action bar that the activity is stopping. This should be - * called before the superclass implementation. - * - *

- * @Override - * protected void onStop() { - * mSherlock.dispatchStop(); - * super.onStop(); - * } - *

- */ - public void dispatchStop() {} - - /** - * Indicate that the menu should be recreated by calling - * {@link OnCreateOptionsMenuListener#onCreateOptionsMenu(com.actionbarsherlock.view.Menu)}. - */ - public abstract void dispatchInvalidateOptionsMenu(); - - /** - * Notify the action bar that it should display its overflow menu if it is - * appropriate for the device. The implementation should conditionally - * call the superclass method only if this method returns {@code false}. - * - *

- * @Override - * public void openOptionsMenu() { - * if (!mSherlock.dispatchOpenOptionsMenu()) { - * super.openOptionsMenu(); - * } - * } - *

- * - * @return {@code true} if the opening of the menu was handled internally. - */ - public boolean dispatchOpenOptionsMenu() { - return false; - } - - /** - * Notify the action bar that it should close its overflow menu if it is - * appropriate for the device. This implementation should conditionally - * call the superclass method only if this method returns {@code false}. - * - *
-     * @Override
-     * public void closeOptionsMenu() {
-     *     if (!mSherlock.dispatchCloseOptionsMenu()) {
-     *         super.closeOptionsMenu();
-     *     }
-     * }
-     * 
- * - * @return {@code true} if the closing of the menu was handled internally. - */ - public boolean dispatchCloseOptionsMenu() { - return false; - } - - /** - * Notify the class that the activity has finished its creation. This - * should be called after the superclass implementation. - * - *
-     * @Override
-     * protected void onPostCreate(Bundle savedInstanceState) {
-     *     mSherlock.dispatchPostCreate(savedInstanceState);
-     *     super.onPostCreate(savedInstanceState);
-     * }
-     * 
- * - * @param savedInstanceState If the activity is being re-initialized after - * previously being shut down then this Bundle - * contains the data it most recently supplied in - * {@link Activity#}onSaveInstanceState(Bundle)}. - * Note: Otherwise it is null. - */ - public void dispatchPostCreate(Bundle savedInstanceState) {} - - /** - * Notify the action bar that the title has changed and the action bar - * should be updated to reflect the change. This should be called before - * the superclass implementation. - * - *
-     *  @Override
-     *  protected void onTitleChanged(CharSequence title, int color) {
-     *      mSherlock.dispatchTitleChanged(title, color);
-     *      super.onTitleChanged(title, color);
-     *  }
-     * 
- * - * @param title New activity title. - * @param color New activity color. - */ - public void dispatchTitleChanged(CharSequence title, int color) {} - - /** - * Notify the action bar the user has created a key event. This is used to - * toggle the display of the overflow action item with the menu key and to - * close the action mode or expanded action item with the back key. - * - *
-     * @Override
-     * public boolean dispatchKeyEvent(KeyEvent event) {
-     *     if (mSherlock.dispatchKeyEvent(event)) {
-     *         return true;
-     *     }
-     *     return super.dispatchKeyEvent(event);
-     * }
-     * 
- * - * @param event Description of the key event. - * @return {@code true} if the event was handled. - */ - public boolean dispatchKeyEvent(KeyEvent event) { - return false; - } - - /** - * Notify the action bar that the Activity has triggered a menu creation - * which should happen on the conclusion of {@link Activity#onCreate}. This - * will be used to gain a reference to the native menu for native and - * overflow binding as well as to indicate when compatibility create should - * occur for the first time. - * - * @param menu Activity native menu. - * @return {@code true} since we always want to say that we have a native - */ - public abstract boolean dispatchCreateOptionsMenu(android.view.Menu menu); - - /** - * Notify the action bar that the Activity has triggered a menu preparation - * which usually means that the user has requested the overflow menu via a - * hardware menu key. You should return the result of this method call and - * not call the superclass implementation. - * - *

- * @Override - * public final boolean onPrepareOptionsMenu(android.view.Menu menu) { - * return mSherlock.dispatchPrepareOptionsMenu(menu); - * } - *

- * - * @param menu Activity native menu. - * @return {@code true} if menu display should proceed. - */ - public abstract boolean dispatchPrepareOptionsMenu(android.view.Menu menu); - - /** - * Notify the action bar that a native options menu item has been selected. - * The implementation should return the result of this method call. - * - *

- * @Override - * public final boolean onOptionsItemSelected(android.view.MenuItem item) { - * return mSherlock.dispatchOptionsItemSelected(item); - * } - *

- * - * @param item Options menu item. - * @return @{code true} if the selection was handled. - */ - public abstract boolean dispatchOptionsItemSelected(android.view.MenuItem item); - - /** - * Notify the action bar that the overflow menu has been opened. The - * implementation should conditionally return {@code true} if this method - * returns {@code true}, otherwise return the result of the superclass - * method. - * - *

- * @Override - * public final boolean onMenuOpened(int featureId, android.view.Menu menu) { - * if (mSherlock.dispatchMenuOpened(featureId, menu)) { - * return true; - * } - * return super.onMenuOpened(featureId, menu); - * } - *

- * - * @param featureId Window feature which triggered the event. - * @param menu Activity native menu. - * @return {@code true} if the event was handled by this method. - */ - public boolean dispatchMenuOpened(int featureId, android.view.Menu menu) { - return false; - } - - /** - * Notify the action bar that the overflow menu has been closed. This - * method should be called before the superclass implementation. - * - *

- * @Override - * public void onPanelClosed(int featureId, android.view.Menu menu) { - * mSherlock.dispatchPanelClosed(featureId, menu); - * super.onPanelClosed(featureId, menu); - * } - *

- * - * @param featureId - * @param menu - */ - public void dispatchPanelClosed(int featureId, android.view.Menu menu) {} - - /** - * Notify the action bar that the activity has been destroyed. This method - * should be called before the superclass implementation. - * - *

- * @Override - * public void onDestroy() { - * mSherlock.dispatchDestroy(); - * super.onDestroy(); - * } - *

- */ - public void dispatchDestroy() {} - - public void dispatchSaveInstanceState(Bundle outState) {} - - public void dispatchRestoreInstanceState(Bundle savedInstanceState) {} - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - - /** - * Internal method to trigger the menu creation process. - * - * @return {@code true} if menu creation should proceed. - */ - protected final boolean callbackCreateOptionsMenu(Menu menu) { - if (DEBUG) Log.d(TAG, "[callbackCreateOptionsMenu] menu: " + menu); - - boolean result = true; - if (mActivity instanceof OnCreatePanelMenuListener) { - OnCreatePanelMenuListener listener = (OnCreatePanelMenuListener)mActivity; - result = listener.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); - } else if (mActivity instanceof OnCreateOptionsMenuListener) { - OnCreateOptionsMenuListener listener = (OnCreateOptionsMenuListener)mActivity; - result = listener.onCreateOptionsMenu(menu); - } - - if (DEBUG) Log.d(TAG, "[callbackCreateOptionsMenu] returning " + result); - return result; - } - - /** - * Internal method to trigger the menu preparation process. - * - * @return {@code true} if menu preparation should proceed. - */ - protected final boolean callbackPrepareOptionsMenu(Menu menu) { - if (DEBUG) Log.d(TAG, "[callbackPrepareOptionsMenu] menu: " + menu); - - boolean result = true; - if (mActivity instanceof OnPreparePanelListener) { - OnPreparePanelListener listener = (OnPreparePanelListener)mActivity; - result = listener.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu); - } else if (mActivity instanceof OnPrepareOptionsMenuListener) { - OnPrepareOptionsMenuListener listener = (OnPrepareOptionsMenuListener)mActivity; - result = listener.onPrepareOptionsMenu(menu); - } - - if (DEBUG) Log.d(TAG, "[callbackPrepareOptionsMenu] returning " + result); - return result; - } - - /** - * Internal method for dispatching options menu selection to the owning - * activity callback. - * - * @param item Selected options menu item. - * @return {@code true} if the item selection was handled in the callback. - */ - protected final boolean callbackOptionsItemSelected(MenuItem item) { - if (DEBUG) Log.d(TAG, "[callbackOptionsItemSelected] item: " + item.getTitleCondensed()); - - boolean result = false; - if (mActivity instanceof OnMenuItemSelectedListener) { - OnMenuItemSelectedListener listener = (OnMenuItemSelectedListener)mActivity; - result = listener.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); - } else if (mActivity instanceof OnOptionsItemSelectedListener) { - OnOptionsItemSelectedListener listener = (OnOptionsItemSelectedListener)mActivity; - result = listener.onOptionsItemSelected(item); - } - - if (DEBUG) Log.d(TAG, "[callbackOptionsItemSelected] returning " + result); - return result; - } - - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - - /** - * Query for the availability of a certain feature. - * - * @param featureId The feature ID to check. - * @return {@code true} if feature is enabled, {@code false} otherwise. - */ - public abstract boolean hasFeature(int featureId); - - /** - * Enable extended screen features. This must be called before - * {@code setContentView()}. May be called as many times as desired as long - * as it is before {@code setContentView()}. If not called, no extended - * features will be available. You can not turn off a feature once it is - * requested. - * - * @param featureId The desired features, defined as constants by Window. - * @return Returns true if the requested feature is supported and now - * enabled. - */ - public abstract boolean requestFeature(int featureId); - - /** - * Set extra options that will influence the UI for this window. - * - * @param uiOptions Flags specifying extra options for this window. - */ - public abstract void setUiOptions(int uiOptions); - - /** - * Set extra options that will influence the UI for this window. Only the - * bits filtered by mask will be modified. - * - * @param uiOptions Flags specifying extra options for this window. - * @param mask Flags specifying which options should be modified. Others - * will remain unchanged. - */ - public abstract void setUiOptions(int uiOptions, int mask); - - /** - * Set the content of the activity inside the action bar. - * - * @param layoutResId Layout resource ID. - */ - public abstract void setContentView(int layoutResId); - - /** - * Set the content of the activity inside the action bar. - * - * @param view The desired content to display. - */ - public void setContentView(View view) { - if (DEBUG) Log.d(TAG, "[setContentView] view: " + view); - - setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); - } - - /** - * Set the content of the activity inside the action bar. - * - * @param view The desired content to display. - * @param params Layout parameters to apply to the view. - */ - public abstract void setContentView(View view, ViewGroup.LayoutParams params); - - /** - * Variation on {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)} - * to add an additional content view to the screen. Added after any - * existing ones on the screen -- existing views are NOT removed. - * - * @param view The desired content to display. - * @param params Layout parameters for the view. - */ - public abstract void addContentView(View view, ViewGroup.LayoutParams params); - - /** - * Change the title associated with this activity. - */ - public abstract void setTitle(CharSequence title); - - /** - * Change the title associated with this activity. - */ - public void setTitle(int resId) { - if (DEBUG) Log.d(TAG, "[setTitle] resId: " + resId); - - setTitle(mActivity.getString(resId)); - } - - /** - * Sets the visibility of the progress bar in the title. - *

- * In order for the progress bar to be shown, the feature must be requested - * via {@link #requestWindowFeature(int)}. - * - * @param visible Whether to show the progress bars in the title. - */ - public abstract void setProgressBarVisibility(boolean visible); - - /** - * 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(int)}. - * - * @param visible Whether to show the progress bars in the title. - */ - public abstract void setProgressBarIndeterminateVisibility(boolean visible); - - /** - * Sets whether the horizontal progress bar in the title should be indeterminate (the circular - * is always indeterminate). - *

- * In order for the progress bar to be shown, the feature must be requested - * via {@link #requestWindowFeature(int)}. - * - * @param indeterminate Whether the horizontal progress bar should be indeterminate. - */ - public abstract void setProgressBarIndeterminate(boolean indeterminate); - - /** - * Sets the progress for the progress bars in the title. - *

- * In order for the progress bar to be shown, the feature must be requested - * via {@link #requestWindowFeature(int)}. - * - * @param progress The progress for the progress bar. Valid ranges are from - * 0 to 10000 (both inclusive). If 10000 is given, the progress - * bar will be completely filled and will fade out. - */ - public abstract void setProgress(int progress); - - /** - * Sets the secondary progress for the progress bar in the title. This - * progress is drawn between the primary progress (set via - * {@link #setProgress(int)} and the background. It can be ideal for media - * scenarios such as showing the buffering progress while the default - * progress shows the play progress. - *

- * In order for the progress bar to be shown, the feature must be requested - * via {@link #requestWindowFeature(int)}. - * - * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from - * 0 to 10000 (both inclusive). - */ - public abstract void setSecondaryProgress(int secondaryProgress); - - /** - * Get a menu inflater instance which supports the newer menu attributes. - * - * @return Menu inflater instance. - */ - public MenuInflater getMenuInflater() { - if (DEBUG) Log.d(TAG, "[getMenuInflater]"); - - // Make sure that action views can get an appropriate theme. - if (mMenuInflater == null) { - if (getActionBar() != null) { - mMenuInflater = new MenuInflater(getThemedContext(), mActivity); - } else { - mMenuInflater = new MenuInflater(mActivity); - } - } - return mMenuInflater; - } - - protected abstract Context getThemedContext(); - - /** - * 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 canceled. - * @see ActionMode - */ - public abstract ActionMode startActionMode(ActionMode.Callback callback); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java deleted file mode 100644 index 03755be2b..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java +++ /dev/null @@ -1,956 +0,0 @@ -/* - * Copyright (C) 2010 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.app; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.support.v4.app.FragmentTransaction; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.view.ViewDebug; -import android.view.ViewGroup; -import android.view.ViewGroup.MarginLayoutParams; -import android.widget.SpinnerAdapter; - -/** - * A window feature at the top of the activity that may display the activity title, navigation - * modes, and other interactive items. - *

Beginning with Android 3.0 (API level 11), the action bar appears at the top of an - * activity's window when the activity uses the system's {@link - * android.R.style#Theme_Holo Holo} theme (or one of its descendant themes), which is the default. - * You may otherwise add the action bar by calling {@link - * android.view.Window#requestFeature requestFeature(FEATURE_ACTION_BAR)} or by declaring it in a - * custom theme with the {@link android.R.styleable#Theme_windowActionBar windowActionBar} property. - *

By default, the action bar shows the application icon on - * the left, followed by the activity title. If your activity has an options menu, you can make - * select items accessible directly from the action bar as "action items". You can also - * modify various characteristics of the action bar or remove it completely.

- *

From your activity, you can retrieve an instance of {@link ActionBar} by calling {@link - * android.app.Activity#getActionBar getActionBar()}.

- *

In some cases, the action bar may be overlayed by another bar that enables contextual actions, - * using an {@link android.view.ActionMode}. For example, when the user selects one or more items in - * your activity, you can enable an action mode that offers actions specific to the selected - * items, with a UI that temporarily replaces the action bar. Although the UI may occupy the - * same space, the {@link android.view.ActionMode} APIs are distinct and independent from those for - * {@link ActionBar}. - *

- */ -public abstract class ActionBar { - /** - * 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; - - /** - * 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; - - /** - * 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; - - /** - * 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; - - /** - * 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; - - /** - * 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. - * - *

Setting this option will implicitly enable interaction with the home/up - * button. See {@link #setHomeButtonEnabled(boolean)}. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_HOME_AS_UP = android.app.ActionBar.DISPLAY_HOME_AS_UP; - - /** - * 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; - - /** - * Show the custom view if one has been set. - * @see #setCustomView(View) - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public static final int DISPLAY_SHOW_CUSTOM = android.app.ActionBar.DISPLAY_SHOW_CUSTOM; - - /** - * 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, LayoutParams layoutParams); - - /** - * 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 icon to display in the 'home' section of the action bar. - * The action bar will use an icon specified by its style or the - * activity icon by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param resId Resource ID of a drawable to show as an icon. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setIcon(int resId); - - /** - * Set the icon to display in the 'home' section of the action bar. - * The action bar will use an icon specified by its style or the - * activity icon by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param icon Drawable to show as an icon. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setIcon(Drawable icon); - - /** - * Set the logo to display in the 'home' section of the action bar. - * The action bar will use a logo specified by its style or the - * activity logo by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param resId Resource ID of a drawable to show as a logo. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setLogo(int resId); - - /** - * Set the logo to display in the 'home' section of the action bar. - * The action bar will use a logo specified by its style or the - * activity logo by default. - * - * Whether the home section shows an icon or logo is controlled - * by the display option {@link #DISPLAY_USE_LOGO}. - * - * @param logo Drawable to show as a logo. - * - * @see #setDisplayUseLogoEnabled(boolean) - * @see #setDisplayShowHomeEnabled(boolean) - */ - public abstract void setLogo(Drawable logo); - - /** - * 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, - OnNavigationListener callback); - - /** - * 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); - - /** - * Get the position of the selected navigation item in list or tabbed navigation modes. - * - * @return Position of the selected item. - */ - public abstract int getSelectedNavigationIndex(); - - /** - * Get the number of navigation items present in the current navigation mode. - * - * @return Number of navigation items. - */ - public abstract int getNavigationItemCount(); - - /** - * 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); - - /** - * 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 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 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 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: setDisplayOptions(0, DISPLAY_SHOW_HOME) will disable the - * {@link #DISPLAY_SHOW_HOME} option. - * 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 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 true to use the activity logo, false to use the activity icon. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayUseLogoEnabled(boolean useLogo); - - /** - * 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 true to show home, false otherwise. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayShowHomeEnabled(boolean showHome); - - /** - * 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 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 whether an activity title/subtitle should be displayed. - * - *

To set several display options at once, see the setDisplayOptions methods. - * - * @param showTitle true to display a title/subtitle if present. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayShowTitleEnabled(boolean showTitle); - - /** - * Set whether a custom view should be displayed, if set. - * - *

To set several display options at once, see the setDisplayOptions methods. - * - * @param showCustom true if the currently set custom view should be displayed, false otherwise. - * - * @see #setDisplayOptions(int) - * @see #setDisplayOptions(int, int) - */ - public abstract void setDisplayShowCustomEnabled(boolean showCustom); - - /** - * Set the ActionBar's background. This will be used for the primary - * action bar. - * - * @param d Background drawable - * @see #setStackedBackgroundDrawable(Drawable) - * @see #setSplitBackgroundDrawable(Drawable) - */ - public abstract void setBackgroundDrawable(Drawable d); - - /** - * Set the ActionBar's stacked background. This will appear - * in the second row/stacked bar on some devices and configurations. - * - * @param d Background drawable for the stacked row - */ - public void setStackedBackgroundDrawable(Drawable d) { } - - /** - * Set the ActionBar's split background. This will appear in - * the split action bar containing menu-provided action buttons - * on some devices and configurations. - *

You can enable split action bar with {@link android.R.attr#uiOptions} - * - * @param d Background drawable for the split bar - */ - public void setSplitBackgroundDrawable(Drawable d) { } - - /** - * @return The current custom view. - */ - public abstract View getCustomView(); - - /** - * 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(); - - /** - * 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 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. - */ - public abstract int getNavigationMode(); - - /** - * 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); - - /** - * @return The current set of display options. - */ - public abstract int getDisplayOptions(); - - /** - * Create and return a new {@link Tab}. - * This tab will not be included in the action bar until it is added. - * - *

Very often tabs will be used to switch between {@link Fragment} - * objects. Here is a typical implementation of such tabs:

- * - * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.java - * complete} - * - * @return A new Tab - * - * @see #addTab(Tab) - */ - public abstract Tab newTab(); - - /** - * 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(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(Tab tab, boolean setSelected); - - /** - * Add a tab for use in tabbed navigation mode. The tab will be inserted at - * 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(Tab tab, int position); - - /** - * Add a tab for use in tabbed navigation mode. The tab will be insterted at - * 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(Tab tab, int position, boolean setSelected); - - /** - * 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(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); - - /** - * Remove all tabs from the action bar and deselect the current tab. - */ - public abstract void removeAllTabs(); - - /** - * 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(Tab tab); - - /** - * 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 Tab getSelectedTab(); - - /** - * Returns the tab at the specified index. - * - * @param index Index value in the range 0-get - * @return - */ - public abstract Tab getTabAt(int index); - - /** - * Returns the number of tabs currently registered with the action bar. - * @return Tab count - */ - public abstract int getTabCount(); - - /** - * Retrieve the current height of the ActionBar. - * - * @return The ActionBar's height - */ - public abstract int getHeight(); - - /** - * Show the ActionBar if it is not currently showing. - * If the window hosting the ActionBar does not have the feature - * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application - * content to fit the new space available. - */ - public abstract void show(); - - /** - * Hide the ActionBar if it is currently showing. - * If the window hosting the ActionBar does not have the feature - * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application - * content to fit the new space available. - */ - public abstract void hide(); - - /** - * @return true if the ActionBar is showing, false otherwise. - */ - public abstract boolean isShowing(); - - /** - * Add a listener that will respond to menu visibility change events. - * - * @param listener The new listener to add - */ - public abstract void addOnMenuVisibilityListener(OnMenuVisibilityListener listener); - - /** - * 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(OnMenuVisibilityListener listener); - - /** - * Enable or disable the "home" button in the corner of the action bar. (Note that this - * is the application home/up affordance on the action bar, not the systemwide home - * button.) - * - *

This defaults to true for packages targeting < API 14. For packages targeting - * API 14 or greater, the application should call this method to enable interaction - * with the home/up affordance. - * - *

Setting the {@link #DISPLAY_HOME_AS_UP} display option will automatically enable - * the home button. - * - * @param enabled true to enable the home button, false to disable the home button. - */ - public void setHomeButtonEnabled(boolean enabled) { } - - /** - * Returns a {@link Context} with an appropriate theme for creating views that - * will appear in the action bar. If you are inflating or instantiating custom views - * that will appear in an action bar, you should use the Context returned by this method. - * (This includes adapters used for list navigation mode.) - * This will ensure that views contrast properly against the action bar. - * - * @return A themed Context for creating views - */ - public Context getThemedContext() { return null; } - - /** - * 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. - */ - public boolean onNavigationItemSelected(int itemPosition, long itemId); - } - - /** - * 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. - */ - public void onMenuVisibilityChanged(boolean isVisible); - } - - /** - * A tab in the action bar. - * - *

Tabs manage the hiding and showing of {@link Fragment}s. - */ - public static abstract class Tab { - /** - * An invalid position for a tab. - * - * @see #getPosition() - */ - public static final int INVALID_POSITION = -1; - - /** - * 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 icon associated with this tab. - * - * @return The tab's icon - */ - public abstract Drawable getIcon(); - - /** - * Return the text of this tab. - * - * @return The tab's text - */ - public abstract CharSequence getText(); - - /** - * 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 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 Tab setIcon(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 Tab setText(CharSequence text); - - /** - * 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 Tab setText(int resId); - - /** - * 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 Tab setCustomView(View view); - - /** - * 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 Tab setCustomView(int layoutResId); - - /** - * Retrieve a previously set custom view for this tab. - * - * @return The custom view set by {@link #setCustomView(View)}. - */ - public abstract View getCustomView(); - - /** - * 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 Tab setTag(Object obj); - - /** - * @return This Tab's tag object. - */ - public abstract Object getTag(); - - /** - * Set the {@link 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 Tab setTabListener(TabListener listener); - - /** - * Select this tab. Only valid if the tab has been added to the action bar. - */ - public abstract void select(); - - /** - * Set a description of this tab's content for use in accessibility support. - * If no content description is provided the title will be used. - * - * @param resId A resource ID referring to the description text - * @return The current instance for call chaining - * @see #setContentDescription(CharSequence) - * @see #getContentDescription() - */ - public abstract Tab setContentDescription(int resId); - - /** - * Set a description of this tab's content for use in accessibility support. - * If no content description is provided the title will be used. - * - * @param contentDesc Description of this tab's content - * @return The current instance for call chaining - * @see #setContentDescription(int) - * @see #getContentDescription() - */ - public abstract Tab setContentDescription(CharSequence contentDesc); - - /** - * Gets a brief description of this tab's content for use in accessibility support. - * - * @return Description of this tab's content - * @see #setContentDescription(CharSequence) - * @see #setContentDescription(int) - */ - public abstract CharSequence getContentDescription(); - } - - /** - * Callback interface invoked when a tab is focused, unfocused, added, or removed. - */ - public interface TabListener { - /** - * Called when a tab enters the selected state. - * - * @param tab The tab that was selected - * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute - * during a tab switch. The previous tab's unselect and this tab's select will be - * executed in a single transaction. This FragmentTransaction does not support - * being added to the back stack. - */ - public void onTabSelected(Tab tab, FragmentTransaction ft); - - /** - * Called when a tab exits the selected state. - * - * @param tab The tab that was unselected - * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute - * during a tab switch. This tab's unselect and the newly selected tab's select - * will be executed in a single transaction. This FragmentTransaction does not - * support being added to the back stack. - */ - public void onTabUnselected(Tab tab, FragmentTransaction ft); - - /** - * 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 A {@link FragmentTransaction} for queuing fragment operations to execute - * once this method returns. This FragmentTransaction does not support - * being added to the back stack. - */ - public void onTabReselected(Tab tab, FragmentTransaction ft); - } - - /** - * Per-child layout information associated with action bar custom views. - * - * @attr ref android.R.styleable#ActionBar_LayoutParams_layout_gravity - */ - public static class LayoutParams extends MarginLayoutParams { - private static final int[] ATTRS = new int[] { - android.R.attr.layout_gravity - }; - - /** - * Gravity for the view associated with these LayoutParams. - * - * @see android.view.Gravity - */ - @ViewDebug.ExportedProperty(mapping = { - @ViewDebug.IntToString(from = -1, to = "NONE"), - @ViewDebug.IntToString(from = Gravity.NO_GRAVITY, to = "NONE"), - @ViewDebug.IntToString(from = Gravity.TOP, to = "TOP"), - @ViewDebug.IntToString(from = Gravity.BOTTOM, to = "BOTTOM"), - @ViewDebug.IntToString(from = Gravity.LEFT, to = "LEFT"), - @ViewDebug.IntToString(from = Gravity.RIGHT, to = "RIGHT"), - @ViewDebug.IntToString(from = Gravity.CENTER_VERTICAL, to = "CENTER_VERTICAL"), - @ViewDebug.IntToString(from = Gravity.FILL_VERTICAL, to = "FILL_VERTICAL"), - @ViewDebug.IntToString(from = Gravity.CENTER_HORIZONTAL, to = "CENTER_HORIZONTAL"), - @ViewDebug.IntToString(from = Gravity.FILL_HORIZONTAL, to = "FILL_HORIZONTAL"), - @ViewDebug.IntToString(from = Gravity.CENTER, to = "CENTER"), - @ViewDebug.IntToString(from = Gravity.FILL, to = "FILL") - }) - public int gravity = -1; - - public LayoutParams(Context c, AttributeSet attrs) { - super(c, attrs); - - TypedArray a = c.obtainStyledAttributes(attrs, ATTRS); - gravity = a.getInt(0, -1); - a.recycle(); - } - - public LayoutParams(int width, int height) { - super(width, height); - this.gravity = Gravity.CENTER_VERTICAL | Gravity.LEFT; - } - - public LayoutParams(int width, int height, int gravity) { - super(width, height); - this.gravity = gravity; - } - - public LayoutParams(int gravity) { - this(WRAP_CONTENT, FILL_PARENT, gravity); - } - - public LayoutParams(LayoutParams source) { - super(source); - - this.gravity = source.gravity; - } - - public LayoutParams(ViewGroup.LayoutParams source) { - super(source); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java deleted file mode 100644 index 7b4543640..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java +++ /dev/null @@ -1,270 +0,0 @@ -package com.actionbarsherlock.app; - -import android.app.Activity; -import android.content.res.Configuration; -import android.os.Bundle; -import android.view.KeyEvent; -import android.view.View; -import android.view.Window; -import android.view.ViewGroup.LayoutParams; -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -public abstract class SherlockActivity extends Activity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { - private ActionBarSherlock mSherlock; - - protected final ActionBarSherlock getSherlock() { - if (mSherlock == null) { - mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); - } - return mSherlock; - } - - - /////////////////////////////////////////////////////////////////////////// - // Action bar and mode - /////////////////////////////////////////////////////////////////////////// - - public ActionBar getSupportActionBar() { - return getSherlock().getActionBar(); - } - - public ActionMode startActionMode(ActionMode.Callback callback) { - return getSherlock().startActionMode(callback); - } - - @Override - public void onActionModeStarted(ActionMode mode) {} - - @Override - public void onActionModeFinished(ActionMode mode) {} - - - /////////////////////////////////////////////////////////////////////////// - // General lifecycle/callback dispatching - /////////////////////////////////////////////////////////////////////////// - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getSherlock().dispatchConfigurationChanged(newConfig); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getSherlock().dispatchPostResume(); - } - - @Override - protected void onPause() { - getSherlock().dispatchPause(); - super.onPause(); - } - - @Override - protected void onStop() { - getSherlock().dispatchStop(); - super.onStop(); - } - - @Override - protected void onDestroy() { - getSherlock().dispatchDestroy(); - super.onDestroy(); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - getSherlock().dispatchPostCreate(savedInstanceState); - super.onPostCreate(savedInstanceState); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - getSherlock().dispatchTitleChanged(title, color); - super.onTitleChanged(title, color); - } - - @Override - public final boolean onMenuOpened(int featureId, android.view.Menu menu) { - if (getSherlock().dispatchMenuOpened(featureId, menu)) { - return true; - } - return super.onMenuOpened(featureId, menu); - } - - @Override - public void onPanelClosed(int featureId, android.view.Menu menu) { - getSherlock().dispatchPanelClosed(featureId, menu); - super.onPanelClosed(featureId, menu); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (getSherlock().dispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEvent(event); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - getSherlock().dispatchSaveInstanceState(outState); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - getSherlock().dispatchRestoreInstanceState(savedInstanceState); - } - - /////////////////////////////////////////////////////////////////////////// - // Native menu handling - /////////////////////////////////////////////////////////////////////////// - - public MenuInflater getSupportMenuInflater() { - return getSherlock().getMenuInflater(); - } - - public void invalidateOptionsMenu() { - getSherlock().dispatchInvalidateOptionsMenu(); - } - - public void supportInvalidateOptionsMenu() { - invalidateOptionsMenu(); - } - - @Override - public final boolean onCreateOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchCreateOptionsMenu(menu); - } - - @Override - public final boolean onPrepareOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchPrepareOptionsMenu(menu); - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return getSherlock().dispatchOptionsItemSelected(item); - } - - @Override - public void openOptionsMenu() { - if (!getSherlock().dispatchOpenOptionsMenu()) { - super.openOptionsMenu(); - } - } - - @Override - public void closeOptionsMenu() { - if (!getSherlock().dispatchCloseOptionsMenu()) { - super.closeOptionsMenu(); - } - } - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onCreateOptionsMenu(menu); - } - return false; - } - - public boolean onCreateOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onPrepareOptionsMenu(menu); - } - return false; - } - - public boolean onPrepareOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onOptionsItemSelected(item); - } - return false; - } - - public boolean onOptionsItemSelected(MenuItem item) { - return false; - } - - - /////////////////////////////////////////////////////////////////////////// - // Content - /////////////////////////////////////////////////////////////////////////// - - @Override - public void addContentView(View view, LayoutParams params) { - getSherlock().addContentView(view, params); - } - - @Override - public void setContentView(int layoutResId) { - getSherlock().setContentView(layoutResId); - } - - @Override - public void setContentView(View view, LayoutParams params) { - getSherlock().setContentView(view, params); - } - - @Override - public void setContentView(View view) { - getSherlock().setContentView(view); - } - - public void requestWindowFeature(long featureId) { - getSherlock().requestFeature((int)featureId); - } - - - /////////////////////////////////////////////////////////////////////////// - // Progress Indication - /////////////////////////////////////////////////////////////////////////// - - public void setSupportProgress(int progress) { - getSherlock().setProgress(progress); - } - - public void setSupportProgressBarIndeterminate(boolean indeterminate) { - getSherlock().setProgressBarIndeterminate(indeterminate); - } - - public void setSupportProgressBarIndeterminateVisibility(boolean visible) { - getSherlock().setProgressBarIndeterminateVisibility(visible); - } - - public void setSupportProgressBarVisibility(boolean visible) { - getSherlock().setProgressBarVisibility(visible); - } - - public void setSupportSecondaryProgress(int secondaryProgress) { - getSherlock().setSecondaryProgress(secondaryProgress); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java deleted file mode 100644 index a7c856bf0..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.actionbarsherlock.app; - -import android.app.Activity; -import android.support.v4.app.DialogFragment; -import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; -import com.actionbarsherlock.internal.view.menu.MenuWrapper; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; - -public class SherlockDialogFragment extends DialogFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { - private SherlockFragmentActivity mActivity; - - public SherlockFragmentActivity getSherlockActivity() { - return mActivity; - } - - @Override - public void onAttach(Activity activity) { - if (!(activity instanceof SherlockFragmentActivity)) { - throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); - } - mActivity = (SherlockFragmentActivity)activity; - - super.onAttach(activity); - } - - @Override - public void onDetach() { - mActivity = null; - super.onDetach(); - } - - @Override - public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { - onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - //Nothing to see here. - } - - @Override - public final void onPrepareOptionsMenu(android.view.Menu menu) { - onPrepareOptionsMenu(new MenuWrapper(menu)); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - //Nothing to see here. - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return onOptionsItemSelected(new MenuItemWrapper(item)); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - //Nothing to see here. - return false; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java deleted file mode 100644 index 078f9b0ca..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.actionbarsherlock.app; - -import android.app.ExpandableListActivity; -import android.content.res.Configuration; -import android.os.Bundle; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.view.Window; -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -public abstract class SherlockExpandableListActivity extends ExpandableListActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { - private ActionBarSherlock mSherlock; - - protected final ActionBarSherlock getSherlock() { - if (mSherlock == null) { - mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); - } - return mSherlock; - } - - - /////////////////////////////////////////////////////////////////////////// - // Action bar and mode - /////////////////////////////////////////////////////////////////////////// - - public ActionBar getSupportActionBar() { - return getSherlock().getActionBar(); - } - - public ActionMode startActionMode(ActionMode.Callback callback) { - return getSherlock().startActionMode(callback); - } - - @Override - public void onActionModeStarted(ActionMode mode) {} - - @Override - public void onActionModeFinished(ActionMode mode) {} - - - /////////////////////////////////////////////////////////////////////////// - // General lifecycle/callback dispatching - /////////////////////////////////////////////////////////////////////////// - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getSherlock().dispatchConfigurationChanged(newConfig); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getSherlock().dispatchPostResume(); - } - - @Override - protected void onPause() { - getSherlock().dispatchPause(); - super.onPause(); - } - - @Override - protected void onStop() { - getSherlock().dispatchStop(); - super.onStop(); - } - - @Override - protected void onDestroy() { - getSherlock().dispatchDestroy(); - super.onDestroy(); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - getSherlock().dispatchPostCreate(savedInstanceState); - super.onPostCreate(savedInstanceState); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - getSherlock().dispatchTitleChanged(title, color); - super.onTitleChanged(title, color); - } - - @Override - public final boolean onMenuOpened(int featureId, android.view.Menu menu) { - if (getSherlock().dispatchMenuOpened(featureId, menu)) { - return true; - } - return super.onMenuOpened(featureId, menu); - } - - @Override - public void onPanelClosed(int featureId, android.view.Menu menu) { - getSherlock().dispatchPanelClosed(featureId, menu); - super.onPanelClosed(featureId, menu); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (getSherlock().dispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEvent(event); - } - - - /////////////////////////////////////////////////////////////////////////// - // Native menu handling - /////////////////////////////////////////////////////////////////////////// - - public MenuInflater getSupportMenuInflater() { - return getSherlock().getMenuInflater(); - } - - public void invalidateOptionsMenu() { - getSherlock().dispatchInvalidateOptionsMenu(); - } - - public void supportInvalidateOptionsMenu() { - invalidateOptionsMenu(); - } - - @Override - public final boolean onCreateOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchCreateOptionsMenu(menu); - } - - @Override - public final boolean onPrepareOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchPrepareOptionsMenu(menu); - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return getSherlock().dispatchOptionsItemSelected(item); - } - - @Override - public void openOptionsMenu() { - if (!getSherlock().dispatchOpenOptionsMenu()) { - super.openOptionsMenu(); - } - } - - @Override - public void closeOptionsMenu() { - if (!getSherlock().dispatchCloseOptionsMenu()) { - super.closeOptionsMenu(); - } - } - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onCreateOptionsMenu(menu); - } - return false; - } - - public boolean onCreateOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onPrepareOptionsMenu(menu); - } - return false; - } - - public boolean onPrepareOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onOptionsItemSelected(item); - } - return false; - } - - public boolean onOptionsItemSelected(MenuItem item) { - return false; - } - - - /////////////////////////////////////////////////////////////////////////// - // Content - /////////////////////////////////////////////////////////////////////////// - - @Override - public void addContentView(View view, LayoutParams params) { - getSherlock().addContentView(view, params); - } - - @Override - public void setContentView(int layoutResId) { - getSherlock().setContentView(layoutResId); - } - - @Override - public void setContentView(View view, LayoutParams params) { - getSherlock().setContentView(view, params); - } - - @Override - public void setContentView(View view) { - getSherlock().setContentView(view); - } - - public void requestWindowFeature(long featureId) { - getSherlock().requestFeature((int)featureId); - } - - - /////////////////////////////////////////////////////////////////////////// - // Progress Indication - /////////////////////////////////////////////////////////////////////////// - - public void setSupportProgress(int progress) { - getSherlock().setProgress(progress); - } - - public void setSupportProgressBarIndeterminate(boolean indeterminate) { - getSherlock().setProgressBarIndeterminate(indeterminate); - } - - public void setSupportProgressBarIndeterminateVisibility(boolean visible) { - getSherlock().setProgressBarIndeterminateVisibility(visible); - } - - public void setSupportProgressBarVisibility(boolean visible) { - getSherlock().setProgressBarVisibility(visible); - } - - public void setSupportSecondaryProgress(int secondaryProgress) { - getSherlock().setSecondaryProgress(secondaryProgress); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java deleted file mode 100644 index 0f24e9c85..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.actionbarsherlock.app; - -import android.app.Activity; -import android.support.v4.app.Fragment; -import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; -import com.actionbarsherlock.internal.view.menu.MenuWrapper; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; - -public class SherlockFragment extends Fragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { - private SherlockFragmentActivity mActivity; - - public SherlockFragmentActivity getSherlockActivity() { - return mActivity; - } - - @Override - public void onAttach(Activity activity) { - if (!(activity instanceof SherlockFragmentActivity)) { - throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); - } - mActivity = (SherlockFragmentActivity)activity; - - super.onAttach(activity); - } - - @Override - public void onDetach() { - mActivity = null; - super.onDetach(); - } - - @Override - public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { - onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - //Nothing to see here. - } - - @Override - public final void onPrepareOptionsMenu(android.view.Menu menu) { - onPrepareOptionsMenu(new MenuWrapper(menu)); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - //Nothing to see here. - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return onOptionsItemSelected(new MenuItemWrapper(item)); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - //Nothing to see here. - return false; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java deleted file mode 100644 index 3d092f033..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java +++ /dev/null @@ -1,303 +0,0 @@ -package com.actionbarsherlock.app; - -import android.content.res.Configuration; -import android.os.Bundle; -import android.support.v4.app.Watson; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.view.Window; -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import static com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; -import static com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; - -/** @see {@link android.support.v4.app.Watson} */ -public class SherlockFragmentActivity extends Watson implements OnActionModeStartedListener, OnActionModeFinishedListener { - private static final boolean DEBUG = false; - private static final String TAG = "SherlockFragmentActivity"; - - private ActionBarSherlock mSherlock; - private boolean mIgnoreNativeCreate = false; - private boolean mIgnoreNativePrepare = false; - private boolean mIgnoreNativeSelected = false; - - protected final ActionBarSherlock getSherlock() { - if (mSherlock == null) { - mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); - } - return mSherlock; - } - - - /////////////////////////////////////////////////////////////////////////// - // Action bar and mode - /////////////////////////////////////////////////////////////////////////// - - public ActionBar getSupportActionBar() { - return getSherlock().getActionBar(); - } - - public ActionMode startActionMode(ActionMode.Callback callback) { - return getSherlock().startActionMode(callback); - } - - @Override - public void onActionModeStarted(ActionMode mode) {} - - @Override - public void onActionModeFinished(ActionMode mode) {} - - - /////////////////////////////////////////////////////////////////////////// - // General lifecycle/callback dispatching - /////////////////////////////////////////////////////////////////////////// - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getSherlock().dispatchConfigurationChanged(newConfig); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getSherlock().dispatchPostResume(); - } - - @Override - protected void onPause() { - getSherlock().dispatchPause(); - super.onPause(); - } - - @Override - protected void onStop() { - getSherlock().dispatchStop(); - super.onStop(); - } - - @Override - protected void onDestroy() { - getSherlock().dispatchDestroy(); - super.onDestroy(); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - getSherlock().dispatchPostCreate(savedInstanceState); - super.onPostCreate(savedInstanceState); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - getSherlock().dispatchTitleChanged(title, color); - super.onTitleChanged(title, color); - } - - @Override - public final boolean onMenuOpened(int featureId, android.view.Menu menu) { - if (getSherlock().dispatchMenuOpened(featureId, menu)) { - return true; - } - return super.onMenuOpened(featureId, menu); - } - - @Override - public void onPanelClosed(int featureId, android.view.Menu menu) { - getSherlock().dispatchPanelClosed(featureId, menu); - super.onPanelClosed(featureId, menu); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (getSherlock().dispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEvent(event); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - getSherlock().dispatchSaveInstanceState(outState); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - getSherlock().dispatchRestoreInstanceState(savedInstanceState); - } - - /////////////////////////////////////////////////////////////////////////// - // Native menu handling - /////////////////////////////////////////////////////////////////////////// - - public MenuInflater getSupportMenuInflater() { - if (DEBUG) Log.d(TAG, "[getSupportMenuInflater]"); - - return getSherlock().getMenuInflater(); - } - - public void invalidateOptionsMenu() { - if (DEBUG) Log.d(TAG, "[invalidateOptionsMenu]"); - - getSherlock().dispatchInvalidateOptionsMenu(); - } - - public void supportInvalidateOptionsMenu() { - if (DEBUG) Log.d(TAG, "[supportInvalidateOptionsMenu]"); - - invalidateOptionsMenu(); - } - - @Override - public final boolean onCreatePanelMenu(int featureId, android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeCreate) { - mIgnoreNativeCreate = true; - boolean result = getSherlock().dispatchCreateOptionsMenu(menu); - mIgnoreNativeCreate = false; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); - return result; - } - return super.onCreatePanelMenu(featureId, menu); - } - - @Override - public final boolean onCreateOptionsMenu(android.view.Menu menu) { - return true; - } - - @Override - public final boolean onPreparePanel(int featureId, View view, android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + ", menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativePrepare) { - mIgnoreNativePrepare = true; - boolean result = getSherlock().dispatchPrepareOptionsMenu(menu); - mIgnoreNativePrepare = false; - - if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); - return result; - } - return super.onPreparePanel(featureId, view, menu); - } - - @Override - public final boolean onPrepareOptionsMenu(android.view.Menu menu) { - return true; - } - - @Override - public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); - - if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeSelected) { - mIgnoreNativeSelected = true; - boolean result = getSherlock().dispatchOptionsItemSelected(item); - mIgnoreNativeSelected = false; - - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] returning " + result); - return result; - } - return super.onMenuItemSelected(featureId, item); - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return false; - } - - @Override - public void openOptionsMenu() { - if (!getSherlock().dispatchOpenOptionsMenu()) { - super.openOptionsMenu(); - } - } - - @Override - public void closeOptionsMenu() { - if (!getSherlock().dispatchCloseOptionsMenu()) { - super.closeOptionsMenu(); - } - } - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - public boolean onCreateOptionsMenu(Menu menu) { - return true; - } - - public boolean onPrepareOptionsMenu(Menu menu) { - return true; - } - - public boolean onOptionsItemSelected(MenuItem item) { - return false; - } - - - /////////////////////////////////////////////////////////////////////////// - // Content - /////////////////////////////////////////////////////////////////////////// - - @Override - public void addContentView(View view, LayoutParams params) { - getSherlock().addContentView(view, params); - } - - @Override - public void setContentView(int layoutResId) { - getSherlock().setContentView(layoutResId); - } - - @Override - public void setContentView(View view, LayoutParams params) { - getSherlock().setContentView(view, params); - } - - @Override - public void setContentView(View view) { - getSherlock().setContentView(view); - } - - public void requestWindowFeature(long featureId) { - getSherlock().requestFeature((int)featureId); - } - - - /////////////////////////////////////////////////////////////////////////// - // Progress Indication - /////////////////////////////////////////////////////////////////////////// - - public void setSupportProgress(int progress) { - getSherlock().setProgress(progress); - } - - public void setSupportProgressBarIndeterminate(boolean indeterminate) { - getSherlock().setProgressBarIndeterminate(indeterminate); - } - - public void setSupportProgressBarIndeterminateVisibility(boolean visible) { - getSherlock().setProgressBarIndeterminateVisibility(visible); - } - - public void setSupportProgressBarVisibility(boolean visible) { - getSherlock().setProgressBarVisibility(visible); - } - - public void setSupportSecondaryProgress(int secondaryProgress) { - getSherlock().setSecondaryProgress(secondaryProgress); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java deleted file mode 100644 index aba6d85e8..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java +++ /dev/null @@ -1,270 +0,0 @@ -package com.actionbarsherlock.app; - -import android.app.ListActivity; -import android.content.res.Configuration; -import android.os.Bundle; -import android.view.KeyEvent; -import android.view.View; -import android.view.Window; -import android.view.ViewGroup.LayoutParams; -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -public abstract class SherlockListActivity extends ListActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { - private ActionBarSherlock mSherlock; - - protected final ActionBarSherlock getSherlock() { - if (mSherlock == null) { - mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); - } - return mSherlock; - } - - - /////////////////////////////////////////////////////////////////////////// - // Action bar and mode - /////////////////////////////////////////////////////////////////////////// - - public ActionBar getSupportActionBar() { - return getSherlock().getActionBar(); - } - - public ActionMode startActionMode(ActionMode.Callback callback) { - return getSherlock().startActionMode(callback); - } - - @Override - public void onActionModeStarted(ActionMode mode) {} - - @Override - public void onActionModeFinished(ActionMode mode) {} - - - /////////////////////////////////////////////////////////////////////////// - // General lifecycle/callback dispatching - /////////////////////////////////////////////////////////////////////////// - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getSherlock().dispatchConfigurationChanged(newConfig); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getSherlock().dispatchPostResume(); - } - - @Override - protected void onPause() { - getSherlock().dispatchPause(); - super.onPause(); - } - - @Override - protected void onStop() { - getSherlock().dispatchStop(); - super.onStop(); - } - - @Override - protected void onDestroy() { - getSherlock().dispatchDestroy(); - super.onDestroy(); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - getSherlock().dispatchPostCreate(savedInstanceState); - super.onPostCreate(savedInstanceState); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - getSherlock().dispatchTitleChanged(title, color); - super.onTitleChanged(title, color); - } - - @Override - public final boolean onMenuOpened(int featureId, android.view.Menu menu) { - if (getSherlock().dispatchMenuOpened(featureId, menu)) { - return true; - } - return super.onMenuOpened(featureId, menu); - } - - @Override - public void onPanelClosed(int featureId, android.view.Menu menu) { - getSherlock().dispatchPanelClosed(featureId, menu); - super.onPanelClosed(featureId, menu); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (getSherlock().dispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEvent(event); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - getSherlock().dispatchSaveInstanceState(outState); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - getSherlock().dispatchRestoreInstanceState(savedInstanceState); - } - - /////////////////////////////////////////////////////////////////////////// - // Native menu handling - /////////////////////////////////////////////////////////////////////////// - - public MenuInflater getSupportMenuInflater() { - return getSherlock().getMenuInflater(); - } - - public void invalidateOptionsMenu() { - getSherlock().dispatchInvalidateOptionsMenu(); - } - - public void supportInvalidateOptionsMenu() { - invalidateOptionsMenu(); - } - - @Override - public final boolean onCreateOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchCreateOptionsMenu(menu); - } - - @Override - public final boolean onPrepareOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchPrepareOptionsMenu(menu); - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return getSherlock().dispatchOptionsItemSelected(item); - } - - @Override - public void openOptionsMenu() { - if (!getSherlock().dispatchOpenOptionsMenu()) { - super.openOptionsMenu(); - } - } - - @Override - public void closeOptionsMenu() { - if (!getSherlock().dispatchCloseOptionsMenu()) { - super.closeOptionsMenu(); - } - } - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onCreateOptionsMenu(menu); - } - return false; - } - - public boolean onCreateOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onPrepareOptionsMenu(menu); - } - return false; - } - - public boolean onPrepareOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onOptionsItemSelected(item); - } - return false; - } - - public boolean onOptionsItemSelected(MenuItem item) { - return false; - } - - - /////////////////////////////////////////////////////////////////////////// - // Content - /////////////////////////////////////////////////////////////////////////// - - @Override - public void addContentView(View view, LayoutParams params) { - getSherlock().addContentView(view, params); - } - - @Override - public void setContentView(int layoutResId) { - getSherlock().setContentView(layoutResId); - } - - @Override - public void setContentView(View view, LayoutParams params) { - getSherlock().setContentView(view, params); - } - - @Override - public void setContentView(View view) { - getSherlock().setContentView(view); - } - - public void requestWindowFeature(long featureId) { - getSherlock().requestFeature((int)featureId); - } - - - /////////////////////////////////////////////////////////////////////////// - // Progress Indication - /////////////////////////////////////////////////////////////////////////// - - public void setSupportProgress(int progress) { - getSherlock().setProgress(progress); - } - - public void setSupportProgressBarIndeterminate(boolean indeterminate) { - getSherlock().setProgressBarIndeterminate(indeterminate); - } - - public void setSupportProgressBarIndeterminateVisibility(boolean visible) { - getSherlock().setProgressBarIndeterminateVisibility(visible); - } - - public void setSupportProgressBarVisibility(boolean visible) { - getSherlock().setProgressBarVisibility(visible); - } - - public void setSupportSecondaryProgress(int secondaryProgress) { - getSherlock().setSecondaryProgress(secondaryProgress); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java deleted file mode 100644 index 13ca3c49f..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.actionbarsherlock.app; - -import android.app.Activity; -import android.support.v4.app.ListFragment; -import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; -import com.actionbarsherlock.internal.view.menu.MenuWrapper; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; - -public class SherlockListFragment extends ListFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { - private SherlockFragmentActivity mActivity; - - public SherlockFragmentActivity getSherlockActivity() { - return mActivity; - } - - @Override - public void onAttach(Activity activity) { - if (!(activity instanceof SherlockFragmentActivity)) { - throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); - } - mActivity = (SherlockFragmentActivity)activity; - - super.onAttach(activity); - } - - @Override - public void onDetach() { - mActivity = null; - super.onDetach(); - } - - @Override - public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { - onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - //Nothing to see here. - } - - @Override - public final void onPrepareOptionsMenu(android.view.Menu menu) { - onPrepareOptionsMenu(new MenuWrapper(menu)); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - //Nothing to see here. - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return onOptionsItemSelected(new MenuItemWrapper(item)); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - //Nothing to see here. - return false; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java deleted file mode 100644 index bee72cb25..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java +++ /dev/null @@ -1,270 +0,0 @@ -package com.actionbarsherlock.app; - -import android.content.res.Configuration; -import android.os.Bundle; -import android.preference.PreferenceActivity; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.view.Window; -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; -import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -public abstract class SherlockPreferenceActivity extends PreferenceActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { - private ActionBarSherlock mSherlock; - - protected final ActionBarSherlock getSherlock() { - if (mSherlock == null) { - mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); - } - return mSherlock; - } - - - /////////////////////////////////////////////////////////////////////////// - // Action bar and mode - /////////////////////////////////////////////////////////////////////////// - - public ActionBar getSupportActionBar() { - return getSherlock().getActionBar(); - } - - public ActionMode startActionMode(ActionMode.Callback callback) { - return getSherlock().startActionMode(callback); - } - - @Override - public void onActionModeStarted(ActionMode mode) {} - - @Override - public void onActionModeFinished(ActionMode mode) {} - - - /////////////////////////////////////////////////////////////////////////// - // General lifecycle/callback dispatching - /////////////////////////////////////////////////////////////////////////// - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getSherlock().dispatchConfigurationChanged(newConfig); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getSherlock().dispatchPostResume(); - } - - @Override - protected void onPause() { - getSherlock().dispatchPause(); - super.onPause(); - } - - @Override - protected void onStop() { - getSherlock().dispatchStop(); - super.onStop(); - } - - @Override - protected void onDestroy() { - getSherlock().dispatchDestroy(); - super.onDestroy(); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - getSherlock().dispatchPostCreate(savedInstanceState); - super.onPostCreate(savedInstanceState); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - getSherlock().dispatchTitleChanged(title, color); - super.onTitleChanged(title, color); - } - - @Override - public final boolean onMenuOpened(int featureId, android.view.Menu menu) { - if (getSherlock().dispatchMenuOpened(featureId, menu)) { - return true; - } - return super.onMenuOpened(featureId, menu); - } - - @Override - public void onPanelClosed(int featureId, android.view.Menu menu) { - getSherlock().dispatchPanelClosed(featureId, menu); - super.onPanelClosed(featureId, menu); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (getSherlock().dispatchKeyEvent(event)) { - return true; - } - return super.dispatchKeyEvent(event); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - getSherlock().dispatchSaveInstanceState(outState); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - getSherlock().dispatchRestoreInstanceState(savedInstanceState); - } - - /////////////////////////////////////////////////////////////////////////// - // Native menu handling - /////////////////////////////////////////////////////////////////////////// - - public MenuInflater getSupportMenuInflater() { - return getSherlock().getMenuInflater(); - } - - public void invalidateOptionsMenu() { - getSherlock().dispatchInvalidateOptionsMenu(); - } - - public void supportInvalidateOptionsMenu() { - invalidateOptionsMenu(); - } - - @Override - public final boolean onCreateOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchCreateOptionsMenu(menu); - } - - @Override - public final boolean onPrepareOptionsMenu(android.view.Menu menu) { - return getSherlock().dispatchPrepareOptionsMenu(menu); - } - - @Override - public final boolean onOptionsItemSelected(android.view.MenuItem item) { - return getSherlock().dispatchOptionsItemSelected(item); - } - - @Override - public void openOptionsMenu() { - if (!getSherlock().dispatchOpenOptionsMenu()) { - super.openOptionsMenu(); - } - } - - @Override - public void closeOptionsMenu() { - if (!getSherlock().dispatchCloseOptionsMenu()) { - super.closeOptionsMenu(); - } - } - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onCreateOptionsMenu(menu); - } - return false; - } - - public boolean onCreateOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onPrepareOptionsMenu(menu); - } - return false; - } - - public boolean onPrepareOptionsMenu(Menu menu) { - return true; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - return onOptionsItemSelected(item); - } - return false; - } - - public boolean onOptionsItemSelected(MenuItem item) { - return false; - } - - - /////////////////////////////////////////////////////////////////////////// - // Content - /////////////////////////////////////////////////////////////////////////// - - @Override - public void addContentView(View view, LayoutParams params) { - getSherlock().addContentView(view, params); - } - - @Override - public void setContentView(int layoutResId) { - getSherlock().setContentView(layoutResId); - } - - @Override - public void setContentView(View view, LayoutParams params) { - getSherlock().setContentView(view, params); - } - - @Override - public void setContentView(View view) { - getSherlock().setContentView(view); - } - - public void requestWindowFeature(long featureId) { - getSherlock().requestFeature((int)featureId); - } - - - /////////////////////////////////////////////////////////////////////////// - // Progress Indication - /////////////////////////////////////////////////////////////////////////// - - public void setSupportProgress(int progress) { - getSherlock().setProgress(progress); - } - - public void setSupportProgressBarIndeterminate(boolean indeterminate) { - getSherlock().setProgressBarIndeterminate(indeterminate); - } - - public void setSupportProgressBarIndeterminateVisibility(boolean visible) { - getSherlock().setProgressBarIndeterminateVisibility(visible); - } - - public void setSupportProgressBarVisibility(boolean visible) { - getSherlock().setProgressBarVisibility(visible); - } - - public void setSupportSecondaryProgress(int secondaryProgress) { - getSherlock().setSecondaryProgress(secondaryProgress); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java deleted file mode 100644 index 5e69275c7..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java +++ /dev/null @@ -1,1203 +0,0 @@ -package com.actionbarsherlock.internal; - -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import org.xmlpull.v1.XmlPullParser; -import android.app.Activity; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.res.AssetManager; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.os.Bundle; -import android.util.AndroidRuntimeException; -import android.util.Log; -import android.util.TypedValue; -import android.view.ContextThemeWrapper; -import android.view.KeyCharacterMap; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewStub; -import android.view.Window; -import android.view.accessibility.AccessibilityEvent; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.FrameLayout; -import android.widget.TextView; -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.R; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.app.ActionBarImpl; -import com.actionbarsherlock.internal.view.StandaloneActionMode; -import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; -import com.actionbarsherlock.internal.view.menu.MenuBuilder; -import com.actionbarsherlock.internal.view.menu.MenuItemImpl; -import com.actionbarsherlock.internal.view.menu.MenuPresenter; -import com.actionbarsherlock.internal.widget.ActionBarContainer; -import com.actionbarsherlock.internal.widget.ActionBarContextView; -import com.actionbarsherlock.internal.widget.ActionBarView; -import com.actionbarsherlock.internal.widget.IcsProgressBar; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; - -@ActionBarSherlock.Implementation(api = 7) -public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBuilder.Callback, com.actionbarsherlock.view.Window.Callback, MenuPresenter.Callback, android.view.MenuItem.OnMenuItemClickListener { - /** Window features which are enabled by default. */ - protected static final int DEFAULT_FEATURES = 0; - - static private final String PANELS_TAG = "sherlock:Panels"; - - public ActionBarSherlockCompat(Activity activity, int flags) { - super(activity, flags); - } - - - /////////////////////////////////////////////////////////////////////////// - // Properties - /////////////////////////////////////////////////////////////////////////// - - /** Whether or not the device has a dedicated menu key button. */ - private boolean mReserveOverflow; - /** Lazy-load indicator for {@link #mReserveOverflow}. */ - private boolean mReserveOverflowSet = false; - - /** Current menu instance for managing action items. */ - private MenuBuilder mMenu; - /** Map between native options items and sherlock items. */ - protected HashMap mNativeItemMap; - - /** Parent view of the window decoration (action bar, mode, etc.). */ - private ViewGroup mDecor; - /** Parent view of the activity content. */ - private ViewGroup mContentParent; - - /** Whether or not the title is stable and can be displayed. */ - private boolean mIsTitleReady = false; - /** Whether or not the parent activity has been destroyed. */ - private boolean mIsDestroyed = false; - - /* Emulate PanelFeatureState */ - private boolean mClosingActionMenu; - private boolean mMenuIsPrepared; - private boolean mMenuRefreshContent; - private Bundle mMenuFrozenActionViewState; - - /** Implementation which backs the action bar interface API. */ - private ActionBarImpl aActionBar; - /** Main action bar view which displays the core content. */ - private ActionBarView wActionBar; - /** Relevant window and action bar features flags. */ - private int mFeatures = DEFAULT_FEATURES; - /** Relevant user interface option flags. */ - private int mUiOptions = 0; - - /** Decor indeterminate progress indicator. */ - private IcsProgressBar mCircularProgressBar; - /** Decor progress indicator. */ - private IcsProgressBar mHorizontalProgressBar; - - /** Current displayed context action bar, if any. */ - private ActionMode mActionMode; - /** Parent view in which the context action bar is displayed. */ - private ActionBarContextView mActionModeView; - - /** Title view used with dialogs. */ - private TextView mTitleView; - /** Current activity title. */ - private CharSequence mTitle = null; - /** Whether or not this "activity" is floating (i.e., a dialog) */ - private boolean mIsFloating; - - - - /////////////////////////////////////////////////////////////////////////// - // Instance methods - /////////////////////////////////////////////////////////////////////////// - - @Override - public ActionBar getActionBar() { - if (DEBUG) Log.d(TAG, "[getActionBar]"); - - initActionBar(); - return aActionBar; - } - - private void initActionBar() { - if (DEBUG) Log.d(TAG, "[initActionBar]"); - - // Initializing the window decor can change window feature flags. - // Make sure that we have the correct set before performing the test below. - if (mDecor == null) { - installDecor(); - } - - if ((aActionBar != null) || !hasFeature(Window.FEATURE_ACTION_BAR) || hasFeature(Window.FEATURE_NO_TITLE) || mActivity.isChild()) { - return; - } - - aActionBar = new ActionBarImpl(mActivity, mFeatures); - - if (!mIsDelegate) { - //We may never get another chance to set the title - wActionBar.setWindowTitle(mActivity.getTitle()); - } - } - - @Override - protected Context getThemedContext() { - return aActionBar.getThemedContext(); - } - - @Override - public void setTitle(CharSequence title) { - if (DEBUG) Log.d(TAG, "[setTitle] title: " + title); - - dispatchTitleChanged(title, 0); - } - - @Override - public ActionMode startActionMode(ActionMode.Callback callback) { - if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback); - - if (mActionMode != null) { - mActionMode.finish(); - } - - final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); - ActionMode mode = null; - - //Emulate Activity's onWindowStartingActionMode: - initActionBar(); - if (aActionBar != null) { - mode = aActionBar.startActionMode(wrappedCallback); - } - - if (mode != null) { - mActionMode = mode; - } else { - if (mActionModeView == null) { - ViewStub stub = (ViewStub)mDecor.findViewById(R.id.abs__action_mode_bar_stub); - if (stub != null) { - mActionModeView = (ActionBarContextView)stub.inflate(); - } - } - if (mActionModeView != null) { - mActionModeView.killMode(); - mode = new StandaloneActionMode(mActivity, mActionModeView, wrappedCallback, true); - if (callback.onCreateActionMode(mode, mode.getMenu())) { - mode.invalidate(); - mActionModeView.initForMode(mode); - mActionModeView.setVisibility(View.VISIBLE); - mActionMode = mode; - mActionModeView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - } else { - mActionMode = null; - } - } - } - if (mActionMode != null && mActivity instanceof OnActionModeStartedListener) { - ((OnActionModeStartedListener)mActivity).onActionModeStarted(mActionMode); - } - return mActionMode; - } - - - /////////////////////////////////////////////////////////////////////////// - // Lifecycle and interaction callbacks for delegation - /////////////////////////////////////////////////////////////////////////// - - @Override - public void dispatchConfigurationChanged(Configuration newConfig) { - if (DEBUG) Log.d(TAG, "[dispatchConfigurationChanged] newConfig: " + newConfig); - - if (aActionBar != null) { - aActionBar.onConfigurationChanged(newConfig); - } - } - - @Override - public void dispatchPostResume() { - if (DEBUG) Log.d(TAG, "[dispatchPostResume]"); - - if (aActionBar != null) { - aActionBar.setShowHideAnimationEnabled(true); - } - } - - @Override - public void dispatchPause() { - if (DEBUG) Log.d(TAG, "[dispatchPause]"); - - if (wActionBar != null && wActionBar.isOverflowMenuShowing()) { - wActionBar.hideOverflowMenu(); - } - } - - @Override - public void dispatchStop() { - if (DEBUG) Log.d(TAG, "[dispatchStop]"); - - if (aActionBar != null) { - aActionBar.setShowHideAnimationEnabled(false); - } - } - - @Override - public void dispatchInvalidateOptionsMenu() { - if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]"); - - Bundle savedActionViewStates = null; - if (mMenu != null) { - savedActionViewStates = new Bundle(); - mMenu.saveActionViewStates(savedActionViewStates); - if (savedActionViewStates.size() > 0) { - mMenuFrozenActionViewState = savedActionViewStates; - } - // This will be started again when the panel is prepared. - mMenu.stopDispatchingItemsChanged(); - mMenu.clear(); - } - mMenuRefreshContent = true; - - // Prepare the options panel if we have an action bar - if (wActionBar != null) { - mMenuIsPrepared = false; - preparePanel(); - } - } - - @Override - public boolean dispatchOpenOptionsMenu() { - if (DEBUG) Log.d(TAG, "[dispatchOpenOptionsMenu]"); - - if (!isReservingOverflow()) { - return false; - } - - return wActionBar.showOverflowMenu(); - } - - @Override - public boolean dispatchCloseOptionsMenu() { - if (DEBUG) Log.d(TAG, "[dispatchCloseOptionsMenu]"); - - if (!isReservingOverflow()) { - return false; - } - - if (wActionBar != null) { - return wActionBar.hideOverflowMenu(); - } - return false; - } - - @Override - public void dispatchPostCreate(Bundle savedInstanceState) { - if (DEBUG) Log.d(TAG, "[dispatchOnPostCreate]"); - - if (mIsDelegate) { - mIsTitleReady = true; - } - - if (mDecor == null) { - initActionBar(); - } - } - - @Override - public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { - if (DEBUG) { - Log.d(TAG, "[dispatchCreateOptionsMenu] android.view.Menu: " + menu); - Log.d(TAG, "[dispatchCreateOptionsMenu] returning true"); - } - return true; - } - - @Override - public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] android.view.Menu: " + menu); - - if (mActionMode != null) { - return false; - } - - mMenuIsPrepared = false; - if (!preparePanel()) { - return false; - } - - if (isReservingOverflow()) { - return false; - } - - if (mNativeItemMap == null) { - mNativeItemMap = new HashMap(); - } else { - mNativeItemMap.clear(); - } - - if (mMenu == null) { - return false; - } - - boolean result = mMenu.bindNativeOverflow(menu, this, mNativeItemMap); - if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result); - return result; - } - - @Override - public boolean dispatchOptionsItemSelected(android.view.MenuItem item) { - throw new IllegalStateException("Native callback invoked. Create a test case and report!"); - } - - @Override - public boolean dispatchMenuOpened(int featureId, android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[dispatchMenuOpened] featureId: " + featureId + ", menu: " + menu); - - if (featureId == Window.FEATURE_ACTION_BAR || featureId == Window.FEATURE_OPTIONS_PANEL) { - if (aActionBar != null) { - aActionBar.dispatchMenuVisibilityChanged(true); - } - return true; - } - - return false; - } - - @Override - public void dispatchPanelClosed(int featureId, android.view.Menu menu){ - if (DEBUG) Log.d(TAG, "[dispatchPanelClosed] featureId: " + featureId + ", menu: " + menu); - - if (featureId == Window.FEATURE_ACTION_BAR || featureId == Window.FEATURE_OPTIONS_PANEL) { - if (aActionBar != null) { - aActionBar.dispatchMenuVisibilityChanged(false); - } - } - } - - @Override - public void dispatchTitleChanged(CharSequence title, int color) { - if (DEBUG) Log.d(TAG, "[dispatchTitleChanged] title: " + title + ", color: " + color); - - if (!mIsDelegate || mIsTitleReady) { - if (mTitleView != null) { - mTitleView.setText(title); - } else if (wActionBar != null) { - wActionBar.setWindowTitle(title); - } - } - - mTitle = title; - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] event: " + event); - - final int keyCode = event.getKeyCode(); - - // Not handled by the view hierarchy, does the action bar want it - // to cancel out of something special? - if (keyCode == KeyEvent.KEYCODE_BACK) { - final int action = event.getAction(); - // Back cancels action modes first. - if (mActionMode != null) { - if (action == KeyEvent.ACTION_UP) { - mActionMode.finish(); - } - if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true"); - return true; - } - - // Next collapse any expanded action views. - if (wActionBar != null && wActionBar.hasExpandedActionView()) { - if (action == KeyEvent.ACTION_UP) { - wActionBar.collapseActionView(); - } - if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true"); - return true; - } - } - - if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning false"); - return false; - } - - @Override - public void dispatchDestroy() { - mIsDestroyed = true; - } - - @Override - public void dispatchSaveInstanceState(Bundle outState) { - if (mMenu != null) { - mMenuFrozenActionViewState = new Bundle(); - mMenu.saveActionViewStates(mMenuFrozenActionViewState); - } - outState.putParcelable(PANELS_TAG, mMenuFrozenActionViewState); - } - - @Override - public void dispatchRestoreInstanceState(Bundle savedInstanceState) { - mMenuFrozenActionViewState = savedInstanceState.getParcelable(PANELS_TAG); - } - - /////////////////////////////////////////////////////////////////////////// - // Menu callback lifecycle and creation - /////////////////////////////////////////////////////////////////////////// - - private boolean preparePanel() { - // Already prepared (isPrepared will be reset to false later) - if (mMenuIsPrepared) { - return true; - } - - // Init the panel state's menu--return false if init failed - if (mMenu == null || mMenuRefreshContent) { - if (mMenu == null) { - if (!initializePanelMenu() || (mMenu == null)) { - return false; - } - } - - if (wActionBar != null) { - wActionBar.setMenu(mMenu, this); - } - - // Call callback, and return if it doesn't want to display menu. - - // Creating the panel menu will involve a lot of manipulation; - // don't dispatch change events to presenters until we're done. - mMenu.stopDispatchingItemsChanged(); - if (!callbackCreateOptionsMenu(mMenu)) { - // Ditch the menu created above - mMenu = null; - - if (wActionBar != null) { - // Don't show it in the action bar either - wActionBar.setMenu(null, this); - } - - return false; - } - - mMenuRefreshContent = false; - } - - // Callback and return if the callback does not want to show the menu - - // Preparing the panel menu can involve a lot of manipulation; - // don't dispatch change events to presenters until we're done. - mMenu.stopDispatchingItemsChanged(); - - // Restore action view state before we prepare. This gives apps - // an opportunity to override frozen/restored state in onPrepare. - if (mMenuFrozenActionViewState != null) { - mMenu.restoreActionViewStates(mMenuFrozenActionViewState); - mMenuFrozenActionViewState = null; - } - - if (!callbackPrepareOptionsMenu(mMenu)) { - if (wActionBar != null) { - // The app didn't want to show the menu for now but it still exists. - // Clear it out of the action bar. - wActionBar.setMenu(null, this); - } - mMenu.startDispatchingItemsChanged(); - return false; - } - - // Set the proper keymap - KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); - mMenu.setQwertyMode(kmap.getKeyboardType() != KeyCharacterMap.NUMERIC); - mMenu.startDispatchingItemsChanged(); - - // Set other state - mMenuIsPrepared = true; - - return true; - } - - public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { - return callbackOptionsItemSelected(item); - } - - public void onMenuModeChange(MenuBuilder menu) { - reopenMenu(true); - } - - private void reopenMenu(boolean toggleMenuMode) { - if (wActionBar != null && wActionBar.isOverflowReserved()) { - if (!wActionBar.isOverflowMenuShowing() || !toggleMenuMode) { - if (wActionBar.getVisibility() == View.VISIBLE) { - if (callbackPrepareOptionsMenu(mMenu)) { - wActionBar.showOverflowMenu(); - } - } - } else { - wActionBar.hideOverflowMenu(); - } - return; - } - } - - private boolean initializePanelMenu() { - Context context = mActivity;//getContext(); - - // If we have an action bar, initialize the menu with a context themed for it. - if (wActionBar != null) { - TypedValue outValue = new TypedValue(); - Resources.Theme currentTheme = context.getTheme(); - currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, - outValue, true); - final int targetThemeRes = outValue.resourceId; - - if (targetThemeRes != 0 /*&& context.getThemeResId() != targetThemeRes*/) { - context = new ContextThemeWrapper(context, targetThemeRes); - } - } - - mMenu = new MenuBuilder(context); - mMenu.setCallback(this); - - return true; - } - - void checkCloseActionMenu(Menu menu) { - if (mClosingActionMenu) { - return; - } - - mClosingActionMenu = true; - wActionBar.dismissPopupMenus(); - //Callback cb = getCallback(); - //if (cb != null && !isDestroyed()) { - // cb.onPanelClosed(FEATURE_ACTION_BAR, menu); - //} - mClosingActionMenu = false; - } - - @Override - public boolean onOpenSubMenu(MenuBuilder subMenu) { - return true; - } - - @Override - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - checkCloseActionMenu(menu); - } - - @Override - public boolean onMenuItemClick(android.view.MenuItem item) { - if (DEBUG) Log.d(TAG, "[mNativeItemListener.onMenuItemClick] item: " + item); - - final MenuItemImpl sherlockItem = mNativeItemMap.get(item); - if (sherlockItem != null) { - sherlockItem.invoke(); - } else { - Log.e(TAG, "Options item \"" + item + "\" not found in mapping"); - } - - return true; //Do not allow continuation of native handling - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - return callbackOptionsItemSelected(item); - } - - - /////////////////////////////////////////////////////////////////////////// - // Progress bar interaction and internal handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public void setProgressBarVisibility(boolean visible) { - if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible); - - setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON : - Window.PROGRESS_VISIBILITY_OFF); - } - - @Override - public void setProgressBarIndeterminateVisibility(boolean visible) { - if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible); - - setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, - visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF); - } - - @Override - public void setProgressBarIndeterminate(boolean indeterminate) { - if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate); - - setFeatureInt(Window.FEATURE_PROGRESS, - indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF); - } - - @Override - public void setProgress(int progress) { - if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress); - - setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START); - } - - @Override - public void setSecondaryProgress(int secondaryProgress) { - if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress); - - setFeatureInt(Window.FEATURE_PROGRESS, - secondaryProgress + Window.PROGRESS_SECONDARY_START); - } - - private void setFeatureInt(int featureId, int value) { - updateInt(featureId, value, false); - } - - private void updateInt(int featureId, int value, boolean fromResume) { - // Do nothing if the decor is not yet installed... an update will - // need to be forced when we eventually become active. - if (mContentParent == null) { - return; - } - - final int featureMask = 1 << featureId; - - if ((getFeatures() & featureMask) == 0 && !fromResume) { - return; - } - - onIntChanged(featureId, value); - } - - private void onIntChanged(int featureId, int value) { - if (featureId == Window.FEATURE_PROGRESS || featureId == Window.FEATURE_INDETERMINATE_PROGRESS) { - updateProgressBars(value); - } - } - - private void updateProgressBars(int value) { - IcsProgressBar circularProgressBar = getCircularProgressBar(true); - IcsProgressBar horizontalProgressBar = getHorizontalProgressBar(true); - - final int features = mFeatures;//getLocalFeatures(); - if (value == Window.PROGRESS_VISIBILITY_ON) { - if ((features & (1 << Window.FEATURE_PROGRESS)) != 0) { - int level = horizontalProgressBar.getProgress(); - int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? - View.VISIBLE : View.INVISIBLE; - horizontalProgressBar.setVisibility(visibility); - } - if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0) { - circularProgressBar.setVisibility(View.VISIBLE); - } - } else if (value == Window.PROGRESS_VISIBILITY_OFF) { - if ((features & (1 << Window.FEATURE_PROGRESS)) != 0) { - horizontalProgressBar.setVisibility(View.GONE); - } - if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0) { - circularProgressBar.setVisibility(View.GONE); - } - } else if (value == Window.PROGRESS_INDETERMINATE_ON) { - horizontalProgressBar.setIndeterminate(true); - } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { - horizontalProgressBar.setIndeterminate(false); - } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { - // We want to set the progress value before testing for visibility - // so that when the progress bar becomes visible again, it has the - // correct level. - horizontalProgressBar.setProgress(value - Window.PROGRESS_START); - - if (value < Window.PROGRESS_END) { - showProgressBars(horizontalProgressBar, circularProgressBar); - } else { - hideProgressBars(horizontalProgressBar, circularProgressBar); - } - } else if (Window.PROGRESS_SECONDARY_START <= value && value <= Window.PROGRESS_SECONDARY_END) { - horizontalProgressBar.setSecondaryProgress(value - Window.PROGRESS_SECONDARY_START); - - showProgressBars(horizontalProgressBar, circularProgressBar); - } - } - - private void showProgressBars(IcsProgressBar horizontalProgressBar, IcsProgressBar spinnyProgressBar) { - final int features = mFeatures;//getLocalFeatures(); - if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0 && - spinnyProgressBar.getVisibility() == View.INVISIBLE) { - spinnyProgressBar.setVisibility(View.VISIBLE); - } - // Only show the progress bars if the primary progress is not complete - if ((features & (1 << Window.FEATURE_PROGRESS)) != 0 && - horizontalProgressBar.getProgress() < 10000) { - horizontalProgressBar.setVisibility(View.VISIBLE); - } - } - - private void hideProgressBars(IcsProgressBar horizontalProgressBar, IcsProgressBar spinnyProgressBar) { - final int features = mFeatures;//getLocalFeatures(); - Animation anim = AnimationUtils.loadAnimation(mActivity, android.R.anim.fade_out); - anim.setDuration(1000); - if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0 && - spinnyProgressBar.getVisibility() == View.VISIBLE) { - spinnyProgressBar.startAnimation(anim); - spinnyProgressBar.setVisibility(View.INVISIBLE); - } - if ((features & (1 << Window.FEATURE_PROGRESS)) != 0 && - horizontalProgressBar.getVisibility() == View.VISIBLE) { - horizontalProgressBar.startAnimation(anim); - horizontalProgressBar.setVisibility(View.INVISIBLE); - } - } - - private IcsProgressBar getCircularProgressBar(boolean shouldInstallDecor) { - if (mCircularProgressBar != null) { - return mCircularProgressBar; - } - if (mContentParent == null && shouldInstallDecor) { - installDecor(); - } - mCircularProgressBar = (IcsProgressBar)mDecor.findViewById(R.id.abs__progress_circular); - if (mCircularProgressBar != null) { - mCircularProgressBar.setVisibility(View.INVISIBLE); - } - return mCircularProgressBar; - } - - private IcsProgressBar getHorizontalProgressBar(boolean shouldInstallDecor) { - if (mHorizontalProgressBar != null) { - return mHorizontalProgressBar; - } - if (mContentParent == null && shouldInstallDecor) { - installDecor(); - } - mHorizontalProgressBar = (IcsProgressBar)mDecor.findViewById(R.id.abs__progress_horizontal); - if (mHorizontalProgressBar != null) { - mHorizontalProgressBar.setVisibility(View.INVISIBLE); - } - return mHorizontalProgressBar; - } - - - /////////////////////////////////////////////////////////////////////////// - // Feature management and content interaction and creation - /////////////////////////////////////////////////////////////////////////// - - private int getFeatures() { - if (DEBUG) Log.d(TAG, "[getFeatures] returning " + mFeatures); - - return mFeatures; - } - - @Override - public boolean hasFeature(int featureId) { - if (DEBUG) Log.d(TAG, "[hasFeature] featureId: " + featureId); - - boolean result = (mFeatures & (1 << featureId)) != 0; - if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result); - return result; - } - - @Override - public boolean requestFeature(int featureId) { - if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId); - - if (mContentParent != null) { - throw new AndroidRuntimeException("requestFeature() must be called before adding content"); - } - - switch (featureId) { - case Window.FEATURE_ACTION_BAR: - case Window.FEATURE_ACTION_BAR_OVERLAY: - case Window.FEATURE_ACTION_MODE_OVERLAY: - case Window.FEATURE_INDETERMINATE_PROGRESS: - case Window.FEATURE_NO_TITLE: - case Window.FEATURE_PROGRESS: - mFeatures |= (1 << featureId); - return true; - - default: - return false; - } - } - - @Override - public void setUiOptions(int uiOptions) { - if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions); - - mUiOptions = uiOptions; - } - - @Override - public void setUiOptions(int uiOptions, int mask) { - if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask); - - mUiOptions = (mUiOptions & ~mask) | (uiOptions & mask); - } - - @Override - public void setContentView(int layoutResId) { - if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId); - - if (mContentParent == null) { - installDecor(); - } else { - mContentParent.removeAllViews(); - } - mActivity.getLayoutInflater().inflate(layoutResId, mContentParent); - - android.view.Window.Callback callback = mActivity.getWindow().getCallback(); - if (callback != null) { - callback.onContentChanged(); - } - - initActionBar(); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params); - - if (mContentParent == null) { - installDecor(); - } else { - mContentParent.removeAllViews(); - } - mContentParent.addView(view, params); - - android.view.Window.Callback callback = mActivity.getWindow().getCallback(); - if (callback != null) { - callback.onContentChanged(); - } - - initActionBar(); - } - - @Override - public void addContentView(View view, ViewGroup.LayoutParams params) { - if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); - - if (mContentParent == null) { - installDecor(); - } - mContentParent.addView(view, params); - - initActionBar(); - } - - private void installDecor() { - if (DEBUG) Log.d(TAG, "[installDecor]"); - - if (mDecor == null) { - mDecor = (ViewGroup)mActivity.getWindow().getDecorView().findViewById(android.R.id.content); - } - if (mContentParent == null) { - //Since we are not operating at the window level we need to take - //into account the fact that the true decor may have already been - //initialized and had content attached to it. If that is the case, - //copy over its children to our new content container. - List views = null; - if (mDecor.getChildCount() > 0) { - views = new ArrayList(1); //Usually there's only one child - for (int i = 0, children = mDecor.getChildCount(); i < children; i++) { - View child = mDecor.getChildAt(0); - mDecor.removeView(child); - views.add(child); - } - } - - mContentParent = generateLayout(); - - //Copy over the old children. See above for explanation. - if (views != null) { - for (View child : views) { - mContentParent.addView(child); - } - } - - mTitleView = (TextView)mDecor.findViewById(android.R.id.title); - if (mTitleView != null) { - if (hasFeature(Window.FEATURE_NO_TITLE)) { - mTitleView.setVisibility(View.GONE); - if (mContentParent instanceof FrameLayout) { - ((FrameLayout)mContentParent).setForeground(null); - } - } else { - mTitleView.setText(mTitle); - } - } else { - wActionBar = (ActionBarView)mDecor.findViewById(R.id.abs__action_bar); - if (wActionBar != null) { - wActionBar.setWindowCallback(this); - if (wActionBar.getTitle() == null) { - wActionBar.setWindowTitle(mActivity.getTitle()); - } - if (hasFeature(Window.FEATURE_PROGRESS)) { - wActionBar.initProgress(); - } - if (hasFeature(Window.FEATURE_INDETERMINATE_PROGRESS)) { - wActionBar.initIndeterminateProgress(); - } - - //Since we don't require onCreate dispatching, parse for uiOptions here - int uiOptions = loadUiOptionsFromManifest(mActivity); - if (uiOptions != 0) { - mUiOptions = uiOptions; - } - - boolean splitActionBar = false; - final boolean splitWhenNarrow = (mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0; - if (splitWhenNarrow) { - splitActionBar = getResources_getBoolean(mActivity, R.bool.abs__split_action_bar_is_narrow); - } else { - splitActionBar = mActivity.getTheme() - .obtainStyledAttributes(R.styleable.SherlockTheme) - .getBoolean(R.styleable.SherlockTheme_windowSplitActionBar, false); - } - final ActionBarContainer splitView = (ActionBarContainer)mDecor.findViewById(R.id.abs__split_action_bar); - if (splitView != null) { - wActionBar.setSplitView(splitView); - wActionBar.setSplitActionBar(splitActionBar); - wActionBar.setSplitWhenNarrow(splitWhenNarrow); - - mActionModeView = (ActionBarContextView)mDecor.findViewById(R.id.abs__action_context_bar); - mActionModeView.setSplitView(splitView); - mActionModeView.setSplitActionBar(splitActionBar); - mActionModeView.setSplitWhenNarrow(splitWhenNarrow); - } else if (splitActionBar) { - Log.e(TAG, "Requested split action bar with incompatible window decor! Ignoring request."); - } - - // Post the panel invalidate for later; avoid application onCreateOptionsMenu - // being called in the middle of onCreate or similar. - mDecor.post(new Runnable() { - @Override - public void run() { - //Invalidate if the panel menu hasn't been created before this. - if (!mIsDestroyed && !mActivity.isFinishing() && mMenu == null) { - dispatchInvalidateOptionsMenu(); - } - } - }); - } - } - } - } - - private ViewGroup generateLayout() { - if (DEBUG) Log.d(TAG, "[generateLayout]"); - - // Apply data from current theme. - - TypedArray a = mActivity.getTheme().obtainStyledAttributes(R.styleable.SherlockTheme); - - mIsFloating = a.getBoolean(R.styleable.SherlockTheme_android_windowIsFloating, false); - - if (!a.hasValue(R.styleable.SherlockTheme_windowActionBar)) { - throw new IllegalStateException("You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative."); - } - - if (a.getBoolean(R.styleable.SherlockTheme_windowNoTitle, false)) { - requestFeature(Window.FEATURE_NO_TITLE); - } else if (a.getBoolean(R.styleable.SherlockTheme_windowActionBar, false)) { - // Don't allow an action bar if there is no title. - requestFeature(Window.FEATURE_ACTION_BAR); - } - - if (a.getBoolean(R.styleable.SherlockTheme_windowActionBarOverlay, false)) { - requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); - } - - if (a.getBoolean(R.styleable.SherlockTheme_windowActionModeOverlay, false)) { - requestFeature(Window.FEATURE_ACTION_MODE_OVERLAY); - } - - a.recycle(); - - int layoutResource; - if (!hasFeature(Window.FEATURE_NO_TITLE)) { - if (mIsFloating) { - //Trash original dialog LinearLayout - mDecor = (ViewGroup)mDecor.getParent(); - mDecor.removeAllViews(); - - layoutResource = R.layout.abs__dialog_title_holo; - } else { - if (hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) { - layoutResource = R.layout.abs__screen_action_bar_overlay; - } else { - layoutResource = R.layout.abs__screen_action_bar; - } - } - } else if (hasFeature(Window.FEATURE_ACTION_MODE_OVERLAY) && !hasFeature(Window.FEATURE_NO_TITLE)) { - layoutResource = R.layout.abs__screen_simple_overlay_action_mode; - } else { - layoutResource = R.layout.abs__screen_simple; - } - - if (DEBUG) Log.d(TAG, "[generateLayout] using screen XML " + mActivity.getResources().getString(layoutResource)); - View in = mActivity.getLayoutInflater().inflate(layoutResource, null); - mDecor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); - - ViewGroup contentParent = (ViewGroup)mDecor.findViewById(R.id.abs__content); - if (contentParent == null) { - throw new RuntimeException("Couldn't find content container view"); - } - - //Make our new child the true content view (for fragments). VERY VOLATILE! - mDecor.setId(View.NO_ID); - contentParent.setId(android.R.id.content); - - if (hasFeature(Window.FEATURE_INDETERMINATE_PROGRESS)) { - IcsProgressBar progress = getCircularProgressBar(false); - if (progress != null) { - progress.setIndeterminate(true); - } - } - - return contentParent; - } - - - /////////////////////////////////////////////////////////////////////////// - // Miscellaneous - /////////////////////////////////////////////////////////////////////////// - - /** - * Determine whether or not the device has a dedicated menu key. - * - * @return {@code true} if native menu key is present. - */ - private boolean isReservingOverflow() { - if (!mReserveOverflowSet) { - mReserveOverflow = ActionMenuPresenter.reserveOverflow(mActivity); - mReserveOverflowSet = true; - } - return mReserveOverflow; - } - - private static int loadUiOptionsFromManifest(Activity activity) { - int uiOptions = 0; - try { - final String thisPackage = activity.getClass().getName(); - if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage); - - final String packageName = activity.getApplicationInfo().packageName; - final AssetManager am = activity.createPackageContext(packageName, 0).getAssets(); - final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); - - int eventType = xml.getEventType(); - while (eventType != XmlPullParser.END_DOCUMENT) { - if (eventType == XmlPullParser.START_TAG) { - String name = xml.getName(); - - if ("application".equals(name)) { - //Check if the has the attribute - if (DEBUG) Log.d(TAG, "Got "); - - for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { - if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); - - if ("uiOptions".equals(xml.getAttributeName(i))) { - uiOptions = xml.getAttributeIntValue(i, 0); - break; //out of for loop - } - } - } else if ("activity".equals(name)) { - //Check if the is us and has the attribute - if (DEBUG) Log.d(TAG, "Got "); - Integer activityUiOptions = null; - String activityPackage = null; - boolean isOurActivity = false; - - for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { - if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); - - //We need both uiOptions and name attributes - String attrName = xml.getAttributeName(i); - if ("uiOptions".equals(attrName)) { - activityUiOptions = xml.getAttributeIntValue(i, 0); - } else if ("name".equals(attrName)) { - activityPackage = cleanActivityName(packageName, xml.getAttributeValue(i)); - if (!thisPackage.equals(activityPackage)) { - break; //out of for loop - } - isOurActivity = true; - } - - //Make sure we have both attributes before processing - if ((activityUiOptions != null) && (activityPackage != null)) { - //Our activity, uiOptions specified, override with our value - uiOptions = activityUiOptions.intValue(); - } - } - if (isOurActivity) { - //If we matched our activity but it had no logo don't - //do any more processing of the manifest - break; - } - } - } - eventType = xml.nextToken(); - } - } catch (Exception e) { - e.printStackTrace(); - } - if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(uiOptions)); - return uiOptions; - } - - public static String cleanActivityName(String manifestPackage, String activityName) { - if (activityName.charAt(0) == '.') { - //Relative activity name (e.g., android:name=".ui.SomeClass") - return manifestPackage + activityName; - } - if (activityName.indexOf('.', 1) == -1) { - //Unqualified activity name (e.g., android:name="SomeClass") - return manifestPackage + "." + activityName; - } - //Fully-qualified activity name (e.g., "com.my.package.SomeClass") - return activityName; - } - - /** - * Clears out internal reference when the action mode is destroyed. - */ - private class ActionModeCallbackWrapper implements ActionMode.Callback { - private final ActionMode.Callback mWrapped; - - public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { - mWrapped = wrapped; - } - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - return mWrapped.onCreateActionMode(mode, menu); - } - - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return mWrapped.onPrepareActionMode(mode, menu); - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - return mWrapped.onActionItemClicked(mode, item); - } - - public void onDestroyActionMode(ActionMode mode) { - mWrapped.onDestroyActionMode(mode); - if (mActionModeView != null) { - mActionModeView.setVisibility(View.GONE); - mActionModeView.removeAllViews(); - } - if (mActivity instanceof OnActionModeFinishedListener) { - ((OnActionModeFinishedListener)mActivity).onActionModeFinished(mActionMode); - } - mActionMode = null; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java deleted file mode 100644 index 0824d3848..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java +++ /dev/null @@ -1,336 +0,0 @@ -package com.actionbarsherlock.internal; - -import com.actionbarsherlock.ActionBarSherlock; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.app.ActionBarWrapper; -import com.actionbarsherlock.internal.view.menu.MenuWrapper; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.MenuInflater; -import android.app.Activity; -import android.content.Context; -import android.util.Log; -import android.util.TypedValue; -import android.view.ContextThemeWrapper; -import android.view.View; -import android.view.Window; -import android.view.ViewGroup.LayoutParams; - -@ActionBarSherlock.Implementation(api = 14) -public class ActionBarSherlockNative extends ActionBarSherlock { - private ActionBarWrapper mActionBar; - private ActionModeWrapper mActionMode; - private MenuWrapper mMenu; - - public ActionBarSherlockNative(Activity activity, int flags) { - super(activity, flags); - } - - - @Override - public ActionBar getActionBar() { - if (DEBUG) Log.d(TAG, "[getActionBar]"); - - initActionBar(); - return mActionBar; - } - - private void initActionBar() { - if (mActionBar != null || mActivity.getActionBar() == null) { - return; - } - - mActionBar = new ActionBarWrapper(mActivity); - } - - @Override - public void dispatchInvalidateOptionsMenu() { - if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]"); - - mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL); - } - - @Override - public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] menu: " + menu); - - if (mMenu == null || menu != mMenu.unwrap()) { - mMenu = new MenuWrapper(menu); - } - - final boolean result = callbackCreateOptionsMenu(mMenu); - if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] returning " + result); - return result; - } - - @Override - public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu); - - final boolean result = callbackPrepareOptionsMenu(mMenu); - if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result); - return result; - } - - @Override - public boolean dispatchOptionsItemSelected(android.view.MenuItem item) { - if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] item: " + item.getTitleCondensed()); - - final boolean result = callbackOptionsItemSelected(mMenu.findItem(item)); - if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result); - return result; - } - - @Override - public boolean hasFeature(int feature) { - if (DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature); - - final boolean result = mActivity.getWindow().hasFeature(feature); - if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result); - return result; - } - - @Override - public boolean requestFeature(int featureId) { - if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId); - - final boolean result = mActivity.getWindow().requestFeature(featureId); - if (DEBUG) Log.d(TAG, "[requestFeature] returning " + result); - return result; - } - - @Override - public void setUiOptions(int uiOptions) { - if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions); - - mActivity.getWindow().setUiOptions(uiOptions); - } - - @Override - public void setUiOptions(int uiOptions, int mask) { - if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask); - - mActivity.getWindow().setUiOptions(uiOptions, mask); - } - - @Override - public void setContentView(int layoutResId) { - if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId); - - mActivity.getWindow().setContentView(layoutResId); - initActionBar(); - } - - @Override - public void setContentView(View view, LayoutParams params) { - if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params); - - mActivity.getWindow().setContentView(view, params); - initActionBar(); - } - - @Override - public void addContentView(View view, LayoutParams params) { - if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); - - mActivity.getWindow().addContentView(view, params); - initActionBar(); - } - - @Override - public void setTitle(CharSequence title) { - if (DEBUG) Log.d(TAG, "[setTitle] title: " + title); - - mActivity.getWindow().setTitle(title); - } - - @Override - public void setProgressBarVisibility(boolean visible) { - if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible); - - mActivity.setProgressBarVisibility(visible); - } - - @Override - public void setProgressBarIndeterminateVisibility(boolean visible) { - if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible); - - mActivity.setProgressBarIndeterminateVisibility(visible); - } - - @Override - public void setProgressBarIndeterminate(boolean indeterminate) { - if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate); - - mActivity.setProgressBarIndeterminate(indeterminate); - } - - @Override - public void setProgress(int progress) { - if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress); - - mActivity.setProgress(progress); - } - - @Override - public void setSecondaryProgress(int secondaryProgress) { - if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress); - - mActivity.setSecondaryProgress(secondaryProgress); - } - - @Override - protected Context getThemedContext() { - Context context = mActivity; - TypedValue outValue = new TypedValue(); - mActivity.getTheme().resolveAttribute(android.R.attr.actionBarWidgetTheme, outValue, true); - if (outValue.resourceId != 0) { - //We are unable to test if this is the same as our current theme - //so we just wrap it and hope that if the attribute was specified - //then the user is intentionally specifying an alternate theme. - context = new ContextThemeWrapper(context, outValue.resourceId); - } - return context; - } - - @Override - public ActionMode startActionMode(com.actionbarsherlock.view.ActionMode.Callback callback) { - if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback); - - if (mActionMode != null) { - mActionMode.finish(); - } - ActionModeCallbackWrapper wrapped = null; - if (callback != null) { - wrapped = new ActionModeCallbackWrapper(callback); - } - - //Calling this will trigger the callback wrapper's onCreate which - //is where we will set the new instance to mActionMode since we need - //to pass it through to the sherlock callbacks and the call below - //will not have returned yet to store its value. - if (mActivity.startActionMode(wrapped) == null) { - mActionMode = null; - } - if (mActivity instanceof OnActionModeStartedListener && mActionMode != null) { - ((OnActionModeStartedListener)mActivity).onActionModeStarted(mActionMode); - } - - return mActionMode; - } - - private class ActionModeCallbackWrapper implements android.view.ActionMode.Callback { - private final ActionMode.Callback mCallback; - - public ActionModeCallbackWrapper(ActionMode.Callback callback) { - mCallback = callback; - } - - @Override - public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) { - //See ActionBarSherlockNative#startActionMode - mActionMode = new ActionModeWrapper(mode); - - return mCallback.onCreateActionMode(mActionMode, mActionMode.getMenu()); - } - - @Override - public boolean onPrepareActionMode(android.view.ActionMode mode, android.view.Menu menu) { - return mCallback.onPrepareActionMode(mActionMode, mActionMode.getMenu()); - } - - @Override - public boolean onActionItemClicked(android.view.ActionMode mode, android.view.MenuItem item) { - return mCallback.onActionItemClicked(mActionMode, mActionMode.getMenu().findItem(item)); - } - - @Override - public void onDestroyActionMode(android.view.ActionMode mode) { - mCallback.onDestroyActionMode(mActionMode); - if (mActivity instanceof OnActionModeFinishedListener) { - ((OnActionModeFinishedListener)mActivity).onActionModeFinished(mActionMode); - } - } - } - - private class ActionModeWrapper extends ActionMode { - private final android.view.ActionMode mActionMode; - private MenuWrapper mMenu = null; - - ActionModeWrapper(android.view.ActionMode actionMode) { - mActionMode = actionMode; - } - - @Override - public void setTitle(CharSequence title) { - mActionMode.setTitle(title); - } - - @Override - public void setTitle(int resId) { - mActionMode.setTitle(resId); - } - - @Override - public void setSubtitle(CharSequence subtitle) { - mActionMode.setSubtitle(subtitle); - } - - @Override - public void setSubtitle(int resId) { - mActionMode.setSubtitle(resId); - } - - @Override - public void setCustomView(View view) { - mActionMode.setCustomView(view); - } - - @Override - public void invalidate() { - mActionMode.invalidate(); - } - - @Override - public void finish() { - mActionMode.finish(); - } - - @Override - public MenuWrapper getMenu() { - if (mMenu == null) { - mMenu = new MenuWrapper(mActionMode.getMenu()); - } - return mMenu; - } - - @Override - public CharSequence getTitle() { - return mActionMode.getTitle(); - } - - @Override - public CharSequence getSubtitle() { - return mActionMode.getSubtitle(); - } - - @Override - public View getCustomView() { - return mActionMode.getCustomView(); - } - - @Override - public MenuInflater getMenuInflater() { - return ActionBarSherlockNative.this.getMenuInflater(); - } - - @Override - public void setTag(Object tag) { - mActionMode.setTag(tag); - } - - @Override - public Object getTag() { - return mActionMode.getTag(); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java deleted file mode 100644 index 8e1efe8c5..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.actionbarsherlock.internal; - -import android.content.Context; -import android.os.Build; -import android.util.DisplayMetrics; -import com.actionbarsherlock.R; - -public final class ResourcesCompat { - //No instances - private ResourcesCompat() {} - - - /** - * Support implementation of {@code getResources().getBoolean()} that we - * can use to simulate filtering based on width and smallest width - * qualifiers on pre-3.2. - * - * @param context Context to load booleans from on 3.2+ and to fetch the - * display metrics. - * @param id Id of boolean to load. - * @return Associated boolean value as reflected by the current display - * metrics. - */ - public static boolean getResources_getBoolean(Context context, int id) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { - return context.getResources().getBoolean(id); - } - - DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - float widthDp = metrics.widthPixels / metrics.density; - float heightDp = metrics.heightPixels / metrics.density; - float smallestWidthDp = (widthDp < heightDp) ? widthDp : heightDp; - - if (id == R.bool.abs__action_bar_embed_tabs) { - if (widthDp >= 480) { - return true; //values-w480dp - } - return false; //values - } - if (id == R.bool.abs__split_action_bar_is_narrow) { - if (widthDp >= 480) { - return false; //values-w480dp - } - return true; //values - } - if (id == R.bool.abs__action_bar_expanded_action_views_exclusive) { - if (smallestWidthDp >= 600) { - return false; //values-sw600dp - } - return true; //values - } - if (id == R.bool.abs__config_allowActionMenuItemTextWithIcon) { - if (widthDp >= 480) { - return true; //values-w480dp - } - return false; //values - } - - throw new IllegalArgumentException("Unknown boolean resource ID " + id); - } - - /** - * Support implementation of {@code getResources().getInteger()} that we - * can use to simulate filtering based on width qualifiers on pre-3.2. - * - * @param context Context to load integers from on 3.2+ and to fetch the - * display metrics. - * @param id Id of integer to load. - * @return Associated integer value as reflected by the current display - * metrics. - */ - public static int getResources_getInteger(Context context, int id) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { - return context.getResources().getInteger(id); - } - - DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - float widthDp = metrics.widthPixels / metrics.density; - - if (id == R.integer.abs__max_action_buttons) { - if (widthDp >= 600) { - return 5; //values-w600dp - } - if (widthDp >= 500) { - return 4; //values-w500dp - } - if (widthDp >= 360) { - return 3; //values-w360dp - } - return 2; //values - } - - throw new IllegalArgumentException("Unknown integer resource ID " + id); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java deleted file mode 100644 index d022a2465..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java +++ /dev/null @@ -1,1026 +0,0 @@ -/* - * Copyright (C) 2010 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.app; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import android.app.Activity; -import android.app.Dialog; -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Handler; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentTransaction; -import android.util.TypedValue; -import android.view.ContextThemeWrapper; -import android.view.LayoutInflater; -import android.view.View; -import android.view.Window; -import android.view.accessibility.AccessibilityEvent; -import android.widget.SpinnerAdapter; -import com.actionbarsherlock.R; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; -import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorListenerAdapter; -import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet; -import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; -import com.actionbarsherlock.internal.nineoldandroids.animation.Animator.AnimatorListener; -import com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout; -import com.actionbarsherlock.internal.view.menu.MenuBuilder; -import com.actionbarsherlock.internal.view.menu.MenuPopupHelper; -import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; -import com.actionbarsherlock.internal.widget.ActionBarContainer; -import com.actionbarsherlock.internal.widget.ActionBarContextView; -import com.actionbarsherlock.internal.widget.ActionBarView; -import com.actionbarsherlock.internal.widget.ScrollingTabContainerView; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; -import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; - -/** - * ActionBarImpl is the ActionBar implementation used - * by devices of all screen sizes. If it detects a compatible decor, - * it will split contextual modes across both the ActionBarView at - * the top of the screen and a horizontal LinearLayout at the bottom - * which is normally hidden. - */ -public class ActionBarImpl extends ActionBar { - //UNUSED private static final String TAG = "ActionBarImpl"; - - private Context mContext; - private Context mThemedContext; - private Activity mActivity; - //UNUSED private Dialog mDialog; - - private ActionBarContainer mContainerView; - private ActionBarView mActionView; - private ActionBarContextView mContextView; - private ActionBarContainer mSplitView; - private NineFrameLayout mContentView; - private ScrollingTabContainerView mTabScrollView; - - private ArrayList mTabs = new ArrayList(); - - private TabImpl mSelectedTab; - private int mSavedTabPosition = INVALID_POSITION; - - ActionModeImpl mActionMode; - ActionMode mDeferredDestroyActionMode; - ActionMode.Callback mDeferredModeDestroyCallback; - - private boolean mLastMenuVisibility; - private ArrayList mMenuVisibilityListeners = - new ArrayList(); - - private static final int CONTEXT_DISPLAY_NORMAL = 0; - private static final int CONTEXT_DISPLAY_SPLIT = 1; - - private static final int INVALID_POSITION = -1; - - private int mContextDisplayMode; - private boolean mHasEmbeddedTabs; - - final Handler mHandler = new Handler(); - Runnable mTabSelector; - - private Animator mCurrentShowAnim; - private Animator mCurrentModeAnim; - private boolean mShowHideAnimationEnabled; - boolean mWasHiddenBeforeMode; - - final AnimatorListener mHideListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (mContentView != null) { - mContentView.setTranslationY(0); - mContainerView.setTranslationY(0); - } - if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { - mSplitView.setVisibility(View.GONE); - } - mContainerView.setVisibility(View.GONE); - mContainerView.setTransitioning(false); - mCurrentShowAnim = null; - completeDeferredDestroyActionMode(); - } - }; - - final AnimatorListener mShowListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mCurrentShowAnim = null; - mContainerView.requestLayout(); - } - }; - - public ActionBarImpl(Activity activity, int features) { - mActivity = activity; - Window window = activity.getWindow(); - View decor = window.getDecorView(); - init(decor); - - //window.hasFeature() workaround for pre-3.0 - if ((features & (1 << Window.FEATURE_ACTION_BAR_OVERLAY)) == 0) { - mContentView = (NineFrameLayout)decor.findViewById(android.R.id.content); - } - } - - public ActionBarImpl(Dialog dialog) { - //UNUSED mDialog = dialog; - init(dialog.getWindow().getDecorView()); - } - - private void init(View decor) { - mContext = decor.getContext(); - mActionView = (ActionBarView) decor.findViewById(R.id.abs__action_bar); - mContextView = (ActionBarContextView) decor.findViewById( - R.id.abs__action_context_bar); - mContainerView = (ActionBarContainer) decor.findViewById( - R.id.abs__action_bar_container); - mSplitView = (ActionBarContainer) decor.findViewById( - R.id.abs__split_action_bar); - - if (mActionView == null || mContextView == null || mContainerView == null) { - throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + - "with a compatible window decor layout"); - } - - mActionView.setContextView(mContextView); - mContextDisplayMode = mActionView.isSplitActionBar() ? - CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL; - - // Older apps get the home button interaction enabled by default. - // Newer apps need to enable it explicitly. - setHomeButtonEnabled(mContext.getApplicationInfo().targetSdkVersion < 14); - - setHasEmbeddedTabs(getResources_getBoolean(mContext, - R.bool.abs__action_bar_embed_tabs)); - } - - public void onConfigurationChanged(Configuration newConfig) { - setHasEmbeddedTabs(getResources_getBoolean(mContext, - R.bool.abs__action_bar_embed_tabs)); - - //Manually dispatch a configuration change to the action bar view on pre-2.2 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { - mActionView.onConfigurationChanged(newConfig); - if (mContextView != null) { - mContextView.onConfigurationChanged(newConfig); - } - } - } - - private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { - mHasEmbeddedTabs = hasEmbeddedTabs; - // Switch tab layout configuration if needed - if (!mHasEmbeddedTabs) { - mActionView.setEmbeddedTabView(null); - mContainerView.setTabContainer(mTabScrollView); - } else { - mContainerView.setTabContainer(null); - mActionView.setEmbeddedTabView(mTabScrollView); - } - final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; - if (mTabScrollView != null) { - mTabScrollView.setVisibility(isInTabMode ? View.VISIBLE : View.GONE); - } - mActionView.setCollapsable(!mHasEmbeddedTabs && isInTabMode); - } - - private void ensureTabsExist() { - if (mTabScrollView != null) { - return; - } - - ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext); - - if (mHasEmbeddedTabs) { - tabScroller.setVisibility(View.VISIBLE); - mActionView.setEmbeddedTabView(tabScroller); - } else { - tabScroller.setVisibility(getNavigationMode() == NAVIGATION_MODE_TABS ? - View.VISIBLE : View.GONE); - mContainerView.setTabContainer(tabScroller); - } - mTabScrollView = tabScroller; - } - - void completeDeferredDestroyActionMode() { - if (mDeferredModeDestroyCallback != null) { - mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode); - mDeferredDestroyActionMode = null; - mDeferredModeDestroyCallback = null; - } - } - - /** - * Enables or disables animation between show/hide states. - * If animation is disabled using this method, animations in progress - * will be finished. - * - * @param enabled true to animate, false to not animate. - */ - public void setShowHideAnimationEnabled(boolean enabled) { - mShowHideAnimationEnabled = enabled; - if (!enabled && mCurrentShowAnim != null) { - mCurrentShowAnim.end(); - } - } - - public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { - mMenuVisibilityListeners.add(listener); - } - - public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { - mMenuVisibilityListeners.remove(listener); - } - - public void dispatchMenuVisibilityChanged(boolean isVisible) { - if (isVisible == mLastMenuVisibility) { - return; - } - mLastMenuVisibility = isVisible; - - final int count = mMenuVisibilityListeners.size(); - for (int i = 0; i < count; i++) { - mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible); - } - } - - @Override - public void setCustomView(int resId) { - setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId, mActionView, false)); - } - - @Override - public void setDisplayUseLogoEnabled(boolean useLogo) { - setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO); - } - - @Override - public void setDisplayShowHomeEnabled(boolean showHome) { - setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME); - } - - @Override - public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { - setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP); - } - - @Override - public void setDisplayShowTitleEnabled(boolean showTitle) { - setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE); - } - - @Override - public void setDisplayShowCustomEnabled(boolean showCustom) { - setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM); - } - - @Override - public void setHomeButtonEnabled(boolean enable) { - mActionView.setHomeButtonEnabled(enable); - } - - @Override - public void setTitle(int resId) { - setTitle(mContext.getString(resId)); - } - - @Override - public void setSubtitle(int resId) { - setSubtitle(mContext.getString(resId)); - } - - public void setSelectedNavigationItem(int position) { - switch (mActionView.getNavigationMode()) { - case NAVIGATION_MODE_TABS: - selectTab(mTabs.get(position)); - break; - case NAVIGATION_MODE_LIST: - mActionView.setDropdownSelectedPosition(position); - break; - default: - throw new IllegalStateException( - "setSelectedNavigationIndex not valid for current navigation mode"); - } - } - - public void removeAllTabs() { - cleanupTabs(); - } - - private void cleanupTabs() { - if (mSelectedTab != null) { - selectTab(null); - } - mTabs.clear(); - if (mTabScrollView != null) { - mTabScrollView.removeAllTabs(); - } - mSavedTabPosition = INVALID_POSITION; - } - - public void setTitle(CharSequence title) { - mActionView.setTitle(title); - } - - public void setSubtitle(CharSequence subtitle) { - mActionView.setSubtitle(subtitle); - } - - public void setDisplayOptions(int options) { - mActionView.setDisplayOptions(options); - } - - public void setDisplayOptions(int options, int mask) { - final int current = mActionView.getDisplayOptions(); - mActionView.setDisplayOptions((options & mask) | (current & ~mask)); - } - - public void setBackgroundDrawable(Drawable d) { - mContainerView.setPrimaryBackground(d); - } - - public void setStackedBackgroundDrawable(Drawable d) { - mContainerView.setStackedBackground(d); - } - - public void setSplitBackgroundDrawable(Drawable d) { - if (mSplitView != null) { - mSplitView.setSplitBackground(d); - } - } - - public View getCustomView() { - return mActionView.getCustomNavigationView(); - } - - public CharSequence getTitle() { - return mActionView.getTitle(); - } - - public CharSequence getSubtitle() { - return mActionView.getSubtitle(); - } - - public int getNavigationMode() { - return mActionView.getNavigationMode(); - } - - public int getDisplayOptions() { - return mActionView.getDisplayOptions(); - } - - public ActionMode startActionMode(ActionMode.Callback callback) { - boolean wasHidden = false; - if (mActionMode != null) { - wasHidden = mWasHiddenBeforeMode; - mActionMode.finish(); - } - - mContextView.killMode(); - ActionModeImpl mode = new ActionModeImpl(callback); - if (mode.dispatchOnCreate()) { - mWasHiddenBeforeMode = !isShowing() || wasHidden; - mode.invalidate(); - mContextView.initForMode(mode); - animateToMode(true); - if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { - // TODO animate this - mSplitView.setVisibility(View.VISIBLE); - } - mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - mActionMode = mode; - return mode; - } - return null; - } - - private void configureTab(Tab tab, int position) { - final TabImpl tabi = (TabImpl) tab; - final ActionBar.TabListener callback = tabi.getCallback(); - - if (callback == null) { - throw new IllegalStateException("Action Bar Tab must have a Callback"); - } - - tabi.setPosition(position); - mTabs.add(position, tabi); - - final int count = mTabs.size(); - for (int i = position + 1; i < count; i++) { - mTabs.get(i).setPosition(i); - } - } - - @Override - public void addTab(Tab tab) { - addTab(tab, mTabs.isEmpty()); - } - - @Override - public void addTab(Tab tab, int position) { - addTab(tab, position, mTabs.isEmpty()); - } - - @Override - public void addTab(Tab tab, boolean setSelected) { - ensureTabsExist(); - mTabScrollView.addTab(tab, setSelected); - configureTab(tab, mTabs.size()); - if (setSelected) { - selectTab(tab); - } - } - - @Override - public void addTab(Tab tab, int position, boolean setSelected) { - ensureTabsExist(); - mTabScrollView.addTab(tab, position, setSelected); - configureTab(tab, position); - if (setSelected) { - selectTab(tab); - } - } - - @Override - public Tab newTab() { - return new TabImpl(); - } - - @Override - public void removeTab(Tab tab) { - removeTabAt(tab.getPosition()); - } - - @Override - public void removeTabAt(int position) { - if (mTabScrollView == null) { - // No tabs around to remove - return; - } - - int selectedTabPosition = mSelectedTab != null - ? mSelectedTab.getPosition() : mSavedTabPosition; - mTabScrollView.removeTabAt(position); - TabImpl removedTab = mTabs.remove(position); - if (removedTab != null) { - removedTab.setPosition(-1); - } - - final int newTabCount = mTabs.size(); - for (int i = position; i < newTabCount; i++) { - mTabs.get(i).setPosition(i); - } - - if (selectedTabPosition == position) { - selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1))); - } - } - - @Override - public void selectTab(Tab tab) { - if (getNavigationMode() != NAVIGATION_MODE_TABS) { - mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION; - return; - } - - FragmentTransaction trans = null; - if (mActivity instanceof FragmentActivity) { - trans = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() - .disallowAddToBackStack(); - } - - if (mSelectedTab == tab) { - if (mSelectedTab != null) { - mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans); - mTabScrollView.animateToTab(tab.getPosition()); - } - } else { - mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION); - if (mSelectedTab != null) { - mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans); - } - mSelectedTab = (TabImpl) tab; - if (mSelectedTab != null) { - mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans); - } - } - - if (trans != null && !trans.isEmpty()) { - trans.commit(); - } - } - - @Override - public Tab getSelectedTab() { - return mSelectedTab; - } - - @Override - public int getHeight() { - return mContainerView.getHeight(); - } - - @Override - public void show() { - show(true); - } - - void show(boolean markHiddenBeforeMode) { - if (mCurrentShowAnim != null) { - mCurrentShowAnim.end(); - } - if (mContainerView.getVisibility() == View.VISIBLE) { - if (markHiddenBeforeMode) mWasHiddenBeforeMode = false; - return; - } - mContainerView.setVisibility(View.VISIBLE); - - if (mShowHideAnimationEnabled) { - mContainerView.setAlpha(0); - AnimatorSet anim = new AnimatorSet(); - AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); - if (mContentView != null) { - b.with(ObjectAnimator.ofFloat(mContentView, "translationY", - -mContainerView.getHeight(), 0)); - mContainerView.setTranslationY(-mContainerView.getHeight()); - b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0)); - } - if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { - mSplitView.setAlpha(0); - mSplitView.setVisibility(View.VISIBLE); - b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 1)); - } - anim.addListener(mShowListener); - mCurrentShowAnim = anim; - anim.start(); - } else { - mContainerView.setAlpha(1); - mContainerView.setTranslationY(0); - mShowListener.onAnimationEnd(null); - } - } - - @Override - public void hide() { - if (mCurrentShowAnim != null) { - mCurrentShowAnim.end(); - } - if (mContainerView.getVisibility() == View.GONE) { - return; - } - - if (mShowHideAnimationEnabled) { - mContainerView.setAlpha(1); - mContainerView.setTransitioning(true); - AnimatorSet anim = new AnimatorSet(); - AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); - if (mContentView != null) { - b.with(ObjectAnimator.ofFloat(mContentView, "translationY", - 0, -mContainerView.getHeight())); - b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", - -mContainerView.getHeight())); - } - if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { - mSplitView.setAlpha(1); - b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 0)); - } - anim.addListener(mHideListener); - mCurrentShowAnim = anim; - anim.start(); - } else { - mHideListener.onAnimationEnd(null); - } - } - - public boolean isShowing() { - return mContainerView.getVisibility() == View.VISIBLE; - } - - void animateToMode(boolean toActionMode) { - if (toActionMode) { - show(false); - } - if (mCurrentModeAnim != null) { - mCurrentModeAnim.end(); - } - - mActionView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); - mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); - if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) { - mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); - } - } - - public Context getThemedContext() { - if (mThemedContext == null) { - TypedValue outValue = new TypedValue(); - Resources.Theme currentTheme = mContext.getTheme(); - currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, - outValue, true); - final int targetThemeRes = outValue.resourceId; - - if (targetThemeRes != 0) { //XXX && mContext.getThemeResId() != targetThemeRes) { - mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); - } else { - mThemedContext = mContext; - } - } - return mThemedContext; - } - - /** - * @hide - */ - public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { - private ActionMode.Callback mCallback; - private MenuBuilder mMenu; - private WeakReference mCustomView; - - public ActionModeImpl(ActionMode.Callback callback) { - mCallback = callback; - mMenu = new MenuBuilder(getThemedContext()) - .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - mMenu.setCallback(this); - } - - @Override - public MenuInflater getMenuInflater() { - return new MenuInflater(getThemedContext()); - } - - @Override - public Menu getMenu() { - return mMenu; - } - - @Override - public void finish() { - if (mActionMode != this) { - // Not the active action mode - no-op - return; - } - - // If we were hidden before the mode was shown, defer the onDestroy - // callback until the animation is finished and associated relayout - // is about to happen. This lets apps better anticipate visibility - // and layout behavior. - if (mWasHiddenBeforeMode) { - mDeferredDestroyActionMode = this; - mDeferredModeDestroyCallback = mCallback; - } else { - mCallback.onDestroyActionMode(this); - } - mCallback = null; - animateToMode(false); - - // Clear out the context mode views after the animation finishes - mContextView.closeMode(); - mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - - mActionMode = null; - - if (mWasHiddenBeforeMode) { - hide(); - } - } - - @Override - public void invalidate() { - mMenu.stopDispatchingItemsChanged(); - try { - mCallback.onPrepareActionMode(this, mMenu); - } finally { - mMenu.startDispatchingItemsChanged(); - } - } - - public boolean dispatchOnCreate() { - mMenu.stopDispatchingItemsChanged(); - try { - return mCallback.onCreateActionMode(this, mMenu); - } finally { - mMenu.startDispatchingItemsChanged(); - } - } - - @Override - public void setCustomView(View view) { - mContextView.setCustomView(view); - mCustomView = new WeakReference(view); - } - - @Override - public void setSubtitle(CharSequence subtitle) { - mContextView.setSubtitle(subtitle); - } - - @Override - public void setTitle(CharSequence title) { - mContextView.setTitle(title); - } - - @Override - public void setTitle(int resId) { - setTitle(mContext.getResources().getString(resId)); - } - - @Override - public void setSubtitle(int resId) { - setSubtitle(mContext.getResources().getString(resId)); - } - - @Override - public CharSequence getTitle() { - return mContextView.getTitle(); - } - - @Override - public CharSequence getSubtitle() { - return mContextView.getSubtitle(); - } - - @Override - public View getCustomView() { - return mCustomView != null ? mCustomView.get() : null; - } - - public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { - if (mCallback != null) { - return mCallback.onActionItemClicked(this, item); - } else { - return false; - } - } - - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - } - - public boolean onSubMenuSelected(SubMenuBuilder subMenu) { - if (mCallback == null) { - return false; - } - - if (!subMenu.hasVisibleItems()) { - return true; - } - - new MenuPopupHelper(getThemedContext(), subMenu).show(); - return true; - } - - public void onCloseSubMenu(SubMenuBuilder menu) { - } - - public void onMenuModeChange(MenuBuilder menu) { - if (mCallback == null) { - return; - } - invalidate(); - mContextView.showOverflowMenu(); - } - } - - /** - * @hide - */ - public class TabImpl extends ActionBar.Tab { - private ActionBar.TabListener mCallback; - private Object mTag; - private Drawable mIcon; - private CharSequence mText; - private CharSequence mContentDesc; - private int mPosition = -1; - private View mCustomView; - - @Override - public Object getTag() { - return mTag; - } - - @Override - public Tab setTag(Object tag) { - mTag = tag; - return this; - } - - public ActionBar.TabListener getCallback() { - return mCallback; - } - - @Override - public Tab setTabListener(ActionBar.TabListener callback) { - mCallback = callback; - return this; - } - - @Override - public View getCustomView() { - return mCustomView; - } - - @Override - public Tab setCustomView(View view) { - mCustomView = view; - if (mPosition >= 0) { - mTabScrollView.updateTab(mPosition); - } - return this; - } - - @Override - public Tab setCustomView(int layoutResId) { - return setCustomView(LayoutInflater.from(getThemedContext()) - .inflate(layoutResId, null)); - } - - @Override - public Drawable getIcon() { - return mIcon; - } - - @Override - public int getPosition() { - return mPosition; - } - - public void setPosition(int position) { - mPosition = position; - } - - @Override - public CharSequence getText() { - return mText; - } - - @Override - public Tab setIcon(Drawable icon) { - mIcon = icon; - if (mPosition >= 0) { - mTabScrollView.updateTab(mPosition); - } - return this; - } - - @Override - public Tab setIcon(int resId) { - return setIcon(mContext.getResources().getDrawable(resId)); - } - - @Override - public Tab setText(CharSequence text) { - mText = text; - if (mPosition >= 0) { - mTabScrollView.updateTab(mPosition); - } - return this; - } - - @Override - public Tab setText(int resId) { - return setText(mContext.getResources().getText(resId)); - } - - @Override - public void select() { - selectTab(this); - } - - @Override - public Tab setContentDescription(int resId) { - return setContentDescription(mContext.getResources().getText(resId)); - } - - @Override - public Tab setContentDescription(CharSequence contentDesc) { - mContentDesc = contentDesc; - if (mPosition >= 0) { - mTabScrollView.updateTab(mPosition); - } - return this; - } - - @Override - public CharSequence getContentDescription() { - return mContentDesc; - } - } - - @Override - public void setCustomView(View view) { - mActionView.setCustomNavigationView(view); - } - - @Override - public void setCustomView(View view, LayoutParams layoutParams) { - view.setLayoutParams(layoutParams); - mActionView.setCustomNavigationView(view); - } - - @Override - public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { - mActionView.setDropdownAdapter(adapter); - mActionView.setCallback(callback); - } - - @Override - public int getSelectedNavigationIndex() { - switch (mActionView.getNavigationMode()) { - case NAVIGATION_MODE_TABS: - return mSelectedTab != null ? mSelectedTab.getPosition() : -1; - case NAVIGATION_MODE_LIST: - return mActionView.getDropdownSelectedPosition(); - default: - return -1; - } - } - - @Override - public int getNavigationItemCount() { - switch (mActionView.getNavigationMode()) { - case NAVIGATION_MODE_TABS: - return mTabs.size(); - case NAVIGATION_MODE_LIST: - SpinnerAdapter adapter = mActionView.getDropdownAdapter(); - return adapter != null ? adapter.getCount() : 0; - default: - return 0; - } - } - - @Override - public int getTabCount() { - return mTabs.size(); - } - - @Override - public void setNavigationMode(int mode) { - final int oldMode = mActionView.getNavigationMode(); - switch (oldMode) { - case NAVIGATION_MODE_TABS: - mSavedTabPosition = getSelectedNavigationIndex(); - selectTab(null); - mTabScrollView.setVisibility(View.GONE); - break; - } - mActionView.setNavigationMode(mode); - switch (mode) { - case NAVIGATION_MODE_TABS: - ensureTabsExist(); - mTabScrollView.setVisibility(View.VISIBLE); - if (mSavedTabPosition != INVALID_POSITION) { - setSelectedNavigationItem(mSavedTabPosition); - mSavedTabPosition = INVALID_POSITION; - } - break; - } - mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); - } - - @Override - public Tab getTabAt(int index) { - return mTabs.get(index); - } - - - @Override - public void setIcon(int resId) { - mActionView.setIcon(resId); - } - - @Override - public void setIcon(Drawable icon) { - mActionView.setIcon(icon); - } - - @Override - public void setLogo(int resId) { - mActionView.setLogo(resId); - } - - @Override - public void setLogo(Drawable logo) { - mActionView.setLogo(logo); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java deleted file mode 100644 index 840cb3d27..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java +++ /dev/null @@ -1,468 +0,0 @@ -package com.actionbarsherlock.internal.app; - -import java.util.HashSet; -import java.util.Set; - -import android.app.Activity; -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentTransaction; -import android.view.View; -import android.widget.SpinnerAdapter; - -import com.actionbarsherlock.app.ActionBar; - -public class ActionBarWrapper extends ActionBar implements android.app.ActionBar.OnNavigationListener, android.app.ActionBar.OnMenuVisibilityListener { - private final Activity mActivity; - private final android.app.ActionBar mActionBar; - private ActionBar.OnNavigationListener mNavigationListener; - private Set mMenuVisibilityListeners = new HashSet(1); - private FragmentTransaction mFragmentTransaction; - - - public ActionBarWrapper(Activity activity) { - mActivity = activity; - mActionBar = activity.getActionBar(); - if (mActionBar != null) { - mActionBar.addOnMenuVisibilityListener(this); - } - } - - - @Override - public void setHomeButtonEnabled(boolean enabled) { - mActionBar.setHomeButtonEnabled(enabled); - } - - @Override - public Context getThemedContext() { - return mActionBar.getThemedContext(); - } - - @Override - public void setCustomView(View view) { - mActionBar.setCustomView(view); - } - - @Override - public void setCustomView(View view, LayoutParams layoutParams) { - android.app.ActionBar.LayoutParams lp = new android.app.ActionBar.LayoutParams(layoutParams); - lp.gravity = layoutParams.gravity; - lp.bottomMargin = layoutParams.bottomMargin; - lp.topMargin = layoutParams.topMargin; - lp.leftMargin = layoutParams.leftMargin; - lp.rightMargin = layoutParams.rightMargin; - mActionBar.setCustomView(view, lp); - } - - @Override - public void setCustomView(int resId) { - mActionBar.setCustomView(resId); - } - - @Override - public void setIcon(int resId) { - mActionBar.setIcon(resId); - } - - @Override - public void setIcon(Drawable icon) { - mActionBar.setIcon(icon); - } - - @Override - public void setLogo(int resId) { - mActionBar.setLogo(resId); - } - - @Override - public void setLogo(Drawable logo) { - mActionBar.setLogo(logo); - } - - @Override - public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { - mNavigationListener = callback; - mActionBar.setListNavigationCallbacks(adapter, (callback != null) ? this : null); - } - - @Override - public boolean onNavigationItemSelected(int itemPosition, long itemId) { - //This should never be a NullPointerException since we only set - //ourselves as the listener when the callback is not null. - return mNavigationListener.onNavigationItemSelected(itemPosition, itemId); - } - - @Override - public void setSelectedNavigationItem(int position) { - mActionBar.setSelectedNavigationItem(position); - } - - @Override - public int getSelectedNavigationIndex() { - return mActionBar.getSelectedNavigationIndex(); - } - - @Override - public int getNavigationItemCount() { - return mActionBar.getNavigationItemCount(); - } - - @Override - public void setTitle(CharSequence title) { - mActionBar.setTitle(title); - } - - @Override - public void setTitle(int resId) { - mActionBar.setTitle(resId); - } - - @Override - public void setSubtitle(CharSequence subtitle) { - mActionBar.setSubtitle(subtitle); - } - - @Override - public void setSubtitle(int resId) { - mActionBar.setSubtitle(resId); - } - - @Override - public void setDisplayOptions(int options) { - mActionBar.setDisplayOptions(options); - } - - @Override - public void setDisplayOptions(int options, int mask) { - mActionBar.setDisplayOptions(options, mask); - } - - @Override - public void setDisplayUseLogoEnabled(boolean useLogo) { - mActionBar.setDisplayUseLogoEnabled(useLogo); - } - - @Override - public void setDisplayShowHomeEnabled(boolean showHome) { - mActionBar.setDisplayShowHomeEnabled(showHome); - } - - @Override - public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { - mActionBar.setDisplayHomeAsUpEnabled(showHomeAsUp); - } - - @Override - public void setDisplayShowTitleEnabled(boolean showTitle) { - mActionBar.setDisplayShowTitleEnabled(showTitle); - } - - @Override - public void setDisplayShowCustomEnabled(boolean showCustom) { - mActionBar.setDisplayShowCustomEnabled(showCustom); - } - - @Override - public void setBackgroundDrawable(Drawable d) { - mActionBar.setBackgroundDrawable(d); - } - - @Override - public void setStackedBackgroundDrawable(Drawable d) { - mActionBar.setStackedBackgroundDrawable(d); - } - - @Override - public void setSplitBackgroundDrawable(Drawable d) { - mActionBar.setSplitBackgroundDrawable(d); - } - - @Override - public View getCustomView() { - return mActionBar.getCustomView(); - } - - @Override - public CharSequence getTitle() { - return mActionBar.getTitle(); - } - - @Override - public CharSequence getSubtitle() { - return mActionBar.getSubtitle(); - } - - @Override - public int getNavigationMode() { - return mActionBar.getNavigationMode(); - } - - @Override - public void setNavigationMode(int mode) { - mActionBar.setNavigationMode(mode); - } - - @Override - public int getDisplayOptions() { - return mActionBar.getDisplayOptions(); - } - - public class TabWrapper extends ActionBar.Tab implements android.app.ActionBar.TabListener { - final android.app.ActionBar.Tab mNativeTab; - private Object mTag; - private TabListener mListener; - - public TabWrapper(android.app.ActionBar.Tab nativeTab) { - mNativeTab = nativeTab; - mNativeTab.setTag(this); - } - - @Override - public int getPosition() { - return mNativeTab.getPosition(); - } - - @Override - public Drawable getIcon() { - return mNativeTab.getIcon(); - } - - @Override - public CharSequence getText() { - return mNativeTab.getText(); - } - - @Override - public Tab setIcon(Drawable icon) { - mNativeTab.setIcon(icon); - return this; - } - - @Override - public Tab setIcon(int resId) { - mNativeTab.setIcon(resId); - return this; - } - - @Override - public Tab setText(CharSequence text) { - mNativeTab.setText(text); - return this; - } - - @Override - public Tab setText(int resId) { - mNativeTab.setText(resId); - return this; - } - - @Override - public Tab setCustomView(View view) { - mNativeTab.setCustomView(view); - return this; - } - - @Override - public Tab setCustomView(int layoutResId) { - mNativeTab.setCustomView(layoutResId); - return this; - } - - @Override - public View getCustomView() { - return mNativeTab.getCustomView(); - } - - @Override - public Tab setTag(Object obj) { - mTag = obj; - return this; - } - - @Override - public Object getTag() { - return mTag; - } - - @Override - public Tab setTabListener(TabListener listener) { - mNativeTab.setTabListener(listener != null ? this : null); - mListener = listener; - return this; - } - - @Override - public void select() { - mNativeTab.select(); - } - - @Override - public Tab setContentDescription(int resId) { - mNativeTab.setContentDescription(resId); - return this; - } - - @Override - public Tab setContentDescription(CharSequence contentDesc) { - mNativeTab.setContentDescription(contentDesc); - return this; - } - - @Override - public CharSequence getContentDescription() { - return mNativeTab.getContentDescription(); - } - - @Override - public void onTabReselected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { - if (mListener != null) { - FragmentTransaction trans = null; - if (mActivity instanceof FragmentActivity) { - trans = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() - .disallowAddToBackStack(); - } - - mListener.onTabReselected(this, trans); - - if (trans != null && !trans.isEmpty()) { - trans.commit(); - } - } - } - - @Override - public void onTabSelected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { - if (mListener != null) { - - if (mFragmentTransaction == null && mActivity instanceof FragmentActivity) { - mFragmentTransaction = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() - .disallowAddToBackStack(); - } - - mListener.onTabSelected(this, mFragmentTransaction); - - if (mFragmentTransaction != null) { - if (!mFragmentTransaction.isEmpty()) { - mFragmentTransaction.commit(); - } - mFragmentTransaction = null; - } - } - } - - @Override - public void onTabUnselected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { - if (mListener != null) { - FragmentTransaction trans = null; - if (mActivity instanceof FragmentActivity) { - trans = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() - .disallowAddToBackStack(); - mFragmentTransaction = trans; - } - - mListener.onTabUnselected(this, trans); - } - } - } - - @Override - public Tab newTab() { - return new TabWrapper(mActionBar.newTab()); - } - - @Override - public void addTab(Tab tab) { - mActionBar.addTab(((TabWrapper)tab).mNativeTab); - } - - @Override - public void addTab(Tab tab, boolean setSelected) { - mActionBar.addTab(((TabWrapper)tab).mNativeTab, setSelected); - } - - @Override - public void addTab(Tab tab, int position) { - mActionBar.addTab(((TabWrapper)tab).mNativeTab, position); - } - - @Override - public void addTab(Tab tab, int position, boolean setSelected) { - mActionBar.addTab(((TabWrapper)tab).mNativeTab, position, setSelected); - } - - @Override - public void removeTab(Tab tab) { - mActionBar.removeTab(((TabWrapper)tab).mNativeTab); - } - - @Override - public void removeTabAt(int position) { - mActionBar.removeTabAt(position); - } - - @Override - public void removeAllTabs() { - mActionBar.removeAllTabs(); - } - - @Override - public void selectTab(Tab tab) { - mActionBar.selectTab(((TabWrapper)tab).mNativeTab); - } - - @Override - public Tab getSelectedTab() { - android.app.ActionBar.Tab selected = mActionBar.getSelectedTab(); - return (selected != null) ? (Tab)selected.getTag() : null; - } - - @Override - public Tab getTabAt(int index) { - android.app.ActionBar.Tab selected = mActionBar.getTabAt(index); - return (selected != null) ? (Tab)selected.getTag() : null; - } - - @Override - public int getTabCount() { - return mActionBar.getTabCount(); - } - - @Override - public int getHeight() { - return mActionBar.getHeight(); - } - - @Override - public void show() { - mActionBar.show(); - } - - @Override - public void hide() { - mActionBar.hide(); - } - - @Override - public boolean isShowing() { - return mActionBar.isShowing(); - } - - @Override - public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { - mMenuVisibilityListeners.add(listener); - } - - @Override - public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { - mMenuVisibilityListeners.remove(listener); - } - - @Override - public void onMenuVisibilityChanged(boolean isVisible) { - for (OnMenuVisibilityListener listener : mMenuVisibilityListeners) { - listener.onMenuVisibilityChanged(isVisible); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java deleted file mode 100644 index 2caf5b4a9..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import java.util.ArrayList; - -import android.view.animation.Interpolator; - -/** - * This is the superclass for classes which provide basic support for animations which can be - * started, ended, and have AnimatorListeners added to them. - */ -public abstract class Animator implements Cloneable { - - - /** - * The set of listeners to be sent events through the life of an animation. - */ - ArrayList mListeners = null; - - /** - * Starts this animation. If the animation has a nonzero startDelay, the animation will start - * running after that delay elapses. A non-delayed animation will have its initial - * value(s) set immediately, followed by calls to - * {@link AnimatorListener#onAnimationStart(Animator)} for any listeners of this animator. - * - *

The animation started by calling this method will be run on the thread that called - * this method. This thread should have a Looper on it (a runtime exception will be thrown if - * this is not the case). Also, if the animation will animate - * properties of objects in the view hierarchy, then the calling thread should be the UI - * thread for that view hierarchy.

- * - */ - public void start() { - } - - /** - * Cancels the animation. Unlike {@link #end()}, cancel() causes the animation to - * stop in its tracks, sending an - * {@link android.animation.Animator.AnimatorListener#onAnimationCancel(Animator)} to - * its listeners, followed by an - * {@link android.animation.Animator.AnimatorListener#onAnimationEnd(Animator)} message. - * - *

This method must be called on the thread that is running the animation.

- */ - public void cancel() { - } - - /** - * Ends the animation. This causes the animation to assign the end value of the property being - * animated, then calling the - * {@link android.animation.Animator.AnimatorListener#onAnimationEnd(Animator)} method on - * its listeners. - * - *

This method must be called on the thread that is running the animation.

- */ - public void end() { - } - - /** - * The amount of time, in milliseconds, to delay starting the animation after - * {@link #start()} is called. - * - * @return the number of milliseconds to delay running the animation - */ - public abstract long getStartDelay(); - - /** - * The amount of time, in milliseconds, to delay starting the animation after - * {@link #start()} is called. - - * @param startDelay The amount of the delay, in milliseconds - */ - public abstract void setStartDelay(long startDelay); - - - /** - * Sets the length of the animation. - * - * @param duration The length of the animation, in milliseconds. - */ - public abstract Animator setDuration(long duration); - - /** - * Gets the length of the animation. - * - * @return The length of the animation, in milliseconds. - */ - public abstract long getDuration(); - - /** - * The time interpolator used in calculating the elapsed fraction of this animation. The - * interpolator determines whether the animation runs with linear or non-linear motion, - * such as acceleration and deceleration. The default value is - * {@link android.view.animation.AccelerateDecelerateInterpolator} - * - * @param value the interpolator to be used by this animation - */ - public abstract void setInterpolator(/*Time*/Interpolator value); - - /** - * Returns whether this Animator is currently running (having been started and gone past any - * initial startDelay period and not yet ended). - * - * @return Whether the Animator is running. - */ - public abstract boolean isRunning(); - - /** - * Returns whether this Animator has been started and not yet ended. This state is a superset - * of the state of {@link #isRunning()}, because an Animator with a nonzero - * {@link #getStartDelay() startDelay} will return true for {@link #isStarted()} during the - * delay phase, whereas {@link #isRunning()} will return true only after the delay phase - * is complete. - * - * @return Whether the Animator has been started and not yet ended. - */ - public boolean isStarted() { - // Default method returns value for isRunning(). Subclasses should override to return a - // real value. - return isRunning(); - } - - /** - * Adds a listener to the set of listeners that are sent events through the life of an - * animation, such as start, repeat, and end. - * - * @param listener the listener to be added to the current set of listeners for this animation. - */ - public void addListener(AnimatorListener listener) { - if (mListeners == null) { - mListeners = new ArrayList(); - } - mListeners.add(listener); - } - - /** - * Removes a listener from the set listening to this animation. - * - * @param listener the listener to be removed from the current set of listeners for this - * animation. - */ - public void removeListener(AnimatorListener listener) { - if (mListeners == null) { - return; - } - mListeners.remove(listener); - if (mListeners.size() == 0) { - mListeners = null; - } - } - - /** - * Gets the set of {@link android.animation.Animator.AnimatorListener} objects that are currently - * listening for events on this Animator object. - * - * @return ArrayList The set of listeners. - */ - public ArrayList getListeners() { - return mListeners; - } - - /** - * Removes all listeners from this object. This is equivalent to calling - * getListeners() followed by calling clear() on the - * returned list of listeners. - */ - public void removeAllListeners() { - if (mListeners != null) { - mListeners.clear(); - mListeners = null; - } - } - - @Override - public Animator clone() { - try { - final Animator anim = (Animator) super.clone(); - if (mListeners != null) { - ArrayList oldListeners = mListeners; - anim.mListeners = new ArrayList(); - int numListeners = oldListeners.size(); - for (int i = 0; i < numListeners; ++i) { - anim.mListeners.add(oldListeners.get(i)); - } - } - return anim; - } catch (CloneNotSupportedException e) { - throw new AssertionError(); - } - } - - /** - * This method tells the object to use appropriate information to extract - * starting values for the animation. For example, a AnimatorSet object will pass - * this call to its child objects to tell them to set up the values. A - * ObjectAnimator object will use the information it has about its target object - * and PropertyValuesHolder objects to get the start values for its properties. - * An ValueAnimator object will ignore the request since it does not have enough - * information (such as a target object) to gather these values. - */ - public void setupStartValues() { - } - - /** - * This method tells the object to use appropriate information to extract - * ending values for the animation. For example, a AnimatorSet object will pass - * this call to its child objects to tell them to set up the values. A - * ObjectAnimator object will use the information it has about its target object - * and PropertyValuesHolder objects to get the start values for its properties. - * An ValueAnimator object will ignore the request since it does not have enough - * information (such as a target object) to gather these values. - */ - public void setupEndValues() { - } - - /** - * Sets the target object whose property will be animated by this animation. Not all subclasses - * operate on target objects (for example, {@link ValueAnimator}, but this method - * is on the superclass for the convenience of dealing generically with those subclasses - * that do handle targets. - * - * @param target The object being animated - */ - public void setTarget(Object target) { - } - - /** - *

An animation listener receives notifications from an animation. - * Notifications indicate animation related events, such as the end or the - * repetition of the animation.

- */ - public static interface AnimatorListener { - /** - *

Notifies the start of the animation.

- * - * @param animation The started animation. - */ - void onAnimationStart(Animator animation); - - /** - *

Notifies the end of the animation. This callback is not invoked - * for animations with repeat count set to INFINITE.

- * - * @param animation The animation which reached its end. - */ - void onAnimationEnd(Animator animation); - - /** - *

Notifies the cancellation of the animation. This callback is not invoked - * for animations with repeat count set to INFINITE.

- * - * @param animation The animation which was canceled. - */ - void onAnimationCancel(Animator animation); - - /** - *

Notifies the repetition of the animation.

- * - * @param animation The animation which was repeated. - */ - void onAnimationRepeat(Animator animation); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java deleted file mode 100644 index 02ddff48d..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -/** - * This adapter class provides empty implementations of the methods from {@link android.animation.Animator.AnimatorListener}. - * Any custom listener that cares only about a subset of the methods of this listener can - * simply subclass this adapter class instead of implementing the interface directly. - */ -public abstract class AnimatorListenerAdapter implements Animator.AnimatorListener { - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationCancel(Animator animation) { - } - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationEnd(Animator animation) { - } - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationRepeat(Animator animation) { - } - - /** - * {@inheritDoc} - */ - @Override - public void onAnimationStart(Animator animation) { - } - -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java deleted file mode 100644 index 3231080c4..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java +++ /dev/null @@ -1,1111 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; - -import android.view.animation.Interpolator; - -/** - * This class plays a set of {@link Animator} objects in the specified order. Animations - * can be set up to play together, in sequence, or after a specified delay. - * - *

There are two different approaches to adding animations to a AnimatorSet: - * either the {@link AnimatorSet#playTogether(Animator[]) playTogether()} or - * {@link AnimatorSet#playSequentially(Animator[]) playSequentially()} methods can be called to add - * a set of animations all at once, or the {@link AnimatorSet#play(Animator)} can be - * used in conjunction with methods in the {@link AnimatorSet.Builder Builder} - * class to add animations - * one by one.

- * - *

It is possible to set up a AnimatorSet with circular dependencies between - * its animations. For example, an animation a1 could be set up to start before animation a2, a2 - * before a3, and a3 before a1. The results of this configuration are undefined, but will typically - * result in none of the affected animations being played. Because of this (and because - * circular dependencies do not make logical sense anyway), circular dependencies - * should be avoided, and the dependency flow of animations should only be in one direction. - */ -@SuppressWarnings("unchecked") -public final class AnimatorSet extends Animator { - - /** - * Internal variables - * NOTE: This object implements the clone() method, making a deep copy of any referenced - * objects. As other non-trivial fields are added to this class, make sure to add logic - * to clone() to make deep copies of them. - */ - - /** - * Tracks animations currently being played, so that we know what to - * cancel or end when cancel() or end() is called on this AnimatorSet - */ - private ArrayList mPlayingSet = new ArrayList(); - - /** - * Contains all nodes, mapped to their respective Animators. When new - * dependency information is added for an Animator, we want to add it - * to a single node representing that Animator, not create a new Node - * if one already exists. - */ - private HashMap mNodeMap = new HashMap(); - - /** - * Set of all nodes created for this AnimatorSet. This list is used upon - * starting the set, and the nodes are placed in sorted order into the - * sortedNodes collection. - */ - private ArrayList mNodes = new ArrayList(); - - /** - * The sorted list of nodes. This is the order in which the animations will - * be played. The details about when exactly they will be played depend - * on the dependency relationships of the nodes. - */ - private ArrayList mSortedNodes = new ArrayList(); - - /** - * Flag indicating whether the nodes should be sorted prior to playing. This - * flag allows us to cache the previous sorted nodes so that if the sequence - * is replayed with no changes, it does not have to re-sort the nodes again. - */ - private boolean mNeedsSort = true; - - private AnimatorSetListener mSetListener = null; - - /** - * Flag indicating that the AnimatorSet has been manually - * terminated (by calling cancel() or end()). - * This flag is used to avoid starting other animations when currently-playing - * child animations of this AnimatorSet end. It also determines whether cancel/end - * notifications are sent out via the normal AnimatorSetListener mechanism. - */ - boolean mTerminated = false; - - /** - * Indicates whether an AnimatorSet has been start()'d, whether or - * not there is a nonzero startDelay. - */ - private boolean mStarted = false; - - // The amount of time in ms to delay starting the animation after start() is called - private long mStartDelay = 0; - - // Animator used for a nonzero startDelay - private ValueAnimator mDelayAnim = null; - - - // How long the child animations should last in ms. The default value is negative, which - // simply means that there is no duration set on the AnimatorSet. When a real duration is - // set, it is passed along to the child animations. - private long mDuration = -1; - - - /** - * Sets up this AnimatorSet to play all of the supplied animations at the same time. - * - * @param items The animations that will be started simultaneously. - */ - public void playTogether(Animator... items) { - if (items != null) { - mNeedsSort = true; - Builder builder = play(items[0]); - for (int i = 1; i < items.length; ++i) { - builder.with(items[i]); - } - } - } - - /** - * Sets up this AnimatorSet to play all of the supplied animations at the same time. - * - * @param items The animations that will be started simultaneously. - */ - public void playTogether(Collection items) { - if (items != null && items.size() > 0) { - mNeedsSort = true; - Builder builder = null; - for (Animator anim : items) { - if (builder == null) { - builder = play(anim); - } else { - builder.with(anim); - } - } - } - } - - /** - * Sets up this AnimatorSet to play each of the supplied animations when the - * previous animation ends. - * - * @param items The animations that will be started one after another. - */ - public void playSequentially(Animator... items) { - if (items != null) { - mNeedsSort = true; - if (items.length == 1) { - play(items[0]); - } else { - for (int i = 0; i < items.length - 1; ++i) { - play(items[i]).before(items[i+1]); - } - } - } - } - - /** - * Sets up this AnimatorSet to play each of the supplied animations when the - * previous animation ends. - * - * @param items The animations that will be started one after another. - */ - public void playSequentially(List items) { - if (items != null && items.size() > 0) { - mNeedsSort = true; - if (items.size() == 1) { - play(items.get(0)); - } else { - for (int i = 0; i < items.size() - 1; ++i) { - play(items.get(i)).before(items.get(i+1)); - } - } - } - } - - /** - * Returns the current list of child Animator objects controlled by this - * AnimatorSet. This is a copy of the internal list; modifications to the returned list - * will not affect the AnimatorSet, although changes to the underlying Animator objects - * will affect those objects being managed by the AnimatorSet. - * - * @return ArrayList The list of child animations of this AnimatorSet. - */ - public ArrayList getChildAnimations() { - ArrayList childList = new ArrayList(); - for (Node node : mNodes) { - childList.add(node.animation); - } - return childList; - } - - /** - * Sets the target object for all current {@link #getChildAnimations() child animations} - * of this AnimatorSet that take targets ({@link ObjectAnimator} and - * AnimatorSet). - * - * @param target The object being animated - */ - @Override - public void setTarget(Object target) { - for (Node node : mNodes) { - Animator animation = node.animation; - if (animation instanceof AnimatorSet) { - ((AnimatorSet)animation).setTarget(target); - } else if (animation instanceof ObjectAnimator) { - ((ObjectAnimator)animation).setTarget(target); - } - } - } - - /** - * Sets the TimeInterpolator for all current {@link #getChildAnimations() child animations} - * of this AnimatorSet. - * - * @param interpolator the interpolator to be used by each child animation of this AnimatorSet - */ - @Override - public void setInterpolator(/*Time*/Interpolator interpolator) { - for (Node node : mNodes) { - node.animation.setInterpolator(interpolator); - } - } - - /** - * This method creates a Builder object, which is used to - * set up playing constraints. This initial play() method - * tells the Builder the animation that is the dependency for - * the succeeding commands to the Builder. For example, - * calling play(a1).with(a2) sets up the AnimatorSet to play - * a1 and a2 at the same time, - * play(a1).before(a2) sets up the AnimatorSet to play - * a1 first, followed by a2, and - * play(a1).after(a2) sets up the AnimatorSet to play - * a2 first, followed by a1. - * - *

Note that play() is the only way to tell the - * Builder the animation upon which the dependency is created, - * so successive calls to the various functions in Builder - * will all refer to the initial parameter supplied in play() - * as the dependency of the other animations. For example, calling - * play(a1).before(a2).before(a3) will play both a2 - * and a3 when a1 ends; it does not set up a dependency between - * a2 and a3.

- * - * @param anim The animation that is the dependency used in later calls to the - * methods in the returned Builder object. A null parameter will result - * in a null Builder return value. - * @return Builder The object that constructs the AnimatorSet based on the dependencies - * outlined in the calls to play and the other methods in the - * BuilderNote that canceling a AnimatorSet also cancels all of the animations that it - * is responsible for.

- */ - @Override - public void cancel() { - mTerminated = true; - if (isStarted()) { - ArrayList tmpListeners = null; - if (mListeners != null) { - tmpListeners = (ArrayList) mListeners.clone(); - for (AnimatorListener listener : tmpListeners) { - listener.onAnimationCancel(this); - } - } - if (mDelayAnim != null && mDelayAnim.isRunning()) { - // If we're currently in the startDelay period, just cancel that animator and - // send out the end event to all listeners - mDelayAnim.cancel(); - } else if (mSortedNodes.size() > 0) { - for (Node node : mSortedNodes) { - node.animation.cancel(); - } - } - if (tmpListeners != null) { - for (AnimatorListener listener : tmpListeners) { - listener.onAnimationEnd(this); - } - } - mStarted = false; - } - } - - /** - * {@inheritDoc} - * - *

Note that ending a AnimatorSet also ends all of the animations that it is - * responsible for.

- */ - @Override - public void end() { - mTerminated = true; - if (isStarted()) { - if (mSortedNodes.size() != mNodes.size()) { - // hasn't been started yet - sort the nodes now, then end them - sortNodes(); - for (Node node : mSortedNodes) { - if (mSetListener == null) { - mSetListener = new AnimatorSetListener(this); - } - node.animation.addListener(mSetListener); - } - } - if (mDelayAnim != null) { - mDelayAnim.cancel(); - } - if (mSortedNodes.size() > 0) { - for (Node node : mSortedNodes) { - node.animation.end(); - } - } - if (mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - for (AnimatorListener listener : tmpListeners) { - listener.onAnimationEnd(this); - } - } - mStarted = false; - } - } - - /** - * Returns true if any of the child animations of this AnimatorSet have been started and have - * not yet ended. - * @return Whether this AnimatorSet has been started and has not yet ended. - */ - @Override - public boolean isRunning() { - for (Node node : mNodes) { - if (node.animation.isRunning()) { - return true; - } - } - return false; - } - - @Override - public boolean isStarted() { - return mStarted; - } - - /** - * The amount of time, in milliseconds, to delay starting the animation after - * {@link #start()} is called. - * - * @return the number of milliseconds to delay running the animation - */ - @Override - public long getStartDelay() { - return mStartDelay; - } - - /** - * The amount of time, in milliseconds, to delay starting the animation after - * {@link #start()} is called. - - * @param startDelay The amount of the delay, in milliseconds - */ - @Override - public void setStartDelay(long startDelay) { - mStartDelay = startDelay; - } - - /** - * Gets the length of each of the child animations of this AnimatorSet. This value may - * be less than 0, which indicates that no duration has been set on this AnimatorSet - * and each of the child animations will use their own duration. - * - * @return The length of the animation, in milliseconds, of each of the child - * animations of this AnimatorSet. - */ - @Override - public long getDuration() { - return mDuration; - } - - /** - * Sets the length of each of the current child animations of this AnimatorSet. By default, - * each child animation will use its own duration. If the duration is set on the AnimatorSet, - * then each child animation inherits this duration. - * - * @param duration The length of the animation, in milliseconds, of each of the child - * animations of this AnimatorSet. - */ - @Override - public AnimatorSet setDuration(long duration) { - if (duration < 0) { - throw new IllegalArgumentException("duration must be a value of zero or greater"); - } - for (Node node : mNodes) { - // TODO: don't set the duration of the timing-only nodes created by AnimatorSet to - // insert "play-after" delays - node.animation.setDuration(duration); - } - mDuration = duration; - return this; - } - - @Override - public void setupStartValues() { - for (Node node : mNodes) { - node.animation.setupStartValues(); - } - } - - @Override - public void setupEndValues() { - for (Node node : mNodes) { - node.animation.setupEndValues(); - } - } - - /** - * {@inheritDoc} - * - *

Starting this AnimatorSet will, in turn, start the animations for which - * it is responsible. The details of when exactly those animations are started depends on - * the dependency relationships that have been set up between the animations. - */ - @Override - public void start() { - mTerminated = false; - mStarted = true; - - // First, sort the nodes (if necessary). This will ensure that sortedNodes - // contains the animation nodes in the correct order. - sortNodes(); - - int numSortedNodes = mSortedNodes.size(); - for (int i = 0; i < numSortedNodes; ++i) { - Node node = mSortedNodes.get(i); - // First, clear out the old listeners - ArrayList oldListeners = node.animation.getListeners(); - if (oldListeners != null && oldListeners.size() > 0) { - final ArrayList clonedListeners = new - ArrayList(oldListeners); - - for (AnimatorListener listener : clonedListeners) { - if (listener instanceof DependencyListener || - listener instanceof AnimatorSetListener) { - node.animation.removeListener(listener); - } - } - } - } - - // nodesToStart holds the list of nodes to be started immediately. We don't want to - // start the animations in the loop directly because we first need to set up - // dependencies on all of the nodes. For example, we don't want to start an animation - // when some other animation also wants to start when the first animation begins. - final ArrayList nodesToStart = new ArrayList(); - for (int i = 0; i < numSortedNodes; ++i) { - Node node = mSortedNodes.get(i); - if (mSetListener == null) { - mSetListener = new AnimatorSetListener(this); - } - if (node.dependencies == null || node.dependencies.size() == 0) { - nodesToStart.add(node); - } else { - int numDependencies = node.dependencies.size(); - for (int j = 0; j < numDependencies; ++j) { - Dependency dependency = node.dependencies.get(j); - dependency.node.animation.addListener( - new DependencyListener(this, node, dependency.rule)); - } - node.tmpDependencies = (ArrayList) node.dependencies.clone(); - } - node.animation.addListener(mSetListener); - } - // Now that all dependencies are set up, start the animations that should be started. - if (mStartDelay <= 0) { - for (Node node : nodesToStart) { - node.animation.start(); - mPlayingSet.add(node.animation); - } - } else { - mDelayAnim = ValueAnimator.ofFloat(0f, 1f); - mDelayAnim.setDuration(mStartDelay); - mDelayAnim.addListener(new AnimatorListenerAdapter() { - boolean canceled = false; - public void onAnimationCancel(Animator anim) { - canceled = true; - } - public void onAnimationEnd(Animator anim) { - if (!canceled) { - int numNodes = nodesToStart.size(); - for (int i = 0; i < numNodes; ++i) { - Node node = nodesToStart.get(i); - node.animation.start(); - mPlayingSet.add(node.animation); - } - } - } - }); - mDelayAnim.start(); - } - if (mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - int numListeners = tmpListeners.size(); - for (int i = 0; i < numListeners; ++i) { - tmpListeners.get(i).onAnimationStart(this); - } - } - if (mNodes.size() == 0 && mStartDelay == 0) { - // Handle unusual case where empty AnimatorSet is started - should send out - // end event immediately since the event will not be sent out at all otherwise - mStarted = false; - if (mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - int numListeners = tmpListeners.size(); - for (int i = 0; i < numListeners; ++i) { - tmpListeners.get(i).onAnimationEnd(this); - } - } - } - } - - @Override - public AnimatorSet clone() { - final AnimatorSet anim = (AnimatorSet) super.clone(); - /* - * The basic clone() operation copies all items. This doesn't work very well for - * AnimatorSet, because it will copy references that need to be recreated and state - * that may not apply. What we need to do now is put the clone in an uninitialized - * state, with fresh, empty data structures. Then we will build up the nodes list - * manually, as we clone each Node (and its animation). The clone will then be sorted, - * and will populate any appropriate lists, when it is started. - */ - anim.mNeedsSort = true; - anim.mTerminated = false; - anim.mStarted = false; - anim.mPlayingSet = new ArrayList(); - anim.mNodeMap = new HashMap(); - anim.mNodes = new ArrayList(); - anim.mSortedNodes = new ArrayList(); - - // Walk through the old nodes list, cloning each node and adding it to the new nodemap. - // One problem is that the old node dependencies point to nodes in the old AnimatorSet. - // We need to track the old/new nodes in order to reconstruct the dependencies in the clone. - HashMap nodeCloneMap = new HashMap(); // - for (Node node : mNodes) { - Node nodeClone = node.clone(); - nodeCloneMap.put(node, nodeClone); - anim.mNodes.add(nodeClone); - anim.mNodeMap.put(nodeClone.animation, nodeClone); - // Clear out the dependencies in the clone; we'll set these up manually later - nodeClone.dependencies = null; - nodeClone.tmpDependencies = null; - nodeClone.nodeDependents = null; - nodeClone.nodeDependencies = null; - // clear out any listeners that were set up by the AnimatorSet; these will - // be set up when the clone's nodes are sorted - ArrayList cloneListeners = nodeClone.animation.getListeners(); - if (cloneListeners != null) { - ArrayList listenersToRemove = null; - for (AnimatorListener listener : cloneListeners) { - if (listener instanceof AnimatorSetListener) { - if (listenersToRemove == null) { - listenersToRemove = new ArrayList(); - } - listenersToRemove.add(listener); - } - } - if (listenersToRemove != null) { - for (AnimatorListener listener : listenersToRemove) { - cloneListeners.remove(listener); - } - } - } - } - // Now that we've cloned all of the nodes, we're ready to walk through their - // dependencies, mapping the old dependencies to the new nodes - for (Node node : mNodes) { - Node nodeClone = nodeCloneMap.get(node); - if (node.dependencies != null) { - for (Dependency dependency : node.dependencies) { - Node clonedDependencyNode = nodeCloneMap.get(dependency.node); - Dependency cloneDependency = new Dependency(clonedDependencyNode, - dependency.rule); - nodeClone.addDependency(cloneDependency); - } - } - } - - return anim; - } - - /** - * This class is the mechanism by which animations are started based on events in other - * animations. If an animation has multiple dependencies on other animations, then - * all dependencies must be satisfied before the animation is started. - */ - private static class DependencyListener implements AnimatorListener { - - private AnimatorSet mAnimatorSet; - - // The node upon which the dependency is based. - private Node mNode; - - // The Dependency rule (WITH or AFTER) that the listener should wait for on - // the node - private int mRule; - - public DependencyListener(AnimatorSet animatorSet, Node node, int rule) { - this.mAnimatorSet = animatorSet; - this.mNode = node; - this.mRule = rule; - } - - /** - * Ignore cancel events for now. We may want to handle this eventually, - * to prevent follow-on animations from running when some dependency - * animation is canceled. - */ - public void onAnimationCancel(Animator animation) { - } - - /** - * An end event is received - see if this is an event we are listening for - */ - public void onAnimationEnd(Animator animation) { - if (mRule == Dependency.AFTER) { - startIfReady(animation); - } - } - - /** - * Ignore repeat events for now - */ - public void onAnimationRepeat(Animator animation) { - } - - /** - * A start event is received - see if this is an event we are listening for - */ - public void onAnimationStart(Animator animation) { - if (mRule == Dependency.WITH) { - startIfReady(animation); - } - } - - /** - * Check whether the event received is one that the node was waiting for. - * If so, mark it as complete and see whether it's time to start - * the animation. - * @param dependencyAnimation the animation that sent the event. - */ - private void startIfReady(Animator dependencyAnimation) { - if (mAnimatorSet.mTerminated) { - // if the parent AnimatorSet was canceled, then don't start any dependent anims - return; - } - Dependency dependencyToRemove = null; - int numDependencies = mNode.tmpDependencies.size(); - for (int i = 0; i < numDependencies; ++i) { - Dependency dependency = mNode.tmpDependencies.get(i); - if (dependency.rule == mRule && - dependency.node.animation == dependencyAnimation) { - // rule fired - remove the dependency and listener and check to - // see whether it's time to start the animation - dependencyToRemove = dependency; - dependencyAnimation.removeListener(this); - break; - } - } - mNode.tmpDependencies.remove(dependencyToRemove); - if (mNode.tmpDependencies.size() == 0) { - // all dependencies satisfied: start the animation - mNode.animation.start(); - mAnimatorSet.mPlayingSet.add(mNode.animation); - } - } - - } - - private class AnimatorSetListener implements AnimatorListener { - - private AnimatorSet mAnimatorSet; - - AnimatorSetListener(AnimatorSet animatorSet) { - mAnimatorSet = animatorSet; - } - - public void onAnimationCancel(Animator animation) { - if (!mTerminated) { - // Listeners are already notified of the AnimatorSet canceling in cancel(). - // The logic below only kicks in when animations end normally - if (mPlayingSet.size() == 0) { - if (mListeners != null) { - int numListeners = mListeners.size(); - for (int i = 0; i < numListeners; ++i) { - mListeners.get(i).onAnimationCancel(mAnimatorSet); - } - } - } - } - } - - public void onAnimationEnd(Animator animation) { - animation.removeListener(this); - mPlayingSet.remove(animation); - Node animNode = mAnimatorSet.mNodeMap.get(animation); - animNode.done = true; - if (!mTerminated) { - // Listeners are already notified of the AnimatorSet ending in cancel() or - // end(); the logic below only kicks in when animations end normally - ArrayList sortedNodes = mAnimatorSet.mSortedNodes; - boolean allDone = true; - int numSortedNodes = sortedNodes.size(); - for (int i = 0; i < numSortedNodes; ++i) { - if (!sortedNodes.get(i).done) { - allDone = false; - break; - } - } - if (allDone) { - // If this was the last child animation to end, then notify listeners that this - // AnimatorSet has ended - if (mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - int numListeners = tmpListeners.size(); - for (int i = 0; i < numListeners; ++i) { - tmpListeners.get(i).onAnimationEnd(mAnimatorSet); - } - } - mAnimatorSet.mStarted = false; - } - } - } - - // Nothing to do - public void onAnimationRepeat(Animator animation) { - } - - // Nothing to do - public void onAnimationStart(Animator animation) { - } - - } - - /** - * This method sorts the current set of nodes, if needed. The sort is a simple - * DependencyGraph sort, which goes like this: - * - All nodes without dependencies become 'roots' - * - while roots list is not null - * - for each root r - * - add r to sorted list - * - remove r as a dependency from any other node - * - any nodes with no dependencies are added to the roots list - */ - private void sortNodes() { - if (mNeedsSort) { - mSortedNodes.clear(); - ArrayList roots = new ArrayList(); - int numNodes = mNodes.size(); - for (int i = 0; i < numNodes; ++i) { - Node node = mNodes.get(i); - if (node.dependencies == null || node.dependencies.size() == 0) { - roots.add(node); - } - } - ArrayList tmpRoots = new ArrayList(); - while (roots.size() > 0) { - int numRoots = roots.size(); - for (int i = 0; i < numRoots; ++i) { - Node root = roots.get(i); - mSortedNodes.add(root); - if (root.nodeDependents != null) { - int numDependents = root.nodeDependents.size(); - for (int j = 0; j < numDependents; ++j) { - Node node = root.nodeDependents.get(j); - node.nodeDependencies.remove(root); - if (node.nodeDependencies.size() == 0) { - tmpRoots.add(node); - } - } - } - } - roots.clear(); - roots.addAll(tmpRoots); - tmpRoots.clear(); - } - mNeedsSort = false; - if (mSortedNodes.size() != mNodes.size()) { - throw new IllegalStateException("Circular dependencies cannot exist" - + " in AnimatorSet"); - } - } else { - // Doesn't need sorting, but still need to add in the nodeDependencies list - // because these get removed as the event listeners fire and the dependencies - // are satisfied - int numNodes = mNodes.size(); - for (int i = 0; i < numNodes; ++i) { - Node node = mNodes.get(i); - if (node.dependencies != null && node.dependencies.size() > 0) { - int numDependencies = node.dependencies.size(); - for (int j = 0; j < numDependencies; ++j) { - Dependency dependency = node.dependencies.get(j); - if (node.nodeDependencies == null) { - node.nodeDependencies = new ArrayList(); - } - if (!node.nodeDependencies.contains(dependency.node)) { - node.nodeDependencies.add(dependency.node); - } - } - } - // nodes are 'done' by default; they become un-done when started, and done - // again when ended - node.done = false; - } - } - } - - /** - * Dependency holds information about the node that some other node is - * dependent upon and the nature of that dependency. - * - */ - private static class Dependency { - static final int WITH = 0; // dependent node must start with this dependency node - static final int AFTER = 1; // dependent node must start when this dependency node finishes - - // The node that the other node with this Dependency is dependent upon - public Node node; - - // The nature of the dependency (WITH or AFTER) - public int rule; - - public Dependency(Node node, int rule) { - this.node = node; - this.rule = rule; - } - } - - /** - * A Node is an embodiment of both the Animator that it wraps as well as - * any dependencies that are associated with that Animation. This includes - * both dependencies upon other nodes (in the dependencies list) as - * well as dependencies of other nodes upon this (in the nodeDependents list). - */ - private static class Node implements Cloneable { - public Animator animation; - - /** - * These are the dependencies that this node's animation has on other - * nodes. For example, if this node's animation should begin with some - * other animation ends, then there will be an item in this node's - * dependencies list for that other animation's node. - */ - public ArrayList dependencies = null; - - /** - * tmpDependencies is a runtime detail. We use the dependencies list for sorting. - * But we also use the list to keep track of when multiple dependencies are satisfied, - * but removing each dependency as it is satisfied. We do not want to remove - * the dependency itself from the list, because we need to retain that information - * if the AnimatorSet is launched in the future. So we create a copy of the dependency - * list when the AnimatorSet starts and use this tmpDependencies list to track the - * list of satisfied dependencies. - */ - public ArrayList tmpDependencies = null; - - /** - * nodeDependencies is just a list of the nodes that this Node is dependent upon. - * This information is used in sortNodes(), to determine when a node is a root. - */ - public ArrayList nodeDependencies = null; - - /** - * nodeDepdendents is the list of nodes that have this node as a dependency. This - * is a utility field used in sortNodes to facilitate removing this node as a - * dependency when it is a root node. - */ - public ArrayList nodeDependents = null; - - /** - * Flag indicating whether the animation in this node is finished. This flag - * is used by AnimatorSet to check, as each animation ends, whether all child animations - * are done and it's time to send out an end event for the entire AnimatorSet. - */ - public boolean done = false; - - /** - * Constructs the Node with the animation that it encapsulates. A Node has no - * dependencies by default; dependencies are added via the addDependency() - * method. - * - * @param animation The animation that the Node encapsulates. - */ - public Node(Animator animation) { - this.animation = animation; - } - - /** - * Add a dependency to this Node. The dependency includes information about the - * node that this node is dependency upon and the nature of the dependency. - * @param dependency - */ - public void addDependency(Dependency dependency) { - if (dependencies == null) { - dependencies = new ArrayList(); - nodeDependencies = new ArrayList(); - } - dependencies.add(dependency); - if (!nodeDependencies.contains(dependency.node)) { - nodeDependencies.add(dependency.node); - } - Node dependencyNode = dependency.node; - if (dependencyNode.nodeDependents == null) { - dependencyNode.nodeDependents = new ArrayList(); - } - dependencyNode.nodeDependents.add(this); - } - - @Override - public Node clone() { - try { - Node node = (Node) super.clone(); - node.animation = animation.clone(); - return node; - } catch (CloneNotSupportedException e) { - throw new AssertionError(); - } - } - } - - /** - * The Builder object is a utility class to facilitate adding animations to a - * AnimatorSet along with the relationships between the various animations. The - * intention of the Builder methods, along with the {@link - * AnimatorSet#play(Animator) play()} method of AnimatorSet is to make it possible - * to express the dependency relationships of animations in a natural way. Developers can also - * use the {@link AnimatorSet#playTogether(Animator[]) playTogether()} and {@link - * AnimatorSet#playSequentially(Animator[]) playSequentially()} methods if these suit the need, - * but it might be easier in some situations to express the AnimatorSet of animations in pairs. - *

- *

The Builder object cannot be constructed directly, but is rather constructed - * internally via a call to {@link AnimatorSet#play(Animator)}.

- *

- *

For example, this sets up a AnimatorSet to play anim1 and anim2 at the same time, anim3 to - * play when anim2 finishes, and anim4 to play when anim3 finishes:

- *
-     *     AnimatorSet s = new AnimatorSet();
-     *     s.play(anim1).with(anim2);
-     *     s.play(anim2).before(anim3);
-     *     s.play(anim4).after(anim3);
-     * 
- *

- *

Note in the example that both {@link Builder#before(Animator)} and {@link - * Builder#after(Animator)} are used. These are just different ways of expressing the same - * relationship and are provided to make it easier to say things in a way that is more natural, - * depending on the situation.

- *

- *

It is possible to make several calls into the same Builder object to express - * multiple relationships. However, note that it is only the animation passed into the initial - * {@link AnimatorSet#play(Animator)} method that is the dependency in any of the successive - * calls to the Builder object. For example, the following code starts both anim2 - * and anim3 when anim1 ends; there is no direct dependency relationship between anim2 and - * anim3: - *

-     *   AnimatorSet s = new AnimatorSet();
-     *   s.play(anim1).before(anim2).before(anim3);
-     * 
- * If the desired result is to play anim1 then anim2 then anim3, this code expresses the - * relationship correctly:

- *
-     *   AnimatorSet s = new AnimatorSet();
-     *   s.play(anim1).before(anim2);
-     *   s.play(anim2).before(anim3);
-     * 
- *

- *

Note that it is possible to express relationships that cannot be resolved and will not - * result in sensible results. For example, play(anim1).after(anim1) makes no - * sense. In general, circular dependencies like this one (or more indirect ones where a depends - * on b, which depends on c, which depends on a) should be avoided. Only create AnimatorSets - * that can boil down to a simple, one-way relationship of animations starting with, before, and - * after other, different, animations.

- */ - public class Builder { - - /** - * This tracks the current node being processed. It is supplied to the play() method - * of AnimatorSet and passed into the constructor of Builder. - */ - private Node mCurrentNode; - - /** - * package-private constructor. Builders are only constructed by AnimatorSet, when the - * play() method is called. - * - * @param anim The animation that is the dependency for the other animations passed into - * the other methods of this Builder object. - */ - Builder(Animator anim) { - mCurrentNode = mNodeMap.get(anim); - if (mCurrentNode == null) { - mCurrentNode = new Node(anim); - mNodeMap.put(anim, mCurrentNode); - mNodes.add(mCurrentNode); - } - } - - /** - * Sets up the given animation to play at the same time as the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object. - * - * @param anim The animation that will play when the animation supplied to the - * {@link AnimatorSet#play(Animator)} method starts. - */ - public Builder with(Animator anim) { - Node node = mNodeMap.get(anim); - if (node == null) { - node = new Node(anim); - mNodeMap.put(anim, node); - mNodes.add(node); - } - Dependency dependency = new Dependency(mCurrentNode, Dependency.WITH); - node.addDependency(dependency); - return this; - } - - /** - * Sets up the given animation to play when the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object - * ends. - * - * @param anim The animation that will play when the animation supplied to the - * {@link AnimatorSet#play(Animator)} method ends. - */ - public Builder before(Animator anim) { - Node node = mNodeMap.get(anim); - if (node == null) { - node = new Node(anim); - mNodeMap.put(anim, node); - mNodes.add(node); - } - Dependency dependency = new Dependency(mCurrentNode, Dependency.AFTER); - node.addDependency(dependency); - return this; - } - - /** - * Sets up the given animation to play when the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object - * to start when the animation supplied in this method call ends. - * - * @param anim The animation whose end will cause the animation supplied to the - * {@link AnimatorSet#play(Animator)} method to play. - */ - public Builder after(Animator anim) { - Node node = mNodeMap.get(anim); - if (node == null) { - node = new Node(anim); - mNodeMap.put(anim, node); - mNodes.add(node); - } - Dependency dependency = new Dependency(node, Dependency.AFTER); - mCurrentNode.addDependency(dependency); - return this; - } - - /** - * Sets up the animation supplied in the - * {@link AnimatorSet#play(Animator)} call that created this Builder object - * to play when the given amount of time elapses. - * - * @param delay The number of milliseconds that should elapse before the - * animation starts. - */ - public Builder after(long delay) { - // setup dummy ValueAnimator just to run the clock - ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); - anim.setDuration(delay); - after(anim); - return this; - } - - } - -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java deleted file mode 100644 index e41019364..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -/** - * This evaluator can be used to perform type interpolation between float values. - */ -public class FloatEvaluator implements TypeEvaluator { - - /** - * This function returns the result of linearly interpolating the start and end values, with - * fraction representing the proportion between the start and end values. The - * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), - * where x0 is startValue, x1 is endValue, - * and t is fraction. - * - * @param fraction The fraction from the starting to the ending values - * @param startValue The start value; should be of type float or - * Float - * @param endValue The end value; should be of type float or Float - * @return A linear interpolation between the start and end values, given the - * fraction parameter. - */ - public Float evaluate(float fraction, Number startValue, Number endValue) { - float startFloat = startValue.floatValue(); - return startFloat + fraction * (endValue.floatValue() - startFloat); - } -} \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java deleted file mode 100644 index 6d9dafa7a..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import java.util.ArrayList; -import android.view.animation.Interpolator; - -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.FloatKeyframe; - -/** - * This class holds a collection of FloatKeyframe objects and is called by ValueAnimator to calculate - * values between those keyframes for a given animation. The class internal to the animation - * package because it is an implementation detail of how Keyframes are stored and used. - * - *

This type-specific subclass of KeyframeSet, along with the other type-specific subclass for - * int, exists to speed up the getValue() method when there is no custom - * TypeEvaluator set for the animation, so that values can be calculated without autoboxing to the - * Object equivalents of these primitive types.

- */ -@SuppressWarnings("unchecked") -class FloatKeyframeSet extends KeyframeSet { - private float firstValue; - private float lastValue; - private float deltaValue; - private boolean firstTime = true; - - public FloatKeyframeSet(FloatKeyframe... keyframes) { - super(keyframes); - } - - @Override - public Object getValue(float fraction) { - return getFloatValue(fraction); - } - - @Override - public FloatKeyframeSet clone() { - ArrayList keyframes = mKeyframes; - int numKeyframes = mKeyframes.size(); - FloatKeyframe[] newKeyframes = new FloatKeyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - newKeyframes[i] = (FloatKeyframe) keyframes.get(i).clone(); - } - FloatKeyframeSet newSet = new FloatKeyframeSet(newKeyframes); - return newSet; - } - - public float getFloatValue(float fraction) { - if (mNumKeyframes == 2) { - if (firstTime) { - firstTime = false; - firstValue = ((FloatKeyframe) mKeyframes.get(0)).getFloatValue(); - lastValue = ((FloatKeyframe) mKeyframes.get(1)).getFloatValue(); - deltaValue = lastValue - firstValue; - } - if (mInterpolator != null) { - fraction = mInterpolator.getInterpolation(fraction); - } - if (mEvaluator == null) { - return firstValue + fraction * deltaValue; - } else { - return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).floatValue(); - } - } - if (fraction <= 0f) { - final FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(0); - final FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(1); - float prevValue = prevKeyframe.getFloatValue(); - float nextValue = nextKeyframe.getFloatValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + intervalFraction * (nextValue - prevValue) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - floatValue(); - } else if (fraction >= 1f) { - final FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(mNumKeyframes - 2); - final FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(mNumKeyframes - 1); - float prevValue = prevKeyframe.getFloatValue(); - float nextValue = nextKeyframe.getFloatValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + intervalFraction * (nextValue - prevValue) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - floatValue(); - } - FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(0); - for (int i = 1; i < mNumKeyframes; ++i) { - FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(i); - if (fraction < nextKeyframe.getFraction()) { - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevKeyframe.getFraction()) / - (nextKeyframe.getFraction() - prevKeyframe.getFraction()); - float prevValue = prevKeyframe.getFloatValue(); - float nextValue = nextKeyframe.getFloatValue(); - return mEvaluator == null ? - prevValue + intervalFraction * (nextValue - prevValue) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - floatValue(); - } - prevKeyframe = nextKeyframe; - } - // shouldn't get here - return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).floatValue(); - } - -} - diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java deleted file mode 100644 index ed5e79ec6..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -/** - * This evaluator can be used to perform type interpolation between int values. - */ -public class IntEvaluator implements TypeEvaluator { - - /** - * This function returns the result of linearly interpolating the start and end values, with - * fraction representing the proportion between the start and end values. The - * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), - * where x0 is startValue, x1 is endValue, - * and t is fraction. - * - * @param fraction The fraction from the starting to the ending values - * @param startValue The start value; should be of type int or - * Integer - * @param endValue The end value; should be of type int or Integer - * @return A linear interpolation between the start and end values, given the - * fraction parameter. - */ - public Integer evaluate(float fraction, Integer startValue, Integer endValue) { - int startInt = startValue; - return (int)(startInt + fraction * (endValue - startInt)); - } -} \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java deleted file mode 100644 index e9215e7f8..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import java.util.ArrayList; -import android.view.animation.Interpolator; - -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.IntKeyframe; - -/** - * This class holds a collection of IntKeyframe objects and is called by ValueAnimator to calculate - * values between those keyframes for a given animation. The class internal to the animation - * package because it is an implementation detail of how Keyframes are stored and used. - * - *

This type-specific subclass of KeyframeSet, along with the other type-specific subclass for - * float, exists to speed up the getValue() method when there is no custom - * TypeEvaluator set for the animation, so that values can be calculated without autoboxing to the - * Object equivalents of these primitive types.

- */ -@SuppressWarnings("unchecked") -class IntKeyframeSet extends KeyframeSet { - private int firstValue; - private int lastValue; - private int deltaValue; - private boolean firstTime = true; - - public IntKeyframeSet(IntKeyframe... keyframes) { - super(keyframes); - } - - @Override - public Object getValue(float fraction) { - return getIntValue(fraction); - } - - @Override - public IntKeyframeSet clone() { - ArrayList keyframes = mKeyframes; - int numKeyframes = mKeyframes.size(); - IntKeyframe[] newKeyframes = new IntKeyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - newKeyframes[i] = (IntKeyframe) keyframes.get(i).clone(); - } - IntKeyframeSet newSet = new IntKeyframeSet(newKeyframes); - return newSet; - } - - public int getIntValue(float fraction) { - if (mNumKeyframes == 2) { - if (firstTime) { - firstTime = false; - firstValue = ((IntKeyframe) mKeyframes.get(0)).getIntValue(); - lastValue = ((IntKeyframe) mKeyframes.get(1)).getIntValue(); - deltaValue = lastValue - firstValue; - } - if (mInterpolator != null) { - fraction = mInterpolator.getInterpolation(fraction); - } - if (mEvaluator == null) { - return firstValue + (int)(fraction * deltaValue); - } else { - return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).intValue(); - } - } - if (fraction <= 0f) { - final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); - final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(1); - int prevValue = prevKeyframe.getIntValue(); - int nextValue = nextKeyframe.getIntValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + (int)(intervalFraction * (nextValue - prevValue)) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - intValue(); - } else if (fraction >= 1f) { - final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 2); - final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 1); - int prevValue = prevKeyframe.getIntValue(); - int nextValue = nextKeyframe.getIntValue(); - float prevFraction = prevKeyframe.getFraction(); - float nextFraction = nextKeyframe.getFraction(); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); - return mEvaluator == null ? - prevValue + (int)(intervalFraction * (nextValue - prevValue)) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).intValue(); - } - IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); - for (int i = 1; i < mNumKeyframes; ++i) { - IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(i); - if (fraction < nextKeyframe.getFraction()) { - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - float intervalFraction = (fraction - prevKeyframe.getFraction()) / - (nextKeyframe.getFraction() - prevKeyframe.getFraction()); - int prevValue = prevKeyframe.getIntValue(); - int nextValue = nextKeyframe.getIntValue(); - return mEvaluator == null ? - prevValue + (int)(intervalFraction * (nextValue - prevValue)) : - ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). - intValue(); - } - prevKeyframe = nextKeyframe; - } - // shouldn't get here - return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).intValue(); - } - -} - diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java deleted file mode 100644 index ab76fa7f6..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import android.view.animation.Interpolator; - -/** - * This class holds a time/value pair for an animation. The Keyframe class is used - * by {@link ValueAnimator} to define the values that the animation target will have over the course - * of the animation. As the time proceeds from one keyframe to the other, the value of the - * target object will animate between the value at the previous keyframe and the value at the - * next keyframe. Each keyframe also holds an optional {@link TimeInterpolator} - * object, which defines the time interpolation over the intervalue preceding the keyframe. - * - *

The Keyframe class itself is abstract. The type-specific factory methods will return - * a subclass of Keyframe specific to the type of value being stored. This is done to improve - * performance when dealing with the most common cases (e.g., float and - * int values). Other types will fall into a more general Keyframe class that - * treats its values as Objects. Unless your animation requires dealing with a custom type - * or a data structure that needs to be animated directly (and evaluated using an implementation - * of {@link TypeEvaluator}), you should stick to using float and int as animations using those - * types have lower runtime overhead than other types.

- */ -@SuppressWarnings("rawtypes") -public abstract class Keyframe implements Cloneable { - /** - * The time at which mValue will hold true. - */ - float mFraction; - - /** - * The type of the value in this Keyframe. This type is determined at construction time, - * based on the type of the value object passed into the constructor. - */ - Class mValueType; - - /** - * The optional time interpolator for the interval preceding this keyframe. A null interpolator - * (the default) results in linear interpolation over the interval. - */ - private /*Time*/Interpolator mInterpolator = null; - - /** - * Flag to indicate whether this keyframe has a valid value. This flag is used when an - * animation first starts, to populate placeholder keyframes with real values derived - * from the target object. - */ - boolean mHasValue = false; - - /** - * Constructs a Keyframe object with the given time and value. The time defines the - * time, as a proportion of an overall animation's duration, at which the value will hold true - * for the animation. The value for the animation between keyframes will be calculated as - * an interpolation between the values at those keyframes. - * - * @param fraction The time, expressed as a value between 0 and 1, representing the fraction - * of time elapsed of the overall animation duration. - * @param value The value that the object will animate to as the animation time approaches - * the time in this keyframe, and the the value animated from as the time passes the time in - * this keyframe. - */ - public static Keyframe ofInt(float fraction, int value) { - return new IntKeyframe(fraction, value); - } - - /** - * Constructs a Keyframe object with the given time. The value at this time will be derived - * from the target object when the animation first starts (note that this implies that keyframes - * with no initial value must be used as part of an {@link ObjectAnimator}). - * The time defines the - * time, as a proportion of an overall animation's duration, at which the value will hold true - * for the animation. The value for the animation between keyframes will be calculated as - * an interpolation between the values at those keyframes. - * - * @param fraction The time, expressed as a value between 0 and 1, representing the fraction - * of time elapsed of the overall animation duration. - */ - public static Keyframe ofInt(float fraction) { - return new IntKeyframe(fraction); - } - - /** - * Constructs a Keyframe object with the given time and value. The time defines the - * time, as a proportion of an overall animation's duration, at which the value will hold true - * for the animation. The value for the animation between keyframes will be calculated as - * an interpolation between the values at those keyframes. - * - * @param fraction The time, expressed as a value between 0 and 1, representing the fraction - * of time elapsed of the overall animation duration. - * @param value The value that the object will animate to as the animation time approaches - * the time in this keyframe, and the the value animated from as the time passes the time in - * this keyframe. - */ - public static Keyframe ofFloat(float fraction, float value) { - return new FloatKeyframe(fraction, value); - } - - /** - * Constructs a Keyframe object with the given time. The value at this time will be derived - * from the target object when the animation first starts (note that this implies that keyframes - * with no initial value must be used as part of an {@link ObjectAnimator}). - * The time defines the - * time, as a proportion of an overall animation's duration, at which the value will hold true - * for the animation. The value for the animation between keyframes will be calculated as - * an interpolation between the values at those keyframes. - * - * @param fraction The time, expressed as a value between 0 and 1, representing the fraction - * of time elapsed of the overall animation duration. - */ - public static Keyframe ofFloat(float fraction) { - return new FloatKeyframe(fraction); - } - - /** - * Constructs a Keyframe object with the given time and value. The time defines the - * time, as a proportion of an overall animation's duration, at which the value will hold true - * for the animation. The value for the animation between keyframes will be calculated as - * an interpolation between the values at those keyframes. - * - * @param fraction The time, expressed as a value between 0 and 1, representing the fraction - * of time elapsed of the overall animation duration. - * @param value The value that the object will animate to as the animation time approaches - * the time in this keyframe, and the the value animated from as the time passes the time in - * this keyframe. - */ - public static Keyframe ofObject(float fraction, Object value) { - return new ObjectKeyframe(fraction, value); - } - - /** - * Constructs a Keyframe object with the given time. The value at this time will be derived - * from the target object when the animation first starts (note that this implies that keyframes - * with no initial value must be used as part of an {@link ObjectAnimator}). - * The time defines the - * time, as a proportion of an overall animation's duration, at which the value will hold true - * for the animation. The value for the animation between keyframes will be calculated as - * an interpolation between the values at those keyframes. - * - * @param fraction The time, expressed as a value between 0 and 1, representing the fraction - * of time elapsed of the overall animation duration. - */ - public static Keyframe ofObject(float fraction) { - return new ObjectKeyframe(fraction, null); - } - - /** - * Indicates whether this keyframe has a valid value. This method is called internally when - * an {@link ObjectAnimator} first starts; keyframes without values are assigned values at - * that time by deriving the value for the property from the target object. - * - * @return boolean Whether this object has a value assigned. - */ - public boolean hasValue() { - return mHasValue; - } - - /** - * Gets the value for this Keyframe. - * - * @return The value for this Keyframe. - */ - public abstract Object getValue(); - - /** - * Sets the value for this Keyframe. - * - * @param value value for this Keyframe. - */ - public abstract void setValue(Object value); - - /** - * Gets the time for this keyframe, as a fraction of the overall animation duration. - * - * @return The time associated with this keyframe, as a fraction of the overall animation - * duration. This should be a value between 0 and 1. - */ - public float getFraction() { - return mFraction; - } - - /** - * Sets the time for this keyframe, as a fraction of the overall animation duration. - * - * @param fraction time associated with this keyframe, as a fraction of the overall animation - * duration. This should be a value between 0 and 1. - */ - public void setFraction(float fraction) { - mFraction = fraction; - } - - /** - * Gets the optional interpolator for this Keyframe. A value of null indicates - * that there is no interpolation, which is the same as linear interpolation. - * - * @return The optional interpolator for this Keyframe. - */ - public /*Time*/Interpolator getInterpolator() { - return mInterpolator; - } - - /** - * Sets the optional interpolator for this Keyframe. A value of null indicates - * that there is no interpolation, which is the same as linear interpolation. - * - * @return The optional interpolator for this Keyframe. - */ - public void setInterpolator(/*Time*/Interpolator interpolator) { - mInterpolator = interpolator; - } - - /** - * Gets the type of keyframe. This information is used by ValueAnimator to determine the type of - * {@link TypeEvaluator} to use when calculating values between keyframes. The type is based - * on the type of Keyframe created. - * - * @return The type of the value stored in the Keyframe. - */ - public Class getType() { - return mValueType; - } - - @Override - public abstract Keyframe clone(); - - /** - * This internal subclass is used for all types which are not int or float. - */ - static class ObjectKeyframe extends Keyframe { - - /** - * The value of the animation at the time mFraction. - */ - Object mValue; - - ObjectKeyframe(float fraction, Object value) { - mFraction = fraction; - mValue = value; - mHasValue = (value != null); - mValueType = mHasValue ? value.getClass() : Object.class; - } - - public Object getValue() { - return mValue; - } - - public void setValue(Object value) { - mValue = value; - mHasValue = (value != null); - } - - @Override - public ObjectKeyframe clone() { - ObjectKeyframe kfClone = new ObjectKeyframe(getFraction(), mValue); - kfClone.setInterpolator(getInterpolator()); - return kfClone; - } - } - - /** - * Internal subclass used when the keyframe value is of type int. - */ - static class IntKeyframe extends Keyframe { - - /** - * The value of the animation at the time mFraction. - */ - int mValue; - - IntKeyframe(float fraction, int value) { - mFraction = fraction; - mValue = value; - mValueType = int.class; - mHasValue = true; - } - - IntKeyframe(float fraction) { - mFraction = fraction; - mValueType = int.class; - } - - public int getIntValue() { - return mValue; - } - - public Object getValue() { - return mValue; - } - - public void setValue(Object value) { - if (value != null && value.getClass() == Integer.class) { - mValue = ((Integer)value).intValue(); - mHasValue = true; - } - } - - @Override - public IntKeyframe clone() { - IntKeyframe kfClone = new IntKeyframe(getFraction(), mValue); - kfClone.setInterpolator(getInterpolator()); - return kfClone; - } - } - - /** - * Internal subclass used when the keyframe value is of type float. - */ - static class FloatKeyframe extends Keyframe { - /** - * The value of the animation at the time mFraction. - */ - float mValue; - - FloatKeyframe(float fraction, float value) { - mFraction = fraction; - mValue = value; - mValueType = float.class; - mHasValue = true; - } - - FloatKeyframe(float fraction) { - mFraction = fraction; - mValueType = float.class; - } - - public float getFloatValue() { - return mValue; - } - - public Object getValue() { - return mValue; - } - - public void setValue(Object value) { - if (value != null && value.getClass() == Float.class) { - mValue = ((Float)value).floatValue(); - mHasValue = true; - } - } - - @Override - public FloatKeyframe clone() { - FloatKeyframe kfClone = new FloatKeyframe(getFraction(), mValue); - kfClone.setInterpolator(getInterpolator()); - return kfClone; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java deleted file mode 100644 index a71e1ad3c..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import java.util.ArrayList; -import java.util.Arrays; -import android.view.animation.Interpolator; - -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.FloatKeyframe; -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.IntKeyframe; -import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.ObjectKeyframe; - -/** - * This class holds a collection of Keyframe objects and is called by ValueAnimator to calculate - * values between those keyframes for a given animation. The class internal to the animation - * package because it is an implementation detail of how Keyframes are stored and used. - */ -@SuppressWarnings({"rawtypes", "unchecked"}) -class KeyframeSet { - - int mNumKeyframes; - - Keyframe mFirstKeyframe; - Keyframe mLastKeyframe; - /*Time*/Interpolator mInterpolator; // only used in the 2-keyframe case - ArrayList mKeyframes; // only used when there are not 2 keyframes - TypeEvaluator mEvaluator; - - - public KeyframeSet(Keyframe... keyframes) { - mNumKeyframes = keyframes.length; - mKeyframes = new ArrayList(); - mKeyframes.addAll(Arrays.asList(keyframes)); - mFirstKeyframe = mKeyframes.get(0); - mLastKeyframe = mKeyframes.get(mNumKeyframes - 1); - mInterpolator = mLastKeyframe.getInterpolator(); - } - - public static KeyframeSet ofInt(int... values) { - int numKeyframes = values.length; - IntKeyframe keyframes[] = new IntKeyframe[Math.max(numKeyframes,2)]; - if (numKeyframes == 1) { - keyframes[0] = (IntKeyframe) Keyframe.ofInt(0f); - keyframes[1] = (IntKeyframe) Keyframe.ofInt(1f, values[0]); - } else { - keyframes[0] = (IntKeyframe) Keyframe.ofInt(0f, values[0]); - for (int i = 1; i < numKeyframes; ++i) { - keyframes[i] = (IntKeyframe) Keyframe.ofInt((float) i / (numKeyframes - 1), values[i]); - } - } - return new IntKeyframeSet(keyframes); - } - - public static KeyframeSet ofFloat(float... values) { - int numKeyframes = values.length; - FloatKeyframe keyframes[] = new FloatKeyframe[Math.max(numKeyframes,2)]; - if (numKeyframes == 1) { - keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f); - keyframes[1] = (FloatKeyframe) Keyframe.ofFloat(1f, values[0]); - } else { - keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f, values[0]); - for (int i = 1; i < numKeyframes; ++i) { - keyframes[i] = (FloatKeyframe) Keyframe.ofFloat((float) i / (numKeyframes - 1), values[i]); - } - } - return new FloatKeyframeSet(keyframes); - } - - public static KeyframeSet ofKeyframe(Keyframe... keyframes) { - // if all keyframes of same primitive type, create the appropriate KeyframeSet - int numKeyframes = keyframes.length; - boolean hasFloat = false; - boolean hasInt = false; - boolean hasOther = false; - for (int i = 0; i < numKeyframes; ++i) { - if (keyframes[i] instanceof FloatKeyframe) { - hasFloat = true; - } else if (keyframes[i] instanceof IntKeyframe) { - hasInt = true; - } else { - hasOther = true; - } - } - if (hasFloat && !hasInt && !hasOther) { - FloatKeyframe floatKeyframes[] = new FloatKeyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - floatKeyframes[i] = (FloatKeyframe) keyframes[i]; - } - return new FloatKeyframeSet(floatKeyframes); - } else if (hasInt && !hasFloat && !hasOther) { - IntKeyframe intKeyframes[] = new IntKeyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - intKeyframes[i] = (IntKeyframe) keyframes[i]; - } - return new IntKeyframeSet(intKeyframes); - } else { - return new KeyframeSet(keyframes); - } - } - - public static KeyframeSet ofObject(Object... values) { - int numKeyframes = values.length; - ObjectKeyframe keyframes[] = new ObjectKeyframe[Math.max(numKeyframes,2)]; - if (numKeyframes == 1) { - keyframes[0] = (ObjectKeyframe) Keyframe.ofObject(0f); - keyframes[1] = (ObjectKeyframe) Keyframe.ofObject(1f, values[0]); - } else { - keyframes[0] = (ObjectKeyframe) Keyframe.ofObject(0f, values[0]); - for (int i = 1; i < numKeyframes; ++i) { - keyframes[i] = (ObjectKeyframe) Keyframe.ofObject((float) i / (numKeyframes - 1), values[i]); - } - } - return new KeyframeSet(keyframes); - } - - /** - * Sets the TypeEvaluator to be used when calculating animated values. This object - * is required only for KeyframeSets that are not either IntKeyframeSet or FloatKeyframeSet, - * both of which assume their own evaluator to speed up calculations with those primitive - * types. - * - * @param evaluator The TypeEvaluator to be used to calculate animated values. - */ - public void setEvaluator(TypeEvaluator evaluator) { - mEvaluator = evaluator; - } - - @Override - public KeyframeSet clone() { - ArrayList keyframes = mKeyframes; - int numKeyframes = mKeyframes.size(); - Keyframe[] newKeyframes = new Keyframe[numKeyframes]; - for (int i = 0; i < numKeyframes; ++i) { - newKeyframes[i] = keyframes.get(i).clone(); - } - KeyframeSet newSet = new KeyframeSet(newKeyframes); - return newSet; - } - - /** - * Gets the animated value, given the elapsed fraction of the animation (interpolated by the - * animation's interpolator) and the evaluator used to calculate in-between values. This - * function maps the input fraction to the appropriate keyframe interval and a fraction - * between them and returns the interpolated value. Note that the input fraction may fall - * outside the [0-1] bounds, if the animation's interpolator made that happen (e.g., a - * spring interpolation that might send the fraction past 1.0). We handle this situation by - * just using the two keyframes at the appropriate end when the value is outside those bounds. - * - * @param fraction The elapsed fraction of the animation - * @return The animated value. - */ - public Object getValue(float fraction) { - - // Special-case optimization for the common case of only two keyframes - if (mNumKeyframes == 2) { - if (mInterpolator != null) { - fraction = mInterpolator.getInterpolation(fraction); - } - return mEvaluator.evaluate(fraction, mFirstKeyframe.getValue(), - mLastKeyframe.getValue()); - } - if (fraction <= 0f) { - final Keyframe nextKeyframe = mKeyframes.get(1); - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - final float prevFraction = mFirstKeyframe.getFraction(); - float intervalFraction = (fraction - prevFraction) / - (nextKeyframe.getFraction() - prevFraction); - return mEvaluator.evaluate(intervalFraction, mFirstKeyframe.getValue(), - nextKeyframe.getValue()); - } else if (fraction >= 1f) { - final Keyframe prevKeyframe = mKeyframes.get(mNumKeyframes - 2); - final /*Time*/Interpolator interpolator = mLastKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - final float prevFraction = prevKeyframe.getFraction(); - float intervalFraction = (fraction - prevFraction) / - (mLastKeyframe.getFraction() - prevFraction); - return mEvaluator.evaluate(intervalFraction, prevKeyframe.getValue(), - mLastKeyframe.getValue()); - } - Keyframe prevKeyframe = mFirstKeyframe; - for (int i = 1; i < mNumKeyframes; ++i) { - Keyframe nextKeyframe = mKeyframes.get(i); - if (fraction < nextKeyframe.getFraction()) { - final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); - if (interpolator != null) { - fraction = interpolator.getInterpolation(fraction); - } - final float prevFraction = prevKeyframe.getFraction(); - float intervalFraction = (fraction - prevFraction) / - (nextKeyframe.getFraction() - prevFraction); - return mEvaluator.evaluate(intervalFraction, prevKeyframe.getValue(), - nextKeyframe.getValue()); - } - prevKeyframe = nextKeyframe; - } - // shouldn't reach here - return mLastKeyframe.getValue(); - } - - @Override - public String toString() { - String returnVal = " "; - for (int i = 0; i < mNumKeyframes; ++i) { - returnVal += mKeyframes.get(i).getValue() + " "; - } - return returnVal; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java deleted file mode 100644 index 21d15c02a..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import android.util.Log; -//import android.util.Property; - -//import java.lang.reflect.Method; -import java.util.ArrayList; - -/** - * This subclass of {@link ValueAnimator} provides support for animating properties on target objects. - * The constructors of this class take parameters to define the target object that will be animated - * as well as the name of the property that will be animated. Appropriate set/get functions - * are then determined internally and the animation will call these functions as necessary to - * animate the property. - * - * @see #setPropertyName(String) - * - */ -@SuppressWarnings("rawtypes") -public final class ObjectAnimator extends ValueAnimator { - private static final boolean DBG = false; - - // The target object on which the property exists, set in the constructor - private Object mTarget; - - private String mPropertyName; - - //private Property mProperty; - - /** - * Sets the name of the property that will be animated. This name is used to derive - * a setter function that will be called to set animated values. - * For example, a property name of foo will result - * in a call to the function setFoo() on the target object. If either - * valueFrom or valueTo is null, then a getter function will - * also be derived and called. - * - *

For best performance of the mechanism that calls the setter function determined by the - * name of the property being animated, use float or int typed values, - * and make the setter function for those properties have a void return value. This - * will cause the code to take an optimized path for these constrained circumstances. Other - * property types and return types will work, but will have more overhead in processing - * the requests due to normal reflection mechanisms.

- * - *

Note that the setter function derived from this property name - * must take the same parameter type as the - * valueFrom and valueTo properties, otherwise the call to - * the setter function will fail.

- * - *

If this ObjectAnimator has been set up to animate several properties together, - * using more than one PropertyValuesHolder objects, then setting the propertyName simply - * sets the propertyName in the first of those PropertyValuesHolder objects.

- * - * @param propertyName The name of the property being animated. Should not be null. - */ - public void setPropertyName(String propertyName) { - // mValues could be null if this is being constructed piecemeal. Just record the - // propertyName to be used later when setValues() is called if so. - if (mValues != null) { - PropertyValuesHolder valuesHolder = mValues[0]; - String oldName = valuesHolder.getPropertyName(); - valuesHolder.setPropertyName(propertyName); - mValuesMap.remove(oldName); - mValuesMap.put(propertyName, valuesHolder); - } - mPropertyName = propertyName; - // New property/values/target should cause re-initialization prior to starting - mInitialized = false; - } - - /** - * Sets the property that will be animated. Property objects will take precedence over - * properties specified by the {@link #setPropertyName(String)} method. Animations should - * be set up to use one or the other, not both. - * - * @param property The property being animated. Should not be null. - */ - //public void setProperty(Property property) { - // // mValues could be null if this is being constructed piecemeal. Just record the - // // propertyName to be used later when setValues() is called if so. - // if (mValues != null) { - // PropertyValuesHolder valuesHolder = mValues[0]; - // String oldName = valuesHolder.getPropertyName(); - // valuesHolder.setProperty(property); - // mValuesMap.remove(oldName); - // mValuesMap.put(mPropertyName, valuesHolder); - // } - // if (mProperty != null) { - // mPropertyName = property.getName(); - // } - // mProperty = property; - // // New property/values/target should cause re-initialization prior to starting - // mInitialized = false; - //} - - /** - * Gets the name of the property that will be animated. This name will be used to derive - * a setter function that will be called to set animated values. - * For example, a property name of foo will result - * in a call to the function setFoo() on the target object. If either - * valueFrom or valueTo is null, then a getter function will - * also be derived and called. - */ - public String getPropertyName() { - return mPropertyName; - } - - /** - * Creates a new ObjectAnimator object. This default constructor is primarily for - * use internally; the other constructors which take parameters are more generally - * useful. - */ - public ObjectAnimator() { - } - - /** - * Private utility constructor that initializes the target object and name of the - * property being animated. - * - * @param target The object whose property is to be animated. This object should - * have a public method on it called setName(), where name is - * the value of the propertyName parameter. - * @param propertyName The name of the property being animated. - */ - private ObjectAnimator(Object target, String propertyName) { - mTarget = target; - setPropertyName(propertyName); - } - - /** - * Private utility constructor that initializes the target object and property being animated. - * - * @param target The object whose property is to be animated. - * @param property The property being animated. - */ - //private ObjectAnimator(T target, Property property) { - // mTarget = target; - // setProperty(property); - //} - - /** - * Constructs and returns an ObjectAnimator that animates between int values. A single - * value implies that that value is the one being animated to. Two values imply a starting - * and ending values. More than two values imply a starting value, values to animate through - * along the way, and an ending value (these values will be distributed evenly across - * the duration of the animation). - * - * @param target The object whose property is to be animated. This object should - * have a public method on it called setName(), where name is - * the value of the propertyName parameter. - * @param propertyName The name of the property being animated. - * @param values A set of values that the animation will animate between over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - public static ObjectAnimator ofInt(Object target, String propertyName, int... values) { - ObjectAnimator anim = new ObjectAnimator(target, propertyName); - anim.setIntValues(values); - return anim; - } - - /** - * Constructs and returns an ObjectAnimator that animates between int values. A single - * value implies that that value is the one being animated to. Two values imply a starting - * and ending values. More than two values imply a starting value, values to animate through - * along the way, and an ending value (these values will be distributed evenly across - * the duration of the animation). - * - * @param target The object whose property is to be animated. - * @param property The property being animated. - * @param values A set of values that the animation will animate between over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - //public static ObjectAnimator ofInt(T target, Property property, int... values) { - // ObjectAnimator anim = new ObjectAnimator(target, property); - // anim.setIntValues(values); - // return anim; - //} - - /** - * Constructs and returns an ObjectAnimator that animates between float values. A single - * value implies that that value is the one being animated to. Two values imply a starting - * and ending values. More than two values imply a starting value, values to animate through - * along the way, and an ending value (these values will be distributed evenly across - * the duration of the animation). - * - * @param target The object whose property is to be animated. This object should - * have a public method on it called setName(), where name is - * the value of the propertyName parameter. - * @param propertyName The name of the property being animated. - * @param values A set of values that the animation will animate between over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) { - ObjectAnimator anim = new ObjectAnimator(target, propertyName); - anim.setFloatValues(values); - return anim; - } - - /** - * Constructs and returns an ObjectAnimator that animates between float values. A single - * value implies that that value is the one being animated to. Two values imply a starting - * and ending values. More than two values imply a starting value, values to animate through - * along the way, and an ending value (these values will be distributed evenly across - * the duration of the animation). - * - * @param target The object whose property is to be animated. - * @param property The property being animated. - * @param values A set of values that the animation will animate between over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - //public static ObjectAnimator ofFloat(T target, Property property, - // float... values) { - // ObjectAnimator anim = new ObjectAnimator(target, property); - // anim.setFloatValues(values); - // return anim; - //} - - /** - * Constructs and returns an ObjectAnimator that animates between Object values. A single - * value implies that that value is the one being animated to. Two values imply a starting - * and ending values. More than two values imply a starting value, values to animate through - * along the way, and an ending value (these values will be distributed evenly across - * the duration of the animation). - * - * @param target The object whose property is to be animated. This object should - * have a public method on it called setName(), where name is - * the value of the propertyName parameter. - * @param propertyName The name of the property being animated. - * @param evaluator A TypeEvaluator that will be called on each animation frame to - * provide the necessary interpolation between the Object values to derive the animated - * value. - * @param values A set of values that the animation will animate between over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - public static ObjectAnimator ofObject(Object target, String propertyName, - TypeEvaluator evaluator, Object... values) { - ObjectAnimator anim = new ObjectAnimator(target, propertyName); - anim.setObjectValues(values); - anim.setEvaluator(evaluator); - return anim; - } - - /** - * Constructs and returns an ObjectAnimator that animates between Object values. A single - * value implies that that value is the one being animated to. Two values imply a starting - * and ending values. More than two values imply a starting value, values to animate through - * along the way, and an ending value (these values will be distributed evenly across - * the duration of the animation). - * - * @param target The object whose property is to be animated. - * @param property The property being animated. - * @param evaluator A TypeEvaluator that will be called on each animation frame to - * provide the necessary interpolation between the Object values to derive the animated - * value. - * @param values A set of values that the animation will animate between over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - //public static ObjectAnimator ofObject(T target, Property property, - // TypeEvaluator evaluator, V... values) { - // ObjectAnimator anim = new ObjectAnimator(target, property); - // anim.setObjectValues(values); - // anim.setEvaluator(evaluator); - // return anim; - //} - - /** - * Constructs and returns an ObjectAnimator that animates between the sets of values specified - * in PropertyValueHolder objects. This variant should be used when animating - * several properties at once with the same ObjectAnimator, since PropertyValuesHolder allows - * you to associate a set of animation values with a property name. - * - * @param target The object whose property is to be animated. Depending on how the - * PropertyValuesObjects were constructed, the target object should either have the {@link - * android.util.Property} objects used to construct the PropertyValuesHolder objects or (if the - * PropertyValuesHOlder objects were created with property names) the target object should have - * public methods on it called setName(), where name is the name of - * the property passed in as the propertyName parameter for each of the - * PropertyValuesHolder objects. - * @param values A set of PropertyValuesHolder objects whose values will be animated between - * over time. - * @return An ObjectAnimator object that is set up to animate between the given values. - */ - public static ObjectAnimator ofPropertyValuesHolder(Object target, - PropertyValuesHolder... values) { - ObjectAnimator anim = new ObjectAnimator(); - anim.mTarget = target; - anim.setValues(values); - return anim; - } - - @Override - public void setIntValues(int... values) { - if (mValues == null || mValues.length == 0) { - // No values yet - this animator is being constructed piecemeal. Init the values with - // whatever the current propertyName is - //if (mProperty != null) { - // setValues(PropertyValuesHolder.ofInt(mProperty, values)); - //} else { - setValues(PropertyValuesHolder.ofInt(mPropertyName, values)); - //} - } else { - super.setIntValues(values); - } - } - - @Override - public void setFloatValues(float... values) { - if (mValues == null || mValues.length == 0) { - // No values yet - this animator is being constructed piecemeal. Init the values with - // whatever the current propertyName is - //if (mProperty != null) { - // setValues(PropertyValuesHolder.ofFloat(mProperty, values)); - //} else { - setValues(PropertyValuesHolder.ofFloat(mPropertyName, values)); - //} - } else { - super.setFloatValues(values); - } - } - - @Override - public void setObjectValues(Object... values) { - if (mValues == null || mValues.length == 0) { - // No values yet - this animator is being constructed piecemeal. Init the values with - // whatever the current propertyName is - //if (mProperty != null) { - // setValues(PropertyValuesHolder.ofObject(mProperty, (TypeEvaluator)null, values)); - //} else { - setValues(PropertyValuesHolder.ofObject(mPropertyName, (TypeEvaluator)null, values)); - //} - } else { - super.setObjectValues(values); - } - } - - @Override - public void start() { - if (DBG) { - Log.d("ObjectAnimator", "Anim target, duration: " + mTarget + ", " + getDuration()); - for (int i = 0; i < mValues.length; ++i) { - PropertyValuesHolder pvh = mValues[i]; - ArrayList keyframes = pvh.mKeyframeSet.mKeyframes; - Log.d("ObjectAnimator", " Values[" + i + "]: " + - pvh.getPropertyName() + ", " + keyframes.get(0).getValue() + ", " + - keyframes.get(pvh.mKeyframeSet.mNumKeyframes - 1).getValue()); - } - } - super.start(); - } - - /** - * This function is called immediately before processing the first animation - * frame of an animation. If there is a nonzero startDelay, the - * function is called after that delay ends. - * It takes care of the final initialization steps for the - * animation. This includes setting mEvaluator, if the user has not yet - * set it up, and the setter/getter methods, if the user did not supply - * them. - * - *

Overriders of this method should call the superclass method to cause - * internal mechanisms to be set up correctly.

- */ - @Override - void initAnimation() { - if (!mInitialized) { - // mValueType may change due to setter/getter setup; do this before calling super.init(), - // which uses mValueType to set up the default type evaluator. - int numValues = mValues.length; - for (int i = 0; i < numValues; ++i) { - mValues[i].setupSetterAndGetter(mTarget); - } - super.initAnimation(); - } - } - - /** - * Sets the length of the animation. The default duration is 300 milliseconds. - * - * @param duration The length of the animation, in milliseconds. - * @return ObjectAnimator The object called with setDuration(). This return - * value makes it easier to compose statements together that construct and then set the - * duration, as in - * ObjectAnimator.ofInt(target, propertyName, 0, 10).setDuration(500).start(). - */ - @Override - public ObjectAnimator setDuration(long duration) { - super.setDuration(duration); - return this; - } - - - /** - * The target object whose property will be animated by this animation - * - * @return The object being animated - */ - public Object getTarget() { - return mTarget; - } - - /** - * Sets the target object whose property will be animated by this animation - * - * @param target The object being animated - */ - @Override - public void setTarget(Object target) { - if (mTarget != target) { - final Object oldTarget = mTarget; - mTarget = target; - if (oldTarget != null && target != null && oldTarget.getClass() == target.getClass()) { - return; - } - // New target type should cause re-initialization prior to starting - mInitialized = false; - } - } - - @Override - public void setupStartValues() { - initAnimation(); - int numValues = mValues.length; - for (int i = 0; i < numValues; ++i) { - mValues[i].setupStartValue(mTarget); - } - } - - @Override - public void setupEndValues() { - initAnimation(); - int numValues = mValues.length; - for (int i = 0; i < numValues; ++i) { - mValues[i].setupEndValue(mTarget); - } - } - - /** - * This method is called with the elapsed fraction of the animation during every - * animation frame. This function turns the elapsed fraction into an interpolated fraction - * and then into an animated value (from the evaluator. The function is called mostly during - * animation updates, but it is also called when the end() - * function is called, to set the final value on the property. - * - *

Overrides of this method must call the superclass to perform the calculation - * of the animated value.

- * - * @param fraction The elapsed fraction of the animation. - */ - @Override - void animateValue(float fraction) { - super.animateValue(fraction); - int numValues = mValues.length; - for (int i = 0; i < numValues; ++i) { - mValues[i].setAnimatedValue(mTarget); - } - } - - @Override - public ObjectAnimator clone() { - final ObjectAnimator anim = (ObjectAnimator) super.clone(); - return anim; - } - - @Override - public String toString() { - String returnVal = "ObjectAnimator@" + Integer.toHexString(hashCode()) + ", target " + - mTarget; - if (mValues != null) { - for (int i = 0; i < mValues.length; ++i) { - returnVal += "\n " + mValues[i].toString(); - } - } - return returnVal; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java deleted file mode 100644 index 84f7504ab..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java +++ /dev/null @@ -1,1012 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -//import android.util.FloatProperty; -//import android.util.IntProperty; -import android.util.Log; -//import android.util.Property; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * This class holds information about a property and the values that that property - * should take on during an animation. PropertyValuesHolder objects can be used to create - * animations with ValueAnimator or ObjectAnimator that operate on several different properties - * in parallel. - */ -@SuppressWarnings({"rawtypes", "unchecked"}) -public class PropertyValuesHolder implements Cloneable { - - /** - * The name of the property associated with the values. This need not be a real property, - * unless this object is being used with ObjectAnimator. But this is the name by which - * aniamted values are looked up with getAnimatedValue(String) in ValueAnimator. - */ - String mPropertyName; - - /** - * @hide - */ - //protected Property mProperty; - - /** - * The setter function, if needed. ObjectAnimator hands off this functionality to - * PropertyValuesHolder, since it holds all of the per-property information. This - * property is automatically - * derived when the animation starts in setupSetterAndGetter() if using ObjectAnimator. - */ - Method mSetter = null; - - /** - * The getter function, if needed. ObjectAnimator hands off this functionality to - * PropertyValuesHolder, since it holds all of the per-property information. This - * property is automatically - * derived when the animation starts in setupSetterAndGetter() if using ObjectAnimator. - * The getter is only derived and used if one of the values is null. - */ - private Method mGetter = null; - - /** - * The type of values supplied. This information is used both in deriving the setter/getter - * functions and in deriving the type of TypeEvaluator. - */ - Class mValueType; - - /** - * The set of keyframes (time/value pairs) that define this animation. - */ - KeyframeSet mKeyframeSet = null; - - - // type evaluators for the primitive types handled by this implementation - private static final TypeEvaluator sIntEvaluator = new IntEvaluator(); - private static final TypeEvaluator sFloatEvaluator = new FloatEvaluator(); - - // We try several different types when searching for appropriate setter/getter functions. - // The caller may have supplied values in a type that does not match the setter/getter - // functions (such as the integers 0 and 1 to represent floating point values for alpha). - // Also, the use of generics in constructors means that we end up with the Object versions - // of primitive types (Float vs. float). But most likely, the setter/getter functions - // will take primitive types instead. - // So we supply an ordered array of other types to try before giving up. - private static Class[] FLOAT_VARIANTS = {float.class, Float.class, double.class, int.class, - Double.class, Integer.class}; - private static Class[] INTEGER_VARIANTS = {int.class, Integer.class, float.class, double.class, - Float.class, Double.class}; - private static Class[] DOUBLE_VARIANTS = {double.class, Double.class, float.class, int.class, - Float.class, Integer.class}; - - // These maps hold all property entries for a particular class. This map - // is used to speed up property/setter/getter lookups for a given class/property - // combination. No need to use reflection on the combination more than once. - private static final HashMap> sSetterPropertyMap = - new HashMap>(); - private static final HashMap> sGetterPropertyMap = - new HashMap>(); - - // This lock is used to ensure that only one thread is accessing the property maps - // at a time. - final ReentrantReadWriteLock mPropertyMapLock = new ReentrantReadWriteLock(); - - // Used to pass single value to varargs parameter in setter invocation - final Object[] mTmpValueArray = new Object[1]; - - /** - * The type evaluator used to calculate the animated values. This evaluator is determined - * automatically based on the type of the start/end objects passed into the constructor, - * but the system only knows about the primitive types int and float. Any other - * type will need to set the evaluator to a custom evaluator for that type. - */ - private TypeEvaluator mEvaluator; - - /** - * The value most recently calculated by calculateValue(). This is set during - * that function and might be retrieved later either by ValueAnimator.animatedValue() or - * by the property-setting logic in ObjectAnimator.animatedValue(). - */ - private Object mAnimatedValue; - - /** - * Internal utility constructor, used by the factory methods to set the property name. - * @param propertyName The name of the property for this holder. - */ - private PropertyValuesHolder(String propertyName) { - mPropertyName = propertyName; - } - - /** - * Internal utility constructor, used by the factory methods to set the property. - * @param property The property for this holder. - */ - //private PropertyValuesHolder(Property property) { - // mProperty = property; - // if (property != null) { - // mPropertyName = property.getName(); - // } - //} - - /** - * Constructs and returns a PropertyValuesHolder with a given property name and - * set of int values. - * @param propertyName The name of the property being animated. - * @param values The values that the named property will animate between. - * @return PropertyValuesHolder The constructed PropertyValuesHolder object. - */ - public static PropertyValuesHolder ofInt(String propertyName, int... values) { - return new IntPropertyValuesHolder(propertyName, values); - } - - /** - * Constructs and returns a PropertyValuesHolder with a given property and - * set of int values. - * @param property The property being animated. Should not be null. - * @param values The values that the property will animate between. - * @return PropertyValuesHolder The constructed PropertyValuesHolder object. - */ - //public static PropertyValuesHolder ofInt(Property property, int... values) { - // return new IntPropertyValuesHolder(property, values); - //} - - /** - * Constructs and returns a PropertyValuesHolder with a given property name and - * set of float values. - * @param propertyName The name of the property being animated. - * @param values The values that the named property will animate between. - * @return PropertyValuesHolder The constructed PropertyValuesHolder object. - */ - public static PropertyValuesHolder ofFloat(String propertyName, float... values) { - return new FloatPropertyValuesHolder(propertyName, values); - } - - /** - * Constructs and returns a PropertyValuesHolder with a given property and - * set of float values. - * @param property The property being animated. Should not be null. - * @param values The values that the property will animate between. - * @return PropertyValuesHolder The constructed PropertyValuesHolder object. - */ - //public static PropertyValuesHolder ofFloat(Property property, float... values) { - // return new FloatPropertyValuesHolder(property, values); - //} - - /** - * Constructs and returns a PropertyValuesHolder with a given property name and - * set of Object values. This variant also takes a TypeEvaluator because the system - * cannot automatically interpolate between objects of unknown type. - * - * @param propertyName The name of the property being animated. - * @param evaluator A TypeEvaluator that will be called on each animation frame to - * provide the necessary interpolation between the Object values to derive the animated - * value. - * @param values The values that the named property will animate between. - * @return PropertyValuesHolder The constructed PropertyValuesHolder object. - */ - public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator, - Object... values) { - PropertyValuesHolder pvh = new PropertyValuesHolder(propertyName); - pvh.setObjectValues(values); - pvh.setEvaluator(evaluator); - return pvh; - } - - /** - * Constructs and returns a PropertyValuesHolder with a given property and - * set of Object values. This variant also takes a TypeEvaluator because the system - * cannot automatically interpolate between objects of unknown type. - * - * @param property The property being animated. Should not be null. - * @param evaluator A TypeEvaluator that will be called on each animation frame to - * provide the necessary interpolation between the Object values to derive the animated - * value. - * @param values The values that the property will animate between. - * @return PropertyValuesHolder The constructed PropertyValuesHolder object. - */ - //public static PropertyValuesHolder ofObject(Property property, - // TypeEvaluator evaluator, V... values) { - // PropertyValuesHolder pvh = new PropertyValuesHolder(property); - // pvh.setObjectValues(values); - // pvh.setEvaluator(evaluator); - // return pvh; - //} - - /** - * Constructs and returns a PropertyValuesHolder object with the specified property name and set - * of values. These values can be of any type, but the type should be consistent so that - * an appropriate {@link android.animation.TypeEvaluator} can be found that matches - * the common type. - *

If there is only one value, it is assumed to be the end value of an animation, - * and an initial value will be derived, if possible, by calling a getter function - * on the object. Also, if any value is null, the value will be filled in when the animation - * starts in the same way. This mechanism of automatically getting null values only works - * if the PropertyValuesHolder object is used in conjunction - * {@link ObjectAnimator}, and with a getter function - * derived automatically from propertyName, since otherwise PropertyValuesHolder has - * no way of determining what the value should be. - * @param propertyName The name of the property associated with this set of values. This - * can be the actual property name to be used when using a ObjectAnimator object, or - * just a name used to get animated values, such as if this object is used with an - * ValueAnimator object. - * @param values The set of values to animate between. - */ - public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values) { - KeyframeSet keyframeSet = KeyframeSet.ofKeyframe(values); - if (keyframeSet instanceof IntKeyframeSet) { - return new IntPropertyValuesHolder(propertyName, (IntKeyframeSet) keyframeSet); - } else if (keyframeSet instanceof FloatKeyframeSet) { - return new FloatPropertyValuesHolder(propertyName, (FloatKeyframeSet) keyframeSet); - } - else { - PropertyValuesHolder pvh = new PropertyValuesHolder(propertyName); - pvh.mKeyframeSet = keyframeSet; - pvh.mValueType = values[0].getType(); - return pvh; - } - } - - /** - * Constructs and returns a PropertyValuesHolder object with the specified property and set - * of values. These values can be of any type, but the type should be consistent so that - * an appropriate {@link android.animation.TypeEvaluator} can be found that matches - * the common type. - *

If there is only one value, it is assumed to be the end value of an animation, - * and an initial value will be derived, if possible, by calling the property's - * {@link android.util.Property#get(Object)} function. - * Also, if any value is null, the value will be filled in when the animation - * starts in the same way. This mechanism of automatically getting null values only works - * if the PropertyValuesHolder object is used in conjunction with - * {@link ObjectAnimator}, since otherwise PropertyValuesHolder has - * no way of determining what the value should be. - * @param property The property associated with this set of values. Should not be null. - * @param values The set of values to animate between. - */ - //public static PropertyValuesHolder ofKeyframe(Property property, Keyframe... values) { - // KeyframeSet keyframeSet = KeyframeSet.ofKeyframe(values); - // if (keyframeSet instanceof IntKeyframeSet) { - // return new IntPropertyValuesHolder(property, (IntKeyframeSet) keyframeSet); - // } else if (keyframeSet instanceof FloatKeyframeSet) { - // return new FloatPropertyValuesHolder(property, (FloatKeyframeSet) keyframeSet); - // } - // else { - // PropertyValuesHolder pvh = new PropertyValuesHolder(property); - // pvh.mKeyframeSet = keyframeSet; - // pvh.mValueType = ((Keyframe)values[0]).getType(); - // return pvh; - // } - //} - - /** - * Set the animated values for this object to this set of ints. - * If there is only one value, it is assumed to be the end value of an animation, - * and an initial value will be derived, if possible, by calling a getter function - * on the object. Also, if any value is null, the value will be filled in when the animation - * starts in the same way. This mechanism of automatically getting null values only works - * if the PropertyValuesHolder object is used in conjunction - * {@link ObjectAnimator}, and with a getter function - * derived automatically from propertyName, since otherwise PropertyValuesHolder has - * no way of determining what the value should be. - * - * @param values One or more values that the animation will animate between. - */ - public void setIntValues(int... values) { - mValueType = int.class; - mKeyframeSet = KeyframeSet.ofInt(values); - } - - /** - * Set the animated values for this object to this set of floats. - * If there is only one value, it is assumed to be the end value of an animation, - * and an initial value will be derived, if possible, by calling a getter function - * on the object. Also, if any value is null, the value will be filled in when the animation - * starts in the same way. This mechanism of automatically getting null values only works - * if the PropertyValuesHolder object is used in conjunction - * {@link ObjectAnimator}, and with a getter function - * derived automatically from propertyName, since otherwise PropertyValuesHolder has - * no way of determining what the value should be. - * - * @param values One or more values that the animation will animate between. - */ - public void setFloatValues(float... values) { - mValueType = float.class; - mKeyframeSet = KeyframeSet.ofFloat(values); - } - - /** - * Set the animated values for this object to this set of Keyframes. - * - * @param values One or more values that the animation will animate between. - */ - public void setKeyframes(Keyframe... values) { - int numKeyframes = values.length; - Keyframe keyframes[] = new Keyframe[Math.max(numKeyframes,2)]; - mValueType = values[0].getType(); - for (int i = 0; i < numKeyframes; ++i) { - keyframes[i] = values[i]; - } - mKeyframeSet = new KeyframeSet(keyframes); - } - - /** - * Set the animated values for this object to this set of Objects. - * If there is only one value, it is assumed to be the end value of an animation, - * and an initial value will be derived, if possible, by calling a getter function - * on the object. Also, if any value is null, the value will be filled in when the animation - * starts in the same way. This mechanism of automatically getting null values only works - * if the PropertyValuesHolder object is used in conjunction - * {@link ObjectAnimator}, and with a getter function - * derived automatically from propertyName, since otherwise PropertyValuesHolder has - * no way of determining what the value should be. - * - * @param values One or more values that the animation will animate between. - */ - public void setObjectValues(Object... values) { - mValueType = values[0].getClass(); - mKeyframeSet = KeyframeSet.ofObject(values); - } - - /** - * Determine the setter or getter function using the JavaBeans convention of setFoo or - * getFoo for a property named 'foo'. This function figures out what the name of the - * function should be and uses reflection to find the Method with that name on the - * target object. - * - * @param targetClass The class to search for the method - * @param prefix "set" or "get", depending on whether we need a setter or getter. - * @param valueType The type of the parameter (in the case of a setter). This type - * is derived from the values set on this PropertyValuesHolder. This type is used as - * a first guess at the parameter type, but we check for methods with several different - * types to avoid problems with slight mis-matches between supplied values and actual - * value types used on the setter. - * @return Method the method associated with mPropertyName. - */ - private Method getPropertyFunction(Class targetClass, String prefix, Class valueType) { - // TODO: faster implementation... - Method returnVal = null; - String methodName = getMethodName(prefix, mPropertyName); - Class args[] = null; - if (valueType == null) { - try { - returnVal = targetClass.getMethod(methodName, args); - } catch (NoSuchMethodException e) { - Log.e("PropertyValuesHolder", targetClass.getSimpleName() + " - " + - "Couldn't find no-arg method for property " + mPropertyName + ": " + e); - } - } else { - args = new Class[1]; - Class typeVariants[]; - if (mValueType.equals(Float.class)) { - typeVariants = FLOAT_VARIANTS; - } else if (mValueType.equals(Integer.class)) { - typeVariants = INTEGER_VARIANTS; - } else if (mValueType.equals(Double.class)) { - typeVariants = DOUBLE_VARIANTS; - } else { - typeVariants = new Class[1]; - typeVariants[0] = mValueType; - } - for (Class typeVariant : typeVariants) { - args[0] = typeVariant; - try { - returnVal = targetClass.getMethod(methodName, args); - // change the value type to suit - mValueType = typeVariant; - return returnVal; - } catch (NoSuchMethodException e) { - // Swallow the error and keep trying other variants - } - } - // If we got here, then no appropriate function was found - Log.e("PropertyValuesHolder", - "Couldn't find " + prefix + "ter property " + mPropertyName + - " for " + targetClass.getSimpleName() + - " with value type "+ mValueType); - } - - return returnVal; - } - - - /** - * Returns the setter or getter requested. This utility function checks whether the - * requested method exists in the propertyMapMap cache. If not, it calls another - * utility function to request the Method from the targetClass directly. - * @param targetClass The Class on which the requested method should exist. - * @param propertyMapMap The cache of setters/getters derived so far. - * @param prefix "set" or "get", for the setter or getter. - * @param valueType The type of parameter passed into the method (null for getter). - * @return Method the method associated with mPropertyName. - */ - private Method setupSetterOrGetter(Class targetClass, - HashMap> propertyMapMap, - String prefix, Class valueType) { - Method setterOrGetter = null; - try { - // Have to lock property map prior to reading it, to guard against - // another thread putting something in there after we've checked it - // but before we've added an entry to it - mPropertyMapLock.writeLock().lock(); - HashMap propertyMap = propertyMapMap.get(targetClass); - if (propertyMap != null) { - setterOrGetter = propertyMap.get(mPropertyName); - } - if (setterOrGetter == null) { - setterOrGetter = getPropertyFunction(targetClass, prefix, valueType); - if (propertyMap == null) { - propertyMap = new HashMap(); - propertyMapMap.put(targetClass, propertyMap); - } - propertyMap.put(mPropertyName, setterOrGetter); - } - } finally { - mPropertyMapLock.writeLock().unlock(); - } - return setterOrGetter; - } - - /** - * Utility function to get the setter from targetClass - * @param targetClass The Class on which the requested method should exist. - */ - void setupSetter(Class targetClass) { - mSetter = setupSetterOrGetter(targetClass, sSetterPropertyMap, "set", mValueType); - } - - /** - * Utility function to get the getter from targetClass - */ - private void setupGetter(Class targetClass) { - mGetter = setupSetterOrGetter(targetClass, sGetterPropertyMap, "get", null); - } - - /** - * Internal function (called from ObjectAnimator) to set up the setter and getter - * prior to running the animation. If the setter has not been manually set for this - * object, it will be derived automatically given the property name, target object, and - * types of values supplied. If no getter has been set, it will be supplied iff any of the - * supplied values was null. If there is a null value, then the getter (supplied or derived) - * will be called to set those null values to the current value of the property - * on the target object. - * @param target The object on which the setter (and possibly getter) exist. - */ - void setupSetterAndGetter(Object target) { - //if (mProperty != null) { - // // check to make sure that mProperty is on the class of target - // try { - // Object testValue = mProperty.get(target); - // for (Keyframe kf : mKeyframeSet.mKeyframes) { - // if (!kf.hasValue()) { - // kf.setValue(mProperty.get(target)); - // } - // } - // return; - // } catch (ClassCastException e) { - // Log.e("PropertyValuesHolder","No such property (" + mProperty.getName() + - // ") on target object " + target + ". Trying reflection instead"); - // mProperty = null; - // } - //} - Class targetClass = target.getClass(); - if (mSetter == null) { - setupSetter(targetClass); - } - for (Keyframe kf : mKeyframeSet.mKeyframes) { - if (!kf.hasValue()) { - if (mGetter == null) { - setupGetter(targetClass); - } - try { - kf.setValue(mGetter.invoke(target)); - } catch (InvocationTargetException e) { - Log.e("PropertyValuesHolder", e.toString()); - } catch (IllegalAccessException e) { - Log.e("PropertyValuesHolder", e.toString()); - } - } - } - } - - /** - * Utility function to set the value stored in a particular Keyframe. The value used is - * whatever the value is for the property name specified in the keyframe on the target object. - * - * @param target The target object from which the current value should be extracted. - * @param kf The keyframe which holds the property name and value. - */ - private void setupValue(Object target, Keyframe kf) { - //if (mProperty != null) { - // kf.setValue(mProperty.get(target)); - //} - try { - if (mGetter == null) { - Class targetClass = target.getClass(); - setupGetter(targetClass); - } - kf.setValue(mGetter.invoke(target)); - } catch (InvocationTargetException e) { - Log.e("PropertyValuesHolder", e.toString()); - } catch (IllegalAccessException e) { - Log.e("PropertyValuesHolder", e.toString()); - } - } - - /** - * This function is called by ObjectAnimator when setting the start values for an animation. - * The start values are set according to the current values in the target object. The - * property whose value is extracted is whatever is specified by the propertyName of this - * PropertyValuesHolder object. - * - * @param target The object which holds the start values that should be set. - */ - void setupStartValue(Object target) { - setupValue(target, mKeyframeSet.mKeyframes.get(0)); - } - - /** - * This function is called by ObjectAnimator when setting the end values for an animation. - * The end values are set according to the current values in the target object. The - * property whose value is extracted is whatever is specified by the propertyName of this - * PropertyValuesHolder object. - * - * @param target The object which holds the start values that should be set. - */ - void setupEndValue(Object target) { - setupValue(target, mKeyframeSet.mKeyframes.get(mKeyframeSet.mKeyframes.size() - 1)); - } - - @Override - public PropertyValuesHolder clone() { - try { - PropertyValuesHolder newPVH = (PropertyValuesHolder) super.clone(); - newPVH.mPropertyName = mPropertyName; - //newPVH.mProperty = mProperty; - newPVH.mKeyframeSet = mKeyframeSet.clone(); - newPVH.mEvaluator = mEvaluator; - return newPVH; - } catch (CloneNotSupportedException e) { - // won't reach here - return null; - } - } - - /** - * Internal function to set the value on the target object, using the setter set up - * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator - * to handle turning the value calculated by ValueAnimator into a value set on the object - * according to the name of the property. - * @param target The target object on which the value is set - */ - void setAnimatedValue(Object target) { - //if (mProperty != null) { - // mProperty.set(target, getAnimatedValue()); - //} - if (mSetter != null) { - try { - mTmpValueArray[0] = getAnimatedValue(); - mSetter.invoke(target, mTmpValueArray); - } catch (InvocationTargetException e) { - Log.e("PropertyValuesHolder", e.toString()); - } catch (IllegalAccessException e) { - Log.e("PropertyValuesHolder", e.toString()); - } - } - } - - /** - * Internal function, called by ValueAnimator, to set up the TypeEvaluator that will be used - * to calculate animated values. - */ - void init() { - if (mEvaluator == null) { - // We already handle int and float automatically, but not their Object - // equivalents - mEvaluator = (mValueType == Integer.class) ? sIntEvaluator : - (mValueType == Float.class) ? sFloatEvaluator : - null; - } - if (mEvaluator != null) { - // KeyframeSet knows how to evaluate the common types - only give it a custom - // evaluator if one has been set on this class - mKeyframeSet.setEvaluator(mEvaluator); - } - } - - /** - * The TypeEvaluator will the automatically determined based on the type of values - * supplied to PropertyValuesHolder. The evaluator can be manually set, however, if so - * desired. This may be important in cases where either the type of the values supplied - * do not match the way that they should be interpolated between, or if the values - * are of a custom type or one not currently understood by the animation system. Currently, - * only values of type float and int (and their Object equivalents: Float - * and Integer) are correctly interpolated; all other types require setting a TypeEvaluator. - * @param evaluator - */ - public void setEvaluator(TypeEvaluator evaluator) { - mEvaluator = evaluator; - mKeyframeSet.setEvaluator(evaluator); - } - - /** - * Function used to calculate the value according to the evaluator set up for - * this PropertyValuesHolder object. This function is called by ValueAnimator.animateValue(). - * - * @param fraction The elapsed, interpolated fraction of the animation. - */ - void calculateValue(float fraction) { - mAnimatedValue = mKeyframeSet.getValue(fraction); - } - - /** - * Sets the name of the property that will be animated. This name is used to derive - * a setter function that will be called to set animated values. - * For example, a property name of foo will result - * in a call to the function setFoo() on the target object. If either - * valueFrom or valueTo is null, then a getter function will - * also be derived and called. - * - *

Note that the setter function derived from this property name - * must take the same parameter type as the - * valueFrom and valueTo properties, otherwise the call to - * the setter function will fail.

- * - * @param propertyName The name of the property being animated. - */ - public void setPropertyName(String propertyName) { - mPropertyName = propertyName; - } - - /** - * Sets the property that will be animated. - * - *

Note that if this PropertyValuesHolder object is used with ObjectAnimator, the property - * must exist on the target object specified in that ObjectAnimator.

- * - * @param property The property being animated. - */ - //public void setProperty(Property property) { - // mProperty = property; - //} - - /** - * Gets the name of the property that will be animated. This name will be used to derive - * a setter function that will be called to set animated values. - * For example, a property name of foo will result - * in a call to the function setFoo() on the target object. If either - * valueFrom or valueTo is null, then a getter function will - * also be derived and called. - */ - public String getPropertyName() { - return mPropertyName; - } - - /** - * Internal function, called by ValueAnimator and ObjectAnimator, to retrieve the value - * most recently calculated in calculateValue(). - * @return - */ - Object getAnimatedValue() { - return mAnimatedValue; - } - - @Override - public String toString() { - return mPropertyName + ": " + mKeyframeSet.toString(); - } - - /** - * Utility method to derive a setter/getter method name from a property name, where the - * prefix is typically "set" or "get" and the first letter of the property name is - * capitalized. - * - * @param prefix The precursor to the method name, before the property name begins, typically - * "set" or "get". - * @param propertyName The name of the property that represents the bulk of the method name - * after the prefix. The first letter of this word will be capitalized in the resulting - * method name. - * @return String the property name converted to a method name according to the conventions - * specified above. - */ - static String getMethodName(String prefix, String propertyName) { - if (propertyName == null || propertyName.length() == 0) { - // shouldn't get here - return prefix; - } - char firstLetter = Character.toUpperCase(propertyName.charAt(0)); - String theRest = propertyName.substring(1); - return prefix + firstLetter + theRest; - } - - static class IntPropertyValuesHolder extends PropertyValuesHolder { - - // Cache JNI functions to avoid looking them up twice - //private static final HashMap> sJNISetterPropertyMap = - // new HashMap>(); - //int mJniSetter; - //private IntProperty mIntProperty; - - IntKeyframeSet mIntKeyframeSet; - int mIntAnimatedValue; - - public IntPropertyValuesHolder(String propertyName, IntKeyframeSet keyframeSet) { - super(propertyName); - mValueType = int.class; - mKeyframeSet = keyframeSet; - mIntKeyframeSet = (IntKeyframeSet) mKeyframeSet; - } - - //public IntPropertyValuesHolder(Property property, IntKeyframeSet keyframeSet) { - // super(property); - // mValueType = int.class; - // mKeyframeSet = keyframeSet; - // mIntKeyframeSet = (IntKeyframeSet) mKeyframeSet; - // if (property instanceof IntProperty) { - // mIntProperty = (IntProperty) mProperty; - // } - //} - - public IntPropertyValuesHolder(String propertyName, int... values) { - super(propertyName); - setIntValues(values); - } - - //public IntPropertyValuesHolder(Property property, int... values) { - // super(property); - // setIntValues(values); - // if (property instanceof IntProperty) { - // mIntProperty = (IntProperty) mProperty; - // } - //} - - @Override - public void setIntValues(int... values) { - super.setIntValues(values); - mIntKeyframeSet = (IntKeyframeSet) mKeyframeSet; - } - - @Override - void calculateValue(float fraction) { - mIntAnimatedValue = mIntKeyframeSet.getIntValue(fraction); - } - - @Override - Object getAnimatedValue() { - return mIntAnimatedValue; - } - - @Override - public IntPropertyValuesHolder clone() { - IntPropertyValuesHolder newPVH = (IntPropertyValuesHolder) super.clone(); - newPVH.mIntKeyframeSet = (IntKeyframeSet) newPVH.mKeyframeSet; - return newPVH; - } - - /** - * Internal function to set the value on the target object, using the setter set up - * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator - * to handle turning the value calculated by ValueAnimator into a value set on the object - * according to the name of the property. - * @param target The target object on which the value is set - */ - @Override - void setAnimatedValue(Object target) { - //if (mIntProperty != null) { - // mIntProperty.setValue(target, mIntAnimatedValue); - // return; - //} - //if (mProperty != null) { - // mProperty.set(target, mIntAnimatedValue); - // return; - //} - //if (mJniSetter != 0) { - // nCallIntMethod(target, mJniSetter, mIntAnimatedValue); - // return; - //} - if (mSetter != null) { - try { - mTmpValueArray[0] = mIntAnimatedValue; - mSetter.invoke(target, mTmpValueArray); - } catch (InvocationTargetException e) { - Log.e("PropertyValuesHolder", e.toString()); - } catch (IllegalAccessException e) { - Log.e("PropertyValuesHolder", e.toString()); - } - } - } - - @Override - void setupSetter(Class targetClass) { - //if (mProperty != null) { - // return; - //} - // Check new static hashmap for setter method - //try { - // mPropertyMapLock.writeLock().lock(); - // HashMap propertyMap = sJNISetterPropertyMap.get(targetClass); - // if (propertyMap != null) { - // Integer mJniSetterInteger = propertyMap.get(mPropertyName); - // if (mJniSetterInteger != null) { - // mJniSetter = mJniSetterInteger; - // } - // } - // if (mJniSetter == 0) { - // String methodName = getMethodName("set", mPropertyName); - // mJniSetter = nGetIntMethod(targetClass, methodName); - // if (mJniSetter != 0) { - // if (propertyMap == null) { - // propertyMap = new HashMap(); - // sJNISetterPropertyMap.put(targetClass, propertyMap); - // } - // propertyMap.put(mPropertyName, mJniSetter); - // } - // } - //} catch (NoSuchMethodError e) { - // Log.d("PropertyValuesHolder", - // "Can't find native method using JNI, use reflection" + e); - //} finally { - // mPropertyMapLock.writeLock().unlock(); - //} - //if (mJniSetter == 0) { - // Couldn't find method through fast JNI approach - just use reflection - super.setupSetter(targetClass); - //} - } - } - - static class FloatPropertyValuesHolder extends PropertyValuesHolder { - - // Cache JNI functions to avoid looking them up twice - //private static final HashMap> sJNISetterPropertyMap = - // new HashMap>(); - //int mJniSetter; - //private FloatProperty mFloatProperty; - - FloatKeyframeSet mFloatKeyframeSet; - float mFloatAnimatedValue; - - public FloatPropertyValuesHolder(String propertyName, FloatKeyframeSet keyframeSet) { - super(propertyName); - mValueType = float.class; - mKeyframeSet = keyframeSet; - mFloatKeyframeSet = (FloatKeyframeSet) mKeyframeSet; - } - - //public FloatPropertyValuesHolder(Property property, FloatKeyframeSet keyframeSet) { - // super(property); - // mValueType = float.class; - // mKeyframeSet = keyframeSet; - // mFloatKeyframeSet = (FloatKeyframeSet) mKeyframeSet; - // if (property instanceof FloatProperty) { - // mFloatProperty = (FloatProperty) mProperty; - // } - //} - - public FloatPropertyValuesHolder(String propertyName, float... values) { - super(propertyName); - setFloatValues(values); - } - - //public FloatPropertyValuesHolder(Property property, float... values) { - // super(property); - // setFloatValues(values); - // if (property instanceof FloatProperty) { - // mFloatProperty = (FloatProperty) mProperty; - // } - //} - - @Override - public void setFloatValues(float... values) { - super.setFloatValues(values); - mFloatKeyframeSet = (FloatKeyframeSet) mKeyframeSet; - } - - @Override - void calculateValue(float fraction) { - mFloatAnimatedValue = mFloatKeyframeSet.getFloatValue(fraction); - } - - @Override - Object getAnimatedValue() { - return mFloatAnimatedValue; - } - - @Override - public FloatPropertyValuesHolder clone() { - FloatPropertyValuesHolder newPVH = (FloatPropertyValuesHolder) super.clone(); - newPVH.mFloatKeyframeSet = (FloatKeyframeSet) newPVH.mKeyframeSet; - return newPVH; - } - - /** - * Internal function to set the value on the target object, using the setter set up - * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator - * to handle turning the value calculated by ValueAnimator into a value set on the object - * according to the name of the property. - * @param target The target object on which the value is set - */ - @Override - void setAnimatedValue(Object target) { - //if (mFloatProperty != null) { - // mFloatProperty.setValue(target, mFloatAnimatedValue); - // return; - //} - //if (mProperty != null) { - // mProperty.set(target, mFloatAnimatedValue); - // return; - //} - //if (mJniSetter != 0) { - // nCallFloatMethod(target, mJniSetter, mFloatAnimatedValue); - // return; - //} - if (mSetter != null) { - try { - mTmpValueArray[0] = mFloatAnimatedValue; - mSetter.invoke(target, mTmpValueArray); - } catch (InvocationTargetException e) { - Log.e("PropertyValuesHolder", e.toString()); - } catch (IllegalAccessException e) { - Log.e("PropertyValuesHolder", e.toString()); - } - } - } - - @Override - void setupSetter(Class targetClass) { - //if (mProperty != null) { - // return; - //} - // Check new static hashmap for setter method - //try { - // mPropertyMapLock.writeLock().lock(); - // HashMap propertyMap = sJNISetterPropertyMap.get(targetClass); - // if (propertyMap != null) { - // Integer mJniSetterInteger = propertyMap.get(mPropertyName); - // if (mJniSetterInteger != null) { - // mJniSetter = mJniSetterInteger; - // } - // } - // if (mJniSetter == 0) { - // String methodName = getMethodName("set", mPropertyName); - // mJniSetter = nGetFloatMethod(targetClass, methodName); - // if (mJniSetter != 0) { - // if (propertyMap == null) { - // propertyMap = new HashMap(); - // sJNISetterPropertyMap.put(targetClass, propertyMap); - // } - // propertyMap.put(mPropertyName, mJniSetter); - // } - // } - //} catch (NoSuchMethodError e) { - // Log.d("PropertyValuesHolder", - // "Can't find native method using JNI, use reflection" + e); - //} finally { - // mPropertyMapLock.writeLock().unlock(); - //} - //if (mJniSetter == 0) { - // Couldn't find method through fast JNI approach - just use reflection - super.setupSetter(targetClass); - //} - } - - } - - //native static private int nGetIntMethod(Class targetClass, String methodName); - //native static private int nGetFloatMethod(Class targetClass, String methodName); - //native static private void nCallIntMethod(Object target, int methodID, int arg); - //native static private void nCallFloatMethod(Object target, int methodID, float arg); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java deleted file mode 100644 index 0ea319244..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -/** - * Interface for use with the {@link ValueAnimator#setEvaluator(TypeEvaluator)} function. Evaluators - * allow developers to create animations on arbitrary property types, by allowing them to supply - * custom evaulators for types that are not automatically understood and used by the animation - * system. - * - * @see ValueAnimator#setEvaluator(TypeEvaluator) - */ -public interface TypeEvaluator { - - /** - * This function returns the result of linearly interpolating the start and end values, with - * fraction representing the proportion between the start and end values. The - * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), - * where x0 is startValue, x1 is endValue, - * and t is fraction. - * - * @param fraction The fraction from the starting to the ending values - * @param startValue The start value. - * @param endValue The end value. - * @return A linear interpolation between the start and end values, given the - * fraction parameter. - */ - public T evaluate(float fraction, T startValue, T endValue); - -} \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java deleted file mode 100644 index d8a12c688..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java +++ /dev/null @@ -1,1265 +0,0 @@ -/* - * Copyright (C) 2010 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.nineoldandroids.animation; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.AndroidRuntimeException; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - * This class provides a simple timing engine for running animations - * which calculate animated values and set them on target objects. - * - *

There is a single timing pulse that all animations use. It runs in a - * custom handler to ensure that property changes happen on the UI thread.

- * - *

By default, ValueAnimator uses non-linear time interpolation, via the - * {@link AccelerateDecelerateInterpolator} class, which accelerates into and decelerates - * out of an animation. This behavior can be changed by calling - * {@link ValueAnimator#setInterpolator(TimeInterpolator)}.

- */ -@SuppressWarnings({"rawtypes", "unchecked"}) -public class ValueAnimator extends Animator { - - /** - * Internal constants - */ - - /* - * The default amount of time in ms between animation frames - */ - private static final long DEFAULT_FRAME_DELAY = 10; - - /** - * Messages sent to timing handler: START is sent when an animation first begins, FRAME is sent - * by the handler to itself to process the next animation frame - */ - static final int ANIMATION_START = 0; - static final int ANIMATION_FRAME = 1; - - /** - * Values used with internal variable mPlayingState to indicate the current state of an - * animation. - */ - static final int STOPPED = 0; // Not yet playing - static final int RUNNING = 1; // Playing normally - static final int SEEKED = 2; // Seeked to some time value - - /** - * Internal variables - * NOTE: This object implements the clone() method, making a deep copy of any referenced - * objects. As other non-trivial fields are added to this class, make sure to add logic - * to clone() to make deep copies of them. - */ - - // The first time that the animation's animateFrame() method is called. This time is used to - // determine elapsed time (and therefore the elapsed fraction) in subsequent calls - // to animateFrame() - long mStartTime; - - /** - * Set when setCurrentPlayTime() is called. If negative, animation is not currently seeked - * to a value. - */ - long mSeekTime = -1; - - // TODO: We access the following ThreadLocal variables often, some of them on every update. - // If ThreadLocal access is significantly expensive, we may want to put all of these - // fields into a structure sot hat we just access ThreadLocal once to get the reference - // to that structure, then access the structure directly for each field. - - // The static sAnimationHandler processes the internal timing loop on which all animations - // are based - private static ThreadLocal sAnimationHandler = - new ThreadLocal(); - - // The per-thread list of all active animations - private static final ThreadLocal> sAnimations = - new ThreadLocal>() { - @Override - protected ArrayList initialValue() { - return new ArrayList(); - } - }; - - // The per-thread set of animations to be started on the next animation frame - private static final ThreadLocal> sPendingAnimations = - new ThreadLocal>() { - @Override - protected ArrayList initialValue() { - return new ArrayList(); - } - }; - - /** - * Internal per-thread collections used to avoid set collisions as animations start and end - * while being processed. - */ - private static final ThreadLocal> sDelayedAnims = - new ThreadLocal>() { - @Override - protected ArrayList initialValue() { - return new ArrayList(); - } - }; - - private static final ThreadLocal> sEndingAnims = - new ThreadLocal>() { - @Override - protected ArrayList initialValue() { - return new ArrayList(); - } - }; - - private static final ThreadLocal> sReadyAnims = - new ThreadLocal>() { - @Override - protected ArrayList initialValue() { - return new ArrayList(); - } - }; - - // The time interpolator to be used if none is set on the animation - private static final /*Time*/Interpolator sDefaultInterpolator = - new AccelerateDecelerateInterpolator(); - - // type evaluators for the primitive types handled by this implementation - //private static final TypeEvaluator sIntEvaluator = new IntEvaluator(); - //private static final TypeEvaluator sFloatEvaluator = new FloatEvaluator(); - - /** - * Used to indicate whether the animation is currently playing in reverse. This causes the - * elapsed fraction to be inverted to calculate the appropriate values. - */ - private boolean mPlayingBackwards = false; - - /** - * This variable tracks the current iteration that is playing. When mCurrentIteration exceeds the - * repeatCount (if repeatCount!=INFINITE), the animation ends - */ - private int mCurrentIteration = 0; - - /** - * Tracks current elapsed/eased fraction, for querying in getAnimatedFraction(). - */ - private float mCurrentFraction = 0f; - - /** - * Tracks whether a startDelay'd animation has begun playing through the startDelay. - */ - private boolean mStartedDelay = false; - - /** - * Tracks the time at which the animation began playing through its startDelay. This is - * different from the mStartTime variable, which is used to track when the animation became - * active (which is when the startDelay expired and the animation was added to the active - * animations list). - */ - private long mDelayStartTime; - - /** - * Flag that represents the current state of the animation. Used to figure out when to start - * an animation (if state == STOPPED). Also used to end an animation that - * has been cancel()'d or end()'d since the last animation frame. Possible values are - * STOPPED, RUNNING, SEEKED. - */ - int mPlayingState = STOPPED; - - /** - * Additional playing state to indicate whether an animator has been start()'d. There is - * some lag between a call to start() and the first animation frame. We should still note - * that the animation has been started, even if it's first animation frame has not yet - * happened, and reflect that state in isRunning(). - * Note that delayed animations are different: they are not started until their first - * animation frame, which occurs after their delay elapses. - */ - private boolean mRunning = false; - - /** - * Additional playing state to indicate whether an animator has been start()'d, whether or - * not there is a nonzero startDelay. - */ - private boolean mStarted = false; - - /** - * Flag that denotes whether the animation is set up and ready to go. Used to - * set up animation that has not yet been started. - */ - boolean mInitialized = false; - - // - // Backing variables - // - - // How long the animation should last in ms - private long mDuration = 300; - - // The amount of time in ms to delay starting the animation after start() is called - private long mStartDelay = 0; - - // The number of milliseconds between animation frames - private static long sFrameDelay = DEFAULT_FRAME_DELAY; - - // The number of times the animation will repeat. The default is 0, which means the animation - // will play only once - private int mRepeatCount = 0; - - /** - * The type of repetition that will occur when repeatMode is nonzero. RESTART means the - * animation will start from the beginning on every new cycle. REVERSE means the animation - * will reverse directions on each iteration. - */ - private int mRepeatMode = RESTART; - - /** - * The time interpolator to be used. The elapsed fraction of the animation will be passed - * through this interpolator to calculate the interpolated fraction, which is then used to - * calculate the animated values. - */ - private /*Time*/Interpolator mInterpolator = sDefaultInterpolator; - - /** - * The set of listeners to be sent events through the life of an animation. - */ - private ArrayList mUpdateListeners = null; - - /** - * The property/value sets being animated. - */ - PropertyValuesHolder[] mValues; - - /** - * A hashmap of the PropertyValuesHolder objects. This map is used to lookup animated values - * by property name during calls to getAnimatedValue(String). - */ - HashMap mValuesMap; - - /** - * Public constants - */ - - /** - * When the animation reaches the end and repeatCount is INFINITE - * or a positive value, the animation restarts from the beginning. - */ - public static final int RESTART = 1; - /** - * When the animation reaches the end and repeatCount is INFINITE - * or a positive value, the animation reverses direction on every iteration. - */ - public static final int REVERSE = 2; - /** - * This value used used with the {@link #setRepeatCount(int)} property to repeat - * the animation indefinitely. - */ - public static final int INFINITE = -1; - - /** - * Creates a new ValueAnimator object. This default constructor is primarily for - * use internally; the factory methods which take parameters are more generally - * useful. - */ - public ValueAnimator() { - } - - /** - * Constructs and returns a ValueAnimator that animates between int values. A single - * value implies that that value is the one being animated to. However, this is not typically - * useful in a ValueAnimator object because there is no way for the object to determine the - * starting value for the animation (unlike ObjectAnimator, which can derive that value - * from the target object and property being animated). Therefore, there should typically - * be two or more values. - * - * @param values A set of values that the animation will animate between over time. - * @return A ValueAnimator object that is set up to animate between the given values. - */ - public static ValueAnimator ofInt(int... values) { - ValueAnimator anim = new ValueAnimator(); - anim.setIntValues(values); - return anim; - } - - /** - * Constructs and returns a ValueAnimator that animates between float values. A single - * value implies that that value is the one being animated to. However, this is not typically - * useful in a ValueAnimator object because there is no way for the object to determine the - * starting value for the animation (unlike ObjectAnimator, which can derive that value - * from the target object and property being animated). Therefore, there should typically - * be two or more values. - * - * @param values A set of values that the animation will animate between over time. - * @return A ValueAnimator object that is set up to animate between the given values. - */ - public static ValueAnimator ofFloat(float... values) { - ValueAnimator anim = new ValueAnimator(); - anim.setFloatValues(values); - return anim; - } - - /** - * Constructs and returns a ValueAnimator that animates between the values - * specified in the PropertyValuesHolder objects. - * - * @param values A set of PropertyValuesHolder objects whose values will be animated - * between over time. - * @return A ValueAnimator object that is set up to animate between the given values. - */ - public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values) { - ValueAnimator anim = new ValueAnimator(); - anim.setValues(values); - return anim; - } - /** - * Constructs and returns a ValueAnimator that animates between Object values. A single - * value implies that that value is the one being animated to. However, this is not typically - * useful in a ValueAnimator object because there is no way for the object to determine the - * starting value for the animation (unlike ObjectAnimator, which can derive that value - * from the target object and property being animated). Therefore, there should typically - * be two or more values. - * - *

Since ValueAnimator does not know how to animate between arbitrary Objects, this - * factory method also takes a TypeEvaluator object that the ValueAnimator will use - * to perform that interpolation. - * - * @param evaluator A TypeEvaluator that will be called on each animation frame to - * provide the ncessry interpolation between the Object values to derive the animated - * value. - * @param values A set of values that the animation will animate between over time. - * @return A ValueAnimator object that is set up to animate between the given values. - */ - public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) { - ValueAnimator anim = new ValueAnimator(); - anim.setObjectValues(values); - anim.setEvaluator(evaluator); - return anim; - } - - /** - * Sets int values that will be animated between. A single - * value implies that that value is the one being animated to. However, this is not typically - * useful in a ValueAnimator object because there is no way for the object to determine the - * starting value for the animation (unlike ObjectAnimator, which can derive that value - * from the target object and property being animated). Therefore, there should typically - * be two or more values. - * - *

If there are already multiple sets of values defined for this ValueAnimator via more - * than one PropertyValuesHolder object, this method will set the values for the first - * of those objects.

- * - * @param values A set of values that the animation will animate between over time. - */ - public void setIntValues(int... values) { - if (values == null || values.length == 0) { - return; - } - if (mValues == null || mValues.length == 0) { - setValues(new PropertyValuesHolder[]{PropertyValuesHolder.ofInt("", values)}); - } else { - PropertyValuesHolder valuesHolder = mValues[0]; - valuesHolder.setIntValues(values); - } - // New property/values/target should cause re-initialization prior to starting - mInitialized = false; - } - - /** - * Sets float values that will be animated between. A single - * value implies that that value is the one being animated to. However, this is not typically - * useful in a ValueAnimator object because there is no way for the object to determine the - * starting value for the animation (unlike ObjectAnimator, which can derive that value - * from the target object and property being animated). Therefore, there should typically - * be two or more values. - * - *

If there are already multiple sets of values defined for this ValueAnimator via more - * than one PropertyValuesHolder object, this method will set the values for the first - * of those objects.

- * - * @param values A set of values that the animation will animate between over time. - */ - public void setFloatValues(float... values) { - if (values == null || values.length == 0) { - return; - } - if (mValues == null || mValues.length == 0) { - setValues(new PropertyValuesHolder[]{PropertyValuesHolder.ofFloat("", values)}); - } else { - PropertyValuesHolder valuesHolder = mValues[0]; - valuesHolder.setFloatValues(values); - } - // New property/values/target should cause re-initialization prior to starting - mInitialized = false; - } - - /** - * Sets the values to animate between for this animation. A single - * value implies that that value is the one being animated to. However, this is not typically - * useful in a ValueAnimator object because there is no way for the object to determine the - * starting value for the animation (unlike ObjectAnimator, which can derive that value - * from the target object and property being animated). Therefore, there should typically - * be two or more values. - * - *

If there are already multiple sets of values defined for this ValueAnimator via more - * than one PropertyValuesHolder object, this method will set the values for the first - * of those objects.

- * - *

There should be a TypeEvaluator set on the ValueAnimator that knows how to interpolate - * between these value objects. ValueAnimator only knows how to interpolate between the - * primitive types specified in the other setValues() methods.

- * - * @param values The set of values to animate between. - */ - public void setObjectValues(Object... values) { - if (values == null || values.length == 0) { - return; - } - if (mValues == null || mValues.length == 0) { - setValues(new PropertyValuesHolder[]{PropertyValuesHolder.ofObject("", - (TypeEvaluator)null, values)}); - } else { - PropertyValuesHolder valuesHolder = mValues[0]; - valuesHolder.setObjectValues(values); - } - // New property/values/target should cause re-initialization prior to starting - mInitialized = false; - } - - /** - * Sets the values, per property, being animated between. This function is called internally - * by the constructors of ValueAnimator that take a list of values. But an ValueAnimator can - * be constructed without values and this method can be called to set the values manually - * instead. - * - * @param values The set of values, per property, being animated between. - */ - public void setValues(PropertyValuesHolder... values) { - int numValues = values.length; - mValues = values; - mValuesMap = new HashMap(numValues); - for (int i = 0; i < numValues; ++i) { - PropertyValuesHolder valuesHolder = values[i]; - mValuesMap.put(valuesHolder.getPropertyName(), valuesHolder); - } - // New property/values/target should cause re-initialization prior to starting - mInitialized = false; - } - - /** - * Returns the values that this ValueAnimator animates between. These values are stored in - * PropertyValuesHolder objects, even if the ValueAnimator was created with a simple list - * of value objects instead. - * - * @return PropertyValuesHolder[] An array of PropertyValuesHolder objects which hold the - * values, per property, that define the animation. - */ - public PropertyValuesHolder[] getValues() { - return mValues; - } - - /** - * This function is called immediately before processing the first animation - * frame of an animation. If there is a nonzero startDelay, the - * function is called after that delay ends. - * It takes care of the final initialization steps for the - * animation. - * - *

Overrides of this method should call the superclass method to ensure - * that internal mechanisms for the animation are set up correctly.

- */ - void initAnimation() { - if (!mInitialized) { - int numValues = mValues.length; - for (int i = 0; i < numValues; ++i) { - mValues[i].init(); - } - mInitialized = true; - } - } - - - /** - * Sets the length of the animation. The default duration is 300 milliseconds. - * - * @param duration The length of the animation, in milliseconds. This value cannot - * be negative. - * @return ValueAnimator The object called with setDuration(). This return - * value makes it easier to compose statements together that construct and then set the - * duration, as in ValueAnimator.ofInt(0, 10).setDuration(500).start(). - */ - public ValueAnimator setDuration(long duration) { - if (duration < 0) { - throw new IllegalArgumentException("Animators cannot have negative duration: " + - duration); - } - mDuration = duration; - return this; - } - - /** - * Gets the length of the animation. The default duration is 300 milliseconds. - * - * @return The length of the animation, in milliseconds. - */ - public long getDuration() { - return mDuration; - } - - /** - * Sets the position of the animation to the specified point in time. This time should - * be between 0 and the total duration of the animation, including any repetition. If - * the animation has not yet been started, then it will not advance forward after it is - * set to this time; it will simply set the time to this value and perform any appropriate - * actions based on that time. If the animation is already running, then setCurrentPlayTime() - * will set the current playing time to this value and continue playing from that point. - * - * @param playTime The time, in milliseconds, to which the animation is advanced or rewound. - */ - public void setCurrentPlayTime(long playTime) { - initAnimation(); - long currentTime = AnimationUtils.currentAnimationTimeMillis(); - if (mPlayingState != RUNNING) { - mSeekTime = playTime; - mPlayingState = SEEKED; - } - mStartTime = currentTime - playTime; - animationFrame(currentTime); - } - - /** - * Gets the current position of the animation in time, which is equal to the current - * time minus the time that the animation started. An animation that is not yet started will - * return a value of zero. - * - * @return The current position in time of the animation. - */ - public long getCurrentPlayTime() { - if (!mInitialized || mPlayingState == STOPPED) { - return 0; - } - return AnimationUtils.currentAnimationTimeMillis() - mStartTime; - } - - /** - * This custom, static handler handles the timing pulse that is shared by - * all active animations. This approach ensures that the setting of animation - * values will happen on the UI thread and that all animations will share - * the same times for calculating their values, which makes synchronizing - * animations possible. - * - */ - private static class AnimationHandler extends Handler { - /** - * There are only two messages that we care about: ANIMATION_START and - * ANIMATION_FRAME. The START message is sent when an animation's start() - * method is called. It cannot start synchronously when start() is called - * because the call may be on the wrong thread, and it would also not be - * synchronized with other animations because it would not start on a common - * timing pulse. So each animation sends a START message to the handler, which - * causes the handler to place the animation on the active animations queue and - * start processing frames for that animation. - * The FRAME message is the one that is sent over and over while there are any - * active animations to process. - */ - @Override - public void handleMessage(Message msg) { - boolean callAgain = true; - ArrayList animations = sAnimations.get(); - ArrayList delayedAnims = sDelayedAnims.get(); - switch (msg.what) { - // TODO: should we avoid sending frame message when starting if we - // were already running? - case ANIMATION_START: - ArrayList pendingAnimations = sPendingAnimations.get(); - if (animations.size() > 0 || delayedAnims.size() > 0) { - callAgain = false; - } - // pendingAnims holds any animations that have requested to be started - // We're going to clear sPendingAnimations, but starting animation may - // cause more to be added to the pending list (for example, if one animation - // starting triggers another starting). So we loop until sPendingAnimations - // is empty. - while (pendingAnimations.size() > 0) { - ArrayList pendingCopy = - (ArrayList) pendingAnimations.clone(); - pendingAnimations.clear(); - int count = pendingCopy.size(); - for (int i = 0; i < count; ++i) { - ValueAnimator anim = pendingCopy.get(i); - // If the animation has a startDelay, place it on the delayed list - if (anim.mStartDelay == 0) { - anim.startAnimation(); - } else { - delayedAnims.add(anim); - } - } - } - // fall through to process first frame of new animations - case ANIMATION_FRAME: - // currentTime holds the common time for all animations processed - // during this frame - long currentTime = AnimationUtils.currentAnimationTimeMillis(); - ArrayList readyAnims = sReadyAnims.get(); - ArrayList endingAnims = sEndingAnims.get(); - - // First, process animations currently sitting on the delayed queue, adding - // them to the active animations if they are ready - int numDelayedAnims = delayedAnims.size(); - for (int i = 0; i < numDelayedAnims; ++i) { - ValueAnimator anim = delayedAnims.get(i); - if (anim.delayedAnimationFrame(currentTime)) { - readyAnims.add(anim); - } - } - int numReadyAnims = readyAnims.size(); - if (numReadyAnims > 0) { - for (int i = 0; i < numReadyAnims; ++i) { - ValueAnimator anim = readyAnims.get(i); - anim.startAnimation(); - anim.mRunning = true; - delayedAnims.remove(anim); - } - readyAnims.clear(); - } - - // Now process all active animations. The return value from animationFrame() - // tells the handler whether it should now be ended - int numAnims = animations.size(); - int i = 0; - while (i < numAnims) { - ValueAnimator anim = animations.get(i); - if (anim.animationFrame(currentTime)) { - endingAnims.add(anim); - } - if (animations.size() == numAnims) { - ++i; - } else { - // An animation might be canceled or ended by client code - // during the animation frame. Check to see if this happened by - // seeing whether the current index is the same as it was before - // calling animationFrame(). Another approach would be to copy - // animations to a temporary list and process that list instead, - // but that entails garbage and processing overhead that would - // be nice to avoid. - --numAnims; - endingAnims.remove(anim); - } - } - if (endingAnims.size() > 0) { - for (i = 0; i < endingAnims.size(); ++i) { - endingAnims.get(i).endAnimation(); - } - endingAnims.clear(); - } - - // If there are still active or delayed animations, call the handler again - // after the frameDelay - if (callAgain && (!animations.isEmpty() || !delayedAnims.isEmpty())) { - sendEmptyMessageDelayed(ANIMATION_FRAME, Math.max(0, sFrameDelay - - (AnimationUtils.currentAnimationTimeMillis() - currentTime))); - } - break; - } - } - } - - /** - * The amount of time, in milliseconds, to delay starting the animation after - * {@link #start()} is called. - * - * @return the number of milliseconds to delay running the animation - */ - public long getStartDelay() { - return mStartDelay; - } - - /** - * The amount of time, in milliseconds, to delay starting the animation after - * {@link #start()} is called. - - * @param startDelay The amount of the delay, in milliseconds - */ - public void setStartDelay(long startDelay) { - this.mStartDelay = startDelay; - } - - /** - * The amount of time, in milliseconds, between each frame of the animation. This is a - * requested time that the animation will attempt to honor, but the actual delay between - * frames may be different, depending on system load and capabilities. This is a static - * function because the same delay will be applied to all animations, since they are all - * run off of a single timing loop. - * - * @return the requested time between frames, in milliseconds - */ - public static long getFrameDelay() { - return sFrameDelay; - } - - /** - * The amount of time, in milliseconds, between each frame of the animation. This is a - * requested time that the animation will attempt to honor, but the actual delay between - * frames may be different, depending on system load and capabilities. This is a static - * function because the same delay will be applied to all animations, since they are all - * run off of a single timing loop. - * - * @param frameDelay the requested time between frames, in milliseconds - */ - public static void setFrameDelay(long frameDelay) { - sFrameDelay = frameDelay; - } - - /** - * The most recent value calculated by this ValueAnimator when there is just one - * property being animated. This value is only sensible while the animation is running. The main - * purpose for this read-only property is to retrieve the value from the ValueAnimator - * during a call to {@link AnimatorUpdateListener#onAnimationUpdate(ValueAnimator)}, which - * is called during each animation frame, immediately after the value is calculated. - * - * @return animatedValue The value most recently calculated by this ValueAnimator for - * the single property being animated. If there are several properties being animated - * (specified by several PropertyValuesHolder objects in the constructor), this function - * returns the animated value for the first of those objects. - */ - public Object getAnimatedValue() { - if (mValues != null && mValues.length > 0) { - return mValues[0].getAnimatedValue(); - } - // Shouldn't get here; should always have values unless ValueAnimator was set up wrong - return null; - } - - /** - * The most recent value calculated by this ValueAnimator for propertyName. - * The main purpose for this read-only property is to retrieve the value from the - * ValueAnimator during a call to - * {@link AnimatorUpdateListener#onAnimationUpdate(ValueAnimator)}, which - * is called during each animation frame, immediately after the value is calculated. - * - * @return animatedValue The value most recently calculated for the named property - * by this ValueAnimator. - */ - public Object getAnimatedValue(String propertyName) { - PropertyValuesHolder valuesHolder = mValuesMap.get(propertyName); - if (valuesHolder != null) { - return valuesHolder.getAnimatedValue(); - } else { - // At least avoid crashing if called with bogus propertyName - return null; - } - } - - /** - * Sets how many times the animation should be repeated. If the repeat - * count is 0, the animation is never repeated. If the repeat count is - * greater than 0 or {@link #INFINITE}, the repeat mode will be taken - * into account. The repeat count is 0 by default. - * - * @param value the number of times the animation should be repeated - */ - public void setRepeatCount(int value) { - mRepeatCount = value; - } - /** - * Defines how many times the animation should repeat. The default value - * is 0. - * - * @return the number of times the animation should repeat, or {@link #INFINITE} - */ - public int getRepeatCount() { - return mRepeatCount; - } - - /** - * Defines what this animation should do when it reaches the end. This - * setting is applied only when the repeat count is either greater than - * 0 or {@link #INFINITE}. Defaults to {@link #RESTART}. - * - * @param value {@link #RESTART} or {@link #REVERSE} - */ - public void setRepeatMode(int value) { - mRepeatMode = value; - } - - /** - * Defines what this animation should do when it reaches the end. - * - * @return either one of {@link #REVERSE} or {@link #RESTART} - */ - public int getRepeatMode() { - return mRepeatMode; - } - - /** - * Adds a listener to the set of listeners that are sent update events through the life of - * an animation. This method is called on all listeners for every frame of the animation, - * after the values for the animation have been calculated. - * - * @param listener the listener to be added to the current set of listeners for this animation. - */ - public void addUpdateListener(AnimatorUpdateListener listener) { - if (mUpdateListeners == null) { - mUpdateListeners = new ArrayList(); - } - mUpdateListeners.add(listener); - } - - /** - * Removes all listeners from the set listening to frame updates for this animation. - */ - public void removeAllUpdateListeners() { - if (mUpdateListeners == null) { - return; - } - mUpdateListeners.clear(); - mUpdateListeners = null; - } - - /** - * Removes a listener from the set listening to frame updates for this animation. - * - * @param listener the listener to be removed from the current set of update listeners - * for this animation. - */ - public void removeUpdateListener(AnimatorUpdateListener listener) { - if (mUpdateListeners == null) { - return; - } - mUpdateListeners.remove(listener); - if (mUpdateListeners.size() == 0) { - mUpdateListeners = null; - } - } - - - /** - * The time interpolator used in calculating the elapsed fraction of this animation. The - * interpolator determines whether the animation runs with linear or non-linear motion, - * such as acceleration and deceleration. The default value is - * {@link android.view.animation.AccelerateDecelerateInterpolator} - * - * @param value the interpolator to be used by this animation. A value of null - * will result in linear interpolation. - */ - @Override - public void setInterpolator(/*Time*/Interpolator value) { - if (value != null) { - mInterpolator = value; - } else { - mInterpolator = new LinearInterpolator(); - } - } - - /** - * Returns the timing interpolator that this ValueAnimator uses. - * - * @return The timing interpolator for this ValueAnimator. - */ - public /*Time*/Interpolator getInterpolator() { - return mInterpolator; - } - - /** - * The type evaluator to be used when calculating the animated values of this animation. - * The system will automatically assign a float or int evaluator based on the type - * of startValue and endValue in the constructor. But if these values - * are not one of these primitive types, or if different evaluation is desired (such as is - * necessary with int values that represent colors), a custom evaluator needs to be assigned. - * For example, when running an animation on color values, the {@link ArgbEvaluator} - * should be used to get correct RGB color interpolation. - * - *

If this ValueAnimator has only one set of values being animated between, this evaluator - * will be used for that set. If there are several sets of values being animated, which is - * the case if PropertyValuesHOlder objects were set on the ValueAnimator, then the evaluator - * is assigned just to the first PropertyValuesHolder object.

- * - * @param value the evaluator to be used this animation - */ - public void setEvaluator(TypeEvaluator value) { - if (value != null && mValues != null && mValues.length > 0) { - mValues[0].setEvaluator(value); - } - } - - /** - * Start the animation playing. This version of start() takes a boolean flag that indicates - * whether the animation should play in reverse. The flag is usually false, but may be set - * to true if called from the reverse() method. - * - *

The animation started by calling this method will be run on the thread that called - * this method. This thread should have a Looper on it (a runtime exception will be thrown if - * this is not the case). Also, if the animation will animate - * properties of objects in the view hierarchy, then the calling thread should be the UI - * thread for that view hierarchy.

- * - * @param playBackwards Whether the ValueAnimator should start playing in reverse. - */ - private void start(boolean playBackwards) { - if (Looper.myLooper() == null) { - throw new AndroidRuntimeException("Animators may only be run on Looper threads"); - } - mPlayingBackwards = playBackwards; - mCurrentIteration = 0; - mPlayingState = STOPPED; - mStarted = true; - mStartedDelay = false; - sPendingAnimations.get().add(this); - if (mStartDelay == 0) { - // This sets the initial value of the animation, prior to actually starting it running - setCurrentPlayTime(getCurrentPlayTime()); - mPlayingState = STOPPED; - mRunning = true; - - if (mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - int numListeners = tmpListeners.size(); - for (int i = 0; i < numListeners; ++i) { - tmpListeners.get(i).onAnimationStart(this); - } - } - } - AnimationHandler animationHandler = sAnimationHandler.get(); - if (animationHandler == null) { - animationHandler = new AnimationHandler(); - sAnimationHandler.set(animationHandler); - } - animationHandler.sendEmptyMessage(ANIMATION_START); - } - - @Override - public void start() { - start(false); - } - - @Override - public void cancel() { - // Only cancel if the animation is actually running or has been started and is about - // to run - if (mPlayingState != STOPPED || sPendingAnimations.get().contains(this) || - sDelayedAnims.get().contains(this)) { - // Only notify listeners if the animator has actually started - if (mRunning && mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - for (AnimatorListener listener : tmpListeners) { - listener.onAnimationCancel(this); - } - } - endAnimation(); - } - } - - @Override - public void end() { - if (!sAnimations.get().contains(this) && !sPendingAnimations.get().contains(this)) { - // Special case if the animation has not yet started; get it ready for ending - mStartedDelay = false; - startAnimation(); - } else if (!mInitialized) { - initAnimation(); - } - // The final value set on the target varies, depending on whether the animation - // was supposed to repeat an odd number of times - if (mRepeatCount > 0 && (mRepeatCount & 0x01) == 1) { - animateValue(0f); - } else { - animateValue(1f); - } - endAnimation(); - } - - @Override - public boolean isRunning() { - return (mPlayingState == RUNNING || mRunning); - } - - @Override - public boolean isStarted() { - return mStarted; - } - - /** - * Plays the ValueAnimator in reverse. If the animation is already running, - * it will stop itself and play backwards from the point reached when reverse was called. - * If the animation is not currently running, then it will start from the end and - * play backwards. This behavior is only set for the current animation; future playing - * of the animation will use the default behavior of playing forward. - */ - public void reverse() { - mPlayingBackwards = !mPlayingBackwards; - if (mPlayingState == RUNNING) { - long currentTime = AnimationUtils.currentAnimationTimeMillis(); - long currentPlayTime = currentTime - mStartTime; - long timeLeft = mDuration - currentPlayTime; - mStartTime = currentTime - timeLeft; - } else { - start(true); - } - } - - /** - * Called internally to end an animation by removing it from the animations list. Must be - * called on the UI thread. - */ - private void endAnimation() { - sAnimations.get().remove(this); - sPendingAnimations.get().remove(this); - sDelayedAnims.get().remove(this); - mPlayingState = STOPPED; - if (mRunning && mListeners != null) { - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - int numListeners = tmpListeners.size(); - for (int i = 0; i < numListeners; ++i) { - tmpListeners.get(i).onAnimationEnd(this); - } - } - mRunning = false; - mStarted = false; - } - - /** - * Called internally to start an animation by adding it to the active animations list. Must be - * called on the UI thread. - */ - private void startAnimation() { - initAnimation(); - sAnimations.get().add(this); - if (mStartDelay > 0 && mListeners != null) { - // Listeners were already notified in start() if startDelay is 0; this is - // just for delayed animations - ArrayList tmpListeners = - (ArrayList) mListeners.clone(); - int numListeners = tmpListeners.size(); - for (int i = 0; i < numListeners; ++i) { - tmpListeners.get(i).onAnimationStart(this); - } - } - } - - /** - * Internal function called to process an animation frame on an animation that is currently - * sleeping through its startDelay phase. The return value indicates whether it - * should be woken up and put on the active animations queue. - * - * @param currentTime The current animation time, used to calculate whether the animation - * has exceeded its startDelay and should be started. - * @return True if the animation's startDelay has been exceeded and the animation - * should be added to the set of active animations. - */ - private boolean delayedAnimationFrame(long currentTime) { - if (!mStartedDelay) { - mStartedDelay = true; - mDelayStartTime = currentTime; - } else { - long deltaTime = currentTime - mDelayStartTime; - if (deltaTime > mStartDelay) { - // startDelay ended - start the anim and record the - // mStartTime appropriately - mStartTime = currentTime - (deltaTime - mStartDelay); - mPlayingState = RUNNING; - return true; - } - } - return false; - } - - /** - * This internal function processes a single animation frame for a given animation. The - * currentTime parameter is the timing pulse sent by the handler, used to calculate the - * elapsed duration, and therefore - * the elapsed fraction, of the animation. The return value indicates whether the animation - * should be ended (which happens when the elapsed time of the animation exceeds the - * animation's duration, including the repeatCount). - * - * @param currentTime The current time, as tracked by the static timing handler - * @return true if the animation's duration, including any repetitions due to - * repeatCount has been exceeded and the animation should be ended. - */ - boolean animationFrame(long currentTime) { - boolean done = false; - - if (mPlayingState == STOPPED) { - mPlayingState = RUNNING; - if (mSeekTime < 0) { - mStartTime = currentTime; - } else { - mStartTime = currentTime - mSeekTime; - // Now that we're playing, reset the seek time - mSeekTime = -1; - } - } - switch (mPlayingState) { - case RUNNING: - case SEEKED: - float fraction = mDuration > 0 ? (float)(currentTime - mStartTime) / mDuration : 1f; - if (fraction >= 1f) { - if (mCurrentIteration < mRepeatCount || mRepeatCount == INFINITE) { - // Time to repeat - if (mListeners != null) { - int numListeners = mListeners.size(); - for (int i = 0; i < numListeners; ++i) { - mListeners.get(i).onAnimationRepeat(this); - } - } - if (mRepeatMode == REVERSE) { - mPlayingBackwards = mPlayingBackwards ? false : true; - } - mCurrentIteration += (int)fraction; - fraction = fraction % 1f; - mStartTime += mDuration; - } else { - done = true; - fraction = Math.min(fraction, 1.0f); - } - } - if (mPlayingBackwards) { - fraction = 1f - fraction; - } - animateValue(fraction); - break; - } - - return done; - } - - /** - * Returns the current animation fraction, which is the elapsed/interpolated fraction used in - * the most recent frame update on the animation. - * - * @return Elapsed/interpolated fraction of the animation. - */ - public float getAnimatedFraction() { - return mCurrentFraction; - } - - /** - * This method is called with the elapsed fraction of the animation during every - * animation frame. This function turns the elapsed fraction into an interpolated fraction - * and then into an animated value (from the evaluator. The function is called mostly during - * animation updates, but it is also called when the end() - * function is called, to set the final value on the property. - * - *

Overrides of this method must call the superclass to perform the calculation - * of the animated value.

- * - * @param fraction The elapsed fraction of the animation. - */ - void animateValue(float fraction) { - fraction = mInterpolator.getInterpolation(fraction); - mCurrentFraction = fraction; - int numValues = mValues.length; - for (int i = 0; i < numValues; ++i) { - mValues[i].calculateValue(fraction); - } - if (mUpdateListeners != null) { - int numListeners = mUpdateListeners.size(); - for (int i = 0; i < numListeners; ++i) { - mUpdateListeners.get(i).onAnimationUpdate(this); - } - } - } - - @Override - public ValueAnimator clone() { - final ValueAnimator anim = (ValueAnimator) super.clone(); - if (mUpdateListeners != null) { - ArrayList oldListeners = mUpdateListeners; - anim.mUpdateListeners = new ArrayList(); - int numListeners = oldListeners.size(); - for (int i = 0; i < numListeners; ++i) { - anim.mUpdateListeners.add(oldListeners.get(i)); - } - } - anim.mSeekTime = -1; - anim.mPlayingBackwards = false; - anim.mCurrentIteration = 0; - anim.mInitialized = false; - anim.mPlayingState = STOPPED; - anim.mStartedDelay = false; - PropertyValuesHolder[] oldValues = mValues; - if (oldValues != null) { - int numValues = oldValues.length; - anim.mValues = new PropertyValuesHolder[numValues]; - anim.mValuesMap = new HashMap(numValues); - for (int i = 0; i < numValues; ++i) { - PropertyValuesHolder newValuesHolder = oldValues[i].clone(); - anim.mValues[i] = newValuesHolder; - anim.mValuesMap.put(newValuesHolder.getPropertyName(), newValuesHolder); - } - } - return anim; - } - - /** - * Implementors of this interface can add themselves as update listeners - * to an ValueAnimator instance to receive callbacks on every animation - * frame, after the current frame's values have been calculated for that - * ValueAnimator. - */ - public static interface AnimatorUpdateListener { - /** - *

Notifies the occurrence of another frame of the animation.

- * - * @param animation The animation which was repeated. - */ - void onAnimationUpdate(ValueAnimator animation); - - } - - /** - * Return the number of animations currently running. - * - * Used by StrictMode internally to annotate violations. Only - * called on the main thread. - * - * @hide - */ - public static int getCurrentAnimationsCount() { - return sAnimations.get().size(); - } - - /** - * Clear all animations on this thread, without canceling or ending them. - * This should be used with caution. - * - * @hide - */ - public static void clearAllAnimations() { - sAnimations.get().clear(); - sPendingAnimations.get().clear(); - sDelayedAnims.get().clear(); - } - - @Override - public String toString() { - String returnVal = "ValueAnimator@" + Integer.toHexString(hashCode()); - if (mValues != null) { - for (int i = 0; i < mValues.length; ++i) { - returnVal += "\n " + mValues[i].toString(); - } - } - return returnVal; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java deleted file mode 100644 index 7b830b9c0..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.actionbarsherlock.internal.nineoldandroids.view; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.ViewGroup; - -import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; - -public abstract class NineViewGroup extends ViewGroup { - private final AnimatorProxy mProxy; - - public NineViewGroup(Context context) { - super(context); - mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; - } - public NineViewGroup(Context context, AttributeSet attrs) { - super(context, attrs); - mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; - } - public NineViewGroup(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; - } - - @Override - public void setVisibility(int visibility) { - if (mProxy != null) { - if (visibility == GONE) { - clearAnimation(); - } else if (visibility == VISIBLE) { - setAnimation(mProxy); - } - } - super.setVisibility(visibility); - } - - public float getAlpha() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getAlpha(); - } else { - return super.getAlpha(); - } - } - public void setAlpha(float alpha) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setAlpha(alpha); - } else { - super.setAlpha(alpha); - } - } - public float getTranslationX() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getTranslationX(); - } else { - return super.getTranslationX(); - } - } - public void setTranslationX(float translationX) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setTranslationX(translationX); - } else { - super.setTranslationX(translationX); - } - } - public float getTranslationY() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getTranslationY(); - } else { - return super.getTranslationY(); - } - } - public void setTranslationY(float translationY) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setTranslationY(translationY); - } else { - super.setTranslationY(translationY); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java deleted file mode 100644 index 067d0494e..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.actionbarsherlock.internal.nineoldandroids.view.animation; - -import java.lang.ref.WeakReference; -import java.util.WeakHashMap; -import android.graphics.Matrix; -import android.graphics.RectF; -import android.os.Build; -import android.util.FloatMath; -import android.view.View; -import android.view.animation.Animation; -import android.view.animation.Transformation; - -public final class AnimatorProxy extends Animation { - public static final boolean NEEDS_PROXY = Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB; - - private static final WeakHashMap PROXIES = - new WeakHashMap(); - - public static AnimatorProxy wrap(View view) { - AnimatorProxy proxy = PROXIES.get(view); - if (proxy == null) { - proxy = new AnimatorProxy(view); - PROXIES.put(view, proxy); - } - return proxy; - } - - private final WeakReference mView; - - private float mAlpha = 1; - private float mScaleX = 1; - private float mScaleY = 1; - private float mTranslationX; - private float mTranslationY; - - private final RectF mBefore = new RectF(); - private final RectF mAfter = new RectF(); - private final Matrix mTempMatrix = new Matrix(); - - private AnimatorProxy(View view) { - setDuration(0); //perform transformation immediately - setFillAfter(true); //persist transformation beyond duration - view.setAnimation(this); - mView = new WeakReference(view); - } - - public float getAlpha() { - return mAlpha; - } - public void setAlpha(float alpha) { - if (mAlpha != alpha) { - mAlpha = alpha; - View view = mView.get(); - if (view != null) { - view.invalidate(); - } - } - } - public float getScaleX() { - return mScaleX; - } - public void setScaleX(float scaleX) { - if (mScaleX != scaleX) { - prepareForUpdate(); - mScaleX = scaleX; - invalidateAfterUpdate(); - } - } - public float getScaleY() { - return mScaleY; - } - public void setScaleY(float scaleY) { - if (mScaleY != scaleY) { - prepareForUpdate(); - mScaleY = scaleY; - invalidateAfterUpdate(); - } - } - public int getScrollX() { - View view = mView.get(); - if (view == null) { - return 0; - } - return view.getScrollX(); - } - public void setScrollX(int value) { - View view = mView.get(); - if (view != null) { - view.scrollTo(value, view.getScrollY()); - } - } - public int getScrollY() { - View view = mView.get(); - if (view == null) { - return 0; - } - return view.getScrollY(); - } - public void setScrollY(int value) { - View view = mView.get(); - if (view != null) { - view.scrollTo(view.getScrollY(), value); - } - } - - public float getTranslationX() { - return mTranslationX; - } - public void setTranslationX(float translationX) { - if (mTranslationX != translationX) { - prepareForUpdate(); - mTranslationX = translationX; - invalidateAfterUpdate(); - } - } - public float getTranslationY() { - return mTranslationY; - } - public void setTranslationY(float translationY) { - if (mTranslationY != translationY) { - prepareForUpdate(); - mTranslationY = translationY; - invalidateAfterUpdate(); - } - } - - private void prepareForUpdate() { - View view = mView.get(); - if (view != null) { - computeRect(mBefore, view); - } - } - private void invalidateAfterUpdate() { - View view = mView.get(); - if (view == null) { - return; - } - View parent = (View)view.getParent(); - if (parent == null) { - return; - } - - view.setAnimation(this); - - final RectF after = mAfter; - computeRect(after, view); - after.union(mBefore); - - parent.invalidate( - (int) FloatMath.floor(after.left), - (int) FloatMath.floor(after.top), - (int) FloatMath.ceil(after.right), - (int) FloatMath.ceil(after.bottom)); - } - - private void computeRect(final RectF r, View view) { - // compute current rectangle according to matrix transformation - final float w = view.getWidth(); - final float h = view.getHeight(); - - // use a rectangle at 0,0 to make sure we don't run into issues with scaling - r.set(0, 0, w, h); - - final Matrix m = mTempMatrix; - m.reset(); - transformMatrix(m, view); - mTempMatrix.mapRect(r); - - r.offset(view.getLeft(), view.getTop()); - - // Straighten coords if rotations flipped them - if (r.right < r.left) { - final float f = r.right; - r.right = r.left; - r.left = f; - } - if (r.bottom < r.top) { - final float f = r.top; - r.top = r.bottom; - r.bottom = f; - } - } - - private void transformMatrix(Matrix m, View view) { - final float w = view.getWidth(); - final float h = view.getHeight(); - - final float sX = mScaleX; - final float sY = mScaleY; - if ((sX != 1.0f) || (sY != 1.0f)) { - final float deltaSX = ((sX * w) - w) / 2f; - final float deltaSY = ((sY * h) - h) / 2f; - m.postScale(sX, sY); - m.postTranslate(-deltaSX, -deltaSY); - } - m.postTranslate(mTranslationX, mTranslationY); - } - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - View view = mView.get(); - if (view != null) { - t.setAlpha(mAlpha); - transformMatrix(t.getMatrix(), view); - } - } - - @Override - public void reset() { - /* Do nothing. */ - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java deleted file mode 100644 index 953e3e844..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.actionbarsherlock.internal.nineoldandroids.widget; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.FrameLayout; - -import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; - -public class NineFrameLayout extends FrameLayout { - private final AnimatorProxy mProxy; - - public NineFrameLayout(Context context, AttributeSet attrs) { - super(context, attrs); - mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; - } - - @Override - public void setVisibility(int visibility) { - if (mProxy != null) { - if (visibility == GONE) { - clearAnimation(); - } else if (visibility == VISIBLE) { - setAnimation(mProxy); - } - } - super.setVisibility(visibility); - } - - public float getAlpha() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getAlpha(); - } else { - return super.getAlpha(); - } - } - public void setAlpha(float alpha) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setAlpha(alpha); - } else { - super.setAlpha(alpha); - } - } - public float getTranslationY() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getTranslationY(); - } else { - return super.getTranslationY(); - } - } - public void setTranslationY(float translationY) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setTranslationY(translationY); - } else { - super.setTranslationY(translationY); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java deleted file mode 100644 index 129b5aaaa..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.actionbarsherlock.internal.nineoldandroids.widget; - -import android.content.Context; -import android.widget.HorizontalScrollView; -import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; - -public class NineHorizontalScrollView extends HorizontalScrollView { - private final AnimatorProxy mProxy; - - public NineHorizontalScrollView(Context context) { - super(context); - mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; - } - - @Override - public void setVisibility(int visibility) { - if (mProxy != null) { - if (visibility == GONE) { - clearAnimation(); - } else if (visibility == VISIBLE) { - setAnimation(mProxy); - } - } - super.setVisibility(visibility); - } - - public float getAlpha() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getAlpha(); - } else { - return super.getAlpha(); - } - } - public void setAlpha(float alpha) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setAlpha(alpha); - } else { - super.setAlpha(alpha); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java deleted file mode 100644 index 1f381013a..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.actionbarsherlock.internal.nineoldandroids.widget; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.LinearLayout; - -import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; - -public class NineLinearLayout extends LinearLayout { - private final AnimatorProxy mProxy; - - public NineLinearLayout(Context context, AttributeSet attrs) { - super(context, attrs); - mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; - } - - @Override - public void setVisibility(int visibility) { - if (mProxy != null) { - if (visibility == GONE) { - clearAnimation(); - } else if (visibility == VISIBLE) { - setAnimation(mProxy); - } - } - super.setVisibility(visibility); - } - - public float getAlpha() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getAlpha(); - } else { - return super.getAlpha(); - } - } - public void setAlpha(float alpha) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setAlpha(alpha); - } else { - super.setAlpha(alpha); - } - } - public float getTranslationX() { - if (AnimatorProxy.NEEDS_PROXY) { - return mProxy.getTranslationX(); - } else { - return super.getTranslationX(); - } - } - public void setTranslationX(float translationX) { - if (AnimatorProxy.NEEDS_PROXY) { - mProxy.setTranslationX(translationX); - } else { - super.setTranslationX(translationX); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java deleted file mode 100644 index b136d50f0..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.actionbarsherlock.internal.view; - -import com.actionbarsherlock.internal.view.menu.SubMenuWrapper; -import com.actionbarsherlock.view.ActionProvider; -import android.view.View; - -public class ActionProviderWrapper extends android.view.ActionProvider { - private final ActionProvider mProvider; - - - public ActionProviderWrapper(ActionProvider provider) { - super(null/*TODO*/); //XXX this *should* be unused - mProvider = provider; - } - - - public ActionProvider unwrap() { - return mProvider; - } - - @Override - public View onCreateActionView() { - return mProvider.onCreateActionView(); - } - - @Override - public boolean hasSubMenu() { - return mProvider.hasSubMenu(); - } - - @Override - public boolean onPerformDefaultAction() { - return mProvider.onPerformDefaultAction(); - } - - @Override - public void onPrepareSubMenu(android.view.SubMenu subMenu) { - mProvider.onPrepareSubMenu(new SubMenuWrapper(subMenu)); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java deleted file mode 100644 index 0a87bd3f7..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2010 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; - -import android.content.Context; -import android.view.View; -import android.view.accessibility.AccessibilityEvent; - -import java.lang.ref.WeakReference; - -import com.actionbarsherlock.internal.view.menu.MenuBuilder; -import com.actionbarsherlock.internal.view.menu.MenuPopupHelper; -import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; -import com.actionbarsherlock.internal.widget.ActionBarContextView; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -public class StandaloneActionMode extends ActionMode implements MenuBuilder.Callback { - private Context mContext; - private ActionBarContextView mContextView; - private ActionMode.Callback mCallback; - private WeakReference mCustomView; - private boolean mFinished; - private boolean mFocusable; - - private MenuBuilder mMenu; - - public StandaloneActionMode(Context context, ActionBarContextView view, - ActionMode.Callback callback, boolean isFocusable) { - mContext = context; - mContextView = view; - mCallback = callback; - - mMenu = new MenuBuilder(context).setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - mMenu.setCallback(this); - mFocusable = isFocusable; - } - - @Override - public void setTitle(CharSequence title) { - mContextView.setTitle(title); - } - - @Override - public void setSubtitle(CharSequence subtitle) { - mContextView.setSubtitle(subtitle); - } - - @Override - public void setTitle(int resId) { - setTitle(mContext.getString(resId)); - } - - @Override - public void setSubtitle(int resId) { - setSubtitle(mContext.getString(resId)); - } - - @Override - public void setCustomView(View view) { - mContextView.setCustomView(view); - mCustomView = view != null ? new WeakReference(view) : null; - } - - @Override - public void invalidate() { - mCallback.onPrepareActionMode(this, mMenu); - } - - @Override - public void finish() { - if (mFinished) { - return; - } - mFinished = true; - - mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - mCallback.onDestroyActionMode(this); - } - - @Override - public Menu getMenu() { - return mMenu; - } - - @Override - public CharSequence getTitle() { - return mContextView.getTitle(); - } - - @Override - public CharSequence getSubtitle() { - return mContextView.getSubtitle(); - } - - @Override - public View getCustomView() { - return mCustomView != null ? mCustomView.get() : null; - } - - @Override - public MenuInflater getMenuInflater() { - return new MenuInflater(mContext); - } - - public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { - return mCallback.onActionItemClicked(this, item); - } - - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - } - - public boolean onSubMenuSelected(SubMenuBuilder subMenu) { - if (!subMenu.hasVisibleItems()) { - return true; - } - - new MenuPopupHelper(mContext, subMenu).show(); - return true; - } - - public void onCloseSubMenu(SubMenuBuilder menu) { - } - - public void onMenuModeChange(MenuBuilder menu) { - invalidate(); - mContextView.showOverflowMenu(); - } - - public boolean isUiFocusable() { - return mFocusable; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java deleted file mode 100644 index 7d45e81be..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.actionbarsherlock.internal.view; - -public interface View_HasStateListenerSupport { - void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener); - void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java deleted file mode 100644 index 3869d3290..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.actionbarsherlock.internal.view; - -import android.view.View; - -public interface View_OnAttachStateChangeListener { - void onViewAttachedToWindow(View v); - void onViewDetachedFromWindow(View v); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java deleted file mode 100644 index 0354ad1ad..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (C) 2010 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 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.view.KeyEvent; - -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -/** - * @hide - */ -public class ActionMenu implements Menu { - private Context mContext; - - private boolean mIsQwerty; - - private ArrayList mItems; - - public ActionMenu(Context context) { - mContext = context; - mItems = new ArrayList(); - } - - public Context getContext() { - return mContext; - } - - public MenuItem add(CharSequence title) { - return add(0, 0, 0, title); - } - - public MenuItem add(int titleRes) { - return add(0, 0, 0, titleRes); - } - - public MenuItem add(int groupId, int itemId, int order, int titleRes) { - return add(groupId, itemId, order, mContext.getResources().getString(titleRes)); - } - - public MenuItem add(int groupId, int itemId, int order, CharSequence title) { - ActionMenuItem item = new ActionMenuItem(getContext(), - groupId, itemId, 0, order, title); - mItems.add(order, item); - return item; - } - - public int addIntentOptions(int groupId, int itemId, int order, - ComponentName caller, Intent[] specifics, Intent intent, int flags, - 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; - } - - public SubMenu addSubMenu(CharSequence title) { - // TODO Implement submenus - return null; - } - - public SubMenu addSubMenu(int titleRes) { - // TODO Implement submenus - return null; - } - - public SubMenu addSubMenu(int groupId, int itemId, int order, - CharSequence title) { - // TODO Implement submenus - return null; - } - - public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { - // TODO Implement submenus - return null; - } - - public void clear() { - mItems.clear(); - } - - public void close() { - } - - private int findItemIndex(int id) { - final ArrayList items = mItems; - final int itemCount = items.size(); - for (int i = 0; i < itemCount; i++) { - if (items.get(i).getItemId() == id) { - return i; - } - } - - return -1; - } - - public MenuItem findItem(int id) { - return mItems.get(findItemIndex(id)); - } - - public MenuItem getItem(int index) { - return mItems.get(index); - } - - public boolean hasVisibleItems() { - final ArrayList items = mItems; - final int itemCount = items.size(); - - for (int i = 0; i < itemCount; i++) { - if (items.get(i).isVisible()) { - return true; - } - } - - return false; - } - - private ActionMenuItem findItemWithShortcut(int keyCode, KeyEvent event) { - // TODO Make this smarter. - final boolean qwerty = mIsQwerty; - final ArrayList items = mItems; - final int itemCount = items.size(); - - for (int i = 0; i < itemCount; i++) { - ActionMenuItem item = items.get(i); - final char shortcut = qwerty ? item.getAlphabeticShortcut() : - item.getNumericShortcut(); - if (keyCode == shortcut) { - return item; - } - } - return null; - } - - public boolean isShortcutKey(int keyCode, KeyEvent event) { - return findItemWithShortcut(keyCode, event) != null; - } - - public boolean performIdentifierAction(int id, int flags) { - final int index = findItemIndex(id); - if (index < 0) { - return false; - } - - return mItems.get(index).invoke(); - } - - public boolean performShortcut(int keyCode, KeyEvent event, int flags) { - ActionMenuItem item = findItemWithShortcut(keyCode, event); - if (item == null) { - return false; - } - - return item.invoke(); - } - - public void removeGroup(int groupId) { - final ArrayList items = mItems; - int itemCount = items.size(); - int i = 0; - while (i < itemCount) { - if (items.get(i).getGroupId() == groupId) { - items.remove(i); - itemCount--; - } else { - i++; - } - } - } - - public void removeItem(int id) { - mItems.remove(findItemIndex(id)); - } - - public void setGroupCheckable(int group, boolean checkable, - boolean exclusive) { - final ArrayList items = mItems; - final int itemCount = items.size(); - - for (int i = 0; i < itemCount; i++) { - ActionMenuItem item = items.get(i); - if (item.getGroupId() == group) { - item.setCheckable(checkable); - item.setExclusiveCheckable(exclusive); - } - } - } - - public void setGroupEnabled(int group, boolean enabled) { - final ArrayList items = mItems; - final int itemCount = items.size(); - - for (int i = 0; i < itemCount; i++) { - ActionMenuItem item = items.get(i); - if (item.getGroupId() == group) { - item.setEnabled(enabled); - } - } - } - - public void setGroupVisible(int group, boolean visible) { - final ArrayList items = mItems; - final int itemCount = items.size(); - - for (int i = 0; i < itemCount; i++) { - ActionMenuItem item = items.get(i); - if (item.getGroupId() == group) { - item.setVisible(visible); - } - } - } - - public void setQwertyMode(boolean isQwerty) { - mIsQwerty = isQwerty; - } - - public int size() { - return mItems.size(); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java deleted file mode 100644 index 510b97488..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2010 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.content.Context; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View; - -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -/** - * @hide - */ -public class ActionMenuItem implements MenuItem { - private final int mId; - private final int mGroup; - //UNUSED private final int mCategoryOrder; - private final int mOrdering; - - private CharSequence mTitle; - private CharSequence mTitleCondensed; - private Intent mIntent; - private char mShortcutNumericChar; - private char mShortcutAlphabeticChar; - - private Drawable mIconDrawable; - //UNUSED private int mIconResId = NO_ICON; - - private Context mContext; - - private MenuItem.OnMenuItemClickListener mClickListener; - - //UNUSED private static final int NO_ICON = 0; - - private int mFlags = ENABLED; - private static final int CHECKABLE = 0x00000001; - private static final int CHECKED = 0x00000002; - private static final int EXCLUSIVE = 0x00000004; - private static final int HIDDEN = 0x00000008; - private static final int ENABLED = 0x00000010; - - public ActionMenuItem(Context context, int group, int id, int categoryOrder, int ordering, - CharSequence title) { - mContext = context; - mId = id; - mGroup = group; - //UNUSED mCategoryOrder = categoryOrder; - mOrdering = ordering; - mTitle = title; - } - - public char getAlphabeticShortcut() { - return mShortcutAlphabeticChar; - } - - public int getGroupId() { - return mGroup; - } - - public Drawable getIcon() { - return mIconDrawable; - } - - public Intent getIntent() { - return mIntent; - } - - public int getItemId() { - return mId; - } - - public ContextMenuInfo getMenuInfo() { - return null; - } - - public char getNumericShortcut() { - return mShortcutNumericChar; - } - - public int getOrder() { - return mOrdering; - } - - public SubMenu getSubMenu() { - return null; - } - - public CharSequence getTitle() { - return mTitle; - } - - public CharSequence getTitleCondensed() { - return mTitleCondensed; - } - - public boolean hasSubMenu() { - return false; - } - - public boolean isCheckable() { - return (mFlags & CHECKABLE) != 0; - } - - public boolean isChecked() { - return (mFlags & CHECKED) != 0; - } - - public boolean isEnabled() { - return (mFlags & ENABLED) != 0; - } - - public boolean isVisible() { - return (mFlags & HIDDEN) == 0; - } - - public MenuItem setAlphabeticShortcut(char alphaChar) { - mShortcutAlphabeticChar = alphaChar; - return this; - } - - public MenuItem setCheckable(boolean checkable) { - mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); - return this; - } - - public ActionMenuItem setExclusiveCheckable(boolean exclusive) { - mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); - return this; - } - - public MenuItem setChecked(boolean checked) { - mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); - return this; - } - - public MenuItem setEnabled(boolean enabled) { - mFlags = (mFlags & ~ENABLED) | (enabled ? ENABLED : 0); - return this; - } - - public MenuItem setIcon(Drawable icon) { - mIconDrawable = icon; - //UNUSED mIconResId = NO_ICON; - return this; - } - - public MenuItem setIcon(int iconRes) { - //UNUSED mIconResId = iconRes; - mIconDrawable = mContext.getResources().getDrawable(iconRes); - return this; - } - - public MenuItem setIntent(Intent intent) { - mIntent = intent; - return this; - } - - public MenuItem setNumericShortcut(char numericChar) { - mShortcutNumericChar = numericChar; - return this; - } - - public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { - mClickListener = menuItemClickListener; - return this; - } - - public MenuItem setShortcut(char numericChar, char alphaChar) { - mShortcutNumericChar = numericChar; - mShortcutAlphabeticChar = alphaChar; - return this; - } - - public MenuItem setTitle(CharSequence title) { - mTitle = title; - return this; - } - - public MenuItem setTitle(int title) { - mTitle = mContext.getResources().getString(title); - return this; - } - - public MenuItem setTitleCondensed(CharSequence title) { - mTitleCondensed = title; - return this; - } - - public MenuItem setVisible(boolean visible) { - mFlags = (mFlags & HIDDEN) | (visible ? 0 : HIDDEN); - return this; - } - - public boolean invoke() { - if (mClickListener != null && mClickListener.onMenuItemClick(this)) { - return true; - } - - if (mIntent != null) { - mContext.startActivity(mIntent); - return true; - } - - return false; - } - - public void setShowAsAction(int show) { - // Do nothing. ActionMenuItems always show as action buttons. - } - - public MenuItem setActionView(View actionView) { - throw new UnsupportedOperationException(); - } - - public View getActionView() { - return null; - } - - @Override - public MenuItem setActionView(int resId) { - throw new UnsupportedOperationException(); - } - - @Override - public ActionProvider getActionProvider() { - return null; - } - - @Override - public MenuItem setActionProvider(ActionProvider actionProvider) { - throw new UnsupportedOperationException(); - } - - @Override - public MenuItem setShowAsActionFlags(int actionEnum) { - setShowAsAction(actionEnum); - return this; - } - - @Override - public boolean expandActionView() { - return false; - } - - @Override - public boolean collapseActionView() { - return false; - } - - @Override - public boolean isActionViewExpanded() { - return false; - } - - @Override - public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { - // No need to save the listener; ActionMenuItem does not support collapsing items. - return this; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java deleted file mode 100644 index dcb50f362..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (C) 2010 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 java.util.HashSet; -import java.util.Set; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View; -import android.view.accessibility.AccessibilityEvent; -import android.widget.ImageButton; -import android.widget.LinearLayout; -import android.widget.Toast; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; -import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; -import com.actionbarsherlock.internal.widget.CapitalizingButton; - -import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; - -/** - * @hide - */ -public class ActionMenuItemView extends LinearLayout - implements MenuView.ItemView, View.OnClickListener, View.OnLongClickListener, - ActionMenuView.ActionMenuChildView, View_HasStateListenerSupport { - //UNUSED private static final String TAG = "ActionMenuItemView"; - - private MenuItemImpl mItemData; - private CharSequence mTitle; - private MenuBuilder.ItemInvoker mItemInvoker; - - private ImageButton mImageButton; - private CapitalizingButton mTextButton; - private boolean mAllowTextWithIcon; - private boolean mExpandedFormat; - private int mMinWidth; - - private final Set mListeners = new HashSet(); - - public ActionMenuItemView(Context context) { - this(context, null); - } - - public ActionMenuItemView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) { - //TODO super(context, attrs, defStyle); - super(context, attrs); - mAllowTextWithIcon = getResources_getBoolean(context, - R.bool.abs__config_allowActionMenuItemTextWithIcon); - TypedArray a = context.obtainStyledAttributes(attrs, - R.styleable.SherlockActionMenuItemView, 0, 0); - mMinWidth = a.getDimensionPixelSize( - R.styleable.SherlockActionMenuItemView_android_minWidth, 0); - a.recycle(); - } - - @Override - public void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { - mListeners.add(listener); - } - - @Override - public void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { - mListeners.remove(listener); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - for (View_OnAttachStateChangeListener listener : mListeners) { - listener.onViewAttachedToWindow(this); - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - for (View_OnAttachStateChangeListener listener : mListeners) { - listener.onViewDetachedFromWindow(this); - } - } - - @Override - public void onFinishInflate() { - - mImageButton = (ImageButton) findViewById(R.id.abs__imageButton); - mTextButton = (CapitalizingButton) findViewById(R.id.abs__textButton); - mImageButton.setOnClickListener(this); - mTextButton.setOnClickListener(this); - mImageButton.setOnLongClickListener(this); - setOnClickListener(this); - setOnLongClickListener(this); - } - - public MenuItemImpl getItemData() { - return mItemData; - } - - public void initialize(MenuItemImpl itemData, int menuType) { - mItemData = itemData; - - setIcon(itemData.getIcon()); - setTitle(itemData.getTitleForItemView(this)); // Title only takes effect if there is no icon - setId(itemData.getItemId()); - - setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); - setEnabled(itemData.isEnabled()); - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - mImageButton.setEnabled(enabled); - mTextButton.setEnabled(enabled); - } - - public void onClick(View v) { - if (mItemInvoker != null) { - mItemInvoker.invokeItem(mItemData); - } - } - - public void setItemInvoker(MenuBuilder.ItemInvoker invoker) { - mItemInvoker = invoker; - } - - public boolean prefersCondensedTitle() { - return true; - } - - public void setCheckable(boolean checkable) { - // TODO Support checkable action items - } - - public void setChecked(boolean checked) { - // TODO Support checkable action items - } - - public void setExpandedFormat(boolean expandedFormat) { - if (mExpandedFormat != expandedFormat) { - mExpandedFormat = expandedFormat; - if (mItemData != null) { - mItemData.actionFormatChanged(); - } - } - } - - private void updateTextButtonVisibility() { - boolean visible = !TextUtils.isEmpty(mTextButton.getText()); - visible &= mImageButton.getDrawable() == null || - (mItemData.showsTextAsAction() && (mAllowTextWithIcon || mExpandedFormat)); - - mTextButton.setVisibility(visible ? VISIBLE : GONE); - } - - public void setIcon(Drawable icon) { - mImageButton.setImageDrawable(icon); - if (icon != null) { - mImageButton.setVisibility(VISIBLE); - } else { - mImageButton.setVisibility(GONE); - } - - updateTextButtonVisibility(); - } - - public boolean hasText() { - return mTextButton.getVisibility() != GONE; - } - - public void setShortcut(boolean showShortcut, char shortcutKey) { - // Action buttons don't show text for shortcut keys. - } - - public void setTitle(CharSequence title) { - mTitle = title; - - mTextButton.setTextCompat(mTitle); - - setContentDescription(mTitle); - updateTextButtonVisibility(); - } - - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - onPopulateAccessibilityEvent(event); - return true; - } - - @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - super.onPopulateAccessibilityEvent(event); - } - final CharSequence cdesc = getContentDescription(); - if (!TextUtils.isEmpty(cdesc)) { - event.getText().add(cdesc); - } - } - - @Override - public boolean dispatchHoverEvent(MotionEvent event) { - // Don't allow children to hover; we want this to be treated as a single component. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return onHoverEvent(event); - } - return false; - } - - public boolean showsIcon() { - return true; - } - - public boolean needsDividerBefore() { - return hasText() && mItemData.getIcon() == null; - } - - public boolean needsDividerAfter() { - return hasText(); - } - - @Override - public boolean onLongClick(View v) { - if (hasText()) { - // Don't show the cheat sheet for items that already show text. - return false; - } - - final int[] screenPos = new int[2]; - final Rect displayFrame = new Rect(); - getLocationOnScreen(screenPos); - getWindowVisibleDisplayFrame(displayFrame); - - final Context context = getContext(); - final int width = getWidth(); - final int height = getHeight(); - final int midy = screenPos[1] + height / 2; - final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; - - Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT); - if (midy < displayFrame.height()) { - // Show along the top; follow action buttons - cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT, - screenWidth - screenPos[0] - width / 2, height); - } else { - // Show along the bottom center - cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); - } - cheatSheet.show(); - return true; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - final int specSize = MeasureSpec.getSize(widthMeasureSpec); - final int oldMeasuredWidth = getMeasuredWidth(); - final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(specSize, mMinWidth) - : mMinWidth; - - if (widthMode != MeasureSpec.EXACTLY && mMinWidth > 0 && oldMeasuredWidth < targetWidth) { - // Remeasure at exactly the minimum width. - super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), - heightMeasureSpec); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java deleted file mode 100644 index 876a22c58..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java +++ /dev/null @@ -1,714 +0,0 @@ -/* - * 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 com.actionbarsherlock.internal.view.menu; - -import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getInteger; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.SparseBooleanArray; -import android.view.SoundEffectConstants; -import android.view.View; -import android.view.View.MeasureSpec; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.widget.ImageButton; -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; -import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; -import com.actionbarsherlock.internal.view.menu.ActionMenuView.ActionMenuChildView; -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.view.MenuItem; - -/** - * MenuPresenter for building action menus as seen in the action bar and action modes. - */ -public class ActionMenuPresenter extends BaseMenuPresenter - implements ActionProvider.SubUiVisibilityListener { - //UNUSED private static final String TAG = "ActionMenuPresenter"; - - private View mOverflowButton; - private boolean mReserveOverflow; - private boolean mReserveOverflowSet; - private int mWidthLimit; - private int mActionItemWidthLimit; - private int mMaxItems; - private boolean mMaxItemsSet; - private boolean mStrictWidthLimit; - private boolean mWidthLimitSet; - private boolean mExpandedActionViewsExclusive; - - private int mMinCellSize; - - // Group IDs that have been added as actions - used temporarily, allocated here for reuse. - private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); - - private View mScrapActionButtonView; - - private OverflowPopup mOverflowPopup; - private ActionButtonSubmenu mActionButtonPopup; - - private OpenOverflowRunnable mPostedOpenRunnable; - - final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); - int mOpenSubMenuId; - - public ActionMenuPresenter(Context context) { - super(context, R.layout.abs__action_menu_layout, - R.layout.abs__action_menu_item_layout); - } - - @Override - public void initForMenu(Context context, MenuBuilder menu) { - super.initForMenu(context, menu); - - final Resources res = context.getResources(); - - if (!mReserveOverflowSet) { - mReserveOverflow = reserveOverflow(mContext); - } - - if (!mWidthLimitSet) { - mWidthLimit = res.getDisplayMetrics().widthPixels / 2; - } - - // Measure for initial configuration - if (!mMaxItemsSet) { - mMaxItems = getResources_getInteger(context, R.integer.abs__max_action_buttons); - } - - int width = mWidthLimit; - if (mReserveOverflow) { - if (mOverflowButton == null) { - mOverflowButton = new OverflowMenuButton(mSystemContext); - final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - mOverflowButton.measure(spec, spec); - } - width -= mOverflowButton.getMeasuredWidth(); - } else { - mOverflowButton = null; - } - - mActionItemWidthLimit = width; - - mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density); - - // Drop a scrap view as it may no longer reflect the proper context/config. - mScrapActionButtonView = null; - } - - public static boolean reserveOverflow(Context context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB); - } else { - return !HasPermanentMenuKey.get(context); - } - } - - private static class HasPermanentMenuKey { - public static boolean get(Context context) { - return ViewConfiguration.get(context).hasPermanentMenuKey(); - } - } - - public void onConfigurationChanged(Configuration newConfig) { - if (!mMaxItemsSet) { - mMaxItems = getResources_getInteger(mContext, - R.integer.abs__max_action_buttons); - if (mMenu != null) { - mMenu.onItemsChanged(true); - } - } - } - - public void setWidthLimit(int width, boolean strict) { - mWidthLimit = width; - mStrictWidthLimit = strict; - mWidthLimitSet = true; - } - - public void setReserveOverflow(boolean reserveOverflow) { - mReserveOverflow = reserveOverflow; - mReserveOverflowSet = true; - } - - public void setItemLimit(int itemCount) { - mMaxItems = itemCount; - mMaxItemsSet = true; - } - - public void setExpandedActionViewsExclusive(boolean isExclusive) { - mExpandedActionViewsExclusive = isExclusive; - } - - @Override - public MenuView getMenuView(ViewGroup root) { - MenuView result = super.getMenuView(root); - ((ActionMenuView) result).setPresenter(this); - return result; - } - - @Override - public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { - View actionView = item.getActionView(); - if (actionView == null || item.hasCollapsibleActionView()) { - if (!(convertView instanceof ActionMenuItemView)) { - convertView = null; - } - actionView = super.getItemView(item, convertView, parent); - } - actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE); - - final ActionMenuView menuParent = (ActionMenuView) parent; - final ViewGroup.LayoutParams lp = actionView.getLayoutParams(); - if (!menuParent.checkLayoutParams(lp)) { - actionView.setLayoutParams(menuParent.generateLayoutParams(lp)); - } - return actionView; - } - - @Override - public void bindItemView(MenuItemImpl item, MenuView.ItemView itemView) { - itemView.initialize(item, 0); - - final ActionMenuView menuView = (ActionMenuView) mMenuView; - ActionMenuItemView actionItemView = (ActionMenuItemView) itemView; - actionItemView.setItemInvoker(menuView); - } - - @Override - public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { - return item.isActionButton(); - } - - @Override - public void updateMenuView(boolean cleared) { - super.updateMenuView(cleared); - - if (mMenu != null) { - final ArrayList actionItems = mMenu.getActionItems(); - final int count = actionItems.size(); - for (int i = 0; i < count; i++) { - final ActionProvider provider = actionItems.get(i).getActionProvider(); - if (provider != null) { - provider.setSubUiVisibilityListener(this); - } - } - } - - final ArrayList nonActionItems = mMenu != null ? - mMenu.getNonActionItems() : null; - - boolean hasOverflow = false; - if (mReserveOverflow && nonActionItems != null) { - final int count = nonActionItems.size(); - if (count == 1) { - hasOverflow = !nonActionItems.get(0).isActionViewExpanded(); - } else { - hasOverflow = count > 0; - } - } - - if (hasOverflow) { - if (mOverflowButton == null) { - mOverflowButton = new OverflowMenuButton(mSystemContext); - } - ViewGroup parent = (ViewGroup) mOverflowButton.getParent(); - if (parent != mMenuView) { - if (parent != null) { - parent.removeView(mOverflowButton); - } - ActionMenuView menuView = (ActionMenuView) mMenuView; - menuView.addView(mOverflowButton, menuView.generateOverflowButtonLayoutParams()); - } - } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) { - ((ViewGroup) mMenuView).removeView(mOverflowButton); - } - - ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow); - } - - @Override - public boolean filterLeftoverView(ViewGroup parent, int childIndex) { - if (parent.getChildAt(childIndex) == mOverflowButton) return false; - return super.filterLeftoverView(parent, childIndex); - } - - public boolean onSubMenuSelected(SubMenuBuilder subMenu) { - if (!subMenu.hasVisibleItems()) return false; - - SubMenuBuilder topSubMenu = subMenu; - while (topSubMenu.getParentMenu() != mMenu) { - topSubMenu = (SubMenuBuilder) topSubMenu.getParentMenu(); - } - View anchor = findViewForItem(topSubMenu.getItem()); - if (anchor == null) { - if (mOverflowButton == null) return false; - anchor = mOverflowButton; - } - - mOpenSubMenuId = subMenu.getItem().getItemId(); - mActionButtonPopup = new ActionButtonSubmenu(mContext, subMenu); - mActionButtonPopup.setAnchorView(anchor); - mActionButtonPopup.show(); - super.onSubMenuSelected(subMenu); - return true; - } - - private View findViewForItem(MenuItem item) { - final ViewGroup parent = (ViewGroup) mMenuView; - if (parent == null) return null; - - final int count = parent.getChildCount(); - for (int i = 0; i < count; i++) { - final View child = parent.getChildAt(i); - if (child instanceof MenuView.ItemView && - ((MenuView.ItemView) child).getItemData() == item) { - return child; - } - } - return null; - } - - /** - * Display the overflow menu if one is present. - * @return true if the overflow menu was shown, false otherwise. - */ - public boolean showOverflowMenu() { - if (mReserveOverflow && !isOverflowMenuShowing() && mMenu != null && mMenuView != null && - mPostedOpenRunnable == null && !mMenu.getNonActionItems().isEmpty()) { - OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true); - mPostedOpenRunnable = new OpenOverflowRunnable(popup); - // Post this for later; we might still need a layout for the anchor to be right. - ((View) mMenuView).post(mPostedOpenRunnable); - - // ActionMenuPresenter uses null as a callback argument here - // to indicate overflow is opening. - super.onSubMenuSelected(null); - - return true; - } - return false; - } - - /** - * Hide the overflow menu if it is currently showing. - * - * @return true if the overflow menu was hidden, false otherwise. - */ - public boolean hideOverflowMenu() { - if (mPostedOpenRunnable != null && mMenuView != null) { - ((View) mMenuView).removeCallbacks(mPostedOpenRunnable); - mPostedOpenRunnable = null; - return true; - } - - MenuPopupHelper popup = mOverflowPopup; - if (popup != null) { - popup.dismiss(); - return true; - } - return false; - } - - /** - * Dismiss all popup menus - overflow and submenus. - * @return true if popups were dismissed, false otherwise. (This can be because none were open.) - */ - public boolean dismissPopupMenus() { - boolean result = hideOverflowMenu(); - result |= hideSubMenus(); - return result; - } - - /** - * Dismiss all submenu popups. - * - * @return true if popups were dismissed, false otherwise. (This can be because none were open.) - */ - public boolean hideSubMenus() { - if (mActionButtonPopup != null) { - mActionButtonPopup.dismiss(); - return true; - } - return false; - } - - /** - * @return true if the overflow menu is currently showing - */ - public boolean isOverflowMenuShowing() { - return mOverflowPopup != null && mOverflowPopup.isShowing(); - } - - /** - * @return true if space has been reserved in the action menu for an overflow item. - */ - public boolean isOverflowReserved() { - return mReserveOverflow; - } - - public boolean flagActionItems() { - final ArrayList visibleItems = mMenu.getVisibleItems(); - final int itemsSize = visibleItems.size(); - int maxActions = mMaxItems; - int widthLimit = mActionItemWidthLimit; - final int querySpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - final ViewGroup parent = (ViewGroup) mMenuView; - - int requiredItems = 0; - int requestedItems = 0; - int firstActionWidth = 0; - boolean hasOverflow = false; - for (int i = 0; i < itemsSize; i++) { - MenuItemImpl item = visibleItems.get(i); - if (item.requiresActionButton()) { - requiredItems++; - } else if (item.requestsActionButton()) { - requestedItems++; - } else { - hasOverflow = true; - } - if (mExpandedActionViewsExclusive && item.isActionViewExpanded()) { - // Overflow everything if we have an expanded action view and we're - // space constrained. - maxActions = 0; - } - } - - // Reserve a spot for the overflow item if needed. - if (mReserveOverflow && - (hasOverflow || requiredItems + requestedItems > maxActions)) { - maxActions--; - } - maxActions -= requiredItems; - - final SparseBooleanArray seenGroups = mActionButtonGroups; - seenGroups.clear(); - - int cellSize = 0; - int cellsRemaining = 0; - if (mStrictWidthLimit) { - cellsRemaining = widthLimit / mMinCellSize; - final int cellSizeRemaining = widthLimit % mMinCellSize; - cellSize = mMinCellSize + cellSizeRemaining / cellsRemaining; - } - - // Flag as many more requested items as will fit. - for (int i = 0; i < itemsSize; i++) { - MenuItemImpl item = visibleItems.get(i); - - if (item.requiresActionButton()) { - View v = getItemView(item, mScrapActionButtonView, parent); - if (mScrapActionButtonView == null) { - mScrapActionButtonView = v; - } - if (mStrictWidthLimit) { - cellsRemaining -= ActionMenuView.measureChildForCells(v, - cellSize, cellsRemaining, querySpec, 0); - } else { - v.measure(querySpec, querySpec); - } - final int measuredWidth = v.getMeasuredWidth(); - widthLimit -= measuredWidth; - if (firstActionWidth == 0) { - firstActionWidth = measuredWidth; - } - final int groupId = item.getGroupId(); - if (groupId != 0) { - seenGroups.put(groupId, true); - } - item.setIsActionButton(true); - } else if (item.requestsActionButton()) { - // Items in a group with other items that already have an action slot - // can break the max actions rule, but not the width limit. - final int groupId = item.getGroupId(); - final boolean inGroup = seenGroups.get(groupId); - boolean isAction = (maxActions > 0 || inGroup) && widthLimit > 0 && - (!mStrictWidthLimit || cellsRemaining > 0); - - if (isAction) { - View v = getItemView(item, mScrapActionButtonView, parent); - if (mScrapActionButtonView == null) { - mScrapActionButtonView = v; - } - if (mStrictWidthLimit) { - final int cells = ActionMenuView.measureChildForCells(v, - cellSize, cellsRemaining, querySpec, 0); - cellsRemaining -= cells; - if (cells == 0) { - isAction = false; - } - } else { - v.measure(querySpec, querySpec); - } - final int measuredWidth = v.getMeasuredWidth(); - widthLimit -= measuredWidth; - if (firstActionWidth == 0) { - firstActionWidth = measuredWidth; - } - - if (mStrictWidthLimit) { - isAction &= widthLimit >= 0; - } else { - // Did this push the entire first item past the limit? - isAction &= widthLimit + firstActionWidth > 0; - } - } - - if (isAction && groupId != 0) { - seenGroups.put(groupId, true); - } else if (inGroup) { - // We broke the width limit. Demote the whole group, they all overflow now. - seenGroups.put(groupId, false); - for (int j = 0; j < i; j++) { - MenuItemImpl areYouMyGroupie = visibleItems.get(j); - if (areYouMyGroupie.getGroupId() == groupId) { - // Give back the action slot - if (areYouMyGroupie.isActionButton()) maxActions++; - areYouMyGroupie.setIsActionButton(false); - } - } - } - - if (isAction) maxActions--; - - item.setIsActionButton(isAction); - } - } - return true; - } - - @Override - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - dismissPopupMenus(); - super.onCloseMenu(menu, allMenusAreClosing); - } - - @Override - public Parcelable onSaveInstanceState() { - SavedState state = new SavedState(); - state.openSubMenuId = mOpenSubMenuId; - return state; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState saved = (SavedState) state; - if (saved.openSubMenuId > 0) { - MenuItem item = mMenu.findItem(saved.openSubMenuId); - if (item != null) { - SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); - onSubMenuSelected(subMenu); - } - } - } - - @Override - public void onSubUiVisibilityChanged(boolean isVisible) { - if (isVisible) { - // Not a submenu, but treat it like one. - super.onSubMenuSelected(null); - } else { - mMenu.close(false); - } - } - - private static class SavedState implements Parcelable { - public int openSubMenuId; - - SavedState() { - } - - SavedState(Parcel in) { - openSubMenuId = in.readInt(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(openSubMenuId); - } - - @SuppressWarnings("unused") - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - private class OverflowMenuButton extends ImageButton implements ActionMenuChildView, View_HasStateListenerSupport { - private final Set mListeners = new HashSet(); - - public OverflowMenuButton(Context context) { - super(context, null, R.attr.actionOverflowButtonStyle); - - setClickable(true); - setFocusable(true); - setVisibility(VISIBLE); - setEnabled(true); - } - - @Override - public boolean performClick() { - if (super.performClick()) { - return true; - } - - playSoundEffect(SoundEffectConstants.CLICK); - showOverflowMenu(); - return true; - } - - public boolean needsDividerBefore() { - return false; - } - - public boolean needsDividerAfter() { - return false; - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - for (View_OnAttachStateChangeListener listener : mListeners) { - listener.onViewAttachedToWindow(this); - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - for (View_OnAttachStateChangeListener listener : mListeners) { - listener.onViewDetachedFromWindow(this); - } - - if (mOverflowPopup != null) mOverflowPopup.dismiss(); - } - - @Override - public void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { - mListeners.add(listener); - } - - @Override - public void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { - mListeners.remove(listener); - } - } - - private class OverflowPopup extends MenuPopupHelper { - public OverflowPopup(Context context, MenuBuilder menu, View anchorView, - boolean overflowOnly) { - super(context, menu, anchorView, overflowOnly); - setCallback(mPopupPresenterCallback); - } - - @Override - public void onDismiss() { - super.onDismiss(); - mMenu.close(); - mOverflowPopup = null; - } - } - - private class ActionButtonSubmenu extends MenuPopupHelper { - //UNUSED private SubMenuBuilder mSubMenu; - - public ActionButtonSubmenu(Context context, SubMenuBuilder subMenu) { - super(context, subMenu); - //UNUSED mSubMenu = subMenu; - - MenuItemImpl item = (MenuItemImpl) subMenu.getItem(); - if (!item.isActionButton()) { - // Give a reasonable anchor to nested submenus. - setAnchorView(mOverflowButton == null ? (View) mMenuView : mOverflowButton); - } - - setCallback(mPopupPresenterCallback); - - boolean preserveIconSpacing = false; - final int count = subMenu.size(); - for (int i = 0; i < count; i++) { - MenuItem childItem = subMenu.getItem(i); - if (childItem.isVisible() && childItem.getIcon() != null) { - preserveIconSpacing = true; - break; - } - } - setForceShowIcon(preserveIconSpacing); - } - - @Override - public void onDismiss() { - super.onDismiss(); - mActionButtonPopup = null; - mOpenSubMenuId = 0; - } - } - - private class PopupPresenterCallback implements MenuPresenter.Callback { - - @Override - public boolean onOpenSubMenu(MenuBuilder subMenu) { - if (subMenu == null) return false; - - mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); - return false; - } - - @Override - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - if (menu instanceof SubMenuBuilder) { - ((SubMenuBuilder) menu).getRootMenu().close(false); - } - } - } - - private class OpenOverflowRunnable implements Runnable { - private OverflowPopup mPopup; - - public OpenOverflowRunnable(OverflowPopup popup) { - mPopup = popup; - } - - public void run() { - mMenu.changeMenuMode(); - final View menuView = (View) mMenuView; - if (menuView != null && menuView.getWindowToken() != null && mPopup.tryShow()) { - mOverflowPopup = mPopup; - } - mPostedOpenRunnable = null; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java deleted file mode 100644 index 0e3b1ae0d..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java +++ /dev/null @@ -1,575 +0,0 @@ -/* - * Copyright (C) 2010 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.content.Context; -import android.content.res.Configuration; -import android.graphics.Canvas; -import android.os.Build; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; -import android.widget.LinearLayout; -import com.actionbarsherlock.internal.widget.IcsLinearLayout; - -/** - * @hide - */ -public class ActionMenuView extends IcsLinearLayout implements MenuBuilder.ItemInvoker, MenuView { - //UNUSED private static final String TAG = "ActionMenuView"; - private static final boolean IS_FROYO = Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO; - - static final int MIN_CELL_SIZE = 56; // dips - static final int GENERATED_ITEM_PADDING = 4; // dips - - private MenuBuilder mMenu; - - private boolean mReserveOverflow; - private ActionMenuPresenter mPresenter; - private boolean mFormatItems; - private int mFormatItemsWidth; - private int mMinCellSize; - private int mGeneratedItemPadding; - //UNUSED private int mMeasuredExtraWidth; - - private boolean mFirst = true; - - public ActionMenuView(Context context) { - this(context, null); - } - - public ActionMenuView(Context context, AttributeSet attrs) { - super(context, attrs); - setBaselineAligned(false); - final float density = context.getResources().getDisplayMetrics().density; - mMinCellSize = (int) (MIN_CELL_SIZE * density); - mGeneratedItemPadding = (int) (GENERATED_ITEM_PADDING * density); - } - - public void setPresenter(ActionMenuPresenter presenter) { - mPresenter = presenter; - } - - public boolean isExpandedFormat() { - return mFormatItems; - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - if (IS_FROYO) { - super.onConfigurationChanged(newConfig); - } - mPresenter.updateMenuView(false); - - if (mPresenter != null && mPresenter.isOverflowMenuShowing()) { - mPresenter.hideOverflowMenu(); - mPresenter.showOverflowMenu(); - } - } - - @Override - protected void onDraw(Canvas canvas) { - //Need to trigger a relayout since we may have been added extremely - //late in the initial rendering (e.g., when contained in a ViewPager). - //See: https://github.com/JakeWharton/ActionBarSherlock/issues/272 - if (!IS_FROYO && mFirst) { - mFirst = false; - requestLayout(); - return; - } - super.onDraw(canvas); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // If we've been given an exact size to match, apply special formatting during layout. - final boolean wasFormatted = mFormatItems; - mFormatItems = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; - - if (wasFormatted != mFormatItems) { - mFormatItemsWidth = 0; // Reset this when switching modes - } - - // Special formatting can change whether items can fit as action buttons. - // Kick the menu and update presenters when this changes. - final int widthSize = MeasureSpec.getMode(widthMeasureSpec); - if (mFormatItems && mMenu != null && widthSize != mFormatItemsWidth) { - mFormatItemsWidth = widthSize; - mMenu.onItemsChanged(true); - } - - if (mFormatItems) { - onMeasureExactFormat(widthMeasureSpec, heightMeasureSpec); - } else { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - } - - private void onMeasureExactFormat(int widthMeasureSpec, int heightMeasureSpec) { - // We already know the width mode is EXACTLY if we're here. - final int heightMode = MeasureSpec.getMode(heightMeasureSpec); - int widthSize = MeasureSpec.getSize(widthMeasureSpec); - int heightSize = MeasureSpec.getSize(heightMeasureSpec); - - final int widthPadding = getPaddingLeft() + getPaddingRight(); - final int heightPadding = getPaddingTop() + getPaddingBottom(); - - widthSize -= widthPadding; - - // Divide the view into cells. - final int cellCount = widthSize / mMinCellSize; - final int cellSizeRemaining = widthSize % mMinCellSize; - - if (cellCount == 0) { - // Give up, nothing fits. - setMeasuredDimension(widthSize, 0); - return; - } - - final int cellSize = mMinCellSize + cellSizeRemaining / cellCount; - - int cellsRemaining = cellCount; - int maxChildHeight = 0; - int maxCellsUsed = 0; - int expandableItemCount = 0; - int visibleItemCount = 0; - boolean hasOverflow = false; - - // This is used as a bitfield to locate the smallest items present. Assumes childCount < 64. - long smallestItemsAt = 0; - - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (child.getVisibility() == GONE) continue; - - final boolean isGeneratedItem = child instanceof ActionMenuItemView; - visibleItemCount++; - - if (isGeneratedItem) { - // Reset padding for generated menu item views; it may change below - // and views are recycled. - child.setPadding(mGeneratedItemPadding, 0, mGeneratedItemPadding, 0); - } - - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - lp.expanded = false; - lp.extraPixels = 0; - lp.cellsUsed = 0; - lp.expandable = false; - lp.leftMargin = 0; - lp.rightMargin = 0; - lp.preventEdgeOffset = isGeneratedItem && ((ActionMenuItemView) child).hasText(); - - // Overflow always gets 1 cell. No more, no less. - final int cellsAvailable = lp.isOverflowButton ? 1 : cellsRemaining; - - final int cellsUsed = measureChildForCells(child, cellSize, cellsAvailable, - heightMeasureSpec, heightPadding); - - maxCellsUsed = Math.max(maxCellsUsed, cellsUsed); - if (lp.expandable) expandableItemCount++; - if (lp.isOverflowButton) hasOverflow = true; - - cellsRemaining -= cellsUsed; - maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight()); - if (cellsUsed == 1) smallestItemsAt |= (1 << i); - } - - // When we have overflow and a single expanded (text) item, we want to try centering it - // visually in the available space even though overflow consumes some of it. - final boolean centerSingleExpandedItem = hasOverflow && visibleItemCount == 2; - - // Divide space for remaining cells if we have items that can expand. - // Try distributing whole leftover cells to smaller items first. - - boolean needsExpansion = false; - while (expandableItemCount > 0 && cellsRemaining > 0) { - int minCells = Integer.MAX_VALUE; - long minCellsAt = 0; // Bit locations are indices of relevant child views - int minCellsItemCount = 0; - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - // Don't try to expand items that shouldn't. - if (!lp.expandable) continue; - - // Mark indices of children that can receive an extra cell. - if (lp.cellsUsed < minCells) { - minCells = lp.cellsUsed; - minCellsAt = 1 << i; - minCellsItemCount = 1; - } else if (lp.cellsUsed == minCells) { - minCellsAt |= 1 << i; - minCellsItemCount++; - } - } - - // Items that get expanded will always be in the set of smallest items when we're done. - smallestItemsAt |= minCellsAt; - - if (minCellsItemCount > cellsRemaining) break; // Couldn't expand anything evenly. Stop. - - // We have enough cells, all minimum size items will be incremented. - minCells++; - - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if ((minCellsAt & (1 << i)) == 0) { - // If this item is already at our small item count, mark it for later. - if (lp.cellsUsed == minCells) smallestItemsAt |= 1 << i; - continue; - } - - if (centerSingleExpandedItem && lp.preventEdgeOffset && cellsRemaining == 1) { - // Add padding to this item such that it centers. - child.setPadding(mGeneratedItemPadding + cellSize, 0, mGeneratedItemPadding, 0); - } - lp.cellsUsed++; - lp.expanded = true; - cellsRemaining--; - } - - needsExpansion = true; - } - - // Divide any space left that wouldn't divide along cell boundaries - // evenly among the smallest items - - final boolean singleItem = !hasOverflow && visibleItemCount == 1; - if (cellsRemaining > 0 && smallestItemsAt != 0 && - (cellsRemaining < visibleItemCount - 1 || singleItem || maxCellsUsed > 1)) { - float expandCount = Long.bitCount(smallestItemsAt); - - if (!singleItem) { - // The items at the far edges may only expand by half in order to pin to either side. - if ((smallestItemsAt & 1) != 0) { - LayoutParams lp = (LayoutParams) getChildAt(0).getLayoutParams(); - if (!lp.preventEdgeOffset) expandCount -= 0.5f; - } - if ((smallestItemsAt & (1 << (childCount - 1))) != 0) { - LayoutParams lp = ((LayoutParams) getChildAt(childCount - 1).getLayoutParams()); - if (!lp.preventEdgeOffset) expandCount -= 0.5f; - } - } - - final int extraPixels = expandCount > 0 ? - (int) (cellsRemaining * cellSize / expandCount) : 0; - - for (int i = 0; i < childCount; i++) { - if ((smallestItemsAt & (1 << i)) == 0) continue; - - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (child instanceof ActionMenuItemView) { - // If this is one of our views, expand and measure at the larger size. - lp.extraPixels = extraPixels; - lp.expanded = true; - if (i == 0 && !lp.preventEdgeOffset) { - // First item gets part of its new padding pushed out of sight. - // The last item will get this implicitly from layout. - lp.leftMargin = -extraPixels / 2; - } - needsExpansion = true; - } else if (lp.isOverflowButton) { - lp.extraPixels = extraPixels; - lp.expanded = true; - lp.rightMargin = -extraPixels / 2; - needsExpansion = true; - } else { - // If we don't know what it is, give it some margins instead - // and let it center within its space. We still want to pin - // against the edges. - if (i != 0) { - lp.leftMargin = extraPixels / 2; - } - if (i != childCount - 1) { - lp.rightMargin = extraPixels / 2; - } - } - } - - cellsRemaining = 0; - } - - // Remeasure any items that have had extra space allocated to them. - if (needsExpansion) { - int heightSpec = MeasureSpec.makeMeasureSpec(heightSize - heightPadding, heightMode); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - if (!lp.expanded) continue; - - final int width = lp.cellsUsed * cellSize + lp.extraPixels; - child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), heightSpec); - } - } - - if (heightMode != MeasureSpec.EXACTLY) { - heightSize = maxChildHeight; - } - - setMeasuredDimension(widthSize, heightSize); - //UNUSED mMeasuredExtraWidth = cellsRemaining * cellSize; - } - - /** - * Measure a child view to fit within cell-based formatting. The child's width - * will be measured to a whole multiple of cellSize. - * - *

Sets the expandable and cellsUsed fields of LayoutParams. - * - * @param child Child to measure - * @param cellSize Size of one cell - * @param cellsRemaining Number of cells remaining that this view can expand to fill - * @param parentHeightMeasureSpec MeasureSpec used by the parent view - * @param parentHeightPadding Padding present in the parent view - * @return Number of cells this child was measured to occupy - */ - static int measureChildForCells(View child, int cellSize, int cellsRemaining, - int parentHeightMeasureSpec, int parentHeightPadding) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - final int childHeightSize = MeasureSpec.getSize(parentHeightMeasureSpec) - - parentHeightPadding; - final int childHeightMode = MeasureSpec.getMode(parentHeightMeasureSpec); - final int childHeightSpec = MeasureSpec.makeMeasureSpec(childHeightSize, childHeightMode); - - int cellsUsed = 0; - if (cellsRemaining > 0) { - final int childWidthSpec = MeasureSpec.makeMeasureSpec( - cellSize * cellsRemaining, MeasureSpec.AT_MOST); - child.measure(childWidthSpec, childHeightSpec); - - final int measuredWidth = child.getMeasuredWidth(); - cellsUsed = measuredWidth / cellSize; - if (measuredWidth % cellSize != 0) cellsUsed++; - } - - final ActionMenuItemView itemView = child instanceof ActionMenuItemView ? - (ActionMenuItemView) child : null; - final boolean expandable = !lp.isOverflowButton && itemView != null && itemView.hasText(); - lp.expandable = expandable; - - lp.cellsUsed = cellsUsed; - final int targetWidth = cellsUsed * cellSize; - child.measure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), - childHeightSpec); - return cellsUsed; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - if (!mFormatItems) { - super.onLayout(changed, left, top, right, bottom); - return; - } - - final int childCount = getChildCount(); - final int midVertical = (top + bottom) / 2; - final int dividerWidth = 0;//getDividerWidth(); - int overflowWidth = 0; - //UNUSED int nonOverflowWidth = 0; - int nonOverflowCount = 0; - int widthRemaining = right - left - getPaddingRight() - getPaddingLeft(); - boolean hasOverflow = false; - for (int i = 0; i < childCount; i++) { - final View v = getChildAt(i); - if (v.getVisibility() == GONE) { - continue; - } - - LayoutParams p = (LayoutParams) v.getLayoutParams(); - if (p.isOverflowButton) { - overflowWidth = v.getMeasuredWidth(); - if (hasDividerBeforeChildAt(i)) { - overflowWidth += dividerWidth; - } - - int height = v.getMeasuredHeight(); - int r = getWidth() - getPaddingRight() - p.rightMargin; - int l = r - overflowWidth; - int t = midVertical - (height / 2); - int b = t + height; - v.layout(l, t, r, b); - - widthRemaining -= overflowWidth; - hasOverflow = true; - } else { - final int size = v.getMeasuredWidth() + p.leftMargin + p.rightMargin; - //UNUSED nonOverflowWidth += size; - widthRemaining -= size; - //if (hasDividerBeforeChildAt(i)) { - //UNUSED nonOverflowWidth += dividerWidth; - //} - nonOverflowCount++; - } - } - - if (childCount == 1 && !hasOverflow) { - // Center a single child - final View v = getChildAt(0); - final int width = v.getMeasuredWidth(); - final int height = v.getMeasuredHeight(); - final int midHorizontal = (right - left) / 2; - final int l = midHorizontal - width / 2; - final int t = midVertical - height / 2; - v.layout(l, t, l + width, t + height); - return; - } - - final int spacerCount = nonOverflowCount - (hasOverflow ? 0 : 1); - final int spacerSize = Math.max(0, spacerCount > 0 ? widthRemaining / spacerCount : 0); - - int startLeft = getPaddingLeft(); - for (int i = 0; i < childCount; i++) { - final View v = getChildAt(i); - final LayoutParams lp = (LayoutParams) v.getLayoutParams(); - if (v.getVisibility() == GONE || lp.isOverflowButton) { - continue; - } - - startLeft += lp.leftMargin; - int width = v.getMeasuredWidth(); - int height = v.getMeasuredHeight(); - int t = midVertical - height / 2; - v.layout(startLeft, t, startLeft + width, t + height); - startLeft += width + lp.rightMargin + spacerSize; - } - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mPresenter.dismissPopupMenus(); - } - - public boolean isOverflowReserved() { - return mReserveOverflow; - } - - public void setOverflowReserved(boolean reserveOverflow) { - mReserveOverflow = reserveOverflow; - } - - @Override - protected LayoutParams generateDefaultLayoutParams() { - LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - params.gravity = Gravity.CENTER_VERTICAL; - return params; - } - - @Override - public LayoutParams generateLayoutParams(AttributeSet attrs) { - return new LayoutParams(getContext(), attrs); - } - - @Override - protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - if (p instanceof LayoutParams) { - LayoutParams result = new LayoutParams((LayoutParams) p); - if (result.gravity <= Gravity.NO_GRAVITY) { - result.gravity = Gravity.CENTER_VERTICAL; - } - return result; - } - return generateDefaultLayoutParams(); - } - - @Override - protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { - return p != null && p instanceof LayoutParams; - } - - public LayoutParams generateOverflowButtonLayoutParams() { - LayoutParams result = generateDefaultLayoutParams(); - result.isOverflowButton = true; - return result; - } - - public boolean invokeItem(MenuItemImpl item) { - return mMenu.performItemAction(item, 0); - } - - public int getWindowAnimations() { - return 0; - } - - public void initialize(MenuBuilder menu) { - mMenu = menu; - } - - //@Override - protected boolean hasDividerBeforeChildAt(int childIndex) { - if (childIndex == 0) { - return false; - } - final View childBefore = getChildAt(childIndex - 1); - final View child = getChildAt(childIndex); - boolean result = false; - if (childIndex < getChildCount() && childBefore instanceof ActionMenuChildView) { - result |= ((ActionMenuChildView) childBefore).needsDividerAfter(); - } - if (childIndex > 0 && child instanceof ActionMenuChildView) { - result |= ((ActionMenuChildView) child).needsDividerBefore(); - } - return result; - } - - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - return false; - } - - public interface ActionMenuChildView { - public boolean needsDividerBefore(); - public boolean needsDividerAfter(); - } - - public static class LayoutParams extends LinearLayout.LayoutParams { - public boolean isOverflowButton; - public int cellsUsed; - public int extraPixels; - public boolean expandable; - public boolean preventEdgeOffset; - - public boolean expanded; - - public LayoutParams(Context c, AttributeSet attrs) { - super(c, attrs); - } - - public LayoutParams(LayoutParams other) { - super((LinearLayout.LayoutParams) other); - isOverflowButton = other.isOverflowButton; - } - - public LayoutParams(int width, int height) { - super(width, height); - isOverflowButton = false; - } - - public LayoutParams(int width, int height, boolean isOverflowButton) { - super(width, height); - this.isOverflowButton = isOverflowButton; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java deleted file mode 100644 index 6da26f2ae..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * 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 com.actionbarsherlock.internal.view.menu; - -import java.util.ArrayList; -import android.content.Context; -import android.os.Build; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -/** - * Base class for MenuPresenters that have a consistent container view and item - * views. Behaves similarly to an AdapterView in that existing item views will - * be reused if possible when items change. - */ -public abstract class BaseMenuPresenter implements MenuPresenter { - private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; - - protected Context mSystemContext; - protected Context mContext; - protected MenuBuilder mMenu; - protected LayoutInflater mSystemInflater; - protected LayoutInflater mInflater; - private Callback mCallback; - - private int mMenuLayoutRes; - private int mItemLayoutRes; - - protected MenuView mMenuView; - - private int mId; - - /** - * Construct a new BaseMenuPresenter. - * - * @param context Context for generating system-supplied views - * @param menuLayoutRes Layout resource ID for the menu container view - * @param itemLayoutRes Layout resource ID for a single item view - */ - public BaseMenuPresenter(Context context, int menuLayoutRes, int itemLayoutRes) { - mSystemContext = context; - mSystemInflater = LayoutInflater.from(context); - mMenuLayoutRes = menuLayoutRes; - mItemLayoutRes = itemLayoutRes; - } - - @Override - public void initForMenu(Context context, MenuBuilder menu) { - mContext = context; - mInflater = LayoutInflater.from(mContext); - mMenu = menu; - } - - @Override - public MenuView getMenuView(ViewGroup root) { - if (mMenuView == null) { - mMenuView = (MenuView) mSystemInflater.inflate(mMenuLayoutRes, root, false); - mMenuView.initialize(mMenu); - updateMenuView(true); - } - - return mMenuView; - } - - /** - * Reuses item views when it can - */ - public void updateMenuView(boolean cleared) { - final ViewGroup parent = (ViewGroup) mMenuView; - if (parent == null) return; - - int childIndex = 0; - if (mMenu != null) { - mMenu.flagActionItems(); - ArrayList visibleItems = mMenu.getVisibleItems(); - final int itemCount = visibleItems.size(); - for (int i = 0; i < itemCount; i++) { - MenuItemImpl item = visibleItems.get(i); - if (shouldIncludeItem(childIndex, item)) { - final View convertView = parent.getChildAt(childIndex); - final MenuItemImpl oldItem = convertView instanceof MenuView.ItemView ? - ((MenuView.ItemView) convertView).getItemData() : null; - final View itemView = getItemView(item, convertView, parent); - if (item != oldItem) { - // Don't let old states linger with new data. - itemView.setPressed(false); - if (IS_HONEYCOMB) itemView.jumpDrawablesToCurrentState(); - } - if (itemView != convertView) { - addItemView(itemView, childIndex); - } - childIndex++; - } - } - } - - // Remove leftover views. - while (childIndex < parent.getChildCount()) { - if (!filterLeftoverView(parent, childIndex)) { - childIndex++; - } - } - } - - /** - * Add an item view at the given index. - * - * @param itemView View to add - * @param childIndex Index within the parent to insert at - */ - protected void addItemView(View itemView, int childIndex) { - final ViewGroup currentParent = (ViewGroup) itemView.getParent(); - if (currentParent != null) { - currentParent.removeView(itemView); - } - ((ViewGroup) mMenuView).addView(itemView, childIndex); - } - - /** - * Filter the child view at index and remove it if appropriate. - * @param parent Parent to filter from - * @param childIndex Index to filter - * @return true if the child view at index was removed - */ - protected boolean filterLeftoverView(ViewGroup parent, int childIndex) { - parent.removeViewAt(childIndex); - return true; - } - - public void setCallback(Callback cb) { - mCallback = cb; - } - - /** - * Create a new item view that can be re-bound to other item data later. - * - * @return The new item view - */ - public MenuView.ItemView createItemView(ViewGroup parent) { - return (MenuView.ItemView) mSystemInflater.inflate(mItemLayoutRes, parent, false); - } - - /** - * Prepare an item view for use. See AdapterView for the basic idea at work here. - * This may require creating a new item view, but well-behaved implementations will - * re-use the view passed as convertView if present. The returned view will be populated - * with data from the item parameter. - * - * @param item Item to present - * @param convertView Existing view to reuse - * @param parent Intended parent view - use for inflation. - * @return View that presents the requested menu item - */ - public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { - MenuView.ItemView itemView; - if (convertView instanceof MenuView.ItemView) { - itemView = (MenuView.ItemView) convertView; - } else { - itemView = createItemView(parent); - } - bindItemView(item, itemView); - return (View) itemView; - } - - /** - * Bind item data to an existing item view. - * - * @param item Item to bind - * @param itemView View to populate with item data - */ - public abstract void bindItemView(MenuItemImpl item, MenuView.ItemView itemView); - - /** - * Filter item by child index and item data. - * - * @param childIndex Indended presentation index of this item - * @param item Item to present - * @return true if this item should be included in this menu presentation; false otherwise - */ - public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { - return true; - } - - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - if (mCallback != null) { - mCallback.onCloseMenu(menu, allMenusAreClosing); - } - } - - public boolean onSubMenuSelected(SubMenuBuilder menu) { - if (mCallback != null) { - return mCallback.onOpenSubMenu(menu); - } - return false; - } - - public boolean flagActionItems() { - return false; - } - - public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { - return false; - } - - public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { - return false; - } - - public int getId() { - return mId; - } - - public void setId(int id) { - mId = id; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java deleted file mode 100644 index ac25c3736..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * 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 com.actionbarsherlock.R; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import android.widget.TextView; - -/** - * The item view for each item in the ListView-based MenuViews. - */ -public class ListMenuItemView extends LinearLayout implements MenuView.ItemView { - private MenuItemImpl mItemData; - - private ImageView mIconView; - private RadioButton mRadioButton; - private TextView mTitleView; - private CheckBox mCheckBox; - private TextView mShortcutView; - - private Drawable mBackground; - private int mTextAppearance; - private Context mTextAppearanceContext; - private boolean mPreserveIconSpacing; - - //UNUSED private int mMenuType; - - private LayoutInflater mInflater; - - private boolean mForceShowIcon; - - final Context mContext; - - public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs); - mContext = context; - - TypedArray a = - context.obtainStyledAttributes( - attrs, R.styleable.SherlockMenuView, defStyle, 0); - - mBackground = a.getDrawable(R.styleable.SherlockMenuView_itemBackground); - mTextAppearance = a.getResourceId(R.styleable. - SherlockMenuView_itemTextAppearance, -1); - mPreserveIconSpacing = a.getBoolean( - R.styleable.SherlockMenuView_preserveIconSpacing, false); - mTextAppearanceContext = context; - - a.recycle(); - } - - public ListMenuItemView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - setBackgroundDrawable(mBackground); - - mTitleView = (TextView) findViewById(R.id.abs__title); - if (mTextAppearance != -1) { - mTitleView.setTextAppearance(mTextAppearanceContext, - mTextAppearance); - } - - mShortcutView = (TextView) findViewById(R.id.abs__shortcut); - } - - public void initialize(MenuItemImpl itemData, int menuType) { - mItemData = itemData; - //UNUSED mMenuType = menuType; - - setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); - - setTitle(itemData.getTitleForItemView(this)); - setCheckable(itemData.isCheckable()); - setShortcut(itemData.shouldShowShortcut(), itemData.getShortcut()); - setIcon(itemData.getIcon()); - setEnabled(itemData.isEnabled()); - } - - public void setForceShowIcon(boolean forceShow) { - mPreserveIconSpacing = mForceShowIcon = forceShow; - } - - public void setTitle(CharSequence title) { - if (title != null) { - mTitleView.setText(title); - - if (mTitleView.getVisibility() != VISIBLE) mTitleView.setVisibility(VISIBLE); - } else { - if (mTitleView.getVisibility() != GONE) mTitleView.setVisibility(GONE); - } - } - - public MenuItemImpl getItemData() { - return mItemData; - } - - public void setCheckable(boolean checkable) { - - if (!checkable && mRadioButton == null && mCheckBox == null) { - return; - } - - if (mRadioButton == null) { - insertRadioButton(); - } - if (mCheckBox == null) { - insertCheckBox(); - } - - // Depending on whether its exclusive check or not, the checkbox or - // radio button will be the one in use (and the other will be otherCompoundButton) - final CompoundButton compoundButton; - final CompoundButton otherCompoundButton; - - if (mItemData.isExclusiveCheckable()) { - compoundButton = mRadioButton; - otherCompoundButton = mCheckBox; - } else { - compoundButton = mCheckBox; - otherCompoundButton = mRadioButton; - } - - if (checkable) { - compoundButton.setChecked(mItemData.isChecked()); - - final int newVisibility = checkable ? VISIBLE : GONE; - if (compoundButton.getVisibility() != newVisibility) { - compoundButton.setVisibility(newVisibility); - } - - // Make sure the other compound button isn't visible - if (otherCompoundButton.getVisibility() != GONE) { - otherCompoundButton.setVisibility(GONE); - } - } else { - mCheckBox.setVisibility(GONE); - mRadioButton.setVisibility(GONE); - } - } - - public void setChecked(boolean checked) { - CompoundButton compoundButton; - - if (mItemData.isExclusiveCheckable()) { - if (mRadioButton == null) { - insertRadioButton(); - } - compoundButton = mRadioButton; - } else { - if (mCheckBox == null) { - insertCheckBox(); - } - compoundButton = mCheckBox; - } - - compoundButton.setChecked(checked); - } - - public void setShortcut(boolean showShortcut, char shortcutKey) { - final int newVisibility = (showShortcut && mItemData.shouldShowShortcut()) - ? VISIBLE : GONE; - - if (newVisibility == VISIBLE) { - mShortcutView.setText(mItemData.getShortcutLabel()); - } - - if (mShortcutView.getVisibility() != newVisibility) { - mShortcutView.setVisibility(newVisibility); - } - } - - public void setIcon(Drawable icon) { - final boolean showIcon = mItemData.shouldShowIcon() || mForceShowIcon; - if (!showIcon && !mPreserveIconSpacing) { - return; - } - - if (mIconView == null && icon == null && !mPreserveIconSpacing) { - return; - } - - if (mIconView == null) { - insertIconView(); - } - - if (icon != null || mPreserveIconSpacing) { - mIconView.setImageDrawable(showIcon ? icon : null); - - if (mIconView.getVisibility() != VISIBLE) { - mIconView.setVisibility(VISIBLE); - } - } else { - mIconView.setVisibility(GONE); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (mIconView != null && mPreserveIconSpacing) { - // Enforce minimum icon spacing - ViewGroup.LayoutParams lp = getLayoutParams(); - LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); - if (lp.height > 0 && iconLp.width <= 0) { - iconLp.width = lp.height; - } - } - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - - private void insertIconView() { - LayoutInflater inflater = getInflater(); - mIconView = (ImageView) inflater.inflate(R.layout.abs__list_menu_item_icon, - this, false); - addView(mIconView, 0); - } - - private void insertRadioButton() { - LayoutInflater inflater = getInflater(); - mRadioButton = - (RadioButton) inflater.inflate(R.layout.abs__list_menu_item_radio, - this, false); - addView(mRadioButton); - } - - private void insertCheckBox() { - LayoutInflater inflater = getInflater(); - mCheckBox = - (CheckBox) inflater.inflate(R.layout.abs__list_menu_item_checkbox, - this, false); - addView(mCheckBox); - } - - public boolean prefersCondensedTitle() { - return false; - } - - public boolean showsIcon() { - return mForceShowIcon; - } - - private LayoutInflater getInflater() { - if (mInflater == null) { - mInflater = LayoutInflater.from(mContext); - } - return mInflater; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java deleted file mode 100644 index 179b8f037..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java +++ /dev/null @@ -1,1335 +0,0 @@ -/* - * 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 java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.os.Parcelable; -import android.util.SparseArray; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.KeyCharacterMap; -import android.view.KeyEvent; -import android.view.View; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -/** - * Implementation of the {@link android.view.Menu} interface for creating a - * standard menu UI. - */ -public class MenuBuilder implements Menu { - //UNUSED private static final String TAG = "MenuBuilder"; - - private static final String PRESENTER_KEY = "android:menu:presenters"; - private static final String ACTION_VIEW_STATES_KEY = "android:menu:actionviewstates"; - private static final String EXPANDED_ACTION_VIEW_ID = "android:menu:expandedactionview"; - - private static final int[] sCategoryToOrder = new int[] { - 1, /* No category */ - 4, /* CONTAINER */ - 5, /* SYSTEM */ - 3, /* SECONDARY */ - 2, /* ALTERNATIVE */ - 0, /* SELECTED_ALTERNATIVE */ - }; - - private final Context mContext; - private final Resources mResources; - - /** - * Whether the shortcuts should be qwerty-accessible. Use isQwertyMode() - * instead of accessing this directly. - */ - private boolean mQwertyMode; - - /** - * Whether the shortcuts should be visible on menus. Use isShortcutsVisible() - * instead of accessing this directly. - */ - private boolean mShortcutsVisible; - - /** - * Callback that will receive the various menu-related events generated by - * this class. Use getCallback to get a reference to the callback. - */ - private Callback mCallback; - - /** Contains all of the items for this menu */ - private ArrayList mItems; - - /** Contains only the items that are currently visible. This will be created/refreshed from - * {@link #getVisibleItems()} */ - private ArrayList mVisibleItems; - /** - * Whether or not the items (or any one item's shown state) has changed since it was last - * fetched from {@link #getVisibleItems()} - */ - private boolean mIsVisibleItemsStale; - - /** - * Contains only the items that should appear in the Action Bar, if present. - */ - private ArrayList mActionItems; - /** - * Contains items that should NOT appear in the Action Bar, if present. - */ - private ArrayList mNonActionItems; - - /** - * Whether or not the items (or any one item's action state) has changed since it was - * last fetched. - */ - private boolean mIsActionItemsStale; - - /** - * Default value for how added items should show in the action list. - */ - private int mDefaultShowAsAction = MenuItem.SHOW_AS_ACTION_NEVER; - - /** - * Current use case is Context Menus: As Views populate the context menu, each one has - * extra information that should be passed along. This is the current menu info that - * should be set on all items added to this menu. - */ - private ContextMenuInfo mCurrentMenuInfo; - - /** Header title for menu types that have a header (context and submenus) */ - CharSequence mHeaderTitle; - /** Header icon for menu types that have a header and support icons (context) */ - Drawable mHeaderIcon; - /** Header custom view for menu types that have a header and support custom views (context) */ - View mHeaderView; - - /** - * Contains the state of the View hierarchy for all menu views when the menu - * was frozen. - */ - //UNUSED private SparseArray mFrozenViewStates; - - /** - * Prevents onItemsChanged from doing its junk, useful for batching commands - * that may individually call onItemsChanged. - */ - private boolean mPreventDispatchingItemsChanged = false; - private boolean mItemsChangedWhileDispatchPrevented = false; - - private boolean mOptionalIconsVisible = false; - - private boolean mIsClosing = false; - - private ArrayList mTempShortcutItemList = new ArrayList(); - - private CopyOnWriteArrayList> mPresenters = - new CopyOnWriteArrayList>(); - - /** - * Currently expanded menu item; must be collapsed when we clear. - */ - private MenuItemImpl mExpandedItem; - - /** - * Called by menu to notify of close and selection changes. - */ - public interface Callback { - /** - * Called when a menu item is selected. - * @param menu The menu that is the parent of the item - * @param item The menu item that is selected - * @return whether the menu item selection was handled - */ - public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item); - - /** - * Called when the mode of the menu changes (for example, from icon to expanded). - * - * @param menu the menu that has changed modes - */ - public void onMenuModeChange(MenuBuilder menu); - } - - /** - * Called by menu items to execute their associated action - */ - public interface ItemInvoker { - public boolean invokeItem(MenuItemImpl item); - } - - public MenuBuilder(Context context) { - mContext = context; - mResources = context.getResources(); - - mItems = new ArrayList(); - - mVisibleItems = new ArrayList(); - mIsVisibleItemsStale = true; - - mActionItems = new ArrayList(); - mNonActionItems = new ArrayList(); - mIsActionItemsStale = true; - - setShortcutsVisibleInner(true); - } - - public MenuBuilder setDefaultShowAsAction(int defaultShowAsAction) { - mDefaultShowAsAction = defaultShowAsAction; - return this; - } - - /** - * Add a presenter to this menu. This will only hold a WeakReference; - * you do not need to explicitly remove a presenter, but you can using - * {@link #removeMenuPresenter(MenuPresenter)}. - * - * @param presenter The presenter to add - */ - public void addMenuPresenter(MenuPresenter presenter) { - mPresenters.add(new WeakReference(presenter)); - presenter.initForMenu(mContext, this); - mIsActionItemsStale = true; - } - - /** - * Remove a presenter from this menu. That presenter will no longer - * receive notifications of updates to this menu's data. - * - * @param presenter The presenter to remove - */ - public void removeMenuPresenter(MenuPresenter presenter) { - for (WeakReference ref : mPresenters) { - final MenuPresenter item = ref.get(); - if (item == null || item == presenter) { - mPresenters.remove(ref); - } - } - } - - private void dispatchPresenterUpdate(boolean cleared) { - if (mPresenters.isEmpty()) return; - - stopDispatchingItemsChanged(); - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else { - presenter.updateMenuView(cleared); - } - } - startDispatchingItemsChanged(); - } - - private boolean dispatchSubMenuSelected(SubMenuBuilder subMenu) { - if (mPresenters.isEmpty()) return false; - - boolean result = false; - - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else if (!result) { - result = presenter.onSubMenuSelected(subMenu); - } - } - return result; - } - - private void dispatchSaveInstanceState(Bundle outState) { - if (mPresenters.isEmpty()) return; - - SparseArray presenterStates = new SparseArray(); - - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else { - final int id = presenter.getId(); - if (id > 0) { - final Parcelable state = presenter.onSaveInstanceState(); - if (state != null) { - presenterStates.put(id, state); - } - } - } - } - - outState.putSparseParcelableArray(PRESENTER_KEY, presenterStates); - } - - private void dispatchRestoreInstanceState(Bundle state) { - SparseArray presenterStates = state.getSparseParcelableArray(PRESENTER_KEY); - - if (presenterStates == null || mPresenters.isEmpty()) return; - - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else { - final int id = presenter.getId(); - if (id > 0) { - Parcelable parcel = presenterStates.get(id); - if (parcel != null) { - presenter.onRestoreInstanceState(parcel); - } - } - } - } - } - - public void savePresenterStates(Bundle outState) { - dispatchSaveInstanceState(outState); - } - - public void restorePresenterStates(Bundle state) { - dispatchRestoreInstanceState(state); - } - - public void saveActionViewStates(Bundle outStates) { - SparseArray viewStates = null; - - final int itemCount = size(); - for (int i = 0; i < itemCount; i++) { - final MenuItem item = getItem(i); - final View v = item.getActionView(); - if (v != null && v.getId() != View.NO_ID) { - if (viewStates == null) { - viewStates = new SparseArray(); - } - v.saveHierarchyState(viewStates); - if (item.isActionViewExpanded()) { - outStates.putInt(EXPANDED_ACTION_VIEW_ID, item.getItemId()); - } - } - if (item.hasSubMenu()) { - final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); - subMenu.saveActionViewStates(outStates); - } - } - - if (viewStates != null) { - outStates.putSparseParcelableArray(getActionViewStatesKey(), viewStates); - } - } - - public void restoreActionViewStates(Bundle states) { - if (states == null) { - return; - } - - SparseArray viewStates = states.getSparseParcelableArray( - getActionViewStatesKey()); - - final int itemCount = size(); - for (int i = 0; i < itemCount; i++) { - final MenuItem item = getItem(i); - final View v = item.getActionView(); - if (v != null && v.getId() != View.NO_ID) { - v.restoreHierarchyState(viewStates); - } - if (item.hasSubMenu()) { - final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); - subMenu.restoreActionViewStates(states); - } - } - - final int expandedId = states.getInt(EXPANDED_ACTION_VIEW_ID); - if (expandedId > 0) { - MenuItem itemToExpand = findItem(expandedId); - if (itemToExpand != null) { - itemToExpand.expandActionView(); - } - } - } - - protected String getActionViewStatesKey() { - return ACTION_VIEW_STATES_KEY; - } - - public void setCallback(Callback cb) { - mCallback = cb; - } - - /** - * Adds an item to the menu. The other add methods funnel to this. - */ - private MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) { - final int ordering = getOrdering(categoryOrder); - - final MenuItemImpl item = new MenuItemImpl(this, group, id, categoryOrder, - ordering, title, mDefaultShowAsAction); - - if (mCurrentMenuInfo != null) { - // Pass along the current menu info - item.setMenuInfo(mCurrentMenuInfo); - } - - mItems.add(findInsertIndex(mItems, ordering), item); - onItemsChanged(true); - - return item; - } - - public MenuItem add(CharSequence title) { - return addInternal(0, 0, 0, title); - } - - public MenuItem add(int titleRes) { - return addInternal(0, 0, 0, mResources.getString(titleRes)); - } - - public MenuItem add(int group, int id, int categoryOrder, CharSequence title) { - return addInternal(group, id, categoryOrder, title); - } - - public MenuItem add(int group, int id, int categoryOrder, int title) { - return addInternal(group, id, categoryOrder, mResources.getString(title)); - } - - public SubMenu addSubMenu(CharSequence title) { - return addSubMenu(0, 0, 0, title); - } - - public SubMenu addSubMenu(int titleRes) { - return addSubMenu(0, 0, 0, mResources.getString(titleRes)); - } - - public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) { - final MenuItemImpl item = (MenuItemImpl) addInternal(group, id, categoryOrder, title); - final SubMenuBuilder subMenu = new SubMenuBuilder(mContext, this, item); - item.setSubMenu(subMenu); - - return subMenu; - } - - public SubMenu addSubMenu(int group, int id, int categoryOrder, int title) { - return addSubMenu(group, id, categoryOrder, mResources.getString(title)); - } - - public int addIntentOptions(int group, int id, int categoryOrder, ComponentName caller, - Intent[] specifics, Intent intent, int flags, 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(group); - } - - for (int i=0; i= 0) { - outSpecificItems[ri.specificIndex] = item; - } - } - - return N; - } - - public void removeItem(int id) { - removeItemAtInt(findItemIndex(id), true); - } - - public void removeGroup(int group) { - final int i = findGroupIndex(group); - - if (i >= 0) { - final int maxRemovable = mItems.size() - i; - int numRemoved = 0; - while ((numRemoved++ < maxRemovable) && (mItems.get(i).getGroupId() == group)) { - // Don't force update for each one, this method will do it at the end - removeItemAtInt(i, false); - } - - // Notify menu views - onItemsChanged(true); - } - } - - /** - * Remove the item at the given index and optionally forces menu views to - * update. - * - * @param index The index of the item to be removed. If this index is - * invalid an exception is thrown. - * @param updateChildrenOnMenuViews Whether to force update on menu views. - * Please make sure you eventually call this after your batch of - * removals. - */ - private void removeItemAtInt(int index, boolean updateChildrenOnMenuViews) { - if ((index < 0) || (index >= mItems.size())) return; - - mItems.remove(index); - - if (updateChildrenOnMenuViews) onItemsChanged(true); - } - - public void removeItemAt(int index) { - removeItemAtInt(index, true); - } - - public void clearAll() { - mPreventDispatchingItemsChanged = true; - clear(); - clearHeader(); - mPreventDispatchingItemsChanged = false; - mItemsChangedWhileDispatchPrevented = false; - onItemsChanged(true); - } - - public void clear() { - if (mExpandedItem != null) { - collapseItemActionView(mExpandedItem); - } - mItems.clear(); - - onItemsChanged(true); - } - - 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); - } - } - } - - public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { - final int N = mItems.size(); - - for (int i = 0; i < N; i++) { - MenuItemImpl item = mItems.get(i); - if (item.getGroupId() == group) { - item.setExclusiveCheckable(exclusive); - item.setCheckable(checkable); - } - } - } - - public void setGroupVisible(int group, boolean visible) { - final int N = mItems.size(); - - // We handle the notification of items being changed ourselves, so we use setVisibleInt rather - // than setVisible and at the end notify of items being changed - - boolean changedAtLeastOneItem = false; - for (int i = 0; i < N; i++) { - MenuItemImpl item = mItems.get(i); - if (item.getGroupId() == group) { - if (item.setVisibleInt(visible)) changedAtLeastOneItem = true; - } - } - - if (changedAtLeastOneItem) onItemsChanged(true); - } - - public void setGroupEnabled(int group, boolean enabled) { - final int N = mItems.size(); - - for (int i = 0; i < N; i++) { - MenuItemImpl item = mItems.get(i); - if (item.getGroupId() == group) { - item.setEnabled(enabled); - } - } - } - - public boolean hasVisibleItems() { - final int size = size(); - - for (int i = 0; i < size; i++) { - MenuItemImpl item = mItems.get(i); - if (item.isVisible()) { - return true; - } - } - - return false; - } - - public MenuItem findItem(int id) { - final int size = size(); - for (int i = 0; i < size; i++) { - MenuItemImpl item = mItems.get(i); - if (item.getItemId() == id) { - return item; - } else if (item.hasSubMenu()) { - MenuItem possibleItem = item.getSubMenu().findItem(id); - - if (possibleItem != null) { - return possibleItem; - } - } - } - - return null; - } - - public int findItemIndex(int id) { - final int size = size(); - - for (int i = 0; i < size; i++) { - MenuItemImpl item = mItems.get(i); - if (item.getItemId() == id) { - return i; - } - } - - return -1; - } - - public int findGroupIndex(int group) { - return findGroupIndex(group, 0); - } - - public int findGroupIndex(int group, int start) { - final int size = size(); - - if (start < 0) { - start = 0; - } - - for (int i = start; i < size; i++) { - final MenuItemImpl item = mItems.get(i); - - if (item.getGroupId() == group) { - return i; - } - } - - return -1; - } - - public int size() { - return mItems.size(); - } - - /** {@inheritDoc} */ - public MenuItem getItem(int index) { - return mItems.get(index); - } - - public boolean isShortcutKey(int keyCode, KeyEvent event) { - return findItemWithShortcutForKey(keyCode, event) != null; - } - - public void setQwertyMode(boolean isQwerty) { - mQwertyMode = isQwerty; - - onItemsChanged(false); - } - - /** - * 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 >= sCategoryToOrder.length) { - throw new IllegalArgumentException("order does not contain a valid category."); - } - - return (sCategoryToOrder[index] << CATEGORY_SHIFT) | (categoryOrder & USER_MASK); - } - - /** - * @return whether the menu shortcuts are in qwerty mode or not - */ - boolean isQwertyMode() { - return mQwertyMode; - } - - /** - * Sets whether the shortcuts should be visible on menus. Devices without hardware - * key input will never make shortcuts visible even if this method is passed 'true'. - * - * @param shortcutsVisible Whether shortcuts should be visible (if true and a - * menu item does not have a shortcut defined, that item will - * still NOT show a shortcut) - */ - public void setShortcutsVisible(boolean shortcutsVisible) { - if (mShortcutsVisible == shortcutsVisible) return; - - setShortcutsVisibleInner(shortcutsVisible); - onItemsChanged(false); - } - - private void setShortcutsVisibleInner(boolean shortcutsVisible) { - mShortcutsVisible = shortcutsVisible - && mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS - && mResources.getBoolean( - R.bool.abs__config_showMenuShortcutsWhenKeyboardPresent); - } - - /** - * @return Whether shortcuts should be visible on menus. - */ - public boolean isShortcutsVisible() { - return mShortcutsVisible; - } - - Resources getResources() { - return mResources; - } - - public Context getContext() { - return mContext; - } - - boolean dispatchMenuItemSelected(MenuBuilder menu, MenuItem item) { - return mCallback != null && mCallback.onMenuItemSelected(menu, item); - } - - /** - * Dispatch a mode change event to this menu's callback. - */ - public void changeMenuMode() { - if (mCallback != null) { - mCallback.onMenuModeChange(this); - } - } - - 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; - } - - public boolean performShortcut(int keyCode, KeyEvent event, int flags) { - final MenuItemImpl item = findItemWithShortcutForKey(keyCode, event); - - boolean handled = false; - - if (item != null) { - handled = performItemAction(item, flags); - } - - if ((flags & FLAG_ALWAYS_PERFORM_CLOSE) != 0) { - close(true); - } - - return handled; - } - - /* - * This function will return all the menu and sub-menu items that can - * be directly (the shortcut directly corresponds) and indirectly - * (the ALT-enabled char corresponds to the shortcut) associated - * with the keyCode. - */ - @SuppressWarnings("deprecation") - void findItemsWithShortcutForKey(List items, int keyCode, KeyEvent event) { - final boolean qwerty = isQwertyMode(); - final int metaState = event.getMetaState(); - final KeyCharacterMap.KeyData possibleChars = new KeyCharacterMap.KeyData(); - // Get the chars associated with the keyCode (i.e using any chording combo) - final boolean isKeyCodeMapped = event.getKeyData(possibleChars); - // The delete key is not mapped to '\b' so we treat it specially - if (!isKeyCodeMapped && (keyCode != KeyEvent.KEYCODE_DEL)) { - return; - } - - // Look for an item whose shortcut is this key. - final int N = mItems.size(); - for (int i = 0; i < N; i++) { - MenuItemImpl item = mItems.get(i); - if (item.hasSubMenu()) { - ((MenuBuilder)item.getSubMenu()).findItemsWithShortcutForKey(items, keyCode, event); - } - final char shortcutChar = qwerty ? item.getAlphabeticShortcut() : item.getNumericShortcut(); - if (((metaState & (KeyEvent.META_SHIFT_ON | KeyEvent.META_SYM_ON)) == 0) && - (shortcutChar != 0) && - (shortcutChar == possibleChars.meta[0] - || shortcutChar == possibleChars.meta[2] - || (qwerty && shortcutChar == '\b' && - keyCode == KeyEvent.KEYCODE_DEL)) && - item.isEnabled()) { - items.add(item); - } - } - } - - /* - * We want to return the menu item associated with the key, but if there is no - * ambiguity (i.e. there is only one menu item corresponding to the key) we want - * to return it even if it's not an exact match; this allow the user to - * _not_ use the ALT key for example, making the use of shortcuts slightly more - * user-friendly. An example is on the G1, '!' and '1' are on the same key, and - * in Gmail, Menu+1 will trigger Menu+! (the actual shortcut). - * - * On the other hand, if two (or more) shortcuts corresponds to the same key, - * we have to only return the exact match. - */ - @SuppressWarnings("deprecation") - MenuItemImpl findItemWithShortcutForKey(int keyCode, KeyEvent event) { - // Get all items that can be associated directly or indirectly with the keyCode - ArrayList items = mTempShortcutItemList; - items.clear(); - findItemsWithShortcutForKey(items, keyCode, event); - - if (items.isEmpty()) { - return null; - } - - final int metaState = event.getMetaState(); - final KeyCharacterMap.KeyData possibleChars = new KeyCharacterMap.KeyData(); - // Get the chars associated with the keyCode (i.e using any chording combo) - event.getKeyData(possibleChars); - - // If we have only one element, we can safely returns it - final int size = items.size(); - if (size == 1) { - return items.get(0); - } - - final boolean qwerty = isQwertyMode(); - // If we found more than one item associated with the key, - // we have to return the exact match - for (int i = 0; i < size; i++) { - final MenuItemImpl item = items.get(i); - final char shortcutChar = qwerty ? item.getAlphabeticShortcut() : - item.getNumericShortcut(); - if ((shortcutChar == possibleChars.meta[0] && - (metaState & KeyEvent.META_ALT_ON) == 0) - || (shortcutChar == possibleChars.meta[2] && - (metaState & KeyEvent.META_ALT_ON) != 0) - || (qwerty && shortcutChar == '\b' && - keyCode == KeyEvent.KEYCODE_DEL)) { - return item; - } - } - return null; - } - - public boolean performIdentifierAction(int id, int flags) { - // Look for an item whose identifier is the id. - return performItemAction(findItem(id), flags); - } - - public boolean performItemAction(MenuItem item, int flags) { - MenuItemImpl itemImpl = (MenuItemImpl) item; - - if (itemImpl == null || !itemImpl.isEnabled()) { - return false; - } - - boolean invoked = itemImpl.invoke(); - - if (itemImpl.hasCollapsibleActionView()) { - invoked |= itemImpl.expandActionView(); - if (invoked) close(true); - } else if (item.hasSubMenu()) { - close(false); - - final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); - final ActionProvider provider = item.getActionProvider(); - if (provider != null && provider.hasSubMenu()) { - provider.onPrepareSubMenu(subMenu); - } - invoked |= dispatchSubMenuSelected(subMenu); - if (!invoked) close(true); - } else { - if ((flags & FLAG_PERFORM_NO_CLOSE) == 0) { - close(true); - } - } - - return invoked; - } - - /** - * Closes the visible menu. - * - * @param allMenusAreClosing Whether the menus are completely closing (true), - * or whether there is another menu coming in this menu's place - * (false). For example, if the menu is closing because a - * sub menu is about to be shown, allMenusAreClosing - * is false. - */ - final void close(boolean allMenusAreClosing) { - if (mIsClosing) return; - - mIsClosing = true; - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else { - presenter.onCloseMenu(this, allMenusAreClosing); - } - } - mIsClosing = false; - } - - /** {@inheritDoc} */ - public void close() { - close(true); - } - - /** - * Called when an item is added or removed. - * - * @param structureChanged true if the menu structure changed, - * false if only item properties changed. - * (Visibility is a structural property since it affects layout.) - */ - void onItemsChanged(boolean structureChanged) { - if (!mPreventDispatchingItemsChanged) { - if (structureChanged) { - mIsVisibleItemsStale = true; - mIsActionItemsStale = true; - } - - dispatchPresenterUpdate(structureChanged); - } else { - mItemsChangedWhileDispatchPrevented = true; - } - } - - /** - * Stop dispatching item changed events to presenters until - * {@link #startDispatchingItemsChanged()} is called. Useful when - * many menu operations are going to be performed as a batch. - */ - public void stopDispatchingItemsChanged() { - if (!mPreventDispatchingItemsChanged) { - mPreventDispatchingItemsChanged = true; - mItemsChangedWhileDispatchPrevented = false; - } - } - - public void startDispatchingItemsChanged() { - mPreventDispatchingItemsChanged = false; - - if (mItemsChangedWhileDispatchPrevented) { - mItemsChangedWhileDispatchPrevented = false; - onItemsChanged(true); - } - } - - /** - * Called by {@link MenuItemImpl} when its visible flag is changed. - * @param item The item that has gone through a visibility change. - */ - void onItemVisibleChanged(MenuItemImpl item) { - // Notify of items being changed - mIsVisibleItemsStale = true; - onItemsChanged(true); - } - - /** - * Called by {@link MenuItemImpl} when its action request status is changed. - * @param item The item that has gone through a change in action request status. - */ - void onItemActionRequestChanged(MenuItemImpl item) { - // Notify of items being changed - mIsActionItemsStale = true; - onItemsChanged(true); - } - - ArrayList getVisibleItems() { - if (!mIsVisibleItemsStale) return mVisibleItems; - - // Refresh the visible items - mVisibleItems.clear(); - - final int itemsSize = mItems.size(); - MenuItemImpl item; - for (int i = 0; i < itemsSize; i++) { - item = mItems.get(i); - if (item.isVisible()) mVisibleItems.add(item); - } - - mIsVisibleItemsStale = false; - mIsActionItemsStale = true; - - return mVisibleItems; - } - - /** - * This method determines which menu items get to be 'action items' that will appear - * in an action bar and which items should be 'overflow items' in a secondary menu. - * The rules are as follows: - * - *

Items are considered for inclusion in the order specified within the menu. - * There is a limit of mMaxActionItems as a total count, optionally including the overflow - * menu button itself. This is a soft limit; if an item shares a group ID with an item - * previously included as an action item, the new item will stay with its group and become - * an action item itself even if it breaks the max item count limit. This is done to - * limit the conceptual complexity of the items presented within an action bar. Only a few - * unrelated concepts should be presented to the user in this space, and groups are treated - * as a single concept. - * - *

There is also a hard limit of consumed measurable space: mActionWidthLimit. This - * limit may be broken by a single item that exceeds the remaining space, but no further - * items may be added. If an item that is part of a group cannot fit within the remaining - * measured width, the entire group will be demoted to overflow. This is done to ensure room - * for navigation and other affordances in the action bar as well as reduce general UI clutter. - * - *

The space freed by demoting a full group cannot be consumed by future menu items. - * Once items begin to overflow, all future items become overflow items as well. This is - * to avoid inadvertent reordering that may break the app's intended design. - */ - public void flagActionItems() { - if (!mIsActionItemsStale) { - return; - } - - // Presenters flag action items as needed. - boolean flagged = false; - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else { - flagged |= presenter.flagActionItems(); - } - } - - if (flagged) { - mActionItems.clear(); - mNonActionItems.clear(); - ArrayList visibleItems = getVisibleItems(); - final int itemsSize = visibleItems.size(); - for (int i = 0; i < itemsSize; i++) { - MenuItemImpl item = visibleItems.get(i); - if (item.isActionButton()) { - mActionItems.add(item); - } else { - mNonActionItems.add(item); - } - } - } else { - // Nobody flagged anything, everything is a non-action item. - // (This happens during a first pass with no action-item presenters.) - mActionItems.clear(); - mNonActionItems.clear(); - mNonActionItems.addAll(getVisibleItems()); - } - mIsActionItemsStale = false; - } - - ArrayList getActionItems() { - flagActionItems(); - return mActionItems; - } - - ArrayList getNonActionItems() { - flagActionItems(); - return mNonActionItems; - } - - public void clearHeader() { - mHeaderIcon = null; - mHeaderTitle = null; - mHeaderView = null; - - onItemsChanged(false); - } - - private void setHeaderInternal(final int titleRes, final CharSequence title, final int iconRes, - final Drawable icon, final View view) { - final Resources r = getResources(); - - if (view != null) { - mHeaderView = view; - - // If using a custom view, then the title and icon aren't used - mHeaderTitle = null; - mHeaderIcon = null; - } else { - if (titleRes > 0) { - mHeaderTitle = r.getText(titleRes); - } else if (title != null) { - mHeaderTitle = title; - } - - if (iconRes > 0) { - mHeaderIcon = r.getDrawable(iconRes); - } else if (icon != null) { - mHeaderIcon = icon; - } - - // If using the title or icon, then a custom view isn't used - mHeaderView = null; - } - - // Notify of change - onItemsChanged(false); - } - - /** - * Sets the header's title. This replaces the header view. Called by the - * builder-style methods of subclasses. - * - * @param title The new title. - * @return This MenuBuilder so additional setters can be called. - */ - protected MenuBuilder setHeaderTitleInt(CharSequence title) { - setHeaderInternal(0, title, 0, null, null); - return this; - } - - /** - * Sets the header's title. This replaces the header view. Called by the - * builder-style methods of subclasses. - * - * @param titleRes The new title (as a resource ID). - * @return This MenuBuilder so additional setters can be called. - */ - protected MenuBuilder setHeaderTitleInt(int titleRes) { - setHeaderInternal(titleRes, null, 0, null, null); - return this; - } - - /** - * Sets the header's icon. This replaces the header view. Called by the - * builder-style methods of subclasses. - * - * @param icon The new icon. - * @return This MenuBuilder so additional setters can be called. - */ - protected MenuBuilder setHeaderIconInt(Drawable icon) { - setHeaderInternal(0, null, 0, icon, null); - return this; - } - - /** - * Sets the header's icon. This replaces the header view. Called by the - * builder-style methods of subclasses. - * - * @param iconRes The new icon (as a resource ID). - * @return This MenuBuilder so additional setters can be called. - */ - protected MenuBuilder setHeaderIconInt(int iconRes) { - setHeaderInternal(0, null, iconRes, null, null); - return this; - } - - /** - * Sets the header's view. This replaces the title and icon. Called by the - * builder-style methods of subclasses. - * - * @param view The new view. - * @return This MenuBuilder so additional setters can be called. - */ - protected MenuBuilder setHeaderViewInt(View view) { - setHeaderInternal(0, null, 0, null, view); - return this; - } - - public CharSequence getHeaderTitle() { - return mHeaderTitle; - } - - public Drawable getHeaderIcon() { - return mHeaderIcon; - } - - public View getHeaderView() { - return mHeaderView; - } - - /** - * Gets the root menu (if this is a submenu, find its root menu). - * @return The root menu. - */ - public MenuBuilder getRootMenu() { - return this; - } - - /** - * Sets the current menu info that is set on all items added to this menu - * (until this is called again with different menu info, in which case that - * one will be added to all subsequent item additions). - * - * @param menuInfo The extra menu information to add. - */ - public void setCurrentMenuInfo(ContextMenuInfo menuInfo) { - mCurrentMenuInfo = menuInfo; - } - - void setOptionalIconsVisible(boolean visible) { - mOptionalIconsVisible = visible; - } - - boolean getOptionalIconsVisible() { - return mOptionalIconsVisible; - } - - public boolean expandItemActionView(MenuItemImpl item) { - if (mPresenters.isEmpty()) return false; - - boolean expanded = false; - - stopDispatchingItemsChanged(); - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else if ((expanded = presenter.expandItemActionView(this, item))) { - break; - } - } - startDispatchingItemsChanged(); - - if (expanded) { - mExpandedItem = item; - } - return expanded; - } - - public boolean collapseItemActionView(MenuItemImpl item) { - if (mPresenters.isEmpty() || mExpandedItem != item) return false; - - boolean collapsed = false; - - stopDispatchingItemsChanged(); - for (WeakReference ref : mPresenters) { - final MenuPresenter presenter = ref.get(); - if (presenter == null) { - mPresenters.remove(ref); - } else if ((collapsed = presenter.collapseItemActionView(this, item))) { - break; - } - } - startDispatchingItemsChanged(); - - if (collapsed) { - mExpandedItem = null; - } - return collapsed; - } - - public MenuItemImpl getExpandedItem() { - return mExpandedItem; - } - - public boolean bindNativeOverflow(android.view.Menu menu, android.view.MenuItem.OnMenuItemClickListener listener, HashMap map) { - final List nonActionItems = getNonActionItems(); - if (nonActionItems == null || nonActionItems.size() == 0) { - return false; - } - - boolean visible = false; - menu.clear(); - for (MenuItemImpl nonActionItem : nonActionItems) { - if (!nonActionItem.isVisible()) { - continue; - } - visible = true; - - android.view.MenuItem nativeItem; - if (nonActionItem.hasSubMenu()) { - android.view.SubMenu nativeSub = menu.addSubMenu(nonActionItem.getGroupId(), nonActionItem.getItemId(), - nonActionItem.getOrder(), nonActionItem.getTitle()); - - SubMenuBuilder subMenu = (SubMenuBuilder)nonActionItem.getSubMenu(); - for (MenuItemImpl subItem : subMenu.getVisibleItems()) { - android.view.MenuItem nativeSubItem = nativeSub.add(subItem.getGroupId(), subItem.getItemId(), - subItem.getOrder(), subItem.getTitle()); - - nativeSubItem.setIcon(subItem.getIcon()); - nativeSubItem.setOnMenuItemClickListener(listener); - nativeSubItem.setEnabled(subItem.isEnabled()); - nativeSubItem.setIntent(subItem.getIntent()); - nativeSubItem.setNumericShortcut(subItem.getNumericShortcut()); - nativeSubItem.setAlphabeticShortcut(subItem.getAlphabeticShortcut()); - nativeSubItem.setTitleCondensed(subItem.getTitleCondensed()); - nativeSubItem.setCheckable(subItem.isCheckable()); - nativeSubItem.setChecked(subItem.isChecked()); - - if (subItem.isExclusiveCheckable()) { - nativeSub.setGroupCheckable(subItem.getGroupId(), true, true); - } - - map.put(nativeSubItem, subItem); - } - - nativeItem = nativeSub.getItem(); - } else { - nativeItem = menu.add(nonActionItem.getGroupId(), nonActionItem.getItemId(), - nonActionItem.getOrder(), nonActionItem.getTitle()); - } - nativeItem.setIcon(nonActionItem.getIcon()); - nativeItem.setOnMenuItemClickListener(listener); - nativeItem.setEnabled(nonActionItem.isEnabled()); - nativeItem.setIntent(nonActionItem.getIntent()); - nativeItem.setNumericShortcut(nonActionItem.getNumericShortcut()); - nativeItem.setAlphabeticShortcut(nonActionItem.getAlphabeticShortcut()); - nativeItem.setTitleCondensed(nonActionItem.getTitleCondensed()); - nativeItem.setCheckable(nonActionItem.isCheckable()); - nativeItem.setChecked(nonActionItem.isChecked()); - - if (nonActionItem.isExclusiveCheckable()) { - menu.setGroupCheckable(nonActionItem.getGroupId(), true, true); - } - - map.put(nativeItem, nonActionItem); - } - return visible; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java deleted file mode 100644 index f5359fb40..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java +++ /dev/null @@ -1,647 +0,0 @@ -/* - * 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.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.util.Log; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewDebug; -import android.widget.LinearLayout; - -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -/** - * @hide - */ -public final class MenuItemImpl implements MenuItem { - private static final String TAG = "MenuItemImpl"; - - private static final int SHOW_AS_ACTION_MASK = SHOW_AS_ACTION_NEVER | - SHOW_AS_ACTION_IF_ROOM | - SHOW_AS_ACTION_ALWAYS; - - private final int mId; - private final int mGroup; - private final int mCategoryOrder; - private final int mOrdering; - private CharSequence mTitle; - private CharSequence mTitleCondensed; - private Intent mIntent; - private char mShortcutNumericChar; - private char mShortcutAlphabeticChar; - - /** The icon's drawable which is only created as needed */ - private Drawable mIconDrawable; - /** - * The icon's resource ID which is used to get the Drawable when it is - * needed (if the Drawable isn't already obtained--only one of the two is - * needed). - */ - private int mIconResId = NO_ICON; - - /** The menu to which this item belongs */ - private MenuBuilder mMenu; - /** If this item should launch a sub menu, this is the sub menu to launch */ - private SubMenuBuilder mSubMenu; - - private Runnable mItemCallback; - private MenuItem.OnMenuItemClickListener mClickListener; - - private int mFlags = ENABLED; - private static final int CHECKABLE = 0x00000001; - private static final int CHECKED = 0x00000002; - private static final int EXCLUSIVE = 0x00000004; - private static final int HIDDEN = 0x00000008; - private static final int ENABLED = 0x00000010; - private static final int IS_ACTION = 0x00000020; - - private int mShowAsAction = SHOW_AS_ACTION_NEVER; - - private View mActionView; - private ActionProvider mActionProvider; - private OnActionExpandListener mOnActionExpandListener; - private boolean mIsActionViewExpanded = false; - - /** Used for the icon resource ID if this item does not have an icon */ - static final int NO_ICON = 0; - - /** - * Current use case is for context menu: Extra information linked to the - * View that added this item to the context menu. - */ - private ContextMenuInfo mMenuInfo; - - private static String sPrependShortcutLabel; - private static String sEnterShortcutLabel; - private static String sDeleteShortcutLabel; - private static String sSpaceShortcutLabel; - - - /** - * Instantiates this menu item. - * - * @param menu - * @param group Item ordering grouping control. The item will be added after - * all other items whose order is <= this number, and before any - * that are larger than it. This can also be used to define - * groups of items for batch state changes. Normally use 0. - * @param id Unique item ID. Use 0 if you do not need a unique ID. - * @param categoryOrder The ordering for this item. - * @param title The text to display for the item. - */ - MenuItemImpl(MenuBuilder menu, int group, int id, int categoryOrder, int ordering, - CharSequence title, int showAsAction) { - - /* TODO if (sPrependShortcutLabel == null) { - // This is instantiated from the UI thread, so no chance of sync issues - sPrependShortcutLabel = menu.getContext().getResources().getString( - com.android.internal.R.string.prepend_shortcut_label); - sEnterShortcutLabel = menu.getContext().getResources().getString( - com.android.internal.R.string.menu_enter_shortcut_label); - sDeleteShortcutLabel = menu.getContext().getResources().getString( - com.android.internal.R.string.menu_delete_shortcut_label); - sSpaceShortcutLabel = menu.getContext().getResources().getString( - com.android.internal.R.string.menu_space_shortcut_label); - }*/ - - mMenu = menu; - mId = id; - mGroup = group; - mCategoryOrder = categoryOrder; - mOrdering = ordering; - mTitle = title; - mShowAsAction = showAsAction; - } - - /** - * Invokes the item by calling various listeners or callbacks. - * - * @return true if the invocation was handled, false otherwise - */ - public boolean invoke() { - if (mClickListener != null && - mClickListener.onMenuItemClick(this)) { - return true; - } - - if (mMenu.dispatchMenuItemSelected(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); - } - } - - if (mActionProvider != null && mActionProvider.onPerformDefaultAction()) { - return true; - } - - return false; - } - - public boolean isEnabled() { - return (mFlags & ENABLED) != 0; - } - - public MenuItem setEnabled(boolean enabled) { - if (enabled) { - mFlags |= ENABLED; - } else { - mFlags &= ~ENABLED; - } - - mMenu.onItemsChanged(false); - - return this; - } - - public int getGroupId() { - return mGroup; - } - - @ViewDebug.CapturedViewProperty - public int getItemId() { - return mId; - } - - public int getOrder() { - return mCategoryOrder; - } - - public int getOrdering() { - return mOrdering; - } - - public Intent getIntent() { - return mIntent; - } - - public MenuItem setIntent(Intent intent) { - mIntent = intent; - return this; - } - - Runnable getCallback() { - return mItemCallback; - } - - public MenuItem setCallback(Runnable callback) { - mItemCallback = callback; - return this; - } - - public char getAlphabeticShortcut() { - return mShortcutAlphabeticChar; - } - - public MenuItem setAlphabeticShortcut(char alphaChar) { - if (mShortcutAlphabeticChar == alphaChar) return this; - - mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); - - mMenu.onItemsChanged(false); - - return this; - } - - public char getNumericShortcut() { - return mShortcutNumericChar; - } - - public MenuItem setNumericShortcut(char numericChar) { - if (mShortcutNumericChar == numericChar) return this; - - mShortcutNumericChar = numericChar; - - mMenu.onItemsChanged(false); - - return this; - } - - public MenuItem setShortcut(char numericChar, char alphaChar) { - mShortcutNumericChar = numericChar; - mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); - - mMenu.onItemsChanged(false); - - return this; - } - - /** - * @return The active shortcut (based on QWERTY-mode of the menu). - */ - char getShortcut() { - return (mMenu.isQwertyMode() ? mShortcutAlphabeticChar : mShortcutNumericChar); - } - - /** - * @return The label to show for the shortcut. This includes the chording - * key (for example 'Menu+a'). Also, any non-human readable - * characters should be human readable (for example 'Menu+enter'). - */ - String getShortcutLabel() { - - char shortcut = getShortcut(); - if (shortcut == 0) { - return ""; - } - - StringBuilder sb = new StringBuilder(sPrependShortcutLabel); - switch (shortcut) { - - case '\n': - sb.append(sEnterShortcutLabel); - break; - - case '\b': - sb.append(sDeleteShortcutLabel); - break; - - case ' ': - sb.append(sSpaceShortcutLabel); - break; - - default: - sb.append(shortcut); - break; - } - - return sb.toString(); - } - - /** - * @return Whether this menu item should be showing shortcuts (depends on - * whether the menu should show shortcuts and whether this item has - * a shortcut defined) - */ - boolean shouldShowShortcut() { - // Show shortcuts if the menu is supposed to show shortcuts AND this item has a shortcut - return mMenu.isShortcutsVisible() && (getShortcut() != 0); - } - - public SubMenu getSubMenu() { - return mSubMenu; - } - - public boolean hasSubMenu() { - return mSubMenu != null; - } - - void setSubMenu(SubMenuBuilder subMenu) { - mSubMenu = subMenu; - - subMenu.setHeaderTitle(getTitle()); - } - - @ViewDebug.CapturedViewProperty - public CharSequence getTitle() { - return mTitle; - } - - /** - * Gets the title for a particular {@link ItemView} - * - * @param itemView The ItemView that is receiving the title - * @return Either the title or condensed title based on what the ItemView - * prefers - */ - CharSequence getTitleForItemView(MenuView.ItemView itemView) { - return ((itemView != null) && itemView.prefersCondensedTitle()) - ? getTitleCondensed() - : getTitle(); - } - - public MenuItem setTitle(CharSequence title) { - mTitle = title; - - mMenu.onItemsChanged(false); - - if (mSubMenu != null) { - mSubMenu.setHeaderTitle(title); - } - - return this; - } - - public MenuItem setTitle(int title) { - return setTitle(mMenu.getContext().getString(title)); - } - - public CharSequence getTitleCondensed() { - return mTitleCondensed != null ? mTitleCondensed : mTitle; - } - - public MenuItem setTitleCondensed(CharSequence title) { - mTitleCondensed = title; - - // Could use getTitle() in the loop below, but just cache what it would do here - if (title == null) { - title = mTitle; - } - - mMenu.onItemsChanged(false); - - return this; - } - - public Drawable getIcon() { - if (mIconDrawable != null) { - return mIconDrawable; - } - - if (mIconResId != NO_ICON) { - return mMenu.getResources().getDrawable(mIconResId); - } - - return null; - } - - public MenuItem setIcon(Drawable icon) { - mIconResId = NO_ICON; - mIconDrawable = icon; - mMenu.onItemsChanged(false); - - return this; - } - - public MenuItem setIcon(int iconResId) { - mIconDrawable = null; - mIconResId = iconResId; - - // If we have a view, we need to push the Drawable to them - mMenu.onItemsChanged(false); - - return this; - } - - public boolean isCheckable() { - return (mFlags & CHECKABLE) == CHECKABLE; - } - - public MenuItem setCheckable(boolean checkable) { - final int oldFlags = mFlags; - mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); - if (oldFlags != mFlags) { - mMenu.onItemsChanged(false); - } - - return this; - } - - public void setExclusiveCheckable(boolean exclusive) { - mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); - } - - public boolean isExclusiveCheckable() { - return (mFlags & EXCLUSIVE) != 0; - } - - public boolean isChecked() { - return (mFlags & CHECKED) == CHECKED; - } - - public MenuItem setChecked(boolean checked) { - if ((mFlags & EXCLUSIVE) != 0) { - // 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 int oldFlags = mFlags; - mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); - if (oldFlags != mFlags) { - mMenu.onItemsChanged(false); - } - } - - public boolean isVisible() { - return (mFlags & HIDDEN) == 0; - } - - /** - * Changes the visibility of the item. This method DOES NOT notify the - * parent menu of a change in this item, so this should only be called from - * methods that will eventually trigger this change. If unsure, use {@link #setVisible(boolean)} - * instead. - * - * @param shown Whether to show (true) or hide (false). - * @return Whether the item's shown state was changed - */ - boolean setVisibleInt(boolean shown) { - final int oldFlags = mFlags; - mFlags = (mFlags & ~HIDDEN) | (shown ? 0 : HIDDEN); - return oldFlags != mFlags; - } - - public MenuItem setVisible(boolean shown) { - // Try to set the shown state to the given state. If the shown state was changed - // (i.e. the previous state isn't the same as given state), notify the parent menu that - // the shown state has changed for this item - if (setVisibleInt(shown)) mMenu.onItemVisibleChanged(this); - - return this; - } - - public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) { - mClickListener = clickListener; - return this; - } - - @Override - public String toString() { - return mTitle.toString(); - } - - void setMenuInfo(ContextMenuInfo menuInfo) { - mMenuInfo = menuInfo; - } - - public ContextMenuInfo getMenuInfo() { - return mMenuInfo; - } - - public void actionFormatChanged() { - mMenu.onItemActionRequestChanged(this); - } - - /** - * @return Whether the menu should show icons for menu items. - */ - public boolean shouldShowIcon() { - return mMenu.getOptionalIconsVisible(); - } - - public boolean isActionButton() { - return (mFlags & IS_ACTION) == IS_ACTION; - } - - public boolean requestsActionButton() { - return (mShowAsAction & SHOW_AS_ACTION_IF_ROOM) == SHOW_AS_ACTION_IF_ROOM; - } - - public boolean requiresActionButton() { - return (mShowAsAction & SHOW_AS_ACTION_ALWAYS) == SHOW_AS_ACTION_ALWAYS; - } - - public void setIsActionButton(boolean isActionButton) { - if (isActionButton) { - mFlags |= IS_ACTION; - } else { - mFlags &= ~IS_ACTION; - } - } - - public boolean showsTextAsAction() { - return (mShowAsAction & SHOW_AS_ACTION_WITH_TEXT) == SHOW_AS_ACTION_WITH_TEXT; - } - - public void setShowAsAction(int actionEnum) { - switch (actionEnum & SHOW_AS_ACTION_MASK) { - case SHOW_AS_ACTION_ALWAYS: - case SHOW_AS_ACTION_IF_ROOM: - case SHOW_AS_ACTION_NEVER: - // Looks good! - break; - - default: - // Mutually exclusive options selected! - throw new IllegalArgumentException("SHOW_AS_ACTION_ALWAYS, SHOW_AS_ACTION_IF_ROOM," - + " and SHOW_AS_ACTION_NEVER are mutually exclusive."); - } - mShowAsAction = actionEnum; - mMenu.onItemActionRequestChanged(this); - } - - public MenuItem setActionView(View view) { - mActionView = view; - mActionProvider = null; - if (view != null && view.getId() == View.NO_ID && mId > 0) { - view.setId(mId); - } - mMenu.onItemActionRequestChanged(this); - return this; - } - - public MenuItem setActionView(int resId) { - final Context context = mMenu.getContext(); - final LayoutInflater inflater = LayoutInflater.from(context); - setActionView(inflater.inflate(resId, new LinearLayout(context), false)); - return this; - } - - public View getActionView() { - if (mActionView != null) { - return mActionView; - } else if (mActionProvider != null) { - mActionView = mActionProvider.onCreateActionView(); - return mActionView; - } else { - return null; - } - } - - public ActionProvider getActionProvider() { - return mActionProvider; - } - - public MenuItem setActionProvider(ActionProvider actionProvider) { - mActionView = null; - mActionProvider = actionProvider; - mMenu.onItemsChanged(true); // Measurement can be changed - return this; - } - - @Override - public MenuItem setShowAsActionFlags(int actionEnum) { - setShowAsAction(actionEnum); - return this; - } - - @Override - public boolean expandActionView() { - if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) == 0 || mActionView == null) { - return false; - } - - if (mOnActionExpandListener == null || - mOnActionExpandListener.onMenuItemActionExpand(this)) { - return mMenu.expandItemActionView(this); - } - - return false; - } - - @Override - public boolean collapseActionView() { - if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) == 0) { - return false; - } - if (mActionView == null) { - // We're already collapsed if we have no action view. - return true; - } - - if (mOnActionExpandListener == null || - mOnActionExpandListener.onMenuItemActionCollapse(this)) { - return mMenu.collapseItemActionView(this); - } - - return false; - } - - @Override - public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { - mOnActionExpandListener = listener; - return this; - } - - public boolean hasCollapsibleActionView() { - return (mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) != 0 && mActionView != null; - } - - public void setActionViewExpanded(boolean isExpanded) { - mIsActionViewExpanded = isExpanded; - mMenu.onItemsChanged(false); - } - - public boolean isActionViewExpanded() { - return mIsActionViewExpanded; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java deleted file mode 100644 index aaf2997b7..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.actionbarsherlock.internal.view.menu; - -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View; -import com.actionbarsherlock.internal.view.ActionProviderWrapper; -import com.actionbarsherlock.internal.widget.CollapsibleActionViewWrapper; -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.view.CollapsibleActionView; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -public class MenuItemWrapper implements MenuItem, android.view.MenuItem.OnMenuItemClickListener { - private final android.view.MenuItem mNativeItem; - private SubMenu mSubMenu = null; - private OnMenuItemClickListener mMenuItemClickListener = null; - private OnActionExpandListener mActionExpandListener = null; - private android.view.MenuItem.OnActionExpandListener mNativeActionExpandListener = null; - - - public MenuItemWrapper(android.view.MenuItem nativeItem) { - if (nativeItem == null) { - throw new IllegalStateException("Wrapped menu item cannot be null."); - } - mNativeItem = nativeItem; - } - - - @Override - public int getItemId() { - return mNativeItem.getItemId(); - } - - @Override - public int getGroupId() { - return mNativeItem.getGroupId(); - } - - @Override - public int getOrder() { - return mNativeItem.getOrder(); - } - - @Override - public MenuItem setTitle(CharSequence title) { - mNativeItem.setTitle(title); - return this; - } - - @Override - public MenuItem setTitle(int title) { - mNativeItem.setTitle(title); - return this; - } - - @Override - public CharSequence getTitle() { - return mNativeItem.getTitle(); - } - - @Override - public MenuItem setTitleCondensed(CharSequence title) { - mNativeItem.setTitleCondensed(title); - return this; - } - - @Override - public CharSequence getTitleCondensed() { - return mNativeItem.getTitleCondensed(); - } - - @Override - public MenuItem setIcon(Drawable icon) { - mNativeItem.setIcon(icon); - return this; - } - - @Override - public MenuItem setIcon(int iconRes) { - mNativeItem.setIcon(iconRes); - return this; - } - - @Override - public Drawable getIcon() { - return mNativeItem.getIcon(); - } - - @Override - public MenuItem setIntent(Intent intent) { - mNativeItem.setIntent(intent); - return this; - } - - @Override - public Intent getIntent() { - return mNativeItem.getIntent(); - } - - @Override - public MenuItem setShortcut(char numericChar, char alphaChar) { - mNativeItem.setShortcut(numericChar, alphaChar); - return this; - } - - @Override - public MenuItem setNumericShortcut(char numericChar) { - mNativeItem.setNumericShortcut(numericChar); - return this; - } - - @Override - public char getNumericShortcut() { - return mNativeItem.getNumericShortcut(); - } - - @Override - public MenuItem setAlphabeticShortcut(char alphaChar) { - mNativeItem.setAlphabeticShortcut(alphaChar); - return this; - } - - @Override - public char getAlphabeticShortcut() { - return mNativeItem.getAlphabeticShortcut(); - } - - @Override - public MenuItem setCheckable(boolean checkable) { - mNativeItem.setCheckable(checkable); - return this; - } - - @Override - public boolean isCheckable() { - return mNativeItem.isCheckable(); - } - - @Override - public MenuItem setChecked(boolean checked) { - mNativeItem.setChecked(checked); - return this; - } - - @Override - public boolean isChecked() { - return mNativeItem.isChecked(); - } - - @Override - public MenuItem setVisible(boolean visible) { - mNativeItem.setVisible(visible); - return this; - } - - @Override - public boolean isVisible() { - return mNativeItem.isVisible(); - } - - @Override - public MenuItem setEnabled(boolean enabled) { - mNativeItem.setEnabled(enabled); - return this; - } - - @Override - public boolean isEnabled() { - return mNativeItem.isEnabled(); - } - - @Override - public boolean hasSubMenu() { - return mNativeItem.hasSubMenu(); - } - - @Override - public SubMenu getSubMenu() { - if (hasSubMenu() && (mSubMenu == null)) { - mSubMenu = new SubMenuWrapper(mNativeItem.getSubMenu()); - } - return mSubMenu; - } - - @Override - public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { - mMenuItemClickListener = menuItemClickListener; - //Register ourselves as the listener to proxy - mNativeItem.setOnMenuItemClickListener(this); - return this; - } - - @Override - public boolean onMenuItemClick(android.view.MenuItem item) { - if (mMenuItemClickListener != null) { - return mMenuItemClickListener.onMenuItemClick(this); - } - return false; - } - - @Override - public ContextMenuInfo getMenuInfo() { - return mNativeItem.getMenuInfo(); - } - - @Override - public void setShowAsAction(int actionEnum) { - mNativeItem.setShowAsAction(actionEnum); - } - - @Override - public MenuItem setShowAsActionFlags(int actionEnum) { - mNativeItem.setShowAsActionFlags(actionEnum); - return this; - } - - @Override - public MenuItem setActionView(View view) { - if (view != null && view instanceof CollapsibleActionView) { - view = new CollapsibleActionViewWrapper(view); - } - mNativeItem.setActionView(view); - return this; - } - - @Override - public MenuItem setActionView(int resId) { - //Allow the native menu to inflate the resource - mNativeItem.setActionView(resId); - if (resId != 0) { - //Get newly created view - View view = mNativeItem.getActionView(); - if (view instanceof CollapsibleActionView) { - //Wrap it and re-set it - mNativeItem.setActionView(new CollapsibleActionViewWrapper(view)); - } - } - return this; - } - - @Override - public View getActionView() { - View actionView = mNativeItem.getActionView(); - if (actionView instanceof CollapsibleActionViewWrapper) { - return ((CollapsibleActionViewWrapper)actionView).unwrap(); - } - return actionView; - } - - @Override - public MenuItem setActionProvider(ActionProvider actionProvider) { - mNativeItem.setActionProvider(new ActionProviderWrapper(actionProvider)); - return this; - } - - @Override - public ActionProvider getActionProvider() { - android.view.ActionProvider nativeProvider = mNativeItem.getActionProvider(); - if (nativeProvider != null && nativeProvider instanceof ActionProviderWrapper) { - return ((ActionProviderWrapper)nativeProvider).unwrap(); - } - return null; - } - - @Override - public boolean expandActionView() { - return mNativeItem.expandActionView(); - } - - @Override - public boolean collapseActionView() { - return mNativeItem.collapseActionView(); - } - - @Override - public boolean isActionViewExpanded() { - return mNativeItem.isActionViewExpanded(); - } - - @Override - public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { - mActionExpandListener = listener; - - if (mNativeActionExpandListener == null) { - mNativeActionExpandListener = new android.view.MenuItem.OnActionExpandListener() { - @Override - public boolean onMenuItemActionExpand(android.view.MenuItem menuItem) { - if (mActionExpandListener != null) { - return mActionExpandListener.onMenuItemActionExpand(MenuItemWrapper.this); - } - return false; - } - - @Override - public boolean onMenuItemActionCollapse(android.view.MenuItem menuItem) { - if (mActionExpandListener != null) { - return mActionExpandListener.onMenuItemActionCollapse(MenuItemWrapper.this); - } - return false; - } - }; - - //Register our inner-class as the listener to proxy method calls - mNativeItem.setOnActionExpandListener(mNativeActionExpandListener); - } - - return this; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java deleted file mode 100644 index f030de310..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (C) 2010 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 java.util.ArrayList; -import android.content.Context; -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.os.Parcelable; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.MeasureSpec; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.FrameLayout; -import android.widget.ListAdapter; -import android.widget.PopupWindow; -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; -import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; -import com.actionbarsherlock.internal.widget.IcsListPopupWindow; -import com.actionbarsherlock.view.MenuItem; - -/** - * Presents a menu as a small, simple popup anchored to another view. - * @hide - */ -public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.OnKeyListener, - ViewTreeObserver.OnGlobalLayoutListener, PopupWindow.OnDismissListener, - View_OnAttachStateChangeListener, MenuPresenter { - //UNUSED private static final String TAG = "MenuPopupHelper"; - - static final int ITEM_LAYOUT = R.layout.abs__popup_menu_item_layout; - - private Context mContext; - private LayoutInflater mInflater; - private IcsListPopupWindow mPopup; - private MenuBuilder mMenu; - private int mPopupMaxWidth; - private View mAnchorView; - private boolean mOverflowOnly; - private ViewTreeObserver mTreeObserver; - - private MenuAdapter mAdapter; - - private Callback mPresenterCallback; - - boolean mForceShowIcon; - - private ViewGroup mMeasureParent; - - public MenuPopupHelper(Context context, MenuBuilder menu) { - this(context, menu, null, false); - } - - public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) { - this(context, menu, anchorView, false); - } - - public MenuPopupHelper(Context context, MenuBuilder menu, - View anchorView, boolean overflowOnly) { - mContext = context; - mInflater = LayoutInflater.from(context); - mMenu = menu; - mOverflowOnly = overflowOnly; - - final Resources res = context.getResources(); - mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, - res.getDimensionPixelSize(R.dimen.abs__config_prefDialogWidth)); - - mAnchorView = anchorView; - - menu.addMenuPresenter(this); - } - - public void setAnchorView(View anchor) { - mAnchorView = anchor; - } - - public void setForceShowIcon(boolean forceShow) { - mForceShowIcon = forceShow; - } - - public void show() { - if (!tryShow()) { - throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor"); - } - } - - public boolean tryShow() { - mPopup = new IcsListPopupWindow(mContext, null, R.attr.popupMenuStyle); - mPopup.setOnDismissListener(this); - mPopup.setOnItemClickListener(this); - - mAdapter = new MenuAdapter(mMenu); - mPopup.setAdapter(mAdapter); - mPopup.setModal(true); - - View anchor = mAnchorView; - if (anchor != null) { - final boolean addGlobalListener = mTreeObserver == null; - mTreeObserver = anchor.getViewTreeObserver(); // Refresh to latest - if (addGlobalListener) mTreeObserver.addOnGlobalLayoutListener(this); - ((View_HasStateListenerSupport)anchor).addOnAttachStateChangeListener(this); - mPopup.setAnchorView(anchor); - } else { - return false; - } - - mPopup.setContentWidth(Math.min(measureContentWidth(mAdapter), mPopupMaxWidth)); - mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); - mPopup.show(); - mPopup.getListView().setOnKeyListener(this); - return true; - } - - public void dismiss() { - if (isShowing()) { - mPopup.dismiss(); - } - } - - public void onDismiss() { - mPopup = null; - mMenu.close(); - if (mTreeObserver != null) { - if (!mTreeObserver.isAlive()) mTreeObserver = mAnchorView.getViewTreeObserver(); - mTreeObserver.removeGlobalOnLayoutListener(this); - mTreeObserver = null; - } - ((View_HasStateListenerSupport)mAnchorView).removeOnAttachStateChangeListener(this); - } - - public boolean isShowing() { - return mPopup != null && mPopup.isShowing(); - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - MenuAdapter adapter = mAdapter; - adapter.mAdapterMenu.performItemAction(adapter.getItem(position), 0); - } - - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_MENU) { - dismiss(); - return true; - } - return false; - } - - private int measureContentWidth(ListAdapter adapter) { - // Menus don't tend to be long, so this is more sane than it looks. - int width = 0; - View itemView = null; - int itemType = 0; - final int widthMeasureSpec = - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - final int heightMeasureSpec = - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - final int count = adapter.getCount(); - for (int i = 0; i < count; i++) { - final int positionType = adapter.getItemViewType(i); - if (positionType != itemType) { - itemType = positionType; - itemView = null; - } - if (mMeasureParent == null) { - mMeasureParent = new FrameLayout(mContext); - } - itemView = adapter.getView(i, itemView, mMeasureParent); - itemView.measure(widthMeasureSpec, heightMeasureSpec); - width = Math.max(width, itemView.getMeasuredWidth()); - } - return width; - } - - @Override - public void onGlobalLayout() { - if (isShowing()) { - final View anchor = mAnchorView; - if (anchor == null || !anchor.isShown()) { - dismiss(); - } else if (isShowing()) { - // Recompute window size and position - mPopup.show(); - } - } - } - - @Override - public void onViewAttachedToWindow(View v) { - } - - @Override - public void onViewDetachedFromWindow(View v) { - if (mTreeObserver != null) { - if (!mTreeObserver.isAlive()) mTreeObserver = v.getViewTreeObserver(); - mTreeObserver.removeGlobalOnLayoutListener(this); - } - ((View_HasStateListenerSupport)v).removeOnAttachStateChangeListener(this); - } - - @Override - public void initForMenu(Context context, MenuBuilder menu) { - // Don't need to do anything; we added as a presenter in the constructor. - } - - @Override - public MenuView getMenuView(ViewGroup root) { - throw new UnsupportedOperationException("MenuPopupHelpers manage their own views"); - } - - @Override - public void updateMenuView(boolean cleared) { - if (mAdapter != null) mAdapter.notifyDataSetChanged(); - } - - @Override - public void setCallback(Callback cb) { - mPresenterCallback = cb; - } - - @Override - public boolean onSubMenuSelected(SubMenuBuilder subMenu) { - if (subMenu.hasVisibleItems()) { - MenuPopupHelper subPopup = new MenuPopupHelper(mContext, subMenu, mAnchorView, false); - subPopup.setCallback(mPresenterCallback); - - boolean preserveIconSpacing = false; - final int count = subMenu.size(); - for (int i = 0; i < count; i++) { - MenuItem childItem = subMenu.getItem(i); - if (childItem.isVisible() && childItem.getIcon() != null) { - preserveIconSpacing = true; - break; - } - } - subPopup.setForceShowIcon(preserveIconSpacing); - - if (subPopup.tryShow()) { - if (mPresenterCallback != null) { - mPresenterCallback.onOpenSubMenu(subMenu); - } - return true; - } - } - return false; - } - - @Override - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - // Only care about the (sub)menu we're presenting. - if (menu != mMenu) return; - - dismiss(); - if (mPresenterCallback != null) { - mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); - } - } - - @Override - public boolean flagActionItems() { - return false; - } - - public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { - return false; - } - - public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { - return false; - } - - @Override - public int getId() { - return 0; - } - - @Override - public Parcelable onSaveInstanceState() { - return null; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - } - - private class MenuAdapter extends BaseAdapter { - private MenuBuilder mAdapterMenu; - private int mExpandedIndex = -1; - - public MenuAdapter(MenuBuilder menu) { - mAdapterMenu = menu; - registerDataSetObserver(new ExpandedIndexObserver()); - findExpandedIndex(); - } - - public int getCount() { - ArrayList items = mOverflowOnly ? - mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); - if (mExpandedIndex < 0) { - return items.size(); - } - return items.size() - 1; - } - - public MenuItemImpl getItem(int position) { - ArrayList items = mOverflowOnly ? - mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); - if (mExpandedIndex >= 0 && position >= mExpandedIndex) { - position++; - } - return items.get(position); - } - - public long getItemId(int position) { - // Since a menu item's ID is optional, we'll use the position as an - // ID for the item in the AdapterView - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = mInflater.inflate(ITEM_LAYOUT, parent, false); - } - - MenuView.ItemView itemView = (MenuView.ItemView) convertView; - if (mForceShowIcon) { - ((ListMenuItemView) convertView).setForceShowIcon(true); - } - itemView.initialize(getItem(position), 0); - return convertView; - } - - void findExpandedIndex() { - final MenuItemImpl expandedItem = mMenu.getExpandedItem(); - if (expandedItem != null) { - final ArrayList items = mMenu.getNonActionItems(); - final int count = items.size(); - for (int i = 0; i < count; i++) { - final MenuItemImpl item = items.get(i); - if (item == expandedItem) { - mExpandedIndex = i; - return; - } - } - } - mExpandedIndex = -1; - } - } - - private class ExpandedIndexObserver extends DataSetObserver { - @Override - public void onChanged() { - mAdapter.findExpandedIndex(); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java deleted file mode 100644 index c3f35472c..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * 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 com.actionbarsherlock.internal.view.menu; - -import android.content.Context; -import android.os.Parcelable; -import android.view.ViewGroup; - -/** - * A MenuPresenter is responsible for building views for a Menu object. - * It takes over some responsibility from the old style monolithic MenuBuilder class. - */ -public interface MenuPresenter { - /** - * Called by menu implementation to notify another component of open/close events. - */ - public interface Callback { - /** - * Called when a menu is closing. - * @param menu - * @param allMenusAreClosing - */ - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); - - /** - * Called when a submenu opens. Useful for notifying the application - * of menu state so that it does not attempt to hide the action bar - * while a submenu is open or similar. - * - * @param subMenu Submenu currently being opened - * @return true if the Callback will handle presenting the submenu, false if - * the presenter should attempt to do so. - */ - public boolean onOpenSubMenu(MenuBuilder subMenu); - } - - /** - * Initialize this presenter for the given context and menu. - * This method is called by MenuBuilder when a presenter is - * added. See {@link MenuBuilder#addMenuPresenter(MenuPresenter)} - * - * @param context Context for this presenter; used for view creation and resource management - * @param menu Menu to host - */ - public void initForMenu(Context context, MenuBuilder menu); - - /** - * Retrieve a MenuView to display the menu specified in - * {@link #initForMenu(Context, Menu)}. - * - * @param root Intended parent of the MenuView. - * @return A freshly created MenuView. - */ - public MenuView getMenuView(ViewGroup root); - - /** - * Update the menu UI in response to a change. Called by - * MenuBuilder during the normal course of operation. - * - * @param cleared true if the menu was entirely cleared - */ - public void updateMenuView(boolean cleared); - - /** - * Set a callback object that will be notified of menu events - * related to this specific presentation. - * @param cb Callback that will be notified of future events - */ - public void setCallback(Callback cb); - - /** - * Called by Menu implementations to indicate that a submenu item - * has been selected. An active Callback should be notified, and - * if applicable the presenter should present the submenu. - * - * @param subMenu SubMenu being opened - * @return true if the the event was handled, false otherwise. - */ - public boolean onSubMenuSelected(SubMenuBuilder subMenu); - - /** - * Called by Menu implementations to indicate that a menu or submenu is - * closing. Presenter implementations should close the representation - * of the menu indicated as necessary and notify a registered callback. - * - * @param menu Menu or submenu that is closing. - * @param allMenusAreClosing True if all associated menus are closing. - */ - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); - - /** - * Called by Menu implementations to flag items that will be shown as actions. - * @return true if this presenter changed the action status of any items. - */ - public boolean flagActionItems(); - - /** - * Called when a menu item with a collapsable action view should expand its action view. - * - * @param menu Menu containing the item to be expanded - * @param item Item to be expanded - * @return true if this presenter expanded the action view, false otherwise. - */ - public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item); - - /** - * Called when a menu item with a collapsable action view should collapse its action view. - * - * @param menu Menu containing the item to be collapsed - * @param item Item to be collapsed - * @return true if this presenter collapsed the action view, false otherwise. - */ - public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item); - - /** - * Returns an ID for determining how to save/restore instance state. - * @return a valid ID value. - */ - public int getId(); - - /** - * Returns a Parcelable describing the current state of the presenter. - * It will be passed to the {@link #onRestoreInstanceState(Parcelable)} - * method of the presenter sharing the same ID later. - * @return The saved instance state - */ - public Parcelable onSaveInstanceState(); - - /** - * Supplies the previously saved instance state to be restored. - * @param state The previously saved instance state - */ - public void onRestoreInstanceState(Parcelable state); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java deleted file mode 100644 index 323ba2d88..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * 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; - -/** - * Minimal interface for a menu view. {@link #initialize(MenuBuilder)} 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. - */ - public void initialize(MenuBuilder menu); - - /** - * 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 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); - - /** - * 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(); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java deleted file mode 100644 index 3d4dd42fd..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.actionbarsherlock.internal.view.menu; - -import java.util.WeakHashMap; -import android.content.ComponentName; -import android.content.Intent; -import android.view.KeyEvent; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -public class MenuWrapper implements Menu { - private final android.view.Menu mNativeMenu; - - private final WeakHashMap mNativeMap = - new WeakHashMap(); - - - public MenuWrapper(android.view.Menu nativeMenu) { - mNativeMenu = nativeMenu; - } - - public android.view.Menu unwrap() { - return mNativeMenu; - } - - private MenuItem addInternal(android.view.MenuItem nativeItem) { - MenuItem item = new MenuItemWrapper(nativeItem); - mNativeMap.put(nativeItem, item); - return item; - } - - @Override - public MenuItem add(CharSequence title) { - return addInternal(mNativeMenu.add(title)); - } - - @Override - public MenuItem add(int titleRes) { - return addInternal(mNativeMenu.add(titleRes)); - } - - @Override - public MenuItem add(int groupId, int itemId, int order, CharSequence title) { - return addInternal(mNativeMenu.add(groupId, itemId, order, title)); - } - - @Override - public MenuItem add(int groupId, int itemId, int order, int titleRes) { - return addInternal(mNativeMenu.add(groupId, itemId, order, titleRes)); - } - - private SubMenu addInternal(android.view.SubMenu nativeSubMenu) { - SubMenu subMenu = new SubMenuWrapper(nativeSubMenu); - android.view.MenuItem nativeItem = nativeSubMenu.getItem(); - MenuItem item = subMenu.getItem(); - mNativeMap.put(nativeItem, item); - return subMenu; - } - - @Override - public SubMenu addSubMenu(CharSequence title) { - return addInternal(mNativeMenu.addSubMenu(title)); - } - - @Override - public SubMenu addSubMenu(int titleRes) { - return addInternal(mNativeMenu.addSubMenu(titleRes)); - } - - @Override - public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { - return addInternal(mNativeMenu.addSubMenu(groupId, itemId, order, title)); - } - - @Override - public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { - return addInternal(mNativeMenu.addSubMenu(groupId, itemId, order, titleRes)); - } - - @Override - public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) { - int result; - if (outSpecificItems != null) { - android.view.MenuItem[] nativeOutItems = new android.view.MenuItem[outSpecificItems.length]; - result = mNativeMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, nativeOutItems); - for (int i = 0, length = outSpecificItems.length; i < length; i++) { - outSpecificItems[i] = new MenuItemWrapper(nativeOutItems[i]); - } - } else { - result = mNativeMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, null); - } - return result; - } - - @Override - public void removeItem(int id) { - mNativeMenu.removeItem(id); - } - - @Override - public void removeGroup(int groupId) { - mNativeMenu.removeGroup(groupId); - } - - @Override - public void clear() { - mNativeMap.clear(); - mNativeMenu.clear(); - } - - @Override - public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { - mNativeMenu.setGroupCheckable(group, checkable, exclusive); - } - - @Override - public void setGroupVisible(int group, boolean visible) { - mNativeMenu.setGroupVisible(group, visible); - } - - @Override - public void setGroupEnabled(int group, boolean enabled) { - mNativeMenu.setGroupEnabled(group, enabled); - } - - @Override - public boolean hasVisibleItems() { - return mNativeMenu.hasVisibleItems(); - } - - @Override - public MenuItem findItem(int id) { - android.view.MenuItem nativeItem = mNativeMenu.findItem(id); - return findItem(nativeItem); - } - - public MenuItem findItem(android.view.MenuItem nativeItem) { - if (nativeItem == null) { - return null; - } - - MenuItem wrapped = mNativeMap.get(nativeItem); - if (wrapped != null) { - return wrapped; - } - - return addInternal(nativeItem); - } - - @Override - public int size() { - return mNativeMenu.size(); - } - - @Override - public MenuItem getItem(int index) { - android.view.MenuItem nativeItem = mNativeMenu.getItem(index); - return findItem(nativeItem); - } - - @Override - public void close() { - mNativeMenu.close(); - } - - @Override - public boolean performShortcut(int keyCode, KeyEvent event, int flags) { - return mNativeMenu.performShortcut(keyCode, event, flags); - } - - @Override - public boolean isShortcutKey(int keyCode, KeyEvent event) { - return mNativeMenu.isShortcutKey(keyCode, event); - } - - @Override - public boolean performIdentifierAction(int id, int flags) { - return mNativeMenu.performIdentifierAction(id, flags); - } - - @Override - public void setQwertyMode(boolean isQwerty) { - mNativeMenu.setQwertyMode(isQwerty); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java deleted file mode 100644 index 6679cf386..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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.content.Context; -import android.graphics.drawable.Drawable; -import android.view.View; - -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -/** - * The model for a sub menu, which is an extension of the menu. Most methods are proxied to - * the parent menu. - */ -public 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(); - } - - public Menu getParentMenu() { - return mParentMenu; - } - - public MenuItem getItem() { - return mItem; - } - - @Override - public void setCallback(Callback callback) { - mParentMenu.setCallback(callback); - } - - @Override - public MenuBuilder getRootMenu() { - return mParentMenu; - } - - @Override - boolean dispatchMenuItemSelected(MenuBuilder menu, MenuItem item) { - return super.dispatchMenuItemSelected(menu, item) || - mParentMenu.dispatchMenuItemSelected(menu, item); - } - - public SubMenu setIcon(Drawable icon) { - mItem.setIcon(icon); - return this; - } - - public SubMenu setIcon(int iconRes) { - mItem.setIcon(iconRes); - return this; - } - - public SubMenu setHeaderIcon(Drawable icon) { - return (SubMenu) super.setHeaderIconInt(icon); - } - - public SubMenu setHeaderIcon(int iconRes) { - return (SubMenu) super.setHeaderIconInt(iconRes); - } - - public SubMenu setHeaderTitle(CharSequence title) { - return (SubMenu) super.setHeaderTitleInt(title); - } - - public SubMenu setHeaderTitle(int titleRes) { - return (SubMenu) super.setHeaderTitleInt(titleRes); - } - - public SubMenu setHeaderView(View view) { - return (SubMenu) super.setHeaderViewInt(view); - } - - @Override - public boolean expandItemActionView(MenuItemImpl item) { - return mParentMenu.expandItemActionView(item); - } - - @Override - public boolean collapseItemActionView(MenuItemImpl item) { - return mParentMenu.collapseItemActionView(item); - } - - @Override - public String getActionViewStatesKey() { - final int itemId = mItem != null ? mItem.getItemId() : 0; - if (itemId == 0) { - return null; - } - return super.getActionViewStatesKey() + ":" + itemId; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java deleted file mode 100644 index 7d307acb1..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.actionbarsherlock.internal.view.menu; - -import android.graphics.drawable.Drawable; -import android.view.View; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.SubMenu; - -public class SubMenuWrapper extends MenuWrapper implements SubMenu { - private final android.view.SubMenu mNativeSubMenu; - private MenuItem mItem = null; - - public SubMenuWrapper(android.view.SubMenu nativeSubMenu) { - super(nativeSubMenu); - mNativeSubMenu = nativeSubMenu; - } - - - @Override - public SubMenu setHeaderTitle(int titleRes) { - mNativeSubMenu.setHeaderTitle(titleRes); - return this; - } - - @Override - public SubMenu setHeaderTitle(CharSequence title) { - mNativeSubMenu.setHeaderTitle(title); - return this; - } - - @Override - public SubMenu setHeaderIcon(int iconRes) { - mNativeSubMenu.setHeaderIcon(iconRes); - return this; - } - - @Override - public SubMenu setHeaderIcon(Drawable icon) { - mNativeSubMenu.setHeaderIcon(icon); - return this; - } - - @Override - public SubMenu setHeaderView(View view) { - mNativeSubMenu.setHeaderView(view); - return this; - } - - @Override - public void clearHeader() { - mNativeSubMenu.clearHeader(); - } - - @Override - public SubMenu setIcon(int iconRes) { - mNativeSubMenu.setIcon(iconRes); - return this; - } - - @Override - public SubMenu setIcon(Drawable icon) { - mNativeSubMenu.setIcon(icon); - return this; - } - - @Override - public MenuItem getItem() { - if (mItem == null) { - mItem = new MenuItemWrapper(mNativeSubMenu.getItem()); - } - return mItem; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java deleted file mode 100644 index 3a4a44675..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * 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 com.actionbarsherlock.internal.widget; - -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.TypedArray; -import android.os.Build; -import android.util.AttributeSet; -import android.view.View; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.Interpolator; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; -import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet; -import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; -import com.actionbarsherlock.internal.nineoldandroids.view.NineViewGroup; -import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; -import com.actionbarsherlock.internal.view.menu.ActionMenuView; - -import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; - -public abstract class AbsActionBarView extends NineViewGroup { - protected ActionMenuView mMenuView; - protected ActionMenuPresenter mActionMenuPresenter; - protected ActionBarContainer mSplitView; - protected boolean mSplitActionBar; - protected boolean mSplitWhenNarrow; - protected int mContentHeight; - - final Context mContext; - - protected Animator mVisibilityAnim; - protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); - - private static final /*Time*/Interpolator sAlphaInterpolator = new DecelerateInterpolator(); - - private static final int FADE_DURATION = 200; - - public AbsActionBarView(Context context) { - super(context); - mContext = context; - } - - public AbsActionBarView(Context context, AttributeSet attrs) { - super(context, attrs); - mContext = context; - } - - public AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mContext = context; - } - - /* - * Must be public so we can dispatch pre-2.2 via ActionBarImpl. - */ - @Override - public void onConfigurationChanged(Configuration newConfig) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { - super.onConfigurationChanged(newConfig); - } else if (mMenuView != null) { - mMenuView.onConfigurationChanged(newConfig); - } - - // Action bar can change size on configuration changes. - // Reread the desired height from the theme-specified style. - TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.SherlockActionBar, - R.attr.actionBarStyle, 0); - setContentHeight(a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0)); - a.recycle(); - if (mSplitWhenNarrow) { - setSplitActionBar(getResources_getBoolean(getContext(), - R.bool.abs__split_action_bar_is_narrow)); - } - if (mActionMenuPresenter != null) { - mActionMenuPresenter.onConfigurationChanged(newConfig); - } - } - - /** - * Sets whether the bar should be split right now, no questions asked. - * @param split true if the bar should split - */ - public void setSplitActionBar(boolean split) { - mSplitActionBar = split; - } - - /** - * Sets whether the bar should split if we enter a narrow screen configuration. - * @param splitWhenNarrow true if the bar should check to split after a config change - */ - public void setSplitWhenNarrow(boolean splitWhenNarrow) { - mSplitWhenNarrow = splitWhenNarrow; - } - - public void setContentHeight(int height) { - mContentHeight = height; - requestLayout(); - } - - public int getContentHeight() { - return mContentHeight; - } - - public void setSplitView(ActionBarContainer splitView) { - mSplitView = splitView; - } - - /** - * @return Current visibility or if animating, the visibility being animated to. - */ - public int getAnimatedVisibility() { - if (mVisibilityAnim != null) { - return mVisAnimListener.mFinalVisibility; - } - return getVisibility(); - } - - public void animateToVisibility(int visibility) { - if (mVisibilityAnim != null) { - mVisibilityAnim.cancel(); - } - if (visibility == VISIBLE) { - if (getVisibility() != VISIBLE) { - setAlpha(0); - if (mSplitView != null && mMenuView != null) { - mMenuView.setAlpha(0); - } - } - ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); - anim.setDuration(FADE_DURATION); - anim.setInterpolator(sAlphaInterpolator); - if (mSplitView != null && mMenuView != null) { - AnimatorSet set = new AnimatorSet(); - ObjectAnimator splitAnim = ObjectAnimator.ofFloat(mMenuView, "alpha", 1); - splitAnim.setDuration(FADE_DURATION); - set.addListener(mVisAnimListener.withFinalVisibility(visibility)); - set.play(anim).with(splitAnim); - set.start(); - } else { - anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); - anim.start(); - } - } else { - ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); - anim.setDuration(FADE_DURATION); - anim.setInterpolator(sAlphaInterpolator); - if (mSplitView != null && mMenuView != null) { - AnimatorSet set = new AnimatorSet(); - ObjectAnimator splitAnim = ObjectAnimator.ofFloat(mMenuView, "alpha", 0); - splitAnim.setDuration(FADE_DURATION); - set.addListener(mVisAnimListener.withFinalVisibility(visibility)); - set.play(anim).with(splitAnim); - set.start(); - } else { - anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); - anim.start(); - } - } - } - - @Override - public void setVisibility(int visibility) { - if (mVisibilityAnim != null) { - mVisibilityAnim.end(); - } - super.setVisibility(visibility); - } - - public boolean showOverflowMenu() { - if (mActionMenuPresenter != null) { - return mActionMenuPresenter.showOverflowMenu(); - } - return false; - } - - public void postShowOverflowMenu() { - post(new Runnable() { - public void run() { - showOverflowMenu(); - } - }); - } - - public boolean hideOverflowMenu() { - if (mActionMenuPresenter != null) { - return mActionMenuPresenter.hideOverflowMenu(); - } - return false; - } - - public boolean isOverflowMenuShowing() { - if (mActionMenuPresenter != null) { - return mActionMenuPresenter.isOverflowMenuShowing(); - } - return false; - } - - public boolean isOverflowReserved() { - return mActionMenuPresenter != null && mActionMenuPresenter.isOverflowReserved(); - } - - public void dismissPopupMenus() { - if (mActionMenuPresenter != null) { - mActionMenuPresenter.dismissPopupMenus(); - } - } - - protected int measureChildView(View child, int availableWidth, int childSpecHeight, - int spacing) { - child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), - childSpecHeight); - - availableWidth -= child.getMeasuredWidth(); - availableWidth -= spacing; - - return Math.max(0, availableWidth); - } - - protected int positionChild(View child, int x, int y, int contentHeight) { - int childWidth = child.getMeasuredWidth(); - int childHeight = child.getMeasuredHeight(); - int childTop = y + (contentHeight - childHeight) / 2; - - child.layout(x, childTop, x + childWidth, childTop + childHeight); - - return childWidth; - } - - protected int positionChildInverse(View child, int x, int y, int contentHeight) { - int childWidth = child.getMeasuredWidth(); - int childHeight = child.getMeasuredHeight(); - int childTop = y + (contentHeight - childHeight) / 2; - - child.layout(x - childWidth, childTop, x, childTop + childHeight); - - return childWidth; - } - - protected class VisibilityAnimListener implements Animator.AnimatorListener { - private boolean mCanceled = false; - int mFinalVisibility; - - public VisibilityAnimListener withFinalVisibility(int visibility) { - mFinalVisibility = visibility; - return this; - } - - @Override - public void onAnimationStart(Animator animation) { - setVisibility(VISIBLE); - mVisibilityAnim = animation; - mCanceled = false; - } - - @Override - public void onAnimationEnd(Animator animation) { - if (mCanceled) return; - - mVisibilityAnim = null; - setVisibility(mFinalVisibility); - if (mSplitView != null && mMenuView != null) { - mMenuView.setVisibility(mFinalVisibility); - } - } - - @Override - public void onAnimationCancel(Animator animation) { - mCanceled = true; - } - - @Override - public void onAnimationRepeat(Animator animation) { - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java deleted file mode 100644 index 1d9c68b37..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (C) 2010 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.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout; - -/** - * This class acts as a container for the action bar view and action mode context views. - * It applies special styles as needed to help handle animated transitions between them. - * @hide - */ -public class ActionBarContainer extends NineFrameLayout { - private boolean mIsTransitioning; - private View mTabContainer; - private ActionBarView mActionBarView; - - private Drawable mBackground; - private Drawable mStackedBackground; - private Drawable mSplitBackground; - private boolean mIsSplit; - private boolean mIsStacked; - - public ActionBarContainer(Context context) { - this(context, null); - } - - public ActionBarContainer(Context context, AttributeSet attrs) { - super(context, attrs); - - setBackgroundDrawable(null); - - TypedArray a = context.obtainStyledAttributes(attrs, - R.styleable.SherlockActionBar); - mBackground = a.getDrawable(R.styleable.SherlockActionBar_background); - mStackedBackground = a.getDrawable( - R.styleable.SherlockActionBar_backgroundStacked); - - //Fix for issue #379 - if (mStackedBackground instanceof ColorDrawable && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { - Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); - Canvas c = new Canvas(bitmap); - mStackedBackground.draw(c); - int color = bitmap.getPixel(0, 0); - bitmap.recycle(); - mStackedBackground = new IcsColorDrawable(color); - } - - if (getId() == R.id.abs__split_action_bar) { - mIsSplit = true; - mSplitBackground = a.getDrawable( - R.styleable.SherlockActionBar_backgroundSplit); - } - a.recycle(); - - setWillNotDraw(mIsSplit ? mSplitBackground == null : - mBackground == null && mStackedBackground == null); - } - - @Override - public void onFinishInflate() { - super.onFinishInflate(); - mActionBarView = (ActionBarView) findViewById(R.id.abs__action_bar); - } - - public void setPrimaryBackground(Drawable bg) { - mBackground = bg; - invalidate(); - } - - public void setStackedBackground(Drawable bg) { - mStackedBackground = bg; - invalidate(); - } - - public void setSplitBackground(Drawable bg) { - mSplitBackground = bg; - invalidate(); - } - - /** - * Set the action bar into a "transitioning" state. While transitioning - * the bar will block focus and touch from all of its descendants. This - * prevents the user from interacting with the bar while it is animating - * in or out. - * - * @param isTransitioning true if the bar is currently transitioning, false otherwise. - */ - public void setTransitioning(boolean isTransitioning) { - mIsTransitioning = isTransitioning; - setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS - : FOCUS_AFTER_DESCENDANTS); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return mIsTransitioning || super.onInterceptTouchEvent(ev); - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - super.onTouchEvent(ev); - - // An action bar always eats touch events. - return true; - } - - @Override - public boolean onHoverEvent(MotionEvent ev) { - super.onHoverEvent(ev); - - // An action bar always eats hover events. - return true; - } - - public void setTabContainer(ScrollingTabContainerView tabView) { - if (mTabContainer != null) { - removeView(mTabContainer); - } - mTabContainer = tabView; - if (tabView != null) { - addView(tabView); - final ViewGroup.LayoutParams lp = tabView.getLayoutParams(); - lp.width = LayoutParams.MATCH_PARENT; - lp.height = LayoutParams.WRAP_CONTENT; - tabView.setAllowCollapse(false); - } - } - - public View getTabContainer() { - return mTabContainer; - } - - @Override - public void onDraw(Canvas canvas) { - if (getWidth() == 0 || getHeight() == 0) { - return; - } - - if (mIsSplit) { - if (mSplitBackground != null) mSplitBackground.draw(canvas); - } else { - if (mBackground != null) { - mBackground.draw(canvas); - } - if (mStackedBackground != null && mIsStacked) { - mStackedBackground.draw(canvas); - } - } - } - - //This causes the animation reflection to fail on pre-HC platforms - //@Override - //public android.view.ActionMode startActionModeForChild(View child, android.view.ActionMode.Callback callback) { - // // No starting an action mode for an action bar child! (Where would it go?) - // return null; - //} - - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - if (mActionBarView == null) return; - - final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams(); - final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 : - mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; - - if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { - final int mode = MeasureSpec.getMode(heightMeasureSpec); - if (mode == MeasureSpec.AT_MOST) { - final int maxHeight = MeasureSpec.getSize(heightMeasureSpec); - setMeasuredDimension(getMeasuredWidth(), - Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(), - maxHeight)); - } - } - } - - @Override - public void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - - final boolean hasTabs = mTabContainer != null && mTabContainer.getVisibility() != GONE; - - if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { - final int containerHeight = getMeasuredHeight(); - final int tabHeight = mTabContainer.getMeasuredHeight(); - - if ((mActionBarView.getDisplayOptions() & ActionBar.DISPLAY_SHOW_HOME) == 0) { - // Not showing home, put tabs on top. - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - - if (child == mTabContainer) continue; - - if (!mActionBarView.isCollapsed()) { - child.offsetTopAndBottom(tabHeight); - } - } - mTabContainer.layout(l, 0, r, tabHeight); - } else { - mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); - } - } - - boolean needsInvalidate = false; - if (mIsSplit) { - if (mSplitBackground != null) { - mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); - needsInvalidate = true; - } - } else { - if (mBackground != null) { - mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), - mActionBarView.getRight(), mActionBarView.getBottom()); - needsInvalidate = true; - } - if ((mIsStacked = hasTabs && mStackedBackground != null)) { - mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), - mTabContainer.getRight(), mTabContainer.getBottom()); - needsInvalidate = true; - } - } - - if (needsInvalidate) { - invalidate(); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java deleted file mode 100644 index 9ec250f38..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java +++ /dev/null @@ -1,518 +0,0 @@ -/* - * Copyright (C) 2010 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.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; -import android.view.animation.DecelerateInterpolator; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; -import com.actionbarsherlock.internal.nineoldandroids.animation.Animator.AnimatorListener; -import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet; -import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; -import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; -import com.actionbarsherlock.internal.nineoldandroids.widget.NineLinearLayout; -import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; -import com.actionbarsherlock.internal.view.menu.ActionMenuView; -import com.actionbarsherlock.internal.view.menu.MenuBuilder; -import com.actionbarsherlock.view.ActionMode; - -/** - * @hide - */ -public class ActionBarContextView extends AbsActionBarView implements AnimatorListener { - //UNUSED private static final String TAG = "ActionBarContextView"; - - private CharSequence mTitle; - private CharSequence mSubtitle; - - private NineLinearLayout mClose; - private View mCustomView; - private LinearLayout mTitleLayout; - private TextView mTitleView; - private TextView mSubtitleView; - private int mTitleStyleRes; - private int mSubtitleStyleRes; - private Drawable mSplitBackground; - - private Animator mCurrentAnimation; - private boolean mAnimateInOnLayout; - private int mAnimationMode; - - private static final int ANIMATE_IDLE = 0; - private static final int ANIMATE_IN = 1; - private static final int ANIMATE_OUT = 2; - - public ActionBarContextView(Context context) { - this(context, null); - } - - public ActionBarContextView(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.actionModeStyle); - } - - public ActionBarContextView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockActionMode, defStyle, 0); - setBackgroundDrawable(a.getDrawable( - R.styleable.SherlockActionMode_background)); - mTitleStyleRes = a.getResourceId( - R.styleable.SherlockActionMode_titleTextStyle, 0); - mSubtitleStyleRes = a.getResourceId( - R.styleable.SherlockActionMode_subtitleTextStyle, 0); - - mContentHeight = a.getLayoutDimension( - R.styleable.SherlockActionMode_height, 0); - - mSplitBackground = a.getDrawable( - R.styleable.SherlockActionMode_backgroundSplit); - - a.recycle(); - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (mActionMenuPresenter != null) { - mActionMenuPresenter.hideOverflowMenu(); - mActionMenuPresenter.hideSubMenus(); - } - } - - @Override - public void setSplitActionBar(boolean split) { - if (mSplitActionBar != split) { - if (mActionMenuPresenter != null) { - // Mode is already active; move everything over and adjust the menu itself. - final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.MATCH_PARENT); - if (!split) { - mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); - mMenuView.setBackgroundDrawable(null); - final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); - if (oldParent != null) oldParent.removeView(mMenuView); - addView(mMenuView, layoutParams); - } else { - // Allow full screen width in split mode. - mActionMenuPresenter.setWidthLimit( - getContext().getResources().getDisplayMetrics().widthPixels, true); - // No limit to the item count; use whatever will fit. - mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); - // Span the whole width - layoutParams.width = LayoutParams.MATCH_PARENT; - layoutParams.height = mContentHeight; - mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); - mMenuView.setBackgroundDrawable(mSplitBackground); - final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); - if (oldParent != null) oldParent.removeView(mMenuView); - mSplitView.addView(mMenuView, layoutParams); - } - } - super.setSplitActionBar(split); - } - } - - public void setContentHeight(int height) { - mContentHeight = height; - } - - public void setCustomView(View view) { - if (mCustomView != null) { - removeView(mCustomView); - } - mCustomView = view; - if (mTitleLayout != null) { - removeView(mTitleLayout); - mTitleLayout = null; - } - if (view != null) { - addView(view); - } - requestLayout(); - } - - public void setTitle(CharSequence title) { - mTitle = title; - initTitle(); - } - - public void setSubtitle(CharSequence subtitle) { - mSubtitle = subtitle; - initTitle(); - } - - public CharSequence getTitle() { - return mTitle; - } - - public CharSequence getSubtitle() { - return mSubtitle; - } - - private void initTitle() { - if (mTitleLayout == null) { - LayoutInflater inflater = LayoutInflater.from(getContext()); - inflater.inflate(R.layout.abs__action_bar_title_item, this); - mTitleLayout = (LinearLayout) getChildAt(getChildCount() - 1); - mTitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_title); - mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_subtitle); - if (mTitleStyleRes != 0) { - mTitleView.setTextAppearance(mContext, mTitleStyleRes); - } - if (mSubtitleStyleRes != 0) { - mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); - } - } - - mTitleView.setText(mTitle); - mSubtitleView.setText(mSubtitle); - - final boolean hasTitle = !TextUtils.isEmpty(mTitle); - final boolean hasSubtitle = !TextUtils.isEmpty(mSubtitle); - mSubtitleView.setVisibility(hasSubtitle ? VISIBLE : GONE); - mTitleLayout.setVisibility(hasTitle || hasSubtitle ? VISIBLE : GONE); - if (mTitleLayout.getParent() == null) { - addView(mTitleLayout); - } - } - - public void initForMode(final ActionMode mode) { - if (mClose == null) { - LayoutInflater inflater = LayoutInflater.from(mContext); - mClose = (NineLinearLayout)inflater.inflate(R.layout.abs__action_mode_close_item, this, false); - addView(mClose); - } else if (mClose.getParent() == null) { - addView(mClose); - } - - View closeButton = mClose.findViewById(R.id.abs__action_mode_close_button); - closeButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - mode.finish(); - } - }); - - final MenuBuilder menu = (MenuBuilder) mode.getMenu(); - if (mActionMenuPresenter != null) { - mActionMenuPresenter.dismissPopupMenus(); - } - mActionMenuPresenter = new ActionMenuPresenter(mContext); - mActionMenuPresenter.setReserveOverflow(true); - - final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.MATCH_PARENT); - if (!mSplitActionBar) { - menu.addMenuPresenter(mActionMenuPresenter); - mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); - mMenuView.setBackgroundDrawable(null); - addView(mMenuView, layoutParams); - } else { - // Allow full screen width in split mode. - mActionMenuPresenter.setWidthLimit( - getContext().getResources().getDisplayMetrics().widthPixels, true); - // No limit to the item count; use whatever will fit. - mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); - // Span the whole width - layoutParams.width = LayoutParams.MATCH_PARENT; - layoutParams.height = mContentHeight; - menu.addMenuPresenter(mActionMenuPresenter); - mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); - mMenuView.setBackgroundDrawable(mSplitBackground); - mSplitView.addView(mMenuView, layoutParams); - } - - mAnimateInOnLayout = true; - } - - public void closeMode() { - if (mAnimationMode == ANIMATE_OUT) { - // Called again during close; just finish what we were doing. - return; - } - if (mClose == null) { - killMode(); - return; - } - - finishAnimation(); - mAnimationMode = ANIMATE_OUT; - mCurrentAnimation = makeOutAnimation(); - mCurrentAnimation.start(); - } - - private void finishAnimation() { - final Animator a = mCurrentAnimation; - if (a != null) { - mCurrentAnimation = null; - a.end(); - } - } - - public void killMode() { - finishAnimation(); - removeAllViews(); - if (mSplitView != null) { - mSplitView.removeView(mMenuView); - } - mCustomView = null; - mMenuView = null; - mAnimateInOnLayout = false; - } - - @Override - public boolean showOverflowMenu() { - if (mActionMenuPresenter != null) { - return mActionMenuPresenter.showOverflowMenu(); - } - return false; - } - - @Override - public boolean hideOverflowMenu() { - if (mActionMenuPresenter != null) { - return mActionMenuPresenter.hideOverflowMenu(); - } - return false; - } - - @Override - public boolean isOverflowMenuShowing() { - if (mActionMenuPresenter != null) { - return mActionMenuPresenter.isOverflowMenuShowing(); - } - return false; - } - - @Override - protected ViewGroup.LayoutParams generateDefaultLayoutParams() { - // Used by custom views if they don't supply layout params. Everything else - // added to an ActionBarContextView should have them already. - return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - } - - @Override - public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { - return new MarginLayoutParams(getContext(), attrs); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - if (widthMode != MeasureSpec.EXACTLY) { - throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + - "with android:layout_width=\"match_parent\" (or fill_parent)"); - } - - final int heightMode = MeasureSpec.getMode(heightMeasureSpec); - if (heightMode == MeasureSpec.UNSPECIFIED) { - throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + - "with android:layout_height=\"wrap_content\""); - } - - final int contentWidth = MeasureSpec.getSize(widthMeasureSpec); - - int maxHeight = mContentHeight > 0 ? - mContentHeight : MeasureSpec.getSize(heightMeasureSpec); - - final int verticalPadding = getPaddingTop() + getPaddingBottom(); - int availableWidth = contentWidth - getPaddingLeft() - getPaddingRight(); - final int height = maxHeight - verticalPadding; - final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); - - if (mClose != null) { - availableWidth = measureChildView(mClose, availableWidth, childSpecHeight, 0); - MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); - availableWidth -= lp.leftMargin + lp.rightMargin; - } - - if (mMenuView != null && mMenuView.getParent() == this) { - availableWidth = measureChildView(mMenuView, availableWidth, - childSpecHeight, 0); - } - - if (mTitleLayout != null && mCustomView == null) { - availableWidth = measureChildView(mTitleLayout, availableWidth, childSpecHeight, 0); - } - - if (mCustomView != null) { - ViewGroup.LayoutParams lp = mCustomView.getLayoutParams(); - final int customWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? - MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; - final int customWidth = lp.width >= 0 ? - Math.min(lp.width, availableWidth) : availableWidth; - final int customHeightMode = lp.height != LayoutParams.WRAP_CONTENT ? - MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; - final int customHeight = lp.height >= 0 ? - Math.min(lp.height, height) : height; - mCustomView.measure(MeasureSpec.makeMeasureSpec(customWidth, customWidthMode), - MeasureSpec.makeMeasureSpec(customHeight, customHeightMode)); - } - - if (mContentHeight <= 0) { - int measuredHeight = 0; - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - View v = getChildAt(i); - int paddedViewHeight = v.getMeasuredHeight() + verticalPadding; - if (paddedViewHeight > measuredHeight) { - measuredHeight = paddedViewHeight; - } - } - setMeasuredDimension(contentWidth, measuredHeight); - } else { - setMeasuredDimension(contentWidth, maxHeight); - } - } - - private Animator makeInAnimation() { - mClose.setTranslationX(-mClose.getWidth() - - ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); - ObjectAnimator buttonAnimator = ObjectAnimator.ofFloat(mClose, "translationX", 0); - buttonAnimator.setDuration(200); - buttonAnimator.addListener(this); - buttonAnimator.setInterpolator(new DecelerateInterpolator()); - - AnimatorSet set = new AnimatorSet(); - AnimatorSet.Builder b = set.play(buttonAnimator); - - if (mMenuView != null) { - final int count = mMenuView.getChildCount(); - if (count > 0) { - for (int i = count - 1, j = 0; i >= 0; i--, j++) { - AnimatorProxy child = AnimatorProxy.wrap(mMenuView.getChildAt(i)); - child.setScaleY(0); - ObjectAnimator a = ObjectAnimator.ofFloat(child, "scaleY", 0, 1); - a.setDuration(100); - a.setStartDelay(j * 70); - b.with(a); - } - } - } - - return set; - } - - private Animator makeOutAnimation() { - ObjectAnimator buttonAnimator = ObjectAnimator.ofFloat(mClose, "translationX", - -mClose.getWidth() - ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); - buttonAnimator.setDuration(200); - buttonAnimator.addListener(this); - buttonAnimator.setInterpolator(new DecelerateInterpolator()); - - AnimatorSet set = new AnimatorSet(); - AnimatorSet.Builder b = set.play(buttonAnimator); - - if (mMenuView != null) { - final int count = mMenuView.getChildCount(); - if (count > 0) { - for (int i = 0; i < 0; i++) { - AnimatorProxy child = AnimatorProxy.wrap(mMenuView.getChildAt(i)); - child.setScaleY(0); - ObjectAnimator a = ObjectAnimator.ofFloat(child, "scaleY", 0); - a.setDuration(100); - a.setStartDelay(i * 70); - b.with(a); - } - } - } - - return set; - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - int x = getPaddingLeft(); - final int y = getPaddingTop(); - final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); - - if (mClose != null && mClose.getVisibility() != GONE) { - MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); - x += lp.leftMargin; - x += positionChild(mClose, x, y, contentHeight); - x += lp.rightMargin; - - if (mAnimateInOnLayout) { - mAnimationMode = ANIMATE_IN; - mCurrentAnimation = makeInAnimation(); - mCurrentAnimation.start(); - mAnimateInOnLayout = false; - } - } - - if (mTitleLayout != null && mCustomView == null) { - x += positionChild(mTitleLayout, x, y, contentHeight); - } - - if (mCustomView != null) { - x += positionChild(mCustomView, x, y, contentHeight); - } - - x = r - l - getPaddingRight(); - - if (mMenuView != null) { - x -= positionChildInverse(mMenuView, x, y, contentHeight); - } - } - - @Override - public void onAnimationStart(Animator animation) { - } - - @Override - public void onAnimationEnd(Animator animation) { - if (mAnimationMode == ANIMATE_OUT) { - killMode(); - } - mAnimationMode = ANIMATE_IDLE; - } - - @Override - public void onAnimationCancel(Animator animation) { - } - - @Override - public void onAnimationRepeat(Animator animation) { - } - - @Override - public boolean shouldDelayChildPressedState() { - return false; - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { - // Action mode started - //TODO event.setSource(this); - event.setClassName(getClass().getName()); - event.setPackageName(getContext().getPackageName()); - event.setContentDescription(mTitle); - } else { - //TODO super.onInitializeAccessibilityEvent(event); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java deleted file mode 100644 index 4636de17f..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java +++ /dev/null @@ -1,1548 +0,0 @@ -/* - * Copyright (C) 2010 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.widget; - -import org.xmlpull.v1.XmlPullParser; -import android.app.Activity; -import android.content.Context; -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.TypedArray; -import android.content.res.XmlResourceParser; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.accessibility.AccessibilityEvent; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.app.ActionBar.OnNavigationListener; -import com.actionbarsherlock.internal.ActionBarSherlockCompat; -import com.actionbarsherlock.internal.view.menu.ActionMenuItem; -import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; -import com.actionbarsherlock.internal.view.menu.ActionMenuView; -import com.actionbarsherlock.internal.view.menu.MenuBuilder; -import com.actionbarsherlock.internal.view.menu.MenuItemImpl; -import com.actionbarsherlock.internal.view.menu.MenuPresenter; -import com.actionbarsherlock.internal.view.menu.MenuView; -import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; -import com.actionbarsherlock.view.CollapsibleActionView; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.Window; - -import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; - -/** - * @hide - */ -public class ActionBarView extends AbsActionBarView { - private static final String TAG = "ActionBarView"; - private static final boolean DEBUG = false; - - /** - * Display options applied by default - */ - public static final int DISPLAY_DEFAULT = 0; - - /** - * Display options that require re-layout as opposed to a simple invalidate - */ - private static final int DISPLAY_RELAYOUT_MASK = - ActionBar.DISPLAY_SHOW_HOME | - ActionBar.DISPLAY_USE_LOGO | - ActionBar.DISPLAY_HOME_AS_UP | - ActionBar.DISPLAY_SHOW_CUSTOM | - ActionBar.DISPLAY_SHOW_TITLE; - - private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.LEFT | Gravity.CENTER_VERTICAL; - - private int mNavigationMode; - private int mDisplayOptions = -1; - private CharSequence mTitle; - private CharSequence mSubtitle; - private Drawable mIcon; - private Drawable mLogo; - - private HomeView mHomeLayout; - private HomeView mExpandedHomeLayout; - private LinearLayout mTitleLayout; - private TextView mTitleView; - private TextView mSubtitleView; - private View mTitleUpView; - - private IcsSpinner mSpinner; - private IcsLinearLayout mListNavLayout; - private ScrollingTabContainerView mTabScrollView; - private View mCustomNavView; - private IcsProgressBar mProgressView; - private IcsProgressBar mIndeterminateProgressView; - - private int mProgressBarPadding; - private int mItemPadding; - - private int mTitleStyleRes; - private int mSubtitleStyleRes; - private int mProgressStyle; - private int mIndeterminateProgressStyle; - - private boolean mUserTitle; - private boolean mIncludeTabs; - private boolean mIsCollapsable; - private boolean mIsCollapsed; - - private MenuBuilder mOptionsMenu; - - private ActionBarContextView mContextView; - - private ActionMenuItem mLogoNavItem; - - private SpinnerAdapter mSpinnerAdapter; - private OnNavigationListener mCallback; - - //UNUSED private Runnable mTabSelector; - - private ExpandedActionViewMenuPresenter mExpandedMenuPresenter; - View mExpandedActionView; - - Window.Callback mWindowCallback; - - @SuppressWarnings("rawtypes") - private final IcsAdapterView.OnItemSelectedListener mNavItemSelectedListener = - new IcsAdapterView.OnItemSelectedListener() { - public void onItemSelected(IcsAdapterView parent, View view, int position, long id) { - if (mCallback != null) { - mCallback.onNavigationItemSelected(position, id); - } - } - public void onNothingSelected(IcsAdapterView parent) { - // Do nothing - } - }; - - private final OnClickListener mExpandedActionViewUpListener = new OnClickListener() { - @Override - public void onClick(View v) { - final MenuItemImpl item = mExpandedMenuPresenter.mCurrentExpandedItem; - if (item != null) { - item.collapseActionView(); - } - } - }; - - private final OnClickListener mUpClickListener = new OnClickListener() { - public void onClick(View v) { - mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem); - } - }; - - public ActionBarView(Context context, AttributeSet attrs) { - super(context, attrs); - - // Background is always provided by the container. - setBackgroundResource(0); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockActionBar, - R.attr.actionBarStyle, 0); - - ApplicationInfo appInfo = context.getApplicationInfo(); - PackageManager pm = context.getPackageManager(); - mNavigationMode = a.getInt(R.styleable.SherlockActionBar_navigationMode, - ActionBar.NAVIGATION_MODE_STANDARD); - mTitle = a.getText(R.styleable.SherlockActionBar_title); - mSubtitle = a.getText(R.styleable.SherlockActionBar_subtitle); - - mLogo = a.getDrawable(R.styleable.SherlockActionBar_logo); - if (mLogo == null) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { - if (context instanceof Activity) { - //Even though native methods existed in API 9 and 10 they don't work - //so just parse the manifest to look for the logo pre-Honeycomb - final int resId = loadLogoFromManifest((Activity) context); - if (resId != 0) { - mLogo = context.getResources().getDrawable(resId); - } - } - } else { - if (context instanceof Activity) { - try { - mLogo = pm.getActivityLogo(((Activity) context).getComponentName()); - } catch (NameNotFoundException e) { - Log.e(TAG, "Activity component name not found!", e); - } - } - if (mLogo == null) { - mLogo = appInfo.loadLogo(pm); - } - } - } - - mIcon = a.getDrawable(R.styleable.SherlockActionBar_icon); - if (mIcon == null) { - if (context instanceof Activity) { - try { - mIcon = pm.getActivityIcon(((Activity) context).getComponentName()); - } catch (NameNotFoundException e) { - Log.e(TAG, "Activity component name not found!", e); - } - } - if (mIcon == null) { - mIcon = appInfo.loadIcon(pm); - } - } - - final LayoutInflater inflater = LayoutInflater.from(context); - - final int homeResId = a.getResourceId( - R.styleable.SherlockActionBar_homeLayout, - R.layout.abs__action_bar_home); - - mHomeLayout = (HomeView) inflater.inflate(homeResId, this, false); - - mExpandedHomeLayout = (HomeView) inflater.inflate(homeResId, this, false); - mExpandedHomeLayout.setUp(true); - mExpandedHomeLayout.setOnClickListener(mExpandedActionViewUpListener); - mExpandedHomeLayout.setContentDescription(getResources().getText( - R.string.abs__action_bar_up_description)); - - mTitleStyleRes = a.getResourceId(R.styleable.SherlockActionBar_titleTextStyle, 0); - mSubtitleStyleRes = a.getResourceId(R.styleable.SherlockActionBar_subtitleTextStyle, 0); - mProgressStyle = a.getResourceId(R.styleable.SherlockActionBar_progressBarStyle, 0); - mIndeterminateProgressStyle = a.getResourceId( - R.styleable.SherlockActionBar_indeterminateProgressStyle, 0); - - mProgressBarPadding = a.getDimensionPixelOffset(R.styleable.SherlockActionBar_progressBarPadding, 0); - mItemPadding = a.getDimensionPixelOffset(R.styleable.SherlockActionBar_itemPadding, 0); - - setDisplayOptions(a.getInt(R.styleable.SherlockActionBar_displayOptions, DISPLAY_DEFAULT)); - - final int customNavId = a.getResourceId(R.styleable.SherlockActionBar_customNavigationLayout, 0); - if (customNavId != 0) { - mCustomNavView = inflater.inflate(customNavId, this, false); - mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; - setDisplayOptions(mDisplayOptions | ActionBar.DISPLAY_SHOW_CUSTOM); - } - - mContentHeight = a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0); - - a.recycle(); - - mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle); - mHomeLayout.setOnClickListener(mUpClickListener); - mHomeLayout.setClickable(true); - mHomeLayout.setFocusable(true); - } - - /** - * Attempt to programmatically load the logo from the manifest file of an - * activity by using an XML pull parser. This should allow us to read the - * logo attribute regardless of the platform it is being run on. - * - * @param activity Activity instance. - * @return Logo resource ID. - */ - private static int loadLogoFromManifest(Activity activity) { - int logo = 0; - try { - final String thisPackage = activity.getClass().getName(); - if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage); - - final String packageName = activity.getApplicationInfo().packageName; - final AssetManager am = activity.createPackageContext(packageName, 0).getAssets(); - final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); - - int eventType = xml.getEventType(); - while (eventType != XmlPullParser.END_DOCUMENT) { - if (eventType == XmlPullParser.START_TAG) { - String name = xml.getName(); - - if ("application".equals(name)) { - //Check if the has the attribute - if (DEBUG) Log.d(TAG, "Got "); - - for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { - if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); - - if ("logo".equals(xml.getAttributeName(i))) { - logo = xml.getAttributeResourceValue(i, 0); - break; //out of for loop - } - } - } else if ("activity".equals(name)) { - //Check if the is us and has the attribute - if (DEBUG) Log.d(TAG, "Got "); - Integer activityLogo = null; - String activityPackage = null; - boolean isOurActivity = false; - - for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { - if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); - - //We need both uiOptions and name attributes - String attrName = xml.getAttributeName(i); - if ("logo".equals(attrName)) { - activityLogo = xml.getAttributeResourceValue(i, 0); - } else if ("name".equals(attrName)) { - activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i)); - if (!thisPackage.equals(activityPackage)) { - break; //on to the next - } - isOurActivity = true; - } - - //Make sure we have both attributes before processing - if ((activityLogo != null) && (activityPackage != null)) { - //Our activity, logo specified, override with our value - logo = activityLogo.intValue(); - } - } - if (isOurActivity) { - //If we matched our activity but it had no logo don't - //do any more processing of the manifest - break; - } - } - } - eventType = xml.nextToken(); - } - } catch (Exception e) { - e.printStackTrace(); - } - if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo)); - return logo; - } - - /* - * Must be public so we can dispatch pre-2.2 via ActionBarImpl. - */ - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - mTitleView = null; - mSubtitleView = null; - mTitleUpView = null; - if (mTitleLayout != null && mTitleLayout.getParent() == this) { - removeView(mTitleLayout); - } - mTitleLayout = null; - if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { - initTitle(); - } - - if (mTabScrollView != null && mIncludeTabs) { - ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams(); - if (lp != null) { - lp.width = LayoutParams.WRAP_CONTENT; - lp.height = LayoutParams.MATCH_PARENT; - } - mTabScrollView.setAllowCollapse(true); - } - } - - /** - * Set the window callback used to invoke menu items; used for dispatching home button presses. - * @param cb Window callback to dispatch to - */ - public void setWindowCallback(Window.Callback cb) { - mWindowCallback = cb; - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - //UNUSED removeCallbacks(mTabSelector); - if (mActionMenuPresenter != null) { - mActionMenuPresenter.hideOverflowMenu(); - mActionMenuPresenter.hideSubMenus(); - } - } - - @Override - public boolean shouldDelayChildPressedState() { - return false; - } - - public void initProgress() { - mProgressView = new IcsProgressBar(mContext, null, 0, mProgressStyle); - mProgressView.setId(R.id.abs__progress_horizontal); - mProgressView.setMax(10000); - addView(mProgressView); - } - - public void initIndeterminateProgress() { - mIndeterminateProgressView = new IcsProgressBar(mContext, null, 0, mIndeterminateProgressStyle); - mIndeterminateProgressView.setId(R.id.abs__progress_circular); - addView(mIndeterminateProgressView); - } - - @Override - public void setSplitActionBar(boolean splitActionBar) { - if (mSplitActionBar != splitActionBar) { - if (mMenuView != null) { - final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); - if (oldParent != null) { - oldParent.removeView(mMenuView); - } - if (splitActionBar) { - if (mSplitView != null) { - mSplitView.addView(mMenuView); - } - } else { - addView(mMenuView); - } - } - if (mSplitView != null) { - mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE); - } - super.setSplitActionBar(splitActionBar); - } - } - - public boolean isSplitActionBar() { - return mSplitActionBar; - } - - public boolean hasEmbeddedTabs() { - return mIncludeTabs; - } - - public void setEmbeddedTabView(ScrollingTabContainerView tabs) { - if (mTabScrollView != null) { - removeView(mTabScrollView); - } - mTabScrollView = tabs; - mIncludeTabs = tabs != null; - if (mIncludeTabs && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { - addView(mTabScrollView); - ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams(); - lp.width = LayoutParams.WRAP_CONTENT; - lp.height = LayoutParams.MATCH_PARENT; - tabs.setAllowCollapse(true); - } - } - - public void setCallback(OnNavigationListener callback) { - mCallback = callback; - } - - public void setMenu(Menu menu, MenuPresenter.Callback cb) { - if (menu == mOptionsMenu) return; - - if (mOptionsMenu != null) { - mOptionsMenu.removeMenuPresenter(mActionMenuPresenter); - mOptionsMenu.removeMenuPresenter(mExpandedMenuPresenter); - } - - MenuBuilder builder = (MenuBuilder) menu; - mOptionsMenu = builder; - if (mMenuView != null) { - final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); - if (oldParent != null) { - oldParent.removeView(mMenuView); - } - } - if (mActionMenuPresenter == null) { - mActionMenuPresenter = new ActionMenuPresenter(mContext); - mActionMenuPresenter.setCallback(cb); - mActionMenuPresenter.setId(R.id.abs__action_menu_presenter); - mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); - } - - ActionMenuView menuView; - final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.MATCH_PARENT); - if (!mSplitActionBar) { - mActionMenuPresenter.setExpandedActionViewsExclusive( - getResources_getBoolean(getContext(), - R.bool.abs__action_bar_expanded_action_views_exclusive)); - configPresenters(builder); - menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); - final ViewGroup oldParent = (ViewGroup) menuView.getParent(); - if (oldParent != null && oldParent != this) { - oldParent.removeView(menuView); - } - addView(menuView, layoutParams); - } else { - mActionMenuPresenter.setExpandedActionViewsExclusive(false); - // Allow full screen width in split mode. - mActionMenuPresenter.setWidthLimit( - getContext().getResources().getDisplayMetrics().widthPixels, true); - // No limit to the item count; use whatever will fit. - mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); - // Span the whole width - layoutParams.width = LayoutParams.MATCH_PARENT; - configPresenters(builder); - menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); - if (mSplitView != null) { - final ViewGroup oldParent = (ViewGroup) menuView.getParent(); - if (oldParent != null && oldParent != mSplitView) { - oldParent.removeView(menuView); - } - menuView.setVisibility(getAnimatedVisibility()); - mSplitView.addView(menuView, layoutParams); - } else { - // We'll add this later if we missed it this time. - menuView.setLayoutParams(layoutParams); - } - } - mMenuView = menuView; - } - - private void configPresenters(MenuBuilder builder) { - if (builder != null) { - builder.addMenuPresenter(mActionMenuPresenter); - builder.addMenuPresenter(mExpandedMenuPresenter); - } else { - mActionMenuPresenter.initForMenu(mContext, null); - mExpandedMenuPresenter.initForMenu(mContext, null); - mActionMenuPresenter.updateMenuView(true); - mExpandedMenuPresenter.updateMenuView(true); - } - } - - public boolean hasExpandedActionView() { - return mExpandedMenuPresenter != null && - mExpandedMenuPresenter.mCurrentExpandedItem != null; - } - - public void collapseActionView() { - final MenuItemImpl item = mExpandedMenuPresenter == null ? null : - mExpandedMenuPresenter.mCurrentExpandedItem; - if (item != null) { - item.collapseActionView(); - } - } - - public void setCustomNavigationView(View view) { - final boolean showCustom = (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0; - if (mCustomNavView != null && showCustom) { - removeView(mCustomNavView); - } - mCustomNavView = view; - if (mCustomNavView != null && showCustom) { - addView(mCustomNavView); - } - } - - public CharSequence getTitle() { - return mTitle; - } - - /** - * Set the action bar title. This will always replace or override window titles. - * @param title Title to set - * - * @see #setWindowTitle(CharSequence) - */ - public void setTitle(CharSequence title) { - mUserTitle = true; - setTitleImpl(title); - } - - /** - * Set the window title. A window title will always be replaced or overridden by a user title. - * @param title Title to set - * - * @see #setTitle(CharSequence) - */ - public void setWindowTitle(CharSequence title) { - if (!mUserTitle) { - setTitleImpl(title); - } - } - - private void setTitleImpl(CharSequence title) { - mTitle = title; - if (mTitleView != null) { - mTitleView.setText(title); - final boolean visible = mExpandedActionView == null && - (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0 && - (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); - mTitleLayout.setVisibility(visible ? VISIBLE : GONE); - } - if (mLogoNavItem != null) { - mLogoNavItem.setTitle(title); - } - } - - public CharSequence getSubtitle() { - return mSubtitle; - } - - public void setSubtitle(CharSequence subtitle) { - mSubtitle = subtitle; - if (mSubtitleView != null) { - mSubtitleView.setText(subtitle); - mSubtitleView.setVisibility(subtitle != null ? VISIBLE : GONE); - final boolean visible = mExpandedActionView == null && - (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0 && - (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); - mTitleLayout.setVisibility(visible ? VISIBLE : GONE); - } - } - - public void setHomeButtonEnabled(boolean enable) { - mHomeLayout.setEnabled(enable); - mHomeLayout.setFocusable(enable); - // Make sure the home button has an accurate content description for accessibility. - if (!enable) { - mHomeLayout.setContentDescription(null); - } else if ((mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0) { - mHomeLayout.setContentDescription(mContext.getResources().getText( - R.string.abs__action_bar_up_description)); - } else { - mHomeLayout.setContentDescription(mContext.getResources().getText( - R.string.abs__action_bar_home_description)); - } - } - - public void setDisplayOptions(int options) { - final int flagsChanged = mDisplayOptions == -1 ? -1 : options ^ mDisplayOptions; - mDisplayOptions = options; - - if ((flagsChanged & DISPLAY_RELAYOUT_MASK) != 0) { - final boolean showHome = (options & ActionBar.DISPLAY_SHOW_HOME) != 0; - final int vis = showHome && mExpandedActionView == null ? VISIBLE : GONE; - mHomeLayout.setVisibility(vis); - - if ((flagsChanged & ActionBar.DISPLAY_HOME_AS_UP) != 0) { - final boolean setUp = (options & ActionBar.DISPLAY_HOME_AS_UP) != 0; - mHomeLayout.setUp(setUp); - - // Showing home as up implicitly enables interaction with it. - // In honeycomb it was always enabled, so make this transition - // a bit easier for developers in the common case. - // (It would be silly to show it as up without responding to it.) - if (setUp) { - setHomeButtonEnabled(true); - } - } - - if ((flagsChanged & ActionBar.DISPLAY_USE_LOGO) != 0) { - final boolean logoVis = mLogo != null && (options & ActionBar.DISPLAY_USE_LOGO) != 0; - mHomeLayout.setIcon(logoVis ? mLogo : mIcon); - } - - if ((flagsChanged & ActionBar.DISPLAY_SHOW_TITLE) != 0) { - if ((options & ActionBar.DISPLAY_SHOW_TITLE) != 0) { - initTitle(); - } else { - removeView(mTitleLayout); - } - } - - if (mTitleLayout != null && (flagsChanged & - (ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME)) != 0) { - final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; - mTitleUpView.setVisibility(!showHome ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE); - mTitleLayout.setEnabled(!showHome && homeAsUp); - } - - if ((flagsChanged & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) { - if ((options & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { - addView(mCustomNavView); - } else { - removeView(mCustomNavView); - } - } - - requestLayout(); - } else { - invalidate(); - } - - // Make sure the home button has an accurate content description for accessibility. - if (!mHomeLayout.isEnabled()) { - mHomeLayout.setContentDescription(null); - } else if ((options & ActionBar.DISPLAY_HOME_AS_UP) != 0) { - mHomeLayout.setContentDescription(mContext.getResources().getText( - R.string.abs__action_bar_up_description)); - } else { - mHomeLayout.setContentDescription(mContext.getResources().getText( - R.string.abs__action_bar_home_description)); - } - } - - public void setIcon(Drawable icon) { - mIcon = icon; - if (icon != null && - ((mDisplayOptions & ActionBar.DISPLAY_USE_LOGO) == 0 || mLogo == null)) { - mHomeLayout.setIcon(icon); - } - } - - public void setIcon(int resId) { - setIcon(mContext.getResources().getDrawable(resId)); - } - - public void setLogo(Drawable logo) { - mLogo = logo; - if (logo != null && (mDisplayOptions & ActionBar.DISPLAY_USE_LOGO) != 0) { - mHomeLayout.setIcon(logo); - } - } - - public void setLogo(int resId) { - setLogo(mContext.getResources().getDrawable(resId)); - } - - public void setNavigationMode(int mode) { - final int oldMode = mNavigationMode; - if (mode != oldMode) { - switch (oldMode) { - case ActionBar.NAVIGATION_MODE_LIST: - if (mListNavLayout != null) { - removeView(mListNavLayout); - } - break; - case ActionBar.NAVIGATION_MODE_TABS: - if (mTabScrollView != null && mIncludeTabs) { - removeView(mTabScrollView); - } - } - - switch (mode) { - case ActionBar.NAVIGATION_MODE_LIST: - if (mSpinner == null) { - mSpinner = new IcsSpinner(mContext, null, - R.attr.actionDropDownStyle); - mListNavLayout = (IcsLinearLayout) LayoutInflater.from(mContext) - .inflate(R.layout.abs__action_bar_tab_bar_view, null); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( - LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); - params.gravity = Gravity.CENTER; - mListNavLayout.addView(mSpinner, params); - } - if (mSpinner.getAdapter() != mSpinnerAdapter) { - mSpinner.setAdapter(mSpinnerAdapter); - } - mSpinner.setOnItemSelectedListener(mNavItemSelectedListener); - addView(mListNavLayout); - break; - case ActionBar.NAVIGATION_MODE_TABS: - if (mTabScrollView != null && mIncludeTabs) { - addView(mTabScrollView); - } - break; - } - mNavigationMode = mode; - requestLayout(); - } - } - - public void setDropdownAdapter(SpinnerAdapter adapter) { - mSpinnerAdapter = adapter; - if (mSpinner != null) { - mSpinner.setAdapter(adapter); - } - } - - public SpinnerAdapter getDropdownAdapter() { - return mSpinnerAdapter; - } - - public void setDropdownSelectedPosition(int position) { - mSpinner.setSelection(position); - } - - public int getDropdownSelectedPosition() { - return mSpinner.getSelectedItemPosition(); - } - - public View getCustomNavigationView() { - return mCustomNavView; - } - - public int getNavigationMode() { - return mNavigationMode; - } - - public int getDisplayOptions() { - return mDisplayOptions; - } - - @Override - protected ViewGroup.LayoutParams generateDefaultLayoutParams() { - // Used by custom nav views if they don't supply layout params. Everything else - // added to an ActionBarView should have them already. - return new ActionBar.LayoutParams(DEFAULT_CUSTOM_GRAVITY); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - addView(mHomeLayout); - - if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { - final ViewParent parent = mCustomNavView.getParent(); - if (parent != this) { - if (parent instanceof ViewGroup) { - ((ViewGroup) parent).removeView(mCustomNavView); - } - addView(mCustomNavView); - } - } - } - - private void initTitle() { - if (mTitleLayout == null) { - LayoutInflater inflater = LayoutInflater.from(getContext()); - mTitleLayout = (LinearLayout) inflater.inflate(R.layout.abs__action_bar_title_item, - this, false); - mTitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_title); - mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_subtitle); - mTitleUpView = mTitleLayout.findViewById(R.id.abs__up); - - mTitleLayout.setOnClickListener(mUpClickListener); - - if (mTitleStyleRes != 0) { - mTitleView.setTextAppearance(mContext, mTitleStyleRes); - } - if (mTitle != null) { - mTitleView.setText(mTitle); - } - - if (mSubtitleStyleRes != 0) { - mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); - } - if (mSubtitle != null) { - mSubtitleView.setText(mSubtitle); - mSubtitleView.setVisibility(VISIBLE); - } - - final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; - final boolean showHome = (mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0; - mTitleUpView.setVisibility(!showHome ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE); - mTitleLayout.setEnabled(homeAsUp && !showHome); - } - - addView(mTitleLayout); - if (mExpandedActionView != null || - (TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mSubtitle))) { - // Don't show while in expanded mode or with empty text - mTitleLayout.setVisibility(GONE); - } - } - - public void setContextView(ActionBarContextView view) { - mContextView = view; - } - - public void setCollapsable(boolean collapsable) { - mIsCollapsable = collapsable; - } - - public boolean isCollapsed() { - return mIsCollapsed; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int childCount = getChildCount(); - if (mIsCollapsable) { - int visibleChildren = 0; - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE && - !(child == mMenuView && mMenuView.getChildCount() == 0)) { - visibleChildren++; - } - } - - if (visibleChildren == 0) { - // No size for an empty action bar when collapsable. - setMeasuredDimension(0, 0); - mIsCollapsed = true; - return; - } - } - mIsCollapsed = false; - - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - if (widthMode != MeasureSpec.EXACTLY) { - throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + - "with android:layout_width=\"match_parent\" (or fill_parent)"); - } - - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - if (heightMode != MeasureSpec.AT_MOST) { - throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + - "with android:layout_height=\"wrap_content\""); - } - - int contentWidth = MeasureSpec.getSize(widthMeasureSpec); - - int maxHeight = mContentHeight > 0 ? - mContentHeight : MeasureSpec.getSize(heightMeasureSpec); - - final int verticalPadding = getPaddingTop() + getPaddingBottom(); - final int paddingLeft = getPaddingLeft(); - final int paddingRight = getPaddingRight(); - final int height = maxHeight - verticalPadding; - final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); - - int availableWidth = contentWidth - paddingLeft - paddingRight; - int leftOfCenter = availableWidth / 2; - int rightOfCenter = leftOfCenter; - - HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; - - if (homeLayout.getVisibility() != GONE) { - final ViewGroup.LayoutParams lp = homeLayout.getLayoutParams(); - int homeWidthSpec; - if (lp.width < 0) { - homeWidthSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST); - } else { - homeWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); - } - homeLayout.measure(homeWidthSpec, - MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); - final int homeWidth = homeLayout.getMeasuredWidth() + homeLayout.getLeftOffset(); - availableWidth = Math.max(0, availableWidth - homeWidth); - leftOfCenter = Math.max(0, availableWidth - homeWidth); - } - - if (mMenuView != null && mMenuView.getParent() == this) { - availableWidth = measureChildView(mMenuView, availableWidth, - childSpecHeight, 0); - rightOfCenter = Math.max(0, rightOfCenter - mMenuView.getMeasuredWidth()); - } - - if (mIndeterminateProgressView != null && - mIndeterminateProgressView.getVisibility() != GONE) { - availableWidth = measureChildView(mIndeterminateProgressView, availableWidth, - childSpecHeight, 0); - rightOfCenter = Math.max(0, - rightOfCenter - mIndeterminateProgressView.getMeasuredWidth()); - } - - final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && - (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; - - if (mExpandedActionView == null) { - switch (mNavigationMode) { - case ActionBar.NAVIGATION_MODE_LIST: - if (mListNavLayout != null) { - final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding; - availableWidth = Math.max(0, availableWidth - itemPaddingSize); - leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize); - mListNavLayout.measure( - MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); - final int listNavWidth = mListNavLayout.getMeasuredWidth(); - availableWidth = Math.max(0, availableWidth - listNavWidth); - leftOfCenter = Math.max(0, leftOfCenter - listNavWidth); - } - break; - case ActionBar.NAVIGATION_MODE_TABS: - if (mTabScrollView != null) { - final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding; - availableWidth = Math.max(0, availableWidth - itemPaddingSize); - leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize); - mTabScrollView.measure( - MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); - final int tabWidth = mTabScrollView.getMeasuredWidth(); - availableWidth = Math.max(0, availableWidth - tabWidth); - leftOfCenter = Math.max(0, leftOfCenter - tabWidth); - } - break; - } - } - - View customView = null; - if (mExpandedActionView != null) { - customView = mExpandedActionView; - } else if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && - mCustomNavView != null) { - customView = mCustomNavView; - } - - if (customView != null) { - final ViewGroup.LayoutParams lp = generateLayoutParams(customView.getLayoutParams()); - final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? - (ActionBar.LayoutParams) lp : null; - - int horizontalMargin = 0; - int verticalMargin = 0; - if (ablp != null) { - horizontalMargin = ablp.leftMargin + ablp.rightMargin; - verticalMargin = ablp.topMargin + ablp.bottomMargin; - } - - // If the action bar is wrapping to its content height, don't allow a custom - // view to MATCH_PARENT. - int customNavHeightMode; - if (mContentHeight <= 0) { - customNavHeightMode = MeasureSpec.AT_MOST; - } else { - customNavHeightMode = lp.height != LayoutParams.WRAP_CONTENT ? - MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; - } - final int customNavHeight = Math.max(0, - (lp.height >= 0 ? Math.min(lp.height, height) : height) - verticalMargin); - - final int customNavWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? - MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; - int customNavWidth = Math.max(0, - (lp.width >= 0 ? Math.min(lp.width, availableWidth) : availableWidth) - - horizontalMargin); - final int hgrav = (ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY) & - Gravity.HORIZONTAL_GRAVITY_MASK; - - // Centering a custom view is treated specially; we try to center within the whole - // action bar rather than in the available space. - if (hgrav == Gravity.CENTER_HORIZONTAL && lp.width == LayoutParams.MATCH_PARENT) { - customNavWidth = Math.min(leftOfCenter, rightOfCenter) * 2; - } - - customView.measure( - MeasureSpec.makeMeasureSpec(customNavWidth, customNavWidthMode), - MeasureSpec.makeMeasureSpec(customNavHeight, customNavHeightMode)); - availableWidth -= horizontalMargin + customView.getMeasuredWidth(); - } - - if (mExpandedActionView == null && showTitle) { - availableWidth = measureChildView(mTitleLayout, availableWidth, - MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY), 0); - leftOfCenter = Math.max(0, leftOfCenter - mTitleLayout.getMeasuredWidth()); - } - - if (mContentHeight <= 0) { - int measuredHeight = 0; - for (int i = 0; i < childCount; i++) { - View v = getChildAt(i); - int paddedViewHeight = v.getMeasuredHeight() + verticalPadding; - if (paddedViewHeight > measuredHeight) { - measuredHeight = paddedViewHeight; - } - } - setMeasuredDimension(contentWidth, measuredHeight); - } else { - setMeasuredDimension(contentWidth, maxHeight); - } - - if (mContextView != null) { - mContextView.setContentHeight(getMeasuredHeight()); - } - - if (mProgressView != null && mProgressView.getVisibility() != GONE) { - mProgressView.measure(MeasureSpec.makeMeasureSpec( - contentWidth - mProgressBarPadding * 2, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST)); - } - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - int x = getPaddingLeft(); - final int y = getPaddingTop(); - final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); - - if (contentHeight <= 0) { - // Nothing to do if we can't see anything. - return; - } - - HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; - if (homeLayout.getVisibility() != GONE) { - final int leftOffset = homeLayout.getLeftOffset(); - x += positionChild(homeLayout, x + leftOffset, y, contentHeight) + leftOffset; - } - - if (mExpandedActionView == null) { - final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && - (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; - if (showTitle) { - x += positionChild(mTitleLayout, x, y, contentHeight); - } - - switch (mNavigationMode) { - case ActionBar.NAVIGATION_MODE_STANDARD: - break; - case ActionBar.NAVIGATION_MODE_LIST: - if (mListNavLayout != null) { - if (showTitle) x += mItemPadding; - x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding; - } - break; - case ActionBar.NAVIGATION_MODE_TABS: - if (mTabScrollView != null) { - if (showTitle) x += mItemPadding; - x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding; - } - break; - } - } - - int menuLeft = r - l - getPaddingRight(); - if (mMenuView != null && mMenuView.getParent() == this) { - positionChildInverse(mMenuView, menuLeft, y, contentHeight); - menuLeft -= mMenuView.getMeasuredWidth(); - } - - if (mIndeterminateProgressView != null && - mIndeterminateProgressView.getVisibility() != GONE) { - positionChildInverse(mIndeterminateProgressView, menuLeft, y, contentHeight); - menuLeft -= mIndeterminateProgressView.getMeasuredWidth(); - } - - View customView = null; - if (mExpandedActionView != null) { - customView = mExpandedActionView; - } else if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && - mCustomNavView != null) { - customView = mCustomNavView; - } - if (customView != null) { - ViewGroup.LayoutParams lp = customView.getLayoutParams(); - final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? - (ActionBar.LayoutParams) lp : null; - - final int gravity = ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY; - final int navWidth = customView.getMeasuredWidth(); - - int topMargin = 0; - int bottomMargin = 0; - if (ablp != null) { - x += ablp.leftMargin; - menuLeft -= ablp.rightMargin; - topMargin = ablp.topMargin; - bottomMargin = ablp.bottomMargin; - } - - int hgravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; - // See if we actually have room to truly center; if not push against left or right. - if (hgravity == Gravity.CENTER_HORIZONTAL) { - final int centeredLeft = ((getRight() - getLeft()) - navWidth) / 2; - if (centeredLeft < x) { - hgravity = Gravity.LEFT; - } else if (centeredLeft + navWidth > menuLeft) { - hgravity = Gravity.RIGHT; - } - } else if (gravity == -1) { - hgravity = Gravity.LEFT; - } - - int xpos = 0; - switch (hgravity) { - case Gravity.CENTER_HORIZONTAL: - xpos = ((getRight() - getLeft()) - navWidth) / 2; - break; - case Gravity.LEFT: - xpos = x; - break; - case Gravity.RIGHT: - xpos = menuLeft - navWidth; - break; - } - - int vgravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; - - if (gravity == -1) { - vgravity = Gravity.CENTER_VERTICAL; - } - - int ypos = 0; - switch (vgravity) { - case Gravity.CENTER_VERTICAL: - final int paddedTop = getPaddingTop(); - final int paddedBottom = getBottom() - getTop() - getPaddingBottom(); - ypos = ((paddedBottom - paddedTop) - customView.getMeasuredHeight()) / 2; - break; - case Gravity.TOP: - ypos = getPaddingTop() + topMargin; - break; - case Gravity.BOTTOM: - ypos = getHeight() - getPaddingBottom() - customView.getMeasuredHeight() - - bottomMargin; - break; - } - final int customWidth = customView.getMeasuredWidth(); - customView.layout(xpos, ypos, xpos + customWidth, - ypos + customView.getMeasuredHeight()); - x += customWidth; - } - - if (mProgressView != null) { - mProgressView.bringToFront(); - final int halfProgressHeight = mProgressView.getMeasuredHeight() / 2; - mProgressView.layout(mProgressBarPadding, -halfProgressHeight, - mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight); - } - } - - @Override - public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { - return new ActionBar.LayoutParams(getContext(), attrs); - } - - @Override - public ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { - if (lp == null) { - lp = generateDefaultLayoutParams(); - } - return lp; - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState state = new SavedState(superState); - - if (mExpandedMenuPresenter != null && mExpandedMenuPresenter.mCurrentExpandedItem != null) { - state.expandedMenuItemId = mExpandedMenuPresenter.mCurrentExpandedItem.getItemId(); - } - - state.isOverflowOpen = isOverflowMenuShowing(); - - return state; - } - - @Override - public void onRestoreInstanceState(Parcelable p) { - SavedState state = (SavedState) p; - - super.onRestoreInstanceState(state.getSuperState()); - - if (state.expandedMenuItemId != 0 && - mExpandedMenuPresenter != null && mOptionsMenu != null) { - final MenuItem item = mOptionsMenu.findItem(state.expandedMenuItemId); - if (item != null) { - item.expandActionView(); - } - } - - if (state.isOverflowOpen) { - postShowOverflowMenu(); - } - } - - static class SavedState extends BaseSavedState { - int expandedMenuItemId; - boolean isOverflowOpen; - - SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - expandedMenuItemId = in.readInt(); - isOverflowOpen = in.readInt() != 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeInt(expandedMenuItemId); - out.writeInt(isOverflowOpen ? 1 : 0); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - public static class HomeView extends FrameLayout { - private View mUpView; - private ImageView mIconView; - private int mUpWidth; - - public HomeView(Context context) { - this(context, null); - } - - public HomeView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public void setUp(boolean isUp) { - mUpView.setVisibility(isUp ? VISIBLE : GONE); - } - - public void setIcon(Drawable icon) { - mIconView.setImageDrawable(icon); - } - - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - onPopulateAccessibilityEvent(event); - return true; - } - - @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - super.onPopulateAccessibilityEvent(event); - } - final CharSequence cdesc = getContentDescription(); - if (!TextUtils.isEmpty(cdesc)) { - event.getText().add(cdesc); - } - } - - @Override - public boolean dispatchHoverEvent(MotionEvent event) { - // Don't allow children to hover; we want this to be treated as a single component. - return onHoverEvent(event); - } - - @Override - protected void onFinishInflate() { - mUpView = findViewById(R.id.abs__up); - mIconView = (ImageView) findViewById(R.id.abs__home); - } - - public int getLeftOffset() { - return mUpView.getVisibility() == GONE ? mUpWidth : 0; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - measureChildWithMargins(mUpView, widthMeasureSpec, 0, heightMeasureSpec, 0); - final LayoutParams upLp = (LayoutParams) mUpView.getLayoutParams(); - mUpWidth = upLp.leftMargin + mUpView.getMeasuredWidth() + upLp.rightMargin; - int width = mUpView.getVisibility() == GONE ? 0 : mUpWidth; - int height = upLp.topMargin + mUpView.getMeasuredHeight() + upLp.bottomMargin; - measureChildWithMargins(mIconView, widthMeasureSpec, width, heightMeasureSpec, 0); - final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); - width += iconLp.leftMargin + mIconView.getMeasuredWidth() + iconLp.rightMargin; - height = Math.max(height, - iconLp.topMargin + mIconView.getMeasuredHeight() + iconLp.bottomMargin); - - final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - final int heightMode = MeasureSpec.getMode(heightMeasureSpec); - final int widthSize = MeasureSpec.getSize(widthMeasureSpec); - final int heightSize = MeasureSpec.getSize(heightMeasureSpec); - - switch (widthMode) { - case MeasureSpec.AT_MOST: - width = Math.min(width, widthSize); - break; - case MeasureSpec.EXACTLY: - width = widthSize; - break; - case MeasureSpec.UNSPECIFIED: - default: - break; - } - switch (heightMode) { - case MeasureSpec.AT_MOST: - height = Math.min(height, heightSize); - break; - case MeasureSpec.EXACTLY: - height = heightSize; - break; - case MeasureSpec.UNSPECIFIED: - default: - break; - } - setMeasuredDimension(width, height); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - final int vCenter = (b - t) / 2; - //UNUSED int width = r - l; - int upOffset = 0; - if (mUpView.getVisibility() != GONE) { - final LayoutParams upLp = (LayoutParams) mUpView.getLayoutParams(); - final int upHeight = mUpView.getMeasuredHeight(); - final int upWidth = mUpView.getMeasuredWidth(); - final int upTop = vCenter - upHeight / 2; - mUpView.layout(0, upTop, upWidth, upTop + upHeight); - upOffset = upLp.leftMargin + upWidth + upLp.rightMargin; - //UNUSED width -= upOffset; - l += upOffset; - } - final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); - final int iconHeight = mIconView.getMeasuredHeight(); - final int iconWidth = mIconView.getMeasuredWidth(); - final int hCenter = (r - l) / 2; - final int iconLeft = upOffset + Math.max(iconLp.leftMargin, hCenter - iconWidth / 2); - final int iconTop = Math.max(iconLp.topMargin, vCenter - iconHeight / 2); - mIconView.layout(iconLeft, iconTop, iconLeft + iconWidth, iconTop + iconHeight); - } - } - - private class ExpandedActionViewMenuPresenter implements MenuPresenter { - MenuBuilder mMenu; - MenuItemImpl mCurrentExpandedItem; - - @Override - public void initForMenu(Context context, MenuBuilder menu) { - // Clear the expanded action view when menus change. - if (mMenu != null && mCurrentExpandedItem != null) { - mMenu.collapseItemActionView(mCurrentExpandedItem); - } - mMenu = menu; - } - - @Override - public MenuView getMenuView(ViewGroup root) { - return null; - } - - @Override - public void updateMenuView(boolean cleared) { - // Make sure the expanded item we have is still there. - if (mCurrentExpandedItem != null) { - boolean found = false; - - if (mMenu != null) { - final int count = mMenu.size(); - for (int i = 0; i < count; i++) { - final MenuItem item = mMenu.getItem(i); - if (item == mCurrentExpandedItem) { - found = true; - break; - } - } - } - - if (!found) { - // The item we had expanded disappeared. Collapse. - collapseItemActionView(mMenu, mCurrentExpandedItem); - } - } - } - - @Override - public void setCallback(Callback cb) { - } - - @Override - public boolean onSubMenuSelected(SubMenuBuilder subMenu) { - return false; - } - - @Override - public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { - } - - @Override - public boolean flagActionItems() { - return false; - } - - @Override - public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { - mExpandedActionView = item.getActionView(); - mExpandedHomeLayout.setIcon(mIcon.getConstantState().newDrawable(/* TODO getResources() */)); - mCurrentExpandedItem = item; - if (mExpandedActionView.getParent() != ActionBarView.this) { - addView(mExpandedActionView); - } - if (mExpandedHomeLayout.getParent() != ActionBarView.this) { - addView(mExpandedHomeLayout); - } - mHomeLayout.setVisibility(GONE); - if (mTitleLayout != null) mTitleLayout.setVisibility(GONE); - if (mTabScrollView != null) mTabScrollView.setVisibility(GONE); - if (mSpinner != null) mSpinner.setVisibility(GONE); - if (mCustomNavView != null) mCustomNavView.setVisibility(GONE); - requestLayout(); - item.setActionViewExpanded(true); - - if (mExpandedActionView instanceof CollapsibleActionView) { - ((CollapsibleActionView) mExpandedActionView).onActionViewExpanded(); - } - - return true; - } - - @Override - public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { - // Do this before detaching the actionview from the hierarchy, in case - // it needs to dismiss the soft keyboard, etc. - if (mExpandedActionView instanceof CollapsibleActionView) { - ((CollapsibleActionView) mExpandedActionView).onActionViewCollapsed(); - } - - removeView(mExpandedActionView); - removeView(mExpandedHomeLayout); - mExpandedActionView = null; - if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0) { - mHomeLayout.setVisibility(VISIBLE); - } - if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { - if (mTitleLayout == null) { - initTitle(); - } else { - mTitleLayout.setVisibility(VISIBLE); - } - } - if (mTabScrollView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { - mTabScrollView.setVisibility(VISIBLE); - } - if (mSpinner != null && mNavigationMode == ActionBar.NAVIGATION_MODE_LIST) { - mSpinner.setVisibility(VISIBLE); - } - if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { - mCustomNavView.setVisibility(VISIBLE); - } - mExpandedHomeLayout.setIcon(null); - mCurrentExpandedItem = null; - requestLayout(); - item.setActionViewExpanded(false); - - return true; - } - - @Override - public int getId() { - return 0; - } - - @Override - public Parcelable onSaveInstanceState() { - return null; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java deleted file mode 100644 index fa3698f3b..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import java.util.Locale; -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Build; -import android.util.AttributeSet; -import android.widget.Button; - -public class CapitalizingButton extends Button { - private static final boolean SANS_ICE_CREAM = Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH; - private static final boolean IS_GINGERBREAD = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; - - private static final int[] R_styleable_Button = new int[] { - android.R.attr.textAllCaps - }; - private static final int R_styleable_Button_textAllCaps = 0; - - private boolean mAllCaps; - - public CapitalizingButton(Context context, AttributeSet attrs) { - super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(attrs, R_styleable_Button); - mAllCaps = a.getBoolean(R_styleable_Button_textAllCaps, true); - a.recycle(); - } - - public void setTextCompat(CharSequence text) { - if (SANS_ICE_CREAM && mAllCaps && text != null) { - if (IS_GINGERBREAD) { - setText(text.toString().toUpperCase(Locale.ROOT)); - } else { - setText(text.toString().toUpperCase()); - } - } else { - setText(text); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java deleted file mode 100644 index cae8b8aed..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Build; -import android.util.AttributeSet; -import android.widget.TextView; - -import java.util.Locale; - -public class CapitalizingTextView extends TextView { - private static final boolean SANS_ICE_CREAM = Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH; - private static final boolean IS_GINGERBREAD = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; - - private static final int[] R_styleable_TextView = new int[] { - android.R.attr.textAllCaps - }; - private static final int R_styleable_TextView_textAllCaps = 0; - - private boolean mAllCaps; - - public CapitalizingTextView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public CapitalizingTextView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - TypedArray a = context.obtainStyledAttributes(attrs, R_styleable_TextView, defStyle, 0); - mAllCaps = a.getBoolean(R_styleable_TextView_textAllCaps, true); - a.recycle(); - } - - public void setTextCompat(CharSequence text) { - if (SANS_ICE_CREAM && mAllCaps && text != null) { - if (IS_GINGERBREAD) { - try { - setText(text.toString().toUpperCase(Locale.ROOT)); - } catch (NoSuchFieldError e) { - //Some manufacturer broke Locale.ROOT. See #572. - setText(text.toString().toUpperCase()); - } - } else { - setText(text.toString().toUpperCase()); - } - } else { - setText(text); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java deleted file mode 100644 index 14f092c81..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import android.view.View; -import android.widget.FrameLayout; -import com.actionbarsherlock.view.CollapsibleActionView; - -/** - * Wraps an ABS collapsible action view in a native container that delegates the calls. - */ -public class CollapsibleActionViewWrapper extends FrameLayout implements android.view.CollapsibleActionView { - private final CollapsibleActionView child; - - public CollapsibleActionViewWrapper(View child) { - super(child.getContext()); - this.child = (CollapsibleActionView) child; - addView(child); - } - - @Override public void onActionViewExpanded() { - child.onActionViewExpanded(); - } - - @Override public void onActionViewCollapsed() { - child.onActionViewCollapsed(); - } - - public View unwrap() { - return getChildAt(0); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java deleted file mode 100644 index ad1b4f0a8..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import static android.view.View.MeasureSpec.EXACTLY; -import android.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.util.DisplayMetrics; -import android.util.TypedValue; -import android.widget.LinearLayout; -import com.actionbarsherlock.R; - -public class FakeDialogPhoneWindow extends LinearLayout { - final TypedValue mMinWidthMajor = new TypedValue(); - final TypedValue mMinWidthMinor = new TypedValue(); - - public FakeDialogPhoneWindow(Context context, AttributeSet attrs) { - super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockTheme); - - a.getValue(R.styleable.SherlockTheme_windowMinWidthMajor, mMinWidthMajor); - a.getValue(R.styleable.SherlockTheme_windowMinWidthMinor, mMinWidthMinor); - - a.recycle(); - } - - /* Stolen from PhoneWindow */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); - final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; - - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int width = getMeasuredWidth(); - boolean measure = false; - - widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY); - - final TypedValue tv = isPortrait ? mMinWidthMinor : mMinWidthMajor; - - if (tv.type != TypedValue.TYPE_NULL) { - final int min; - if (tv.type == TypedValue.TYPE_DIMENSION) { - min = (int)tv.getDimension(metrics); - } else if (tv.type == TypedValue.TYPE_FRACTION) { - min = (int)tv.getFraction(metrics.widthPixels, metrics.widthPixels); - } else { - min = 0; - } - - if (width < min) { - widthMeasureSpec = MeasureSpec.makeMeasureSpec(min, EXACTLY); - measure = true; - } - } - - // TODO: Support height? - - if (measure) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java deleted file mode 100644 index ce0cb3bca..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java +++ /dev/null @@ -1,479 +0,0 @@ -/* - * 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.widget; - -import android.content.Context; -import android.database.DataSetObserver; -import android.graphics.Rect; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.AttributeSet; -import android.util.SparseArray; -import android.view.View; -import android.view.ViewGroup; -import android.widget.SpinnerAdapter; - -/** - * An abstract base class for spinner widgets. SDK users will probably not - * need to use this class. - * - * @attr ref android.R.styleable#AbsSpinner_entries - */ -public abstract class IcsAbsSpinner extends IcsAdapterView { - private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; - - SpinnerAdapter mAdapter; - - int mHeightMeasureSpec; - int mWidthMeasureSpec; - boolean mBlockLayoutRequests; - - int mSelectionLeftPadding = 0; - int mSelectionTopPadding = 0; - int mSelectionRightPadding = 0; - int mSelectionBottomPadding = 0; - final Rect mSpinnerPadding = new Rect(); - - final RecycleBin mRecycler = new RecycleBin(); - private DataSetObserver mDataSetObserver; - - /** Temporary frame to hold a child View's frame rectangle */ - private Rect mTouchFrame; - - public IcsAbsSpinner(Context context) { - super(context); - initAbsSpinner(); - } - - public IcsAbsSpinner(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public IcsAbsSpinner(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - initAbsSpinner(); - - /* - TypedArray a = context.obtainStyledAttributes(attrs, - com.android.internal.R.styleable.AbsSpinner, defStyle, 0); - - CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries); - if (entries != null) { - ArrayAdapter adapter = - new ArrayAdapter(context, - R.layout.simple_spinner_item, entries); - adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item); - setAdapter(adapter); - } - - a.recycle(); - */ - } - - /** - * Common code for different constructor flavors - */ - private void initAbsSpinner() { - setFocusable(true); - setWillNotDraw(false); - } - - /** - * The Adapter is used to provide the data which backs this Spinner. - * It also provides methods to transform spinner items based on their position - * relative to the selected item. - * @param adapter The SpinnerAdapter to use for this Spinner - */ - @Override - public void setAdapter(SpinnerAdapter adapter) { - if (null != mAdapter) { - mAdapter.unregisterDataSetObserver(mDataSetObserver); - resetList(); - } - - mAdapter = adapter; - - mOldSelectedPosition = INVALID_POSITION; - mOldSelectedRowId = INVALID_ROW_ID; - - if (mAdapter != null) { - mOldItemCount = mItemCount; - mItemCount = mAdapter.getCount(); - checkFocus(); - - mDataSetObserver = new AdapterDataSetObserver(); - mAdapter.registerDataSetObserver(mDataSetObserver); - - int position = mItemCount > 0 ? 0 : INVALID_POSITION; - - setSelectedPositionInt(position); - setNextSelectedPositionInt(position); - - if (mItemCount == 0) { - // Nothing selected - checkSelectionChanged(); - } - - } else { - checkFocus(); - resetList(); - // Nothing selected - checkSelectionChanged(); - } - - requestLayout(); - } - - /** - * Clear out all children from the list - */ - void resetList() { - mDataChanged = false; - mNeedSync = false; - - removeAllViewsInLayout(); - mOldSelectedPosition = INVALID_POSITION; - mOldSelectedRowId = INVALID_ROW_ID; - - setSelectedPositionInt(INVALID_POSITION); - setNextSelectedPositionInt(INVALID_POSITION); - invalidate(); - } - - /** - * @see android.view.View#measure(int, int) - * - * Figure out the dimensions of this Spinner. The width comes from - * the widthMeasureSpec as Spinnners can't have their width set to - * UNSPECIFIED. The height is based on the height of the selected item - * plus padding. - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int widthSize; - int heightSize; - - final int mPaddingLeft = getPaddingLeft(); - final int mPaddingTop = getPaddingTop(); - final int mPaddingRight = getPaddingRight(); - final int mPaddingBottom = getPaddingBottom(); - - mSpinnerPadding.left = mPaddingLeft > mSelectionLeftPadding ? mPaddingLeft - : mSelectionLeftPadding; - mSpinnerPadding.top = mPaddingTop > mSelectionTopPadding ? mPaddingTop - : mSelectionTopPadding; - mSpinnerPadding.right = mPaddingRight > mSelectionRightPadding ? mPaddingRight - : mSelectionRightPadding; - mSpinnerPadding.bottom = mPaddingBottom > mSelectionBottomPadding ? mPaddingBottom - : mSelectionBottomPadding; - - if (mDataChanged) { - handleDataChanged(); - } - - int preferredHeight = 0; - int preferredWidth = 0; - boolean needsMeasuring = true; - - int selectedPosition = getSelectedItemPosition(); - if (selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount()) { - // Try looking in the recycler. (Maybe we were measured once already) - View view = mRecycler.get(selectedPosition); - if (view == null) { - // Make a new one - view = mAdapter.getView(selectedPosition, null, this); - } - - if (view != null) { - // Put in recycler for re-measuring and/or layout - mRecycler.put(selectedPosition, view); - } - - if (view != null) { - if (view.getLayoutParams() == null) { - mBlockLayoutRequests = true; - view.setLayoutParams(generateDefaultLayoutParams()); - mBlockLayoutRequests = false; - } - measureChild(view, widthMeasureSpec, heightMeasureSpec); - - preferredHeight = getChildHeight(view) + mSpinnerPadding.top + mSpinnerPadding.bottom; - preferredWidth = getChildWidth(view) + mSpinnerPadding.left + mSpinnerPadding.right; - - needsMeasuring = false; - } - } - - if (needsMeasuring) { - // No views -- just use padding - preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom; - if (widthMode == MeasureSpec.UNSPECIFIED) { - preferredWidth = mSpinnerPadding.left + mSpinnerPadding.right; - } - } - - preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight()); - preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth()); - - if (IS_HONEYCOMB) { - heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0); - widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 0); - } else { - heightSize = resolveSize(preferredHeight, heightMeasureSpec); - widthSize = resolveSize(preferredWidth, widthMeasureSpec); - } - - setMeasuredDimension(widthSize, heightSize); - mHeightMeasureSpec = heightMeasureSpec; - mWidthMeasureSpec = widthMeasureSpec; - } - - int getChildHeight(View child) { - return child.getMeasuredHeight(); - } - - int getChildWidth(View child) { - return child.getMeasuredWidth(); - } - - @Override - protected ViewGroup.LayoutParams generateDefaultLayoutParams() { - return new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - } - - void recycleAllViews() { - final int childCount = getChildCount(); - final IcsAbsSpinner.RecycleBin recycleBin = mRecycler; - final int position = mFirstPosition; - - // All views go in recycler - for (int i = 0; i < childCount; i++) { - View v = getChildAt(i); - int index = position + i; - recycleBin.put(index, v); - } - } - - /** - * Jump directly to a specific item in the adapter data. - */ - public void setSelection(int position, boolean animate) { - // Animate only if requested position is already on screen somewhere - boolean shouldAnimate = animate && mFirstPosition <= position && - position <= mFirstPosition + getChildCount() - 1; - setSelectionInt(position, shouldAnimate); - } - - @Override - public void setSelection(int position) { - setNextSelectedPositionInt(position); - requestLayout(); - invalidate(); - } - - - /** - * Makes the item at the supplied position selected. - * - * @param position Position to select - * @param animate Should the transition be animated - * - */ - void setSelectionInt(int position, boolean animate) { - if (position != mOldSelectedPosition) { - mBlockLayoutRequests = true; - int delta = position - mSelectedPosition; - setNextSelectedPositionInt(position); - layout(delta, animate); - mBlockLayoutRequests = false; - } - } - - abstract void layout(int delta, boolean animate); - - @Override - public View getSelectedView() { - if (mItemCount > 0 && mSelectedPosition >= 0) { - return getChildAt(mSelectedPosition - mFirstPosition); - } else { - return null; - } - } - - /** - * Override to prevent spamming ourselves with layout requests - * as we place views - * - * @see android.view.View#requestLayout() - */ - @Override - public void requestLayout() { - if (!mBlockLayoutRequests) { - super.requestLayout(); - } - } - - @Override - public SpinnerAdapter getAdapter() { - return mAdapter; - } - - @Override - public int getCount() { - return mItemCount; - } - - /** - * Maps a point to a position in the list. - * - * @param x X in local coordinate - * @param y Y in local coordinate - * @return The position of the item which contains the specified point, or - * {@link #INVALID_POSITION} if the point does not intersect an item. - */ - public int pointToPosition(int x, int y) { - Rect frame = mTouchFrame; - if (frame == null) { - mTouchFrame = new Rect(); - frame = mTouchFrame; - } - - final int count = getChildCount(); - for (int i = count - 1; i >= 0; i--) { - View child = getChildAt(i); - if (child.getVisibility() == View.VISIBLE) { - child.getHitRect(frame); - if (frame.contains(x, y)) { - return mFirstPosition + i; - } - } - } - return INVALID_POSITION; - } - - static class SavedState extends BaseSavedState { - long selectedId; - int position; - - /** - * Constructor called from {@link AbsSpinner#onSaveInstanceState()} - */ - SavedState(Parcelable superState) { - super(superState); - } - - /** - * Constructor called from {@link #CREATOR} - */ - private SavedState(Parcel in) { - super(in); - selectedId = in.readLong(); - position = in.readInt(); - } - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeLong(selectedId); - out.writeInt(position); - } - - @Override - public String toString() { - return "AbsSpinner.SavedState{" - + Integer.toHexString(System.identityHashCode(this)) - + " selectedId=" + selectedId - + " position=" + position + "}"; - } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState ss = new SavedState(superState); - ss.selectedId = getSelectedItemId(); - if (ss.selectedId >= 0) { - ss.position = getSelectedItemPosition(); - } else { - ss.position = INVALID_POSITION; - } - return ss; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState ss = (SavedState) state; - - super.onRestoreInstanceState(ss.getSuperState()); - - if (ss.selectedId >= 0) { - mDataChanged = true; - mNeedSync = true; - mSyncRowId = ss.selectedId; - mSyncPosition = ss.position; - mSyncMode = SYNC_SELECTED_POSITION; - requestLayout(); - } - } - - class RecycleBin { - private final SparseArray mScrapHeap = new SparseArray(); - - public void put(int position, View v) { - mScrapHeap.put(position, v); - } - - View get(int position) { - // System.out.print("Looking for " + position); - View result = mScrapHeap.get(position); - if (result != null) { - // System.out.println(" HIT"); - mScrapHeap.delete(position); - } else { - // System.out.println(" MISS"); - } - return result; - } - - void clear() { - final SparseArray scrapHeap = mScrapHeap; - final int count = scrapHeap.size(); - for (int i = 0; i < count; i++) { - final View view = scrapHeap.valueAt(i); - if (view != null) { - removeDetachedView(view, true); - } - } - scrapHeap.clear(); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java deleted file mode 100644 index c786dc5c1..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java +++ /dev/null @@ -1,1160 +0,0 @@ -/* - * 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.widget; - -import android.content.Context; -import android.database.DataSetObserver; -import android.os.Parcelable; -import android.os.SystemClock; -import android.util.AttributeSet; -import android.util.SparseArray; -import android.view.ContextMenu; -import android.view.SoundEffectConstants; -import android.view.View; -import android.view.ViewDebug; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityNodeInfo; -import android.widget.Adapter; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ListView; - - -/** - * An AdapterView is a view whose children are determined by an {@link Adapter}. - * - *

- * See {@link ListView}, {@link GridView}, {@link Spinner} and - * {@link Gallery} for commonly used subclasses of AdapterView. - * - *

- *

Developer Guides

- *

For more information about using AdapterView, read the - * Binding to Data with AdapterView - * developer guide.

- */ -public abstract class IcsAdapterView extends ViewGroup { - - /** - * The item view type returned by {@link Adapter#getItemViewType(int)} when - * the adapter does not want the item's view recycled. - */ - public static final int ITEM_VIEW_TYPE_IGNORE = -1; - - /** - * The item view type returned by {@link Adapter#getItemViewType(int)} when - * the item is a header or footer. - */ - public static final int ITEM_VIEW_TYPE_HEADER_OR_FOOTER = -2; - - /** - * The position of the first child displayed - */ - @ViewDebug.ExportedProperty(category = "scrolling") - int mFirstPosition = 0; - - /** - * The offset in pixels from the top of the AdapterView to the top - * of the view to select during the next layout. - */ - int mSpecificTop; - - /** - * Position from which to start looking for mSyncRowId - */ - int mSyncPosition; - - /** - * Row id to look for when data has changed - */ - long mSyncRowId = INVALID_ROW_ID; - - /** - * Height of the view when mSyncPosition and mSyncRowId where set - */ - long mSyncHeight; - - /** - * True if we need to sync to mSyncRowId - */ - boolean mNeedSync = false; - - /** - * Indicates whether to sync based on the selection or position. Possible - * values are {@link #SYNC_SELECTED_POSITION} or - * {@link #SYNC_FIRST_POSITION}. - */ - int mSyncMode; - - /** - * Our height after the last layout - */ - private int mLayoutHeight; - - /** - * Sync based on the selected child - */ - static final int SYNC_SELECTED_POSITION = 0; - - /** - * Sync based on the first child displayed - */ - static final int SYNC_FIRST_POSITION = 1; - - /** - * Maximum amount of time to spend in {@link #findSyncPosition()} - */ - static final int SYNC_MAX_DURATION_MILLIS = 100; - - /** - * Indicates that this view is currently being laid out. - */ - boolean mInLayout = false; - - /** - * The listener that receives notifications when an item is selected. - */ - OnItemSelectedListener mOnItemSelectedListener; - - /** - * The listener that receives notifications when an item is clicked. - */ - OnItemClickListener mOnItemClickListener; - - /** - * The listener that receives notifications when an item is long clicked. - */ - OnItemLongClickListener mOnItemLongClickListener; - - /** - * True if the data has changed since the last layout - */ - boolean mDataChanged; - - /** - * The position within the adapter's data set of the item to select - * during the next layout. - */ - @ViewDebug.ExportedProperty(category = "list") - int mNextSelectedPosition = INVALID_POSITION; - - /** - * The item id of the item to select during the next layout. - */ - long mNextSelectedRowId = INVALID_ROW_ID; - - /** - * The position within the adapter's data set of the currently selected item. - */ - @ViewDebug.ExportedProperty(category = "list") - int mSelectedPosition = INVALID_POSITION; - - /** - * The item id of the currently selected item. - */ - long mSelectedRowId = INVALID_ROW_ID; - - /** - * View to show if there are no items to show. - */ - private View mEmptyView; - - /** - * The number of items in the current adapter. - */ - @ViewDebug.ExportedProperty(category = "list") - int mItemCount; - - /** - * The number of items in the adapter before a data changed event occurred. - */ - int mOldItemCount; - - /** - * Represents an invalid position. All valid positions are in the range 0 to 1 less than the - * number of items in the current adapter. - */ - public static final int INVALID_POSITION = -1; - - /** - * Represents an empty or invalid row id - */ - public static final long INVALID_ROW_ID = Long.MIN_VALUE; - - /** - * The last selected position we used when notifying - */ - int mOldSelectedPosition = INVALID_POSITION; - - /** - * The id of the last selected position we used when notifying - */ - long mOldSelectedRowId = INVALID_ROW_ID; - - /** - * Indicates what focusable state is requested when calling setFocusable(). - * In addition to this, this view has other criteria for actually - * determining the focusable state (such as whether its empty or the text - * filter is shown). - * - * @see #setFocusable(boolean) - * @see #checkFocus() - */ - private boolean mDesiredFocusableState; - private boolean mDesiredFocusableInTouchModeState; - - private SelectionNotifier mSelectionNotifier; - /** - * When set to true, calls to requestLayout() will not propagate up the parent hierarchy. - * This is used to layout the children during a layout pass. - */ - boolean mBlockLayoutRequests = false; - - public IcsAdapterView(Context context) { - super(context); - } - - public IcsAdapterView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public IcsAdapterView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - /** - * Register a callback to be invoked when an item in this AdapterView has - * been clicked. - * - * @param listener The callback that will be invoked. - */ - public void setOnItemClickListener(OnItemClickListener listener) { - mOnItemClickListener = listener; - } - - /** - * @return The callback to be invoked with an item in this AdapterView has - * been clicked, or null id no callback has been set. - */ - public final OnItemClickListener getOnItemClickListener() { - return mOnItemClickListener; - } - - /** - * Call the OnItemClickListener, if it is defined. - * - * @param view The view within the AdapterView that was clicked. - * @param position The position of the view in the adapter. - * @param id The row id of the item that was clicked. - * @return True if there was an assigned OnItemClickListener that was - * called, false otherwise is returned. - */ - public boolean performItemClick(View view, int position, long id) { - if (mOnItemClickListener != null) { - playSoundEffect(SoundEffectConstants.CLICK); - if (view != null) { - view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); - } - mOnItemClickListener.onItemClick(/*this*/null, view, position, id); - return true; - } - - return false; - } - - /** - * Interface definition for a callback to be invoked when an item in this - * view has been clicked and held. - */ - public interface OnItemLongClickListener { - /** - * Callback method to be invoked when an item in this view has been - * clicked and held. - * - * Implementers can call getItemAtPosition(position) if they need to access - * the data associated with the selected item. - * - * @param parent The AbsListView where the click happened - * @param view The view within the AbsListView that was clicked - * @param position The position of the view in the list - * @param id The row id of the item that was clicked - * - * @return true if the callback consumed the long click, false otherwise - */ - boolean onItemLongClick(IcsAdapterView parent, View view, int position, long id); - } - - - /** - * Register a callback to be invoked when an item in this AdapterView has - * been clicked and held - * - * @param listener The callback that will run - */ - public void setOnItemLongClickListener(OnItemLongClickListener listener) { - if (!isLongClickable()) { - setLongClickable(true); - } - mOnItemLongClickListener = listener; - } - - /** - * @return The callback to be invoked with an item in this AdapterView has - * been clicked and held, or null id no callback as been set. - */ - public final OnItemLongClickListener getOnItemLongClickListener() { - return mOnItemLongClickListener; - } - - /** - * Interface definition for a callback to be invoked when - * an item in this view has been selected. - */ - public interface OnItemSelectedListener { - /** - *

Callback method to be invoked when an item in this view has been - * selected. This callback is invoked only when the newly selected - * position is different from the previously selected position or if - * there was no selected item.

- * - * Impelmenters can call getItemAtPosition(position) if they need to access the - * data associated with the selected item. - * - * @param parent The AdapterView where the selection happened - * @param view The view within the AdapterView that was clicked - * @param position The position of the view in the adapter - * @param id The row id of the item that is selected - */ - void onItemSelected(IcsAdapterView parent, View view, int position, long id); - - /** - * Callback method to be invoked when the selection disappears from this - * view. The selection can disappear for instance when touch is activated - * or when the adapter becomes empty. - * - * @param parent The AdapterView that now contains no selected item. - */ - void onNothingSelected(IcsAdapterView parent); - } - - - /** - * Register a callback to be invoked when an item in this AdapterView has - * been selected. - * - * @param listener The callback that will run - */ - public void setOnItemSelectedListener(OnItemSelectedListener listener) { - mOnItemSelectedListener = listener; - } - - public final OnItemSelectedListener getOnItemSelectedListener() { - return mOnItemSelectedListener; - } - - /** - * Extra menu information provided to the - * {@link android.view.View.OnCreateContextMenuListener#onCreateContextMenu(ContextMenu, View, ContextMenuInfo) } - * callback when a context menu is brought up for this AdapterView. - * - */ - public static class AdapterContextMenuInfo implements ContextMenu.ContextMenuInfo { - - public AdapterContextMenuInfo(View targetView, int position, long id) { - this.targetView = targetView; - this.position = position; - this.id = id; - } - - /** - * The child view for which the context menu is being displayed. This - * will be one of the children of this AdapterView. - */ - public View targetView; - - /** - * The position in the adapter for which the context menu is being - * displayed. - */ - public int position; - - /** - * The row id of the item for which the context menu is being displayed. - */ - public long id; - } - - /** - * Returns the adapter currently associated with this widget. - * - * @return The adapter used to provide this view's content. - */ - public abstract T getAdapter(); - - /** - * Sets the adapter that provides the data and the views to represent the data - * in this widget. - * - * @param adapter The adapter to use to create this view's content. - */ - public abstract void setAdapter(T adapter); - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @param child Ignored. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void addView(View child) { - throw new UnsupportedOperationException("addView(View) is not supported in AdapterView"); - } - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @param child Ignored. - * @param index Ignored. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void addView(View child, int index) { - throw new UnsupportedOperationException("addView(View, int) is not supported in AdapterView"); - } - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @param child Ignored. - * @param params Ignored. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void addView(View child, LayoutParams params) { - throw new UnsupportedOperationException("addView(View, LayoutParams) " - + "is not supported in AdapterView"); - } - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @param child Ignored. - * @param index Ignored. - * @param params Ignored. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void addView(View child, int index, LayoutParams params) { - throw new UnsupportedOperationException("addView(View, int, LayoutParams) " - + "is not supported in AdapterView"); - } - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @param child Ignored. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void removeView(View child) { - throw new UnsupportedOperationException("removeView(View) is not supported in AdapterView"); - } - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @param index Ignored. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void removeViewAt(int index) { - throw new UnsupportedOperationException("removeViewAt(int) is not supported in AdapterView"); - } - - /** - * This method is not supported and throws an UnsupportedOperationException when called. - * - * @throws UnsupportedOperationException Every time this method is invoked. - */ - @Override - public void removeAllViews() { - throw new UnsupportedOperationException("removeAllViews() is not supported in AdapterView"); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - mLayoutHeight = getHeight(); - } - - /** - * Return the position of the currently selected item within the adapter's data set - * - * @return int Position (starting at 0), or {@link #INVALID_POSITION} if there is nothing selected. - */ - @ViewDebug.CapturedViewProperty - public int getSelectedItemPosition() { - return mNextSelectedPosition; - } - - /** - * @return The id corresponding to the currently selected item, or {@link #INVALID_ROW_ID} - * if nothing is selected. - */ - @ViewDebug.CapturedViewProperty - public long getSelectedItemId() { - return mNextSelectedRowId; - } - - /** - * @return The view corresponding to the currently selected item, or null - * if nothing is selected - */ - public abstract View getSelectedView(); - - /** - * @return The data corresponding to the currently selected item, or - * null if there is nothing selected. - */ - public Object getSelectedItem() { - T adapter = getAdapter(); - int selection = getSelectedItemPosition(); - if (adapter != null && adapter.getCount() > 0 && selection >= 0) { - return adapter.getItem(selection); - } else { - return null; - } - } - - /** - * @return The number of items owned by the Adapter associated with this - * AdapterView. (This is the number of data items, which may be - * larger than the number of visible views.) - */ - @ViewDebug.CapturedViewProperty - public int getCount() { - return mItemCount; - } - - /** - * Get the position within the adapter's data set for the view, where view is a an adapter item - * or a descendant of an adapter item. - * - * @param view an adapter item, or a descendant of an adapter item. This must be visible in this - * AdapterView at the time of the call. - * @return the position within the adapter's data set of the view, or {@link #INVALID_POSITION} - * if the view does not correspond to a list item (or it is not currently visible). - */ - public int getPositionForView(View view) { - View listItem = view; - try { - View v; - while (!(v = (View) listItem.getParent()).equals(this)) { - listItem = v; - } - } catch (ClassCastException e) { - // We made it up to the window without find this list view - return INVALID_POSITION; - } - - // Search the children for the list item - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - if (getChildAt(i).equals(listItem)) { - return mFirstPosition + i; - } - } - - // Child not found! - return INVALID_POSITION; - } - - /** - * Returns the position within the adapter's data set for the first item - * displayed on screen. - * - * @return The position within the adapter's data set - */ - public int getFirstVisiblePosition() { - return mFirstPosition; - } - - /** - * Returns the position within the adapter's data set for the last item - * displayed on screen. - * - * @return The position within the adapter's data set - */ - public int getLastVisiblePosition() { - return mFirstPosition + getChildCount() - 1; - } - - /** - * Sets the currently selected item. To support accessibility subclasses that - * override this method must invoke the overriden super method first. - * - * @param position Index (starting at 0) of the data item to be selected. - */ - public abstract void setSelection(int position); - - /** - * Sets the view to show if the adapter is empty - */ - public void setEmptyView(View emptyView) { - mEmptyView = emptyView; - - final T adapter = getAdapter(); - final boolean empty = ((adapter == null) || adapter.isEmpty()); - updateEmptyStatus(empty); - } - - /** - * When the current adapter is empty, the AdapterView can display a special view - * call the empty view. The empty view is used to provide feedback to the user - * that no data is available in this AdapterView. - * - * @return The view to show if the adapter is empty. - */ - public View getEmptyView() { - return mEmptyView; - } - - /** - * Indicates whether this view is in filter mode. Filter mode can for instance - * be enabled by a user when typing on the keyboard. - * - * @return True if the view is in filter mode, false otherwise. - */ - boolean isInFilterMode() { - return false; - } - - @Override - public void setFocusable(boolean focusable) { - final T adapter = getAdapter(); - final boolean empty = adapter == null || adapter.getCount() == 0; - - mDesiredFocusableState = focusable; - if (!focusable) { - mDesiredFocusableInTouchModeState = false; - } - - super.setFocusable(focusable && (!empty || isInFilterMode())); - } - - @Override - public void setFocusableInTouchMode(boolean focusable) { - final T adapter = getAdapter(); - final boolean empty = adapter == null || adapter.getCount() == 0; - - mDesiredFocusableInTouchModeState = focusable; - if (focusable) { - mDesiredFocusableState = true; - } - - super.setFocusableInTouchMode(focusable && (!empty || isInFilterMode())); - } - - void checkFocus() { - final T adapter = getAdapter(); - final boolean empty = adapter == null || adapter.getCount() == 0; - final boolean focusable = !empty || isInFilterMode(); - // The order in which we set focusable in touch mode/focusable may matter - // for the client, see View.setFocusableInTouchMode() comments for more - // details - super.setFocusableInTouchMode(focusable && mDesiredFocusableInTouchModeState); - super.setFocusable(focusable && mDesiredFocusableState); - if (mEmptyView != null) { - updateEmptyStatus((adapter == null) || adapter.isEmpty()); - } - } - - /** - * Update the status of the list based on the empty parameter. If empty is true and - * we have an empty view, display it. In all the other cases, make sure that the listview - * is VISIBLE and that the empty view is GONE (if it's not null). - */ - private void updateEmptyStatus(boolean empty) { - if (isInFilterMode()) { - empty = false; - } - - if (empty) { - if (mEmptyView != null) { - mEmptyView.setVisibility(View.VISIBLE); - setVisibility(View.GONE); - } else { - // If the caller just removed our empty view, make sure the list view is visible - setVisibility(View.VISIBLE); - } - - // We are now GONE, so pending layouts will not be dispatched. - // Force one here to make sure that the state of the list matches - // the state of the adapter. - if (mDataChanged) { - this.onLayout(false, getLeft(), getTop(), getRight(), getBottom()); - } - } else { - if (mEmptyView != null) mEmptyView.setVisibility(View.GONE); - setVisibility(View.VISIBLE); - } - } - - /** - * Gets the data associated with the specified position in the list. - * - * @param position Which data to get - * @return The data associated with the specified position in the list - */ - public Object getItemAtPosition(int position) { - T adapter = getAdapter(); - return (adapter == null || position < 0) ? null : adapter.getItem(position); - } - - public long getItemIdAtPosition(int position) { - T adapter = getAdapter(); - return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position); - } - - @Override - public void setOnClickListener(OnClickListener l) { - throw new RuntimeException("Don't call setOnClickListener for an AdapterView. " - + "You probably want setOnItemClickListener instead"); - } - - /** - * Override to prevent freezing of any views created by the adapter. - */ - @Override - protected void dispatchSaveInstanceState(SparseArray container) { - dispatchFreezeSelfOnly(container); - } - - /** - * Override to prevent thawing of any views created by the adapter. - */ - @Override - protected void dispatchRestoreInstanceState(SparseArray container) { - dispatchThawSelfOnly(container); - } - - class AdapterDataSetObserver extends DataSetObserver { - - private Parcelable mInstanceState = null; - - @Override - public void onChanged() { - mDataChanged = true; - mOldItemCount = mItemCount; - mItemCount = getAdapter().getCount(); - - // Detect the case where a cursor that was previously invalidated has - // been repopulated with new data. - if (IcsAdapterView.this.getAdapter().hasStableIds() && mInstanceState != null - && mOldItemCount == 0 && mItemCount > 0) { - IcsAdapterView.this.onRestoreInstanceState(mInstanceState); - mInstanceState = null; - } else { - rememberSyncState(); - } - checkFocus(); - requestLayout(); - } - - @Override - public void onInvalidated() { - mDataChanged = true; - - if (IcsAdapterView.this.getAdapter().hasStableIds()) { - // Remember the current state for the case where our hosting activity is being - // stopped and later restarted - mInstanceState = IcsAdapterView.this.onSaveInstanceState(); - } - - // Data is invalid so we should reset our state - mOldItemCount = mItemCount; - mItemCount = 0; - mSelectedPosition = INVALID_POSITION; - mSelectedRowId = INVALID_ROW_ID; - mNextSelectedPosition = INVALID_POSITION; - mNextSelectedRowId = INVALID_ROW_ID; - mNeedSync = false; - - checkFocus(); - requestLayout(); - } - - public void clearSavedState() { - mInstanceState = null; - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - removeCallbacks(mSelectionNotifier); - } - - private class SelectionNotifier implements Runnable { - public void run() { - if (mDataChanged) { - // Data has changed between when this SelectionNotifier - // was posted and now. We need to wait until the AdapterView - // has been synched to the new data. - if (getAdapter() != null) { - post(this); - } - } else { - fireOnSelected(); - } - } - } - - void selectionChanged() { - if (mOnItemSelectedListener != null) { - if (mInLayout || mBlockLayoutRequests) { - // If we are in a layout traversal, defer notification - // by posting. This ensures that the view tree is - // in a consistent state and is able to accomodate - // new layout or invalidate requests. - if (mSelectionNotifier == null) { - mSelectionNotifier = new SelectionNotifier(); - } - post(mSelectionNotifier); - } else { - fireOnSelected(); - } - } - - // we fire selection events here not in View - if (mSelectedPosition != ListView.INVALID_POSITION && isShown() && !isInTouchMode()) { - sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); - } - } - - private void fireOnSelected() { - if (mOnItemSelectedListener == null) - return; - - int selection = this.getSelectedItemPosition(); - if (selection >= 0) { - View v = getSelectedView(); - mOnItemSelectedListener.onItemSelected(this, v, selection, - getAdapter().getItemId(selection)); - } else { - mOnItemSelectedListener.onNothingSelected(this); - } - } - - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - View selectedView = getSelectedView(); - if (selectedView != null && selectedView.getVisibility() == VISIBLE - && selectedView.dispatchPopulateAccessibilityEvent(event)) { - return true; - } - return false; - } - - @Override - public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { - if (super.onRequestSendAccessibilityEvent(child, event)) { - // Add a record for ourselves as well. - AccessibilityEvent record = AccessibilityEvent.obtain(); - onInitializeAccessibilityEvent(record); - // Populate with the text of the requesting child. - child.dispatchPopulateAccessibilityEvent(record); - event.appendRecord(record); - return true; - } - return false; - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setScrollable(isScrollableForAccessibility()); - View selectedView = getSelectedView(); - if (selectedView != null) { - info.setEnabled(selectedView.isEnabled()); - } - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - event.setScrollable(isScrollableForAccessibility()); - View selectedView = getSelectedView(); - if (selectedView != null) { - event.setEnabled(selectedView.isEnabled()); - } - event.setCurrentItemIndex(getSelectedItemPosition()); - event.setFromIndex(getFirstVisiblePosition()); - event.setToIndex(getLastVisiblePosition()); - event.setItemCount(getCount()); - } - - private boolean isScrollableForAccessibility() { - T adapter = getAdapter(); - if (adapter != null) { - final int itemCount = adapter.getCount(); - return itemCount > 0 - && (getFirstVisiblePosition() > 0 || getLastVisiblePosition() < itemCount - 1); - } - return false; - } - - @Override - protected boolean canAnimate() { - return super.canAnimate() && mItemCount > 0; - } - - void handleDataChanged() { - final int count = mItemCount; - boolean found = false; - - if (count > 0) { - - int newPos; - - // Find the row we are supposed to sync to - if (mNeedSync) { - // Update this first, since setNextSelectedPositionInt inspects - // it - mNeedSync = false; - - // See if we can find a position in the new data with the same - // id as the old selection - newPos = findSyncPosition(); - if (newPos >= 0) { - // Verify that new selection is selectable - int selectablePos = lookForSelectablePosition(newPos, true); - if (selectablePos == newPos) { - // Same row id is selected - setNextSelectedPositionInt(newPos); - found = true; - } - } - } - if (!found) { - // Try to use the same position if we can't find matching data - newPos = getSelectedItemPosition(); - - // Pin position to the available range - if (newPos >= count) { - newPos = count - 1; - } - if (newPos < 0) { - newPos = 0; - } - - // Make sure we select something selectable -- first look down - int selectablePos = lookForSelectablePosition(newPos, true); - if (selectablePos < 0) { - // Looking down didn't work -- try looking up - selectablePos = lookForSelectablePosition(newPos, false); - } - if (selectablePos >= 0) { - setNextSelectedPositionInt(selectablePos); - checkSelectionChanged(); - found = true; - } - } - } - if (!found) { - // Nothing is selected - mSelectedPosition = INVALID_POSITION; - mSelectedRowId = INVALID_ROW_ID; - mNextSelectedPosition = INVALID_POSITION; - mNextSelectedRowId = INVALID_ROW_ID; - mNeedSync = false; - checkSelectionChanged(); - } - } - - void checkSelectionChanged() { - if ((mSelectedPosition != mOldSelectedPosition) || (mSelectedRowId != mOldSelectedRowId)) { - selectionChanged(); - mOldSelectedPosition = mSelectedPosition; - mOldSelectedRowId = mSelectedRowId; - } - } - - /** - * Searches the adapter for a position matching mSyncRowId. The search starts at mSyncPosition - * and then alternates between moving up and moving down until 1) we find the right position, or - * 2) we run out of time, or 3) we have looked at every position - * - * @return Position of the row that matches mSyncRowId, or {@link #INVALID_POSITION} if it can't - * be found - */ - int findSyncPosition() { - int count = mItemCount; - - if (count == 0) { - return INVALID_POSITION; - } - - long idToMatch = mSyncRowId; - int seed = mSyncPosition; - - // If there isn't a selection don't hunt for it - if (idToMatch == INVALID_ROW_ID) { - return INVALID_POSITION; - } - - // Pin seed to reasonable values - seed = Math.max(0, seed); - seed = Math.min(count - 1, seed); - - long endTime = SystemClock.uptimeMillis() + SYNC_MAX_DURATION_MILLIS; - - long rowId; - - // first position scanned so far - int first = seed; - - // last position scanned so far - int last = seed; - - // True if we should move down on the next iteration - boolean next = false; - - // True when we have looked at the first item in the data - boolean hitFirst; - - // True when we have looked at the last item in the data - boolean hitLast; - - // Get the item ID locally (instead of getItemIdAtPosition), so - // we need the adapter - T adapter = getAdapter(); - if (adapter == null) { - return INVALID_POSITION; - } - - while (SystemClock.uptimeMillis() <= endTime) { - rowId = adapter.getItemId(seed); - if (rowId == idToMatch) { - // Found it! - return seed; - } - - hitLast = last == count - 1; - hitFirst = first == 0; - - if (hitLast && hitFirst) { - // Looked at everything - break; - } - - if (hitFirst || (next && !hitLast)) { - // Either we hit the top, or we are trying to move down - last++; - seed = last; - // Try going up next time - next = false; - } else if (hitLast || (!next && !hitFirst)) { - // Either we hit the bottom, or we are trying to move up - first--; - seed = first; - // Try going down next time - next = true; - } - - } - - return INVALID_POSITION; - } - - /** - * Find a position that can be selected (i.e., is not a separator). - * - * @param position The starting position to look at. - * @param lookDown Whether to look down for other positions. - * @return The next selectable position starting at position and then searching either up or - * down. Returns {@link #INVALID_POSITION} if nothing can be found. - */ - int lookForSelectablePosition(int position, boolean lookDown) { - return position; - } - - /** - * Utility to keep mSelectedPosition and mSelectedRowId in sync - * @param position Our current position - */ - void setSelectedPositionInt(int position) { - mSelectedPosition = position; - mSelectedRowId = getItemIdAtPosition(position); - } - - /** - * Utility to keep mNextSelectedPosition and mNextSelectedRowId in sync - * @param position Intended value for mSelectedPosition the next time we go - * through layout - */ - void setNextSelectedPositionInt(int position) { - mNextSelectedPosition = position; - mNextSelectedRowId = getItemIdAtPosition(position); - // If we are trying to sync to the selection, update that too - if (mNeedSync && mSyncMode == SYNC_SELECTED_POSITION && position >= 0) { - mSyncPosition = position; - mSyncRowId = mNextSelectedRowId; - } - } - - /** - * Remember enough information to restore the screen state when the data has - * changed. - * - */ - void rememberSyncState() { - if (getChildCount() > 0) { - mNeedSync = true; - mSyncHeight = mLayoutHeight; - if (mSelectedPosition >= 0) { - // Sync the selection state - View v = getChildAt(mSelectedPosition - mFirstPosition); - mSyncRowId = mNextSelectedRowId; - mSyncPosition = mNextSelectedPosition; - if (v != null) { - mSpecificTop = v.getTop(); - } - mSyncMode = SYNC_SELECTED_POSITION; - } else { - // Sync the based on the offset of the first view - View v = getChildAt(0); - T adapter = getAdapter(); - if (mFirstPosition >= 0 && mFirstPosition < adapter.getCount()) { - mSyncRowId = adapter.getItemId(mFirstPosition); - } else { - mSyncRowId = NO_ID; - } - mSyncPosition = mFirstPosition; - if (v != null) { - mSpecificTop = v.getTop(); - } - mSyncMode = SYNC_FIRST_POSITION; - } - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java deleted file mode 100644 index a78b3f71b..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.drawable.Drawable; - -/** - * A version of {@link android.graphics.drawable.ColorDrawable} that respects bounds. - */ -public class IcsColorDrawable extends Drawable { - private int color; - private final Paint paint = new Paint(); - - public IcsColorDrawable(int color) { - this.color = color; - } - - @Override public void draw(Canvas canvas) { - if ((color >>> 24) != 0) { - paint.setColor(color); - canvas.drawRect(getBounds(), paint); - } - } - - @Override - public void setAlpha(int alpha) { - if (alpha != (color >>> 24)) { - color = (color & 0x00FFFFFF) & (alpha << 24); - invalidateSelf(); - } - } - - @Override public void setColorFilter(ColorFilter colorFilter) { - //Ignored - } - - @Override public int getOpacity() { - return color >>> 24; - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java deleted file mode 100644 index 4947c41df..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java +++ /dev/null @@ -1,410 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.View; -import android.widget.LinearLayout; - -import com.actionbarsherlock.internal.nineoldandroids.widget.NineLinearLayout; - -/** - * A simple extension of a regular linear layout that supports the divider API - * of Android 4.0+. The dividers are added adjacent to the children by changing - * their layout params. If you need to rely on the margins which fall in the - * same orientation as the layout you should wrap the child in a simple - * {@link android.widget.FrameLayout} so it can receive the margin. - */ -public class IcsLinearLayout extends NineLinearLayout { - private static final int[] R_styleable_LinearLayout = new int[] { - /* 0 */ android.R.attr.divider, - /* 1 */ android.R.attr.measureWithLargestChild, - /* 2 */ android.R.attr.showDividers, - /* 3 */ android.R.attr.dividerPadding, - }; - private static final int LinearLayout_divider = 0; - private static final int LinearLayout_measureWithLargestChild = 1; - private static final int LinearLayout_showDividers = 2; - private static final int LinearLayout_dividerPadding = 3; - - /** - * Don't show any dividers. - */ - public static final int SHOW_DIVIDER_NONE = 0; - /** - * Show a divider at the beginning of the group. - */ - public static final int SHOW_DIVIDER_BEGINNING = 1; - /** - * Show dividers between each item in the group. - */ - public static final int SHOW_DIVIDER_MIDDLE = 2; - /** - * Show a divider at the end of the group. - */ - public static final int SHOW_DIVIDER_END = 4; - - - private Drawable mDivider; - private int mDividerWidth; - private int mDividerHeight; - private int mShowDividers; - private int mDividerPadding; - - private boolean mUseLargestChild; - - public IcsLinearLayout(Context context, AttributeSet attrs) { - super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(attrs, /*com.android.internal.R.styleable.*/R_styleable_LinearLayout); - - setDividerDrawable(a.getDrawable(/*com.android.internal.R.styleable.*/LinearLayout_divider)); - mShowDividers = a.getInt(/*com.android.internal.R.styleable.*/LinearLayout_showDividers, SHOW_DIVIDER_NONE); - mDividerPadding = a.getDimensionPixelSize(/*com.android.internal.R.styleable.*/LinearLayout_dividerPadding, 0); - mUseLargestChild = a.getBoolean(/*com.android.internal.R.styleable.*/LinearLayout_measureWithLargestChild, false); - - a.recycle(); - } - - /** - * Set how dividers should be shown between items in this layout - * - * @param showDividers One or more of {@link #SHOW_DIVIDER_BEGINNING}, - * {@link #SHOW_DIVIDER_MIDDLE}, or {@link #SHOW_DIVIDER_END}, - * or {@link #SHOW_DIVIDER_NONE} to show no dividers. - */ - public void setShowDividers(int showDividers) { - if (showDividers != mShowDividers) { - requestLayout(); - invalidate(); //XXX This is required if you are toggling a divider off - } - mShowDividers = showDividers; - } - - /** - * @return A flag set indicating how dividers should be shown around items. - * @see #setShowDividers(int) - */ - public int getShowDividers() { - return mShowDividers; - } - - /** - * Set a drawable to be used as a divider between items. - * @param divider Drawable that will divide each item. - * @see #setShowDividers(int) - */ - public void setDividerDrawable(Drawable divider) { - if (divider == mDivider) { - return; - } - mDivider = divider; - if (divider != null) { - mDividerWidth = divider.getIntrinsicWidth(); - mDividerHeight = divider.getIntrinsicHeight(); - } else { - mDividerWidth = 0; - mDividerHeight = 0; - } - setWillNotDraw(divider == null); - requestLayout(); - } - - /** - * Set padding displayed on both ends of dividers. - * - * @param padding Padding value in pixels that will be applied to each end - * - * @see #setShowDividers(int) - * @see #setDividerDrawable(Drawable) - * @see #getDividerPadding() - */ - public void setDividerPadding(int padding) { - mDividerPadding = padding; - } - - /** - * Get the padding size used to inset dividers in pixels - * - * @see #setShowDividers(int) - * @see #setDividerDrawable(Drawable) - * @see #setDividerPadding(int) - */ - public int getDividerPadding() { - return mDividerPadding; - } - - /** - * Get the width of the current divider drawable. - * - * @hide Used internally by framework. - */ - public int getDividerWidth() { - return mDividerWidth; - } - - @Override - protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { - final int index = indexOfChild(child); - final int orientation = getOrientation(); - final LayoutParams params = (LayoutParams) child.getLayoutParams(); - if (hasDividerBeforeChildAt(index)) { - if (orientation == VERTICAL) { - //Account for the divider by pushing everything up - params.topMargin = mDividerHeight; - } else { - //Account for the divider by pushing everything left - params.leftMargin = mDividerWidth; - } - } - - final int count = getChildCount(); - if (index == count - 1) { - if (hasDividerBeforeChildAt(count)) { - if (orientation == VERTICAL) { - params.bottomMargin = mDividerHeight; - } else { - params.rightMargin = mDividerWidth; - } - } - } - super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); - } - - @Override - protected void onDraw(Canvas canvas) { - if (mDivider != null) { - if (getOrientation() == VERTICAL) { - drawDividersVertical(canvas); - } else { - drawDividersHorizontal(canvas); - } - } - super.onDraw(canvas); - } - - void drawDividersVertical(Canvas canvas) { - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - - if (child != null && child.getVisibility() != GONE) { - if (hasDividerBeforeChildAt(i)) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - final int top = child.getTop() - lp.topMargin/* - mDividerHeight*/; - drawHorizontalDivider(canvas, top); - } - } - } - - if (hasDividerBeforeChildAt(count)) { - final View child = getChildAt(count - 1); - int bottom = 0; - if (child == null) { - bottom = getHeight() - getPaddingBottom() - mDividerHeight; - } else { - //final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - bottom = child.getBottom()/* + lp.bottomMargin*/; - } - drawHorizontalDivider(canvas, bottom); - } - } - - void drawDividersHorizontal(Canvas canvas) { - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - - if (child != null && child.getVisibility() != GONE) { - if (hasDividerBeforeChildAt(i)) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - final int left = child.getLeft() - lp.leftMargin/* - mDividerWidth*/; - drawVerticalDivider(canvas, left); - } - } - } - - if (hasDividerBeforeChildAt(count)) { - final View child = getChildAt(count - 1); - int right = 0; - if (child == null) { - right = getWidth() - getPaddingRight() - mDividerWidth; - } else { - //final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - right = child.getRight()/* + lp.rightMargin*/; - } - drawVerticalDivider(canvas, right); - } - } - - void drawHorizontalDivider(Canvas canvas, int top) { - mDivider.setBounds(getPaddingLeft() + mDividerPadding, top, - getWidth() - getPaddingRight() - mDividerPadding, top + mDividerHeight); - mDivider.draw(canvas); - } - - void drawVerticalDivider(Canvas canvas, int left) { - mDivider.setBounds(left, getPaddingTop() + mDividerPadding, - left + mDividerWidth, getHeight() - getPaddingBottom() - mDividerPadding); - mDivider.draw(canvas); - } - - /** - * Determines where to position dividers between children. - * - * @param childIndex Index of child to check for preceding divider - * @return true if there should be a divider before the child at childIndex - * @hide Pending API consideration. Currently only used internally by the system. - */ - protected boolean hasDividerBeforeChildAt(int childIndex) { - if (childIndex == 0) { - return (mShowDividers & SHOW_DIVIDER_BEGINNING) != 0; - } else if (childIndex == getChildCount()) { - return (mShowDividers & SHOW_DIVIDER_END) != 0; - } else if ((mShowDividers & SHOW_DIVIDER_MIDDLE) != 0) { - boolean hasVisibleViewBefore = false; - for (int i = childIndex - 1; i >= 0; i--) { - if (getChildAt(i).getVisibility() != GONE) { - hasVisibleViewBefore = true; - break; - } - } - return hasVisibleViewBefore; - } - return false; - } - - /** - * When true, all children with a weight will be considered having - * the minimum size of the largest child. If false, all children are - * measured normally. - * - * @return True to measure children with a weight using the minimum - * size of the largest child, false otherwise. - * - * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild - */ - public boolean isMeasureWithLargestChildEnabled() { - return mUseLargestChild; - } - - /** - * When set to true, all children with a weight will be considered having - * the minimum size of the largest child. If false, all children are - * measured normally. - * - * Disabled by default. - * - * @param enabled True to measure children with a weight using the - * minimum size of the largest child, false otherwise. - * - * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild - */ - public void setMeasureWithLargestChildEnabled(boolean enabled) { - mUseLargestChild = enabled; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - if (mUseLargestChild) { - final int orientation = getOrientation(); - switch (orientation) { - case HORIZONTAL: - useLargestChildHorizontal(); - break; - - case VERTICAL: - useLargestChildVertical(); - break; - } - } - } - - private void useLargestChildHorizontal() { - final int childCount = getChildCount(); - - // Find largest child width - int largestChildWidth = 0; - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - largestChildWidth = Math.max(child.getMeasuredWidth(), largestChildWidth); - } - - int totalWidth = 0; - // Re-measure childs - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - - if (child == null || child.getVisibility() == View.GONE) { - continue; - } - - final LinearLayout.LayoutParams lp = - (LinearLayout.LayoutParams) child.getLayoutParams(); - - float childExtra = lp.weight; - if (childExtra > 0) { - child.measure( - MeasureSpec.makeMeasureSpec(largestChildWidth, - MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(), - MeasureSpec.EXACTLY)); - totalWidth += largestChildWidth; - - } else { - totalWidth += child.getMeasuredWidth(); - } - - totalWidth += lp.leftMargin + lp.rightMargin; - } - - totalWidth += getPaddingLeft() + getPaddingRight(); - setMeasuredDimension(totalWidth, getMeasuredHeight()); - } - - private void useLargestChildVertical() { - final int childCount = getChildCount(); - - // Find largest child width - int largestChildHeight = 0; - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - largestChildHeight = Math.max(child.getMeasuredHeight(), largestChildHeight); - } - - int totalHeight = 0; - // Re-measure childs - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - - if (child == null || child.getVisibility() == View.GONE) { - continue; - } - - final LinearLayout.LayoutParams lp = - (LinearLayout.LayoutParams) child.getLayoutParams(); - - float childExtra = lp.weight; - if (childExtra > 0) { - child.measure( - MeasureSpec.makeMeasureSpec(child.getMeasuredWidth(), - MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(largestChildHeight, - MeasureSpec.EXACTLY)); - totalHeight += largestChildHeight; - - } else { - totalHeight += child.getMeasuredHeight(); - } - - totalHeight += lp.leftMargin + lp.rightMargin; - } - - totalHeight += getPaddingLeft() + getPaddingRight(); - setMeasuredDimension(getMeasuredWidth(), totalHeight); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java deleted file mode 100644 index d13c6cea9..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java +++ /dev/null @@ -1,644 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import com.actionbarsherlock.R; - -import android.content.Context; -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Handler; -import android.util.AttributeSet; -import android.view.ContextThemeWrapper; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.MeasureSpec; -import android.view.View.OnTouchListener; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.widget.AbsListView; -import android.widget.AdapterView; -import android.widget.LinearLayout; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.PopupWindow; - -/** - * A proxy between pre- and post-Honeycomb implementations of this class. - */ -public class IcsListPopupWindow { - /** - * This value controls the length of time that the user - * must leave a pointer down without scrolling to expand - * the autocomplete dropdown list to cover the IME. - */ - private static final int EXPAND_LIST_TIMEOUT = 250; - - private Context mContext; - private PopupWindow mPopup; - private ListAdapter mAdapter; - private DropDownListView mDropDownList; - - private int mDropDownHeight = ViewGroup.LayoutParams.WRAP_CONTENT; - private int mDropDownWidth = ViewGroup.LayoutParams.WRAP_CONTENT; - private int mDropDownHorizontalOffset; - private int mDropDownVerticalOffset; - private boolean mDropDownVerticalOffsetSet; - - private int mListItemExpandMaximum = Integer.MAX_VALUE; - - private View mPromptView; - private int mPromptPosition = POSITION_PROMPT_ABOVE; - - private DataSetObserver mObserver; - - private View mDropDownAnchorView; - - private Drawable mDropDownListHighlight; - - private AdapterView.OnItemClickListener mItemClickListener; - private AdapterView.OnItemSelectedListener mItemSelectedListener; - - private final ResizePopupRunnable mResizePopupRunnable = new ResizePopupRunnable(); - private final PopupTouchInterceptor mTouchInterceptor = new PopupTouchInterceptor(); - private final PopupScrollListener mScrollListener = new PopupScrollListener(); - private final ListSelectorHider mHideSelector = new ListSelectorHider(); - - private Handler mHandler = new Handler(); - - private Rect mTempRect = new Rect(); - - private boolean mModal; - - public static final int POSITION_PROMPT_ABOVE = 0; - public static final int POSITION_PROMPT_BELOW = 1; - - public IcsListPopupWindow(Context context) { - this(context, null, R.attr.listPopupWindowStyle); - } - - public IcsListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { - mContext = context; - mPopup = new PopupWindow(context, attrs, defStyleAttr); - mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); - } - - public IcsListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - mContext = context; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { - Context wrapped = new ContextThemeWrapper(context, defStyleRes); - mPopup = new PopupWindow(wrapped, attrs, defStyleAttr); - } else { - mPopup = new PopupWindow(context, attrs, defStyleAttr, defStyleRes); - } - mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); - } - - public void setAdapter(ListAdapter adapter) { - if (mObserver == null) { - mObserver = new PopupDataSetObserver(); - } else if (mAdapter != null) { - mAdapter.unregisterDataSetObserver(mObserver); - } - mAdapter = adapter; - if (mAdapter != null) { - adapter.registerDataSetObserver(mObserver); - } - - if (mDropDownList != null) { - mDropDownList.setAdapter(mAdapter); - } - } - - public void setPromptPosition(int position) { - mPromptPosition = position; - } - - public void setModal(boolean modal) { - mModal = true; - mPopup.setFocusable(modal); - } - - public void setBackgroundDrawable(Drawable d) { - mPopup.setBackgroundDrawable(d); - } - - public void setAnchorView(View anchor) { - mDropDownAnchorView = anchor; - } - - public void setHorizontalOffset(int offset) { - mDropDownHorizontalOffset = offset; - } - - public void setVerticalOffset(int offset) { - mDropDownVerticalOffset = offset; - mDropDownVerticalOffsetSet = true; - } - - public void setContentWidth(int width) { - Drawable popupBackground = mPopup.getBackground(); - if (popupBackground != null) { - popupBackground.getPadding(mTempRect); - mDropDownWidth = mTempRect.left + mTempRect.right + width; - } else { - mDropDownWidth = width; - } - } - - public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener) { - mItemClickListener = clickListener; - } - - public void show() { - int height = buildDropDown(); - - int widthSpec = 0; - int heightSpec = 0; - - boolean noInputMethod = isInputMethodNotNeeded(); - //XXX mPopup.setAllowScrollingAnchorParent(!noInputMethod); - - if (mPopup.isShowing()) { - if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { - // The call to PopupWindow's update method below can accept -1 for any - // value you do not want to update. - widthSpec = -1; - } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { - widthSpec = mDropDownAnchorView.getWidth(); - } else { - widthSpec = mDropDownWidth; - } - - if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { - // The call to PopupWindow's update method below can accept -1 for any - // value you do not want to update. - heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.MATCH_PARENT; - if (noInputMethod) { - mPopup.setWindowLayoutMode( - mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? - ViewGroup.LayoutParams.MATCH_PARENT : 0, 0); - } else { - mPopup.setWindowLayoutMode( - mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? - ViewGroup.LayoutParams.MATCH_PARENT : 0, - ViewGroup.LayoutParams.MATCH_PARENT); - } - } else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { - heightSpec = height; - } else { - heightSpec = mDropDownHeight; - } - - mPopup.setOutsideTouchable(true); - - mPopup.update(mDropDownAnchorView, mDropDownHorizontalOffset, - mDropDownVerticalOffset, widthSpec, heightSpec); - } else { - if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { - widthSpec = ViewGroup.LayoutParams.MATCH_PARENT; - } else { - if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { - mPopup.setWidth(mDropDownAnchorView.getWidth()); - } else { - mPopup.setWidth(mDropDownWidth); - } - } - - if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { - heightSpec = ViewGroup.LayoutParams.MATCH_PARENT; - } else { - if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { - mPopup.setHeight(height); - } else { - mPopup.setHeight(mDropDownHeight); - } - } - - mPopup.setWindowLayoutMode(widthSpec, heightSpec); - //XXX mPopup.setClipToScreenEnabled(true); - - // use outside touchable to dismiss drop down when touching outside of it, so - // only set this if the dropdown is not always visible - mPopup.setOutsideTouchable(true); - mPopup.setTouchInterceptor(mTouchInterceptor); - mPopup.showAsDropDown(mDropDownAnchorView, - mDropDownHorizontalOffset, mDropDownVerticalOffset); - mDropDownList.setSelection(ListView.INVALID_POSITION); - - if (!mModal || mDropDownList.isInTouchMode()) { - clearListSelection(); - } - if (!mModal) { - mHandler.post(mHideSelector); - } - } - } - - public void dismiss() { - mPopup.dismiss(); - if (mPromptView != null) { - final ViewParent parent = mPromptView.getParent(); - if (parent instanceof ViewGroup) { - final ViewGroup group = (ViewGroup) parent; - group.removeView(mPromptView); - } - } - mPopup.setContentView(null); - mDropDownList = null; - mHandler.removeCallbacks(mResizePopupRunnable); - } - - public void setOnDismissListener(PopupWindow.OnDismissListener listener) { - mPopup.setOnDismissListener(listener); - } - - public void setInputMethodMode(int mode) { - mPopup.setInputMethodMode(mode); - } - - public void clearListSelection() { - final DropDownListView list = mDropDownList; - if (list != null) { - // WARNING: Please read the comment where mListSelectionHidden is declared - list.mListSelectionHidden = true; - //XXX list.hideSelector(); - list.requestLayout(); - } - } - - public boolean isShowing() { - return mPopup.isShowing(); - } - - private boolean isInputMethodNotNeeded() { - return mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; - } - - public ListView getListView() { - return mDropDownList; - } - - private int buildDropDown() { - ViewGroup dropDownView; - int otherHeights = 0; - - if (mDropDownList == null) { - Context context = mContext; - - mDropDownList = new DropDownListView(context, !mModal); - if (mDropDownListHighlight != null) { - mDropDownList.setSelector(mDropDownListHighlight); - } - mDropDownList.setAdapter(mAdapter); - mDropDownList.setOnItemClickListener(mItemClickListener); - mDropDownList.setFocusable(true); - mDropDownList.setFocusableInTouchMode(true); - mDropDownList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - public void onItemSelected(AdapterView parent, View view, - int position, long id) { - - if (position != -1) { - DropDownListView dropDownList = mDropDownList; - - if (dropDownList != null) { - dropDownList.mListSelectionHidden = false; - } - } - } - - public void onNothingSelected(AdapterView parent) { - } - }); - mDropDownList.setOnScrollListener(mScrollListener); - - if (mItemSelectedListener != null) { - mDropDownList.setOnItemSelectedListener(mItemSelectedListener); - } - - dropDownView = mDropDownList; - - View hintView = mPromptView; - if (hintView != null) { - // if an hint has been specified, we accomodate more space for it and - // add a text view in the drop down menu, at the bottom of the list - LinearLayout hintContainer = new LinearLayout(context); - hintContainer.setOrientation(LinearLayout.VERTICAL); - - LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f - ); - - switch (mPromptPosition) { - case POSITION_PROMPT_BELOW: - hintContainer.addView(dropDownView, hintParams); - hintContainer.addView(hintView); - break; - - case POSITION_PROMPT_ABOVE: - hintContainer.addView(hintView); - hintContainer.addView(dropDownView, hintParams); - break; - - default: - break; - } - - // measure the hint's height to find how much more vertical space - // we need to add to the drop down's height - int widthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth, MeasureSpec.AT_MOST); - int heightSpec = MeasureSpec.UNSPECIFIED; - hintView.measure(widthSpec, heightSpec); - - hintParams = (LinearLayout.LayoutParams) hintView.getLayoutParams(); - otherHeights = hintView.getMeasuredHeight() + hintParams.topMargin - + hintParams.bottomMargin; - - dropDownView = hintContainer; - } - - mPopup.setContentView(dropDownView); - } else { - dropDownView = (ViewGroup) mPopup.getContentView(); - final View view = mPromptView; - if (view != null) { - LinearLayout.LayoutParams hintParams = - (LinearLayout.LayoutParams) view.getLayoutParams(); - otherHeights = view.getMeasuredHeight() + hintParams.topMargin - + hintParams.bottomMargin; - } - } - - // getMaxAvailableHeight() subtracts the padding, so we put it back - // to get the available height for the whole window - int padding = 0; - Drawable background = mPopup.getBackground(); - if (background != null) { - background.getPadding(mTempRect); - padding = mTempRect.top + mTempRect.bottom; - - // If we don't have an explicit vertical offset, determine one from the window - // background so that content will line up. - if (!mDropDownVerticalOffsetSet) { - mDropDownVerticalOffset = -mTempRect.top; - } - } - - // Max height available on the screen for a popup. - boolean ignoreBottomDecorations = - mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; - final int maxHeight = /*mPopup.*/getMaxAvailableHeight( - mDropDownAnchorView, mDropDownVerticalOffset, ignoreBottomDecorations); - - if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { - return maxHeight + padding; - } - - final int listContent = /*mDropDownList.*/measureHeightOfChildren(MeasureSpec.UNSPECIFIED, - 0, -1/*ListView.NO_POSITION*/, maxHeight - otherHeights, -1); - // add padding only if the list has items in it, that way we don't show - // the popup if it is not needed - if (listContent > 0) otherHeights += padding; - - return listContent + otherHeights; - } - - private int getMaxAvailableHeight(View anchor, int yOffset, boolean ignoreBottomDecorations) { - final Rect displayFrame = new Rect(); - anchor.getWindowVisibleDisplayFrame(displayFrame); - - final int[] anchorPos = new int[2]; - anchor.getLocationOnScreen(anchorPos); - - int bottomEdge = displayFrame.bottom; - if (ignoreBottomDecorations) { - Resources res = anchor.getContext().getResources(); - bottomEdge = res.getDisplayMetrics().heightPixels; - } - final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset; - final int distanceToTop = anchorPos[1] - displayFrame.top + yOffset; - - // anchorPos[1] is distance from anchor to top of screen - int returnedHeight = Math.max(distanceToBottom, distanceToTop); - if (mPopup.getBackground() != null) { - mPopup.getBackground().getPadding(mTempRect); - returnedHeight -= mTempRect.top + mTempRect.bottom; - } - - return returnedHeight; - } - - private int measureHeightOfChildren(int widthMeasureSpec, int startPosition, int endPosition, - final int maxHeight, int disallowPartialChildPosition) { - - final ListAdapter adapter = mAdapter; - if (adapter == null) { - return mDropDownList.getListPaddingTop() + mDropDownList.getListPaddingBottom(); - } - - // Include the padding of the list - int returnedHeight = mDropDownList.getListPaddingTop() + mDropDownList.getListPaddingBottom(); - final int dividerHeight = ((mDropDownList.getDividerHeight() > 0) && mDropDownList.getDivider() != null) ? mDropDownList.getDividerHeight() : 0; - // The previous height value that was less than maxHeight and contained - // no partial children - int prevHeightWithoutPartialChild = 0; - int i; - View child; - - // mItemCount - 1 since endPosition parameter is inclusive - endPosition = (endPosition == -1/*NO_POSITION*/) ? adapter.getCount() - 1 : endPosition; - - for (i = startPosition; i <= endPosition; ++i) { - child = mAdapter.getView(i, null, mDropDownList); - if (mDropDownList.getCacheColorHint() != 0) { - child.setDrawingCacheBackgroundColor(mDropDownList.getCacheColorHint()); - } - - measureScrapChild(child, i, widthMeasureSpec); - - if (i > 0) { - // Count the divider for all but one child - returnedHeight += dividerHeight; - } - - returnedHeight += child.getMeasuredHeight(); - - if (returnedHeight >= maxHeight) { - // We went over, figure out which height to return. If returnedHeight > maxHeight, - // then the i'th position did not fit completely. - return (disallowPartialChildPosition >= 0) // Disallowing is enabled (> -1) - && (i > disallowPartialChildPosition) // We've past the min pos - && (prevHeightWithoutPartialChild > 0) // We have a prev height - && (returnedHeight != maxHeight) // i'th child did not fit completely - ? prevHeightWithoutPartialChild - : maxHeight; - } - - if ((disallowPartialChildPosition >= 0) && (i >= disallowPartialChildPosition)) { - prevHeightWithoutPartialChild = returnedHeight; - } - } - - // At this point, we went through the range of children, and they each - // completely fit, so return the returnedHeight - return returnedHeight; - } - private void measureScrapChild(View child, int position, int widthMeasureSpec) { - ListView.LayoutParams p = (ListView.LayoutParams) child.getLayoutParams(); - if (p == null) { - p = new ListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT, 0); - child.setLayoutParams(p); - } - //XXX p.viewType = mAdapter.getItemViewType(position); - //XXX p.forceAdd = true; - - int childWidthSpec = ViewGroup.getChildMeasureSpec(widthMeasureSpec, - mDropDownList.getPaddingLeft() + mDropDownList.getPaddingRight(), p.width); - int lpHeight = p.height; - int childHeightSpec; - if (lpHeight > 0) { - childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); - } else { - childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - } - child.measure(childWidthSpec, childHeightSpec); - } - - private static class DropDownListView extends ListView { - /* - * WARNING: This is a workaround for a touch mode issue. - * - * Touch mode is propagated lazily to windows. This causes problems in - * the following scenario: - * - Type something in the AutoCompleteTextView and get some results - * - Move down with the d-pad to select an item in the list - * - Move up with the d-pad until the selection disappears - * - Type more text in the AutoCompleteTextView *using the soft keyboard* - * and get new results; you are now in touch mode - * - The selection comes back on the first item in the list, even though - * the list is supposed to be in touch mode - * - * Using the soft keyboard triggers the touch mode change but that change - * is propagated to our window only after the first list layout, therefore - * after the list attempts to resurrect the selection. - * - * The trick to work around this issue is to pretend the list is in touch - * mode when we know that the selection should not appear, that is when - * we know the user moved the selection away from the list. - * - * This boolean is set to true whenever we explicitly hide the list's - * selection and reset to false whenever we know the user moved the - * selection back to the list. - * - * When this boolean is true, isInTouchMode() returns true, otherwise it - * returns super.isInTouchMode(). - */ - private boolean mListSelectionHidden; - - private boolean mHijackFocus; - - public DropDownListView(Context context, boolean hijackFocus) { - super(context, null, /*com.android.internal.*/R.attr.dropDownListViewStyle); - mHijackFocus = hijackFocus; - // TODO: Add an API to control this - setCacheColorHint(0); // Transparent, since the background drawable could be anything. - } - - //XXX @Override - //View obtainView(int position, boolean[] isScrap) { - // View view = super.obtainView(position, isScrap); - - // if (view instanceof TextView) { - // ((TextView) view).setHorizontallyScrolling(true); - // } - - // return view; - //} - - @Override - public boolean isInTouchMode() { - // WARNING: Please read the comment where mListSelectionHidden is declared - return (mHijackFocus && mListSelectionHidden) || super.isInTouchMode(); - } - - @Override - public boolean hasWindowFocus() { - return mHijackFocus || super.hasWindowFocus(); - } - - @Override - public boolean isFocused() { - return mHijackFocus || super.isFocused(); - } - - @Override - public boolean hasFocus() { - return mHijackFocus || super.hasFocus(); - } - } - - private class PopupDataSetObserver extends DataSetObserver { - @Override - public void onChanged() { - if (isShowing()) { - // Resize the popup to fit new content - show(); - } - } - - @Override - public void onInvalidated() { - dismiss(); - } - } - - private class ListSelectorHider implements Runnable { - public void run() { - clearListSelection(); - } - } - - private class ResizePopupRunnable implements Runnable { - public void run() { - if (mDropDownList != null && mDropDownList.getCount() > mDropDownList.getChildCount() && - mDropDownList.getChildCount() <= mListItemExpandMaximum) { - mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); - show(); - } - } - } - - private class PopupTouchInterceptor implements OnTouchListener { - public boolean onTouch(View v, MotionEvent event) { - final int action = event.getAction(); - final int x = (int) event.getX(); - final int y = (int) event.getY(); - - if (action == MotionEvent.ACTION_DOWN && - mPopup != null && mPopup.isShowing() && - (x >= 0 && x < mPopup.getWidth() && y >= 0 && y < mPopup.getHeight())) { - mHandler.postDelayed(mResizePopupRunnable, EXPAND_LIST_TIMEOUT); - } else if (action == MotionEvent.ACTION_UP) { - mHandler.removeCallbacks(mResizePopupRunnable); - } - return false; - } - } - - private class PopupScrollListener implements ListView.OnScrollListener { - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, - int totalItemCount) { - - } - - public void onScrollStateChanged(AbsListView view, int scrollState) { - if (scrollState == SCROLL_STATE_TOUCH_SCROLL && - !isInputMethodNotNeeded() && mPopup.getContentView() != null) { - mHandler.removeCallbacks(mResizePopupRunnable); - mResizePopupRunnable.run(); - } - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java deleted file mode 100644 index 1c02d4aca..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java +++ /dev/null @@ -1,1193 +0,0 @@ -/* - * 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.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.BitmapShader; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.Shader; -import android.graphics.drawable.Animatable; -import android.graphics.drawable.AnimationDrawable; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ClipDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; -import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.shapes.RoundRectShape; -import android.graphics.drawable.shapes.Shape; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.SystemClock; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.view.ViewDebug; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityManager; -import android.view.animation.AlphaAnimation; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; -import android.view.animation.Transformation; -import android.widget.RemoteViews.RemoteView; - - -/** - *

- * Visual indicator of progress in some operation. Displays a bar to the user - * representing how far the operation has progressed; the application can - * change the amount of progress (modifying the length of the bar) as it moves - * forward. There is also a secondary progress displayable on a progress bar - * which is useful for displaying intermediate progress, such as the buffer - * level during a streaming playback progress bar. - *

- * - *

- * A progress bar can also be made indeterminate. In indeterminate mode, the - * progress bar shows a cyclic animation without an indication of progress. This mode is used by - * applications when the length of the task is unknown. The indeterminate progress bar can be either - * a spinning wheel or a horizontal bar. - *

- * - *

The following code example shows how a progress bar can be used from - * a worker thread to update the user interface to notify the user of progress: - *

- * - *
- * public class MyActivity extends Activity {
- *     private static final int PROGRESS = 0x1;
- *
- *     private ProgressBar mProgress;
- *     private int mProgressStatus = 0;
- *
- *     private Handler mHandler = new Handler();
- *
- *     protected void onCreate(Bundle icicle) {
- *         super.onCreate(icicle);
- *
- *         setContentView(R.layout.progressbar_activity);
- *
- *         mProgress = (ProgressBar) findViewById(R.id.progress_bar);
- *
- *         // Start lengthy operation in a background thread
- *         new Thread(new Runnable() {
- *             public void run() {
- *                 while (mProgressStatus < 100) {
- *                     mProgressStatus = doWork();
- *
- *                     // Update the progress bar
- *                     mHandler.post(new Runnable() {
- *                         public void run() {
- *                             mProgress.setProgress(mProgressStatus);
- *                         }
- *                     });
- *                 }
- *             }
- *         }).start();
- *     }
- * }
- * - *

To add a progress bar to a layout file, you can use the {@code <ProgressBar>} element. - * By default, the progress bar is a spinning wheel (an indeterminate indicator). To change to a - * horizontal progress bar, apply the {@link android.R.style#Widget_ProgressBar_Horizontal - * Widget.ProgressBar.Horizontal} style, like so:

- * - *
- * <ProgressBar
- *     style="@android:style/Widget.ProgressBar.Horizontal"
- *     ... />
- * - *

If you will use the progress bar to show real progress, you must use the horizontal bar. You - * can then increment the progress with {@link #incrementProgressBy incrementProgressBy()} or - * {@link #setProgress setProgress()}. By default, the progress bar is full when it reaches 100. If - * necessary, you can adjust the maximum value (the value for a full bar) using the {@link - * android.R.styleable#ProgressBar_max android:max} attribute. Other attributes available are listed - * below.

- * - *

Another common style to apply to the progress bar is {@link - * android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}, which shows a smaller - * version of the spinning wheel—useful when waiting for content to load. - * For example, you can insert this kind of progress bar into your default layout for - * a view that will be populated by some content fetched from the Internet—the spinning wheel - * appears immediately and when your application receives the content, it replaces the progress bar - * with the loaded content. For example:

- * - *
- * <LinearLayout
- *     android:orientation="horizontal"
- *     ... >
- *     <ProgressBar
- *         android:layout_width="wrap_content"
- *         android:layout_height="wrap_content"
- *         style="@android:style/Widget.ProgressBar.Small"
- *         android:layout_marginRight="5dp" />
- *     <TextView
- *         android:layout_width="wrap_content"
- *         android:layout_height="wrap_content"
- *         android:text="@string/loading" />
- * </LinearLayout>
- * - *

Other progress bar styles provided by the system include:

- *
    - *
  • {@link android.R.style#Widget_ProgressBar_Horizontal Widget.ProgressBar.Horizontal}
  • - *
  • {@link android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}
  • - *
  • {@link android.R.style#Widget_ProgressBar_Large Widget.ProgressBar.Large}
  • - *
  • {@link android.R.style#Widget_ProgressBar_Inverse Widget.ProgressBar.Inverse}
  • - *
  • {@link android.R.style#Widget_ProgressBar_Small_Inverse - * Widget.ProgressBar.Small.Inverse}
  • - *
  • {@link android.R.style#Widget_ProgressBar_Large_Inverse - * Widget.ProgressBar.Large.Inverse}
  • - *
- *

The "inverse" styles provide an inverse color scheme for the spinner, which may be necessary - * if your application uses a light colored theme (a white background).

- * - *

- * See {@link android.R.styleable#ProgressBar ProgressBar Attributes}, - * {@link android.R.styleable#View View Attributes} - *

- * - * @attr ref android.R.styleable#ProgressBar_animationResolution - * @attr ref android.R.styleable#ProgressBar_indeterminate - * @attr ref android.R.styleable#ProgressBar_indeterminateBehavior - * @attr ref android.R.styleable#ProgressBar_indeterminateDrawable - * @attr ref android.R.styleable#ProgressBar_indeterminateDuration - * @attr ref android.R.styleable#ProgressBar_indeterminateOnly - * @attr ref android.R.styleable#ProgressBar_interpolator - * @attr ref android.R.styleable#ProgressBar_max - * @attr ref android.R.styleable#ProgressBar_maxHeight - * @attr ref android.R.styleable#ProgressBar_maxWidth - * @attr ref android.R.styleable#ProgressBar_minHeight - * @attr ref android.R.styleable#ProgressBar_minWidth - * @attr ref android.R.styleable#ProgressBar_progress - * @attr ref android.R.styleable#ProgressBar_progressDrawable - * @attr ref android.R.styleable#ProgressBar_secondaryProgress - */ -@RemoteView -public class IcsProgressBar extends View { - private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; - private static final int MAX_LEVEL = 10000; - private static final int ANIMATION_RESOLUTION = 200; - private static final int TIMEOUT_SEND_ACCESSIBILITY_EVENT = 200; - - private static final int[] ProgressBar = new int[] { - android.R.attr.maxWidth, - android.R.attr.maxHeight, - android.R.attr.max, - android.R.attr.progress, - android.R.attr.secondaryProgress, - android.R.attr.indeterminate, - android.R.attr.indeterminateOnly, - android.R.attr.indeterminateDrawable, - android.R.attr.progressDrawable, - android.R.attr.indeterminateDuration, - android.R.attr.indeterminateBehavior, - android.R.attr.minWidth, - android.R.attr.minHeight, - android.R.attr.interpolator, - android.R.attr.animationResolution, - }; - private static final int ProgressBar_maxWidth = 0; - private static final int ProgressBar_maxHeight = 1; - private static final int ProgressBar_max = 2; - private static final int ProgressBar_progress = 3; - private static final int ProgressBar_secondaryProgress = 4; - private static final int ProgressBar_indeterminate = 5; - private static final int ProgressBar_indeterminateOnly = 6; - private static final int ProgressBar_indeterminateDrawable = 7; - private static final int ProgressBar_progressDrawable = 8; - private static final int ProgressBar_indeterminateDuration = 9; - private static final int ProgressBar_indeterminateBehavior = 10; - private static final int ProgressBar_minWidth = 11; - private static final int ProgressBar_minHeight = 12; - private static final int ProgressBar_interpolator = 13; - private static final int ProgressBar_animationResolution = 14; - - int mMinWidth; - int mMaxWidth; - int mMinHeight; - int mMaxHeight; - - private int mProgress; - private int mSecondaryProgress; - private int mMax; - - private int mBehavior; - private int mDuration; - private boolean mIndeterminate; - private boolean mOnlyIndeterminate; - private Transformation mTransformation; - private AlphaAnimation mAnimation; - private Drawable mIndeterminateDrawable; - private int mIndeterminateRealLeft; - private int mIndeterminateRealTop; - private Drawable mProgressDrawable; - private Drawable mCurrentDrawable; - Bitmap mSampleTile; - private boolean mNoInvalidate; - private Interpolator mInterpolator; - private RefreshProgressRunnable mRefreshProgressRunnable; - private long mUiThreadId; - private boolean mShouldStartAnimationDrawable; - private long mLastDrawTime; - - private boolean mInDrawing; - - private int mAnimationResolution; - - private AccessibilityManager mAccessibilityManager; - private AccessibilityEventSender mAccessibilityEventSender; - - /** - * Create a new progress bar with range 0...100 and initial progress of 0. - * @param context the application environment - */ - public IcsProgressBar(Context context) { - this(context, null); - } - - public IcsProgressBar(Context context, AttributeSet attrs) { - this(context, attrs, android.R.attr.progressBarStyle); - } - - public IcsProgressBar(Context context, AttributeSet attrs, int defStyle) { - this(context, attrs, defStyle, 0); - } - - /** - * @hide - */ - public IcsProgressBar(Context context, AttributeSet attrs, int defStyle, int styleRes) { - super(context, attrs, defStyle); - mUiThreadId = Thread.currentThread().getId(); - initProgressBar(); - - TypedArray a = - context.obtainStyledAttributes(attrs, /*R.styleable.*/ProgressBar, defStyle, styleRes); - - mNoInvalidate = true; - - Drawable drawable = a.getDrawable(/*R.styleable.*/ProgressBar_progressDrawable); - if (drawable != null) { - drawable = tileify(drawable, false); - // Calling this method can set mMaxHeight, make sure the corresponding - // XML attribute for mMaxHeight is read after calling this method - setProgressDrawable(drawable); - } - - - mDuration = a.getInt(/*R.styleable.*/ProgressBar_indeterminateDuration, mDuration); - - mMinWidth = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_minWidth, mMinWidth); - mMaxWidth = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_maxWidth, mMaxWidth); - mMinHeight = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_minHeight, mMinHeight); - mMaxHeight = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_maxHeight, mMaxHeight); - - mBehavior = a.getInt(/*R.styleable.*/ProgressBar_indeterminateBehavior, mBehavior); - - final int resID = a.getResourceId( - /*com.android.internal.R.styleable.*/ProgressBar_interpolator, - android.R.anim.linear_interpolator); // default to linear interpolator - if (resID > 0) { - setInterpolator(context, resID); - } - - setMax(a.getInt(/*R.styleable.*/ProgressBar_max, mMax)); - - setProgress(a.getInt(/*R.styleable.*/ProgressBar_progress, mProgress)); - - setSecondaryProgress( - a.getInt(/*R.styleable.*/ProgressBar_secondaryProgress, mSecondaryProgress)); - - drawable = a.getDrawable(/*R.styleable.*/ProgressBar_indeterminateDrawable); - if (drawable != null) { - drawable = tileifyIndeterminate(drawable); - setIndeterminateDrawable(drawable); - } - - mOnlyIndeterminate = a.getBoolean( - /*R.styleable.*/ProgressBar_indeterminateOnly, mOnlyIndeterminate); - - mNoInvalidate = false; - - setIndeterminate(mOnlyIndeterminate || a.getBoolean( - /*R.styleable.*/ProgressBar_indeterminate, mIndeterminate)); - - mAnimationResolution = a.getInteger(/*R.styleable.*/ProgressBar_animationResolution, - ANIMATION_RESOLUTION); - - a.recycle(); - - mAccessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE); - } - - /** - * Converts a drawable to a tiled version of itself. It will recursively - * traverse layer and state list drawables. - */ - private Drawable tileify(Drawable drawable, boolean clip) { - - if (drawable instanceof LayerDrawable) { - LayerDrawable background = (LayerDrawable) drawable; - final int N = background.getNumberOfLayers(); - Drawable[] outDrawables = new Drawable[N]; - - for (int i = 0; i < N; i++) { - int id = background.getId(i); - outDrawables[i] = tileify(background.getDrawable(i), - (id == android.R.id.progress || id == android.R.id.secondaryProgress)); - } - - LayerDrawable newBg = new LayerDrawable(outDrawables); - - for (int i = 0; i < N; i++) { - newBg.setId(i, background.getId(i)); - } - - return newBg; - - }/* else if (drawable instanceof StateListDrawable) { - StateListDrawable in = (StateListDrawable) drawable; - StateListDrawable out = new StateListDrawable(); - int numStates = in.getStateCount(); - for (int i = 0; i < numStates; i++) { - out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip)); - } - return out; - - }*/ else if (drawable instanceof BitmapDrawable) { - final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap(); - if (mSampleTile == null) { - mSampleTile = tileBitmap; - } - - final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape()); - - final BitmapShader bitmapShader = new BitmapShader(tileBitmap, - Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); - shapeDrawable.getPaint().setShader(bitmapShader); - - return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT, - ClipDrawable.HORIZONTAL) : shapeDrawable; - } - - return drawable; - } - - Shape getDrawableShape() { - final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; - return new RoundRectShape(roundedCorners, null, null); - } - - /** - * Convert a AnimationDrawable for use as a barberpole animation. - * Each frame of the animation is wrapped in a ClipDrawable and - * given a tiling BitmapShader. - */ - private Drawable tileifyIndeterminate(Drawable drawable) { - if (drawable instanceof AnimationDrawable) { - AnimationDrawable background = (AnimationDrawable) drawable; - final int N = background.getNumberOfFrames(); - AnimationDrawable newBg = new AnimationDrawable(); - newBg.setOneShot(background.isOneShot()); - - for (int i = 0; i < N; i++) { - Drawable frame = tileify(background.getFrame(i), true); - frame.setLevel(10000); - newBg.addFrame(frame, background.getDuration(i)); - } - newBg.setLevel(10000); - drawable = newBg; - } - return drawable; - } - - /** - *

- * Initialize the progress bar's default values: - *

- *
    - *
  • progress = 0
  • - *
  • max = 100
  • - *
  • animation duration = 4000 ms
  • - *
  • indeterminate = false
  • - *
  • behavior = repeat
  • - *
- */ - private void initProgressBar() { - mMax = 100; - mProgress = 0; - mSecondaryProgress = 0; - mIndeterminate = false; - mOnlyIndeterminate = false; - mDuration = 4000; - mBehavior = AlphaAnimation.RESTART; - mMinWidth = 24; - mMaxWidth = 48; - mMinHeight = 24; - mMaxHeight = 48; - } - - /** - *

Indicate whether this progress bar is in indeterminate mode.

- * - * @return true if the progress bar is in indeterminate mode - */ - @ViewDebug.ExportedProperty(category = "progress") - public synchronized boolean isIndeterminate() { - return mIndeterminate; - } - - /** - *

Change the indeterminate mode for this progress bar. In indeterminate - * mode, the progress is ignored and the progress bar shows an infinite - * animation instead.

- * - * If this progress bar's style only supports indeterminate mode (such as the circular - * progress bars), then this will be ignored. - * - * @param indeterminate true to enable the indeterminate mode - */ - public synchronized void setIndeterminate(boolean indeterminate) { - if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { - mIndeterminate = indeterminate; - - if (indeterminate) { - // swap between indeterminate and regular backgrounds - mCurrentDrawable = mIndeterminateDrawable; - startAnimation(); - } else { - mCurrentDrawable = mProgressDrawable; - stopAnimation(); - } - } - } - - /** - *

Get the drawable used to draw the progress bar in - * indeterminate mode.

- * - * @return a {@link android.graphics.drawable.Drawable} instance - * - * @see #setIndeterminateDrawable(android.graphics.drawable.Drawable) - * @see #setIndeterminate(boolean) - */ - public Drawable getIndeterminateDrawable() { - return mIndeterminateDrawable; - } - - /** - *

Define the drawable used to draw the progress bar in - * indeterminate mode.

- * - * @param d the new drawable - * - * @see #getIndeterminateDrawable() - * @see #setIndeterminate(boolean) - */ - public void setIndeterminateDrawable(Drawable d) { - if (d != null) { - d.setCallback(this); - } - mIndeterminateDrawable = d; - if (mIndeterminate) { - mCurrentDrawable = d; - postInvalidate(); - } - } - - /** - *

Get the drawable used to draw the progress bar in - * progress mode.

- * - * @return a {@link android.graphics.drawable.Drawable} instance - * - * @see #setProgressDrawable(android.graphics.drawable.Drawable) - * @see #setIndeterminate(boolean) - */ - public Drawable getProgressDrawable() { - return mProgressDrawable; - } - - /** - *

Define the drawable used to draw the progress bar in - * progress mode.

- * - * @param d the new drawable - * - * @see #getProgressDrawable() - * @see #setIndeterminate(boolean) - */ - public void setProgressDrawable(Drawable d) { - boolean needUpdate; - if (mProgressDrawable != null && d != mProgressDrawable) { - mProgressDrawable.setCallback(null); - needUpdate = true; - } else { - needUpdate = false; - } - - if (d != null) { - d.setCallback(this); - - // Make sure the ProgressBar is always tall enough - int drawableHeight = d.getMinimumHeight(); - if (mMaxHeight < drawableHeight) { - mMaxHeight = drawableHeight; - requestLayout(); - } - } - mProgressDrawable = d; - if (!mIndeterminate) { - mCurrentDrawable = d; - postInvalidate(); - } - - if (needUpdate) { - updateDrawableBounds(getWidth(), getHeight()); - updateDrawableState(); - doRefreshProgress(android.R.id.progress, mProgress, false, false); - doRefreshProgress(android.R.id.secondaryProgress, mSecondaryProgress, false, false); - } - } - - /** - * @return The drawable currently used to draw the progress bar - */ - Drawable getCurrentDrawable() { - return mCurrentDrawable; - } - - @Override - protected boolean verifyDrawable(Drawable who) { - return who == mProgressDrawable || who == mIndeterminateDrawable - || super.verifyDrawable(who); - } - - @Override - public void jumpDrawablesToCurrentState() { - super.jumpDrawablesToCurrentState(); - if (mProgressDrawable != null) mProgressDrawable.jumpToCurrentState(); - if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState(); - } - - @Override - public void postInvalidate() { - if (!mNoInvalidate) { - super.postInvalidate(); - } - } - - private class RefreshProgressRunnable implements Runnable { - - private int mId; - private int mProgress; - private boolean mFromUser; - - RefreshProgressRunnable(int id, int progress, boolean fromUser) { - mId = id; - mProgress = progress; - mFromUser = fromUser; - } - - public void run() { - doRefreshProgress(mId, mProgress, mFromUser, true); - // Put ourselves back in the cache when we are done - mRefreshProgressRunnable = this; - } - - public void setup(int id, int progress, boolean fromUser) { - mId = id; - mProgress = progress; - mFromUser = fromUser; - } - - } - - private synchronized void doRefreshProgress(int id, int progress, boolean fromUser, - boolean callBackToApp) { - float scale = mMax > 0 ? (float) progress / (float) mMax : 0; - final Drawable d = mCurrentDrawable; - if (d != null) { - Drawable progressDrawable = null; - - if (d instanceof LayerDrawable) { - progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id); - } - - final int level = (int) (scale * MAX_LEVEL); - (progressDrawable != null ? progressDrawable : d).setLevel(level); - } else { - invalidate(); - } - - if (callBackToApp && id == android.R.id.progress) { - onProgressRefresh(scale, fromUser); - } - } - - void onProgressRefresh(float scale, boolean fromUser) { - if (mAccessibilityManager.isEnabled()) { - scheduleAccessibilityEventSender(); - } - } - - private synchronized void refreshProgress(int id, int progress, boolean fromUser) { - if (mUiThreadId == Thread.currentThread().getId()) { - doRefreshProgress(id, progress, fromUser, true); - } else { - RefreshProgressRunnable r; - if (mRefreshProgressRunnable != null) { - // Use cached RefreshProgressRunnable if available - r = mRefreshProgressRunnable; - // Uncache it - mRefreshProgressRunnable = null; - r.setup(id, progress, fromUser); - } else { - // Make a new one - r = new RefreshProgressRunnable(id, progress, fromUser); - } - post(r); - } - } - - /** - *

Set the current progress to the specified value. Does not do anything - * if the progress bar is in indeterminate mode.

- * - * @param progress the new progress, between 0 and {@link #getMax()} - * - * @see #setIndeterminate(boolean) - * @see #isIndeterminate() - * @see #getProgress() - * @see #incrementProgressBy(int) - */ - public synchronized void setProgress(int progress) { - setProgress(progress, false); - } - - synchronized void setProgress(int progress, boolean fromUser) { - if (mIndeterminate) { - return; - } - - if (progress < 0) { - progress = 0; - } - - if (progress > mMax) { - progress = mMax; - } - - if (progress != mProgress) { - mProgress = progress; - refreshProgress(android.R.id.progress, mProgress, fromUser); - } - } - - /** - *

- * Set the current secondary progress to the specified value. Does not do - * anything if the progress bar is in indeterminate mode. - *

- * - * @param secondaryProgress the new secondary progress, between 0 and {@link #getMax()} - * @see #setIndeterminate(boolean) - * @see #isIndeterminate() - * @see #getSecondaryProgress() - * @see #incrementSecondaryProgressBy(int) - */ - public synchronized void setSecondaryProgress(int secondaryProgress) { - if (mIndeterminate) { - return; - } - - if (secondaryProgress < 0) { - secondaryProgress = 0; - } - - if (secondaryProgress > mMax) { - secondaryProgress = mMax; - } - - if (secondaryProgress != mSecondaryProgress) { - mSecondaryProgress = secondaryProgress; - refreshProgress(android.R.id.secondaryProgress, mSecondaryProgress, false); - } - } - - /** - *

Get the progress bar's current level of progress. Return 0 when the - * progress bar is in indeterminate mode.

- * - * @return the current progress, between 0 and {@link #getMax()} - * - * @see #setIndeterminate(boolean) - * @see #isIndeterminate() - * @see #setProgress(int) - * @see #setMax(int) - * @see #getMax() - */ - @ViewDebug.ExportedProperty(category = "progress") - public synchronized int getProgress() { - return mIndeterminate ? 0 : mProgress; - } - - /** - *

Get the progress bar's current level of secondary progress. Return 0 when the - * progress bar is in indeterminate mode.

- * - * @return the current secondary progress, between 0 and {@link #getMax()} - * - * @see #setIndeterminate(boolean) - * @see #isIndeterminate() - * @see #setSecondaryProgress(int) - * @see #setMax(int) - * @see #getMax() - */ - @ViewDebug.ExportedProperty(category = "progress") - public synchronized int getSecondaryProgress() { - return mIndeterminate ? 0 : mSecondaryProgress; - } - - /** - *

Return the upper limit of this progress bar's range.

- * - * @return a positive integer - * - * @see #setMax(int) - * @see #getProgress() - * @see #getSecondaryProgress() - */ - @ViewDebug.ExportedProperty(category = "progress") - public synchronized int getMax() { - return mMax; - } - - /** - *

Set the range of the progress bar to 0...max.

- * - * @param max the upper range of this progress bar - * - * @see #getMax() - * @see #setProgress(int) - * @see #setSecondaryProgress(int) - */ - public synchronized void setMax(int max) { - if (max < 0) { - max = 0; - } - if (max != mMax) { - mMax = max; - postInvalidate(); - - if (mProgress > max) { - mProgress = max; - } - refreshProgress(android.R.id.progress, mProgress, false); - } - } - - /** - *

Increase the progress bar's progress by the specified amount.

- * - * @param diff the amount by which the progress must be increased - * - * @see #setProgress(int) - */ - public synchronized final void incrementProgressBy(int diff) { - setProgress(mProgress + diff); - } - - /** - *

Increase the progress bar's secondary progress by the specified amount.

- * - * @param diff the amount by which the secondary progress must be increased - * - * @see #setSecondaryProgress(int) - */ - public synchronized final void incrementSecondaryProgressBy(int diff) { - setSecondaryProgress(mSecondaryProgress + diff); - } - - /** - *

Start the indeterminate progress animation.

- */ - void startAnimation() { - if (getVisibility() != VISIBLE) { - return; - } - - if (mIndeterminateDrawable instanceof Animatable) { - mShouldStartAnimationDrawable = true; - mAnimation = null; - } else { - if (mInterpolator == null) { - mInterpolator = new LinearInterpolator(); - } - - mTransformation = new Transformation(); - mAnimation = new AlphaAnimation(0.0f, 1.0f); - mAnimation.setRepeatMode(mBehavior); - mAnimation.setRepeatCount(Animation.INFINITE); - mAnimation.setDuration(mDuration); - mAnimation.setInterpolator(mInterpolator); - mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); - } - postInvalidate(); - } - - /** - *

Stop the indeterminate progress animation.

- */ - void stopAnimation() { - mAnimation = null; - mTransformation = null; - if (mIndeterminateDrawable instanceof Animatable) { - ((Animatable) mIndeterminateDrawable).stop(); - mShouldStartAnimationDrawable = false; - } - postInvalidate(); - } - - /** - * Sets the acceleration curve for the indeterminate animation. - * The interpolator is loaded as a resource from the specified context. - * - * @param context The application environment - * @param resID The resource identifier of the interpolator to load - */ - public void setInterpolator(Context context, int resID) { - setInterpolator(AnimationUtils.loadInterpolator(context, resID)); - } - - /** - * Sets the acceleration curve for the indeterminate animation. - * Defaults to a linear interpolation. - * - * @param interpolator The interpolator which defines the acceleration curve - */ - public void setInterpolator(Interpolator interpolator) { - mInterpolator = interpolator; - } - - /** - * Gets the acceleration curve type for the indeterminate animation. - * - * @return the {@link Interpolator} associated to this animation - */ - public Interpolator getInterpolator() { - return mInterpolator; - } - - @Override - public void setVisibility(int v) { - if (getVisibility() != v) { - super.setVisibility(v); - - if (mIndeterminate) { - // let's be nice with the UI thread - if (v == GONE || v == INVISIBLE) { - stopAnimation(); - } else { - startAnimation(); - } - } - } - } - - @Override - protected void onVisibilityChanged(View changedView, int visibility) { - super.onVisibilityChanged(changedView, visibility); - - if (mIndeterminate) { - // let's be nice with the UI thread - if (visibility == GONE || visibility == INVISIBLE) { - stopAnimation(); - } else { - startAnimation(); - } - } - } - - @Override - public void invalidateDrawable(Drawable dr) { - if (!mInDrawing) { - if (verifyDrawable(dr)) { - final Rect dirty = dr.getBounds(); - final int scrollX = getScrollX() + getPaddingLeft(); - final int scrollY = getScrollY() + getPaddingTop(); - - invalidate(dirty.left + scrollX, dirty.top + scrollY, - dirty.right + scrollX, dirty.bottom + scrollY); - } else { - super.invalidateDrawable(dr); - } - } - } - - /** - * @hide - * - @Override - public int getResolvedLayoutDirection(Drawable who) { - return (who == mProgressDrawable || who == mIndeterminateDrawable) ? - getResolvedLayoutDirection() : super.getResolvedLayoutDirection(who); - } - */ - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - updateDrawableBounds(w, h); - } - - private void updateDrawableBounds(int w, int h) { - // onDraw will translate the canvas so we draw starting at 0,0 - int right = w - getPaddingRight() - getPaddingLeft(); - int bottom = h - getPaddingBottom() - getPaddingTop(); - int top = 0; - int left = 0; - - if (mIndeterminateDrawable != null) { - // Aspect ratio logic does not apply to AnimationDrawables - if (mOnlyIndeterminate && !(mIndeterminateDrawable instanceof AnimationDrawable)) { - // Maintain aspect ratio. Certain kinds of animated drawables - // get very confused otherwise. - final int intrinsicWidth = mIndeterminateDrawable.getIntrinsicWidth(); - final int intrinsicHeight = mIndeterminateDrawable.getIntrinsicHeight(); - final float intrinsicAspect = (float) intrinsicWidth / intrinsicHeight; - final float boundAspect = (float) w / h; - if (intrinsicAspect != boundAspect) { - if (boundAspect > intrinsicAspect) { - // New width is larger. Make it smaller to match height. - final int width = (int) (h * intrinsicAspect); - left = (w - width) / 2; - right = left + width; - } else { - // New height is larger. Make it smaller to match width. - final int height = (int) (w * (1 / intrinsicAspect)); - top = (h - height) / 2; - bottom = top + height; - } - } - } - mIndeterminateDrawable.setBounds(0, 0, right - left, bottom - top); - mIndeterminateRealLeft = left; - mIndeterminateRealTop = top; - } - - if (mProgressDrawable != null) { - mProgressDrawable.setBounds(0, 0, right, bottom); - } - } - - @Override - protected synchronized void onDraw(Canvas canvas) { - super.onDraw(canvas); - - Drawable d = mCurrentDrawable; - if (d != null) { - // Translate canvas so a indeterminate circular progress bar with padding - // rotates properly in its animation - canvas.save(); - canvas.translate(getPaddingLeft() + mIndeterminateRealLeft, getPaddingTop() + mIndeterminateRealTop); - long time = getDrawingTime(); - if (mAnimation != null) { - mAnimation.getTransformation(time, mTransformation); - float scale = mTransformation.getAlpha(); - try { - mInDrawing = true; - d.setLevel((int) (scale * MAX_LEVEL)); - } finally { - mInDrawing = false; - } - if (SystemClock.uptimeMillis() - mLastDrawTime >= mAnimationResolution) { - mLastDrawTime = SystemClock.uptimeMillis(); - postInvalidateDelayed(mAnimationResolution); - } - } - d.draw(canvas); - canvas.restore(); - if (mShouldStartAnimationDrawable && d instanceof Animatable) { - ((Animatable) d).start(); - mShouldStartAnimationDrawable = false; - } - } - } - - @Override - protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - Drawable d = mCurrentDrawable; - - int dw = 0; - int dh = 0; - if (d != null) { - dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth())); - dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight())); - } - updateDrawableState(); - dw += getPaddingLeft() + getPaddingRight(); - dh += getPaddingTop() + getPaddingBottom(); - - if (IS_HONEYCOMB) { - setMeasuredDimension(View.resolveSizeAndState(dw, widthMeasureSpec, 0), - View.resolveSizeAndState(dh, heightMeasureSpec, 0)); - } else { - setMeasuredDimension(View.resolveSize(dw, widthMeasureSpec), - View.resolveSize(dh, heightMeasureSpec)); - } - } - - @Override - protected void drawableStateChanged() { - super.drawableStateChanged(); - updateDrawableState(); - } - - private void updateDrawableState() { - int[] state = getDrawableState(); - - if (mProgressDrawable != null && mProgressDrawable.isStateful()) { - mProgressDrawable.setState(state); - } - - if (mIndeterminateDrawable != null && mIndeterminateDrawable.isStateful()) { - mIndeterminateDrawable.setState(state); - } - } - - static class SavedState extends BaseSavedState { - int progress; - int secondaryProgress; - - /** - * Constructor called from {@link IcsProgressBar#onSaveInstanceState()} - */ - SavedState(Parcelable superState) { - super(superState); - } - - /** - * Constructor called from {@link #CREATOR} - */ - private SavedState(Parcel in) { - super(in); - progress = in.readInt(); - secondaryProgress = in.readInt(); - } - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeInt(progress); - out.writeInt(secondaryProgress); - } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - @Override - public Parcelable onSaveInstanceState() { - // Force our ancestor class to save its state - Parcelable superState = super.onSaveInstanceState(); - SavedState ss = new SavedState(superState); - - ss.progress = mProgress; - ss.secondaryProgress = mSecondaryProgress; - - return ss; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState ss = (SavedState) state; - super.onRestoreInstanceState(ss.getSuperState()); - - setProgress(ss.progress); - setSecondaryProgress(ss.secondaryProgress); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - if (mIndeterminate) { - startAnimation(); - } - } - - @Override - protected void onDetachedFromWindow() { - if (mIndeterminate) { - stopAnimation(); - } - if(mRefreshProgressRunnable != null) { - removeCallbacks(mRefreshProgressRunnable); - } - if (mAccessibilityEventSender != null) { - removeCallbacks(mAccessibilityEventSender); - } - // This should come after stopAnimation(), otherwise an invalidate message remains in the - // queue, which can prevent the entire view hierarchy from being GC'ed during a rotation - super.onDetachedFromWindow(); - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - event.setItemCount(mMax); - event.setCurrentItemIndex(mProgress); - } - - /** - * Schedule a command for sending an accessibility event. - *
- * Note: A command is used to ensure that accessibility events - * are sent at most one in a given time frame to save - * system resources while the progress changes quickly. - */ - private void scheduleAccessibilityEventSender() { - if (mAccessibilityEventSender == null) { - mAccessibilityEventSender = new AccessibilityEventSender(); - } else { - removeCallbacks(mAccessibilityEventSender); - } - postDelayed(mAccessibilityEventSender, TIMEOUT_SEND_ACCESSIBILITY_EVENT); - } - - /** - * Command for sending an accessibility event. - */ - private class AccessibilityEventSender implements Runnable { - public void run() { - sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java deleted file mode 100644 index 038d1e031..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java +++ /dev/null @@ -1,703 +0,0 @@ -/* - * Copyright (C) 2007 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.widget; - -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; -import com.actionbarsherlock.R; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.res.TypedArray; -import android.database.DataSetObserver; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.PopupWindow; -import android.widget.SpinnerAdapter; - - -/** - * A view that displays one child at a time and lets the user pick among them. - * The items in the Spinner come from the {@link Adapter} associated with - * this view. - * - *

See the Spinner - * tutorial.

- * - * @attr ref android.R.styleable#Spinner_prompt - */ -public class IcsSpinner extends IcsAbsSpinner implements OnClickListener { - //private static final String TAG = "Spinner"; - - // Only measure this many items to get a decent max width. - private static final int MAX_ITEMS_MEASURED = 15; - - /** - * Use a dialog window for selecting spinner options. - */ - //public static final int MODE_DIALOG = 0; - - /** - * Use a dropdown anchored to the Spinner for selecting spinner options. - */ - public static final int MODE_DROPDOWN = 1; - - /** - * Use the theme-supplied value to select the dropdown mode. - */ - //private static final int MODE_THEME = -1; - - private SpinnerPopup mPopup; - private DropDownAdapter mTempAdapter; - int mDropDownWidth; - - private int mGravity; - private boolean mDisableChildrenWhenDisabled; - - private Rect mTempRect = new Rect(); - - public IcsSpinner(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.actionDropDownStyle); - } - - /** - * Construct a new spinner with the given context's theme, the supplied attribute set, - * and default style. - * - * @param context The Context the view is running in, through which it can - * access the current theme, resources, etc. - * @param attrs The attributes of the XML tag that is inflating the view. - * @param defStyle The default style to apply to this view. If 0, no style - * will be applied (beyond what is included in the theme). This may - * either be an attribute resource, whose value will be retrieved - * from the current theme, or an explicit style resource. - */ - public IcsSpinner(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - TypedArray a = context.obtainStyledAttributes(attrs, - R.styleable.SherlockSpinner, defStyle, 0); - - - DropdownPopup popup = new DropdownPopup(context, attrs, defStyle); - - mDropDownWidth = a.getLayoutDimension( - R.styleable.SherlockSpinner_android_dropDownWidth, - ViewGroup.LayoutParams.WRAP_CONTENT); - popup.setBackgroundDrawable(a.getDrawable( - R.styleable.SherlockSpinner_android_popupBackground)); - final int verticalOffset = a.getDimensionPixelOffset( - R.styleable.SherlockSpinner_android_dropDownVerticalOffset, 0); - if (verticalOffset != 0) { - popup.setVerticalOffset(verticalOffset); - } - - final int horizontalOffset = a.getDimensionPixelOffset( - R.styleable.SherlockSpinner_android_dropDownHorizontalOffset, 0); - if (horizontalOffset != 0) { - popup.setHorizontalOffset(horizontalOffset); - } - - mPopup = popup; - - mGravity = a.getInt(R.styleable.SherlockSpinner_android_gravity, Gravity.CENTER); - - mPopup.setPromptText(a.getString(R.styleable.SherlockSpinner_android_prompt)); - - mDisableChildrenWhenDisabled = true; - - a.recycle(); - - // Base constructor can call setAdapter before we initialize mPopup. - // Finish setting things up if this happened. - if (mTempAdapter != null) { - mPopup.setAdapter(mTempAdapter); - mTempAdapter = null; - } - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - if (mDisableChildrenWhenDisabled) { - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - getChildAt(i).setEnabled(enabled); - } - } - } - - /** - * Describes how the selected item view is positioned. Currently only the horizontal component - * is used. The default is determined by the current theme. - * - * @param gravity See {@link android.view.Gravity} - * - * @attr ref android.R.styleable#Spinner_gravity - */ - public void setGravity(int gravity) { - if (mGravity != gravity) { - if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) { - gravity |= Gravity.LEFT; - } - mGravity = gravity; - requestLayout(); - } - } - - @Override - public void setAdapter(SpinnerAdapter adapter) { - super.setAdapter(adapter); - - if (mPopup != null) { - mPopup.setAdapter(new DropDownAdapter(adapter)); - } else { - mTempAdapter = new DropDownAdapter(adapter); - } - } - - @Override - public int getBaseline() { - View child = null; - - if (getChildCount() > 0) { - child = getChildAt(0); - } else if (mAdapter != null && mAdapter.getCount() > 0) { - child = makeAndAddView(0); - mRecycler.put(0, child); - removeAllViewsInLayout(); - } - - if (child != null) { - final int childBaseline = child.getBaseline(); - return childBaseline >= 0 ? child.getTop() + childBaseline : -1; - } else { - return -1; - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - - if (mPopup != null && mPopup.isShowing()) { - mPopup.dismiss(); - } - } - - /** - *

A spinner does not support item click events. Calling this method - * will raise an exception.

- * - * @param l this listener will be ignored - */ - @Override - public void setOnItemClickListener(OnItemClickListener l) { - throw new RuntimeException("setOnItemClickListener cannot be used with a spinner."); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mPopup != null && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) { - final int measuredWidth = getMeasuredWidth(); - setMeasuredDimension(Math.min(Math.max(measuredWidth, - measureContentWidth(getAdapter(), getBackground())), - MeasureSpec.getSize(widthMeasureSpec)), - getMeasuredHeight()); - } - } - - /** - * @see android.view.View#onLayout(boolean,int,int,int,int) - * - * Creates and positions all views - * - */ - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - mInLayout = true; - layout(0, false); - mInLayout = false; - } - - /** - * Creates and positions all views for this Spinner. - * - * @param delta Change in the selected position. +1 moves selection is moving to the right, - * so views are scrolling to the left. -1 means selection is moving to the left. - */ - @Override - void layout(int delta, boolean animate) { - int childrenLeft = mSpinnerPadding.left; - int childrenWidth = getRight() - getLeft() - mSpinnerPadding.left - mSpinnerPadding.right; - - if (mDataChanged) { - handleDataChanged(); - } - - // Handle the empty set by removing all views - if (mItemCount == 0) { - resetList(); - return; - } - - if (mNextSelectedPosition >= 0) { - setSelectedPositionInt(mNextSelectedPosition); - } - - recycleAllViews(); - - // Clear out old views - removeAllViewsInLayout(); - - // Make selected view and position it - mFirstPosition = mSelectedPosition; - View sel = makeAndAddView(mSelectedPosition); - int width = sel.getMeasuredWidth(); - int selectedOffset = childrenLeft; - switch (mGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { - case Gravity.CENTER_HORIZONTAL: - selectedOffset = childrenLeft + (childrenWidth / 2) - (width / 2); - break; - case Gravity.RIGHT: - selectedOffset = childrenLeft + childrenWidth - width; - break; - } - sel.offsetLeftAndRight(selectedOffset); - - // Flush any cached views that did not get reused above - mRecycler.clear(); - - invalidate(); - - checkSelectionChanged(); - - mDataChanged = false; - mNeedSync = false; - setNextSelectedPositionInt(mSelectedPosition); - } - - /** - * Obtain a view, either by pulling an existing view from the recycler or - * by getting a new one from the adapter. If we are animating, make sure - * there is enough information in the view's layout parameters to animate - * from the old to new positions. - * - * @param position Position in the spinner for the view to obtain - * @return A view that has been added to the spinner - */ - private View makeAndAddView(int position) { - - View child; - - if (!mDataChanged) { - child = mRecycler.get(position); - if (child != null) { - // Position the view - setUpChild(child); - - return child; - } - } - - // Nothing found in the recycler -- ask the adapter for a view - child = mAdapter.getView(position, null, this); - - // Position the view - setUpChild(child); - - return child; - } - - /** - * Helper for makeAndAddView to set the position of a view - * and fill out its layout paramters. - * - * @param child The view to position - */ - private void setUpChild(View child) { - - // Respect layout params that are already in the view. Otherwise - // make some up... - ViewGroup.LayoutParams lp = child.getLayoutParams(); - if (lp == null) { - lp = generateDefaultLayoutParams(); - } - - addViewInLayout(child, 0, lp); - - child.setSelected(hasFocus()); - if (mDisableChildrenWhenDisabled) { - child.setEnabled(isEnabled()); - } - - // Get measure specs - int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec, - mSpinnerPadding.top + mSpinnerPadding.bottom, lp.height); - int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, - mSpinnerPadding.left + mSpinnerPadding.right, lp.width); - - // Measure child - child.measure(childWidthSpec, childHeightSpec); - - int childLeft; - int childRight; - - // Position vertically based on gravity setting - int childTop = mSpinnerPadding.top - + ((getMeasuredHeight() - mSpinnerPadding.bottom - - mSpinnerPadding.top - child.getMeasuredHeight()) / 2); - int childBottom = childTop + child.getMeasuredHeight(); - - int width = child.getMeasuredWidth(); - childLeft = 0; - childRight = childLeft + width; - - child.layout(childLeft, childTop, childRight, childBottom); - } - - @Override - public boolean performClick() { - boolean handled = super.performClick(); - - if (!handled) { - handled = true; - - if (!mPopup.isShowing()) { - mPopup.show(); - } - } - - return handled; - } - - public void onClick(DialogInterface dialog, int which) { - setSelection(which); - dialog.dismiss(); - } - - /** - * Sets the prompt to display when the dialog is shown. - * @param prompt the prompt to set - */ - public void setPrompt(CharSequence prompt) { - mPopup.setPromptText(prompt); - } - - /** - * Sets the prompt to display when the dialog is shown. - * @param promptId the resource ID of the prompt to display when the dialog is shown - */ - public void setPromptId(int promptId) { - setPrompt(getContext().getText(promptId)); - } - - /** - * @return The prompt to display when the dialog is shown - */ - public CharSequence getPrompt() { - return mPopup.getHintText(); - } - - int measureContentWidth(SpinnerAdapter adapter, Drawable background) { - if (adapter == null) { - return 0; - } - - int width = 0; - View itemView = null; - int itemType = 0; - final int widthMeasureSpec = - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - final int heightMeasureSpec = - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - - // Make sure the number of items we'll measure is capped. If it's a huge data set - // with wildly varying sizes, oh well. - int start = Math.max(0, getSelectedItemPosition()); - final int end = Math.min(adapter.getCount(), start + MAX_ITEMS_MEASURED); - final int count = end - start; - start = Math.max(0, start - (MAX_ITEMS_MEASURED - count)); - for (int i = start; i < end; i++) { - final int positionType = adapter.getItemViewType(i); - if (positionType != itemType) { - itemType = positionType; - itemView = null; - } - itemView = adapter.getView(i, itemView, this); - if (itemView.getLayoutParams() == null) { - itemView.setLayoutParams(new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); - } - itemView.measure(widthMeasureSpec, heightMeasureSpec); - width = Math.max(width, itemView.getMeasuredWidth()); - } - - // Add background padding to measured width - if (background != null) { - background.getPadding(mTempRect); - width += mTempRect.left + mTempRect.right; - } - - return width; - } - - /** - *

Wrapper class for an Adapter. Transforms the embedded Adapter instance - * into a ListAdapter.

- */ - private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { - private SpinnerAdapter mAdapter; - private ListAdapter mListAdapter; - - /** - *

Creates a new ListAdapter wrapper for the specified adapter.

- * - * @param adapter the Adapter to transform into a ListAdapter - */ - public DropDownAdapter(SpinnerAdapter adapter) { - this.mAdapter = adapter; - if (adapter instanceof ListAdapter) { - this.mListAdapter = (ListAdapter) adapter; - } - } - - public int getCount() { - return mAdapter == null ? 0 : mAdapter.getCount(); - } - - public Object getItem(int position) { - return mAdapter == null ? null : mAdapter.getItem(position); - } - - public long getItemId(int position) { - return mAdapter == null ? -1 : mAdapter.getItemId(position); - } - - public View getView(int position, View convertView, ViewGroup parent) { - return getDropDownView(position, convertView, parent); - } - - public View getDropDownView(int position, View convertView, ViewGroup parent) { - return mAdapter == null ? null : - mAdapter.getDropDownView(position, convertView, parent); - } - - public boolean hasStableIds() { - return mAdapter != null && mAdapter.hasStableIds(); - } - - public void registerDataSetObserver(DataSetObserver observer) { - if (mAdapter != null) { - mAdapter.registerDataSetObserver(observer); - } - } - - public void unregisterDataSetObserver(DataSetObserver observer) { - if (mAdapter != null) { - mAdapter.unregisterDataSetObserver(observer); - } - } - - /** - * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call. - * Otherwise, return true. - */ - public boolean areAllItemsEnabled() { - final ListAdapter adapter = mListAdapter; - if (adapter != null) { - return adapter.areAllItemsEnabled(); - } else { - return true; - } - } - - /** - * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call. - * Otherwise, return true. - */ - public boolean isEnabled(int position) { - final ListAdapter adapter = mListAdapter; - if (adapter != null) { - return adapter.isEnabled(position); - } else { - return true; - } - } - - public int getItemViewType(int position) { - return 0; - } - - public int getViewTypeCount() { - return 1; - } - - public boolean isEmpty() { - return getCount() == 0; - } - } - - /** - * Implements some sort of popup selection interface for selecting a spinner option. - * Allows for different spinner modes. - */ - private interface SpinnerPopup { - public void setAdapter(ListAdapter adapter); - - /** - * Show the popup - */ - public void show(); - - /** - * Dismiss the popup - */ - public void dismiss(); - - /** - * @return true if the popup is showing, false otherwise. - */ - public boolean isShowing(); - - /** - * Set hint text to be displayed to the user. This should provide - * a description of the choice being made. - * @param hintText Hint text to set. - */ - public void setPromptText(CharSequence hintText); - public CharSequence getHintText(); - } - - /* - private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener { - private AlertDialog mPopup; - private ListAdapter mListAdapter; - private CharSequence mPrompt; - - public void dismiss() { - mPopup.dismiss(); - mPopup = null; - } - - public boolean isShowing() { - return mPopup != null ? mPopup.isShowing() : false; - } - - public void setAdapter(ListAdapter adapter) { - mListAdapter = adapter; - } - - public void setPromptText(CharSequence hintText) { - mPrompt = hintText; - } - - public CharSequence getHintText() { - return mPrompt; - } - - public void show() { - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - if (mPrompt != null) { - builder.setTitle(mPrompt); - } - mPopup = builder.setSingleChoiceItems(mListAdapter, - getSelectedItemPosition(), this).show(); - } - - public void onClick(DialogInterface dialog, int which) { - setSelection(which); - dismiss(); - } - } - */ - - private class DropdownPopup extends IcsListPopupWindow implements SpinnerPopup { - private CharSequence mHintText; - private ListAdapter mAdapter; - - public DropdownPopup(Context context, AttributeSet attrs, int defStyleRes) { - super(context, attrs, 0, defStyleRes); - - setAnchorView(IcsSpinner.this); - setModal(true); - setPromptPosition(POSITION_PROMPT_ABOVE); - setOnItemClickListener(new OnItemClickListener() { - @SuppressWarnings("rawtypes") - public void onItemClick(AdapterView parent, View v, int position, long id) { - IcsSpinner.this.setSelection(position); - dismiss(); - } - }); - } - - @Override - public void setAdapter(ListAdapter adapter) { - super.setAdapter(adapter); - mAdapter = adapter; - } - - public CharSequence getHintText() { - return mHintText; - } - - public void setPromptText(CharSequence hintText) { - // Hint text is ignored for dropdowns, but maintain it here. - mHintText = hintText; - } - - @Override - public void show() { - final int spinnerPaddingLeft = IcsSpinner.this.getPaddingLeft(); - if (mDropDownWidth == WRAP_CONTENT) { - final int spinnerWidth = IcsSpinner.this.getWidth(); - final int spinnerPaddingRight = IcsSpinner.this.getPaddingRight(); - setContentWidth(Math.max( - measureContentWidth((SpinnerAdapter) mAdapter, getBackground()), - spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight)); - } else if (mDropDownWidth == MATCH_PARENT) { - final int spinnerWidth = IcsSpinner.this.getWidth(); - final int spinnerPaddingRight = IcsSpinner.this.getPaddingRight(); - setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight); - } else { - setContentWidth(mDropDownWidth); - } - final Drawable background = getBackground(); - int bgOffset = 0; - if (background != null) { - background.getPadding(mTempRect); - bgOffset = -mTempRect.left; - } - setHorizontalOffset(bgOffset + spinnerPaddingLeft); - setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); - super.show(); - getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); - setSelection(IcsSpinner.this.getSelectedItemPosition()); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java deleted file mode 100644 index a7185d082..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.actionbarsherlock.internal.widget; - -import android.view.View; - -final class IcsView { - //No instances - private IcsView() {} - - /** - * Return only the state bits of {@link #getMeasuredWidthAndState()} - * and {@link #getMeasuredHeightAndState()}, combined into one integer. - * The width component is in the regular bits {@link #MEASURED_STATE_MASK} - * and the height component is at the shifted bits - * {@link #MEASURED_HEIGHT_STATE_SHIFT}>>{@link #MEASURED_STATE_MASK}. - */ - public static int getMeasuredStateInt(View child) { - return (child.getMeasuredWidth()&View.MEASURED_STATE_MASK) - | ((child.getMeasuredHeight()>>View.MEASURED_HEIGHT_STATE_SHIFT) - & (View.MEASURED_STATE_MASK>>View.MEASURED_HEIGHT_STATE_SHIFT)); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java deleted file mode 100644 index 48fb5d8b4..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java +++ /dev/null @@ -1,546 +0,0 @@ -/* - * 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 com.actionbarsherlock.internal.widget; - -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.text.TextUtils.TruncateAt; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.Interpolator; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import com.actionbarsherlock.R; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; -import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; -import com.actionbarsherlock.internal.nineoldandroids.widget.NineHorizontalScrollView; - -/** - * This widget implements the dynamic action bar tab behavior that can change - * across different configurations or circumstances. - */ -public class ScrollingTabContainerView extends NineHorizontalScrollView - implements IcsAdapterView.OnItemSelectedListener { - //UNUSED private static final String TAG = "ScrollingTabContainerView"; - Runnable mTabSelector; - private TabClickListener mTabClickListener; - - private IcsLinearLayout mTabLayout; - private IcsSpinner mTabSpinner; - private boolean mAllowCollapse; - - private LayoutInflater mInflater; - - int mMaxTabWidth; - private int mContentHeight; - private int mSelectedTabIndex; - - protected Animator mVisibilityAnim; - protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); - - private static final /*Time*/Interpolator sAlphaInterpolator = new DecelerateInterpolator(); - - private static final int FADE_DURATION = 200; - - public ScrollingTabContainerView(Context context) { - super(context); - setHorizontalScrollBarEnabled(false); - - TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.SherlockActionBar, - R.attr.actionBarStyle, 0); - setContentHeight(a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0)); - a.recycle(); - - mInflater = LayoutInflater.from(context); - - mTabLayout = createTabLayout(); - addView(mTabLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.MATCH_PARENT)); - } - - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY; - setFillViewport(lockedExpanded); - - final int childCount = mTabLayout.getChildCount(); - if (childCount > 1 && - (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) { - if (childCount > 2) { - mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f); - } else { - mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2; - } - } else { - mMaxTabWidth = -1; - } - - heightMeasureSpec = MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY); - - final boolean canCollapse = !lockedExpanded && mAllowCollapse; - - if (canCollapse) { - // See if we should expand - mTabLayout.measure(MeasureSpec.UNSPECIFIED, heightMeasureSpec); - if (mTabLayout.getMeasuredWidth() > MeasureSpec.getSize(widthMeasureSpec)) { - performCollapse(); - } else { - performExpand(); - } - } else { - performExpand(); - } - - final int oldWidth = getMeasuredWidth(); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - final int newWidth = getMeasuredWidth(); - - if (lockedExpanded && oldWidth != newWidth) { - // Recenter the tab display if we're at a new (scrollable) size. - setTabSelected(mSelectedTabIndex); - } - } - - /** - * Indicates whether this view is collapsed into a dropdown menu instead - * of traditional tabs. - * @return true if showing as a spinner - */ - private boolean isCollapsed() { - return mTabSpinner != null && mTabSpinner.getParent() == this; - } - - public void setAllowCollapse(boolean allowCollapse) { - mAllowCollapse = allowCollapse; - } - - private void performCollapse() { - if (isCollapsed()) return; - - if (mTabSpinner == null) { - mTabSpinner = createSpinner(); - } - removeView(mTabLayout); - addView(mTabSpinner, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.MATCH_PARENT)); - if (mTabSpinner.getAdapter() == null) { - mTabSpinner.setAdapter(new TabAdapter()); - } - if (mTabSelector != null) { - removeCallbacks(mTabSelector); - mTabSelector = null; - } - mTabSpinner.setSelection(mSelectedTabIndex); - } - - private boolean performExpand() { - if (!isCollapsed()) return false; - - removeView(mTabSpinner); - addView(mTabLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.MATCH_PARENT)); - setTabSelected(mTabSpinner.getSelectedItemPosition()); - return false; - } - - public void setTabSelected(int position) { - mSelectedTabIndex = position; - final int tabCount = mTabLayout.getChildCount(); - for (int i = 0; i < tabCount; i++) { - final View child = mTabLayout.getChildAt(i); - final boolean isSelected = i == position; - child.setSelected(isSelected); - if (isSelected) { - animateToTab(position); - } - } - } - - public void setContentHeight(int contentHeight) { - mContentHeight = contentHeight; - requestLayout(); - } - - private IcsLinearLayout createTabLayout() { - final IcsLinearLayout tabLayout = (IcsLinearLayout) LayoutInflater.from(getContext()) - .inflate(R.layout.abs__action_bar_tab_bar_view, null); - tabLayout.setMeasureWithLargestChildEnabled(true); - tabLayout.setLayoutParams(new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); - return tabLayout; - } - - private IcsSpinner createSpinner() { - final IcsSpinner spinner = new IcsSpinner(getContext(), null, - R.attr.actionDropDownStyle); - spinner.setLayoutParams(new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); - spinner.setOnItemSelectedListener(this); - return spinner; - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - // Action bar can change size on configuration changes. - // Reread the desired height from the theme-specified style. - TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.SherlockActionBar, - R.attr.actionBarStyle, 0); - setContentHeight(a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0)); - a.recycle(); - } - - public void animateToVisibility(int visibility) { - if (mVisibilityAnim != null) { - mVisibilityAnim.cancel(); - } - if (visibility == VISIBLE) { - if (getVisibility() != VISIBLE) { - setAlpha(0); - } - ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); - anim.setDuration(FADE_DURATION); - anim.setInterpolator(sAlphaInterpolator); - - anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); - anim.start(); - } else { - ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); - anim.setDuration(FADE_DURATION); - anim.setInterpolator(sAlphaInterpolator); - - anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); - anim.start(); - } - } - - public void animateToTab(final int position) { - final View tabView = mTabLayout.getChildAt(position); - if (mTabSelector != null) { - removeCallbacks(mTabSelector); - } - mTabSelector = new Runnable() { - public void run() { - final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2; - smoothScrollTo(scrollPos, 0); - mTabSelector = null; - } - }; - post(mTabSelector); - } - - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - if (mTabSelector != null) { - // Re-post the selector we saved - post(mTabSelector); - } - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (mTabSelector != null) { - removeCallbacks(mTabSelector); - } - } - - private TabView createTabView(ActionBar.Tab tab, boolean forAdapter) { - //Workaround for not being able to pass a defStyle on pre-3.0 - final TabView tabView = (TabView)mInflater.inflate(R.layout.abs__action_bar_tab, null); - tabView.init(this, tab, forAdapter); - - if (forAdapter) { - tabView.setBackgroundDrawable(null); - tabView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, - mContentHeight)); - } else { - tabView.setFocusable(true); - - if (mTabClickListener == null) { - mTabClickListener = new TabClickListener(); - } - tabView.setOnClickListener(mTabClickListener); - } - return tabView; - } - - public void addTab(ActionBar.Tab tab, boolean setSelected) { - TabView tabView = createTabView(tab, false); - mTabLayout.addView(tabView, new IcsLinearLayout.LayoutParams(0, - LayoutParams.MATCH_PARENT, 1)); - if (mTabSpinner != null) { - ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); - } - if (setSelected) { - tabView.setSelected(true); - } - if (mAllowCollapse) { - requestLayout(); - } - } - - public void addTab(ActionBar.Tab tab, int position, boolean setSelected) { - final TabView tabView = createTabView(tab, false); - mTabLayout.addView(tabView, position, new IcsLinearLayout.LayoutParams( - 0, LayoutParams.MATCH_PARENT, 1)); - if (mTabSpinner != null) { - ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); - } - if (setSelected) { - tabView.setSelected(true); - } - if (mAllowCollapse) { - requestLayout(); - } - } - - public void updateTab(int position) { - ((TabView) mTabLayout.getChildAt(position)).update(); - if (mTabSpinner != null) { - ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); - } - if (mAllowCollapse) { - requestLayout(); - } - } - - public void removeTabAt(int position) { - mTabLayout.removeViewAt(position); - if (mTabSpinner != null) { - ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); - } - if (mAllowCollapse) { - requestLayout(); - } - } - - public void removeAllTabs() { - mTabLayout.removeAllViews(); - if (mTabSpinner != null) { - ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); - } - if (mAllowCollapse) { - requestLayout(); - } - } - - @Override - public void onItemSelected(IcsAdapterView parent, View view, int position, long id) { - TabView tabView = (TabView) view; - tabView.getTab().select(); - } - - @Override - public void onNothingSelected(IcsAdapterView parent) { - } - - public static class TabView extends LinearLayout { - private ScrollingTabContainerView mParent; - private ActionBar.Tab mTab; - private CapitalizingTextView mTextView; - private ImageView mIconView; - private View mCustomView; - - public TabView(Context context, AttributeSet attrs) { - //TODO super(context, null, R.attr.actionBarTabStyle); - super(context, attrs); - } - - public void init(ScrollingTabContainerView parent, ActionBar.Tab tab, boolean forList) { - mParent = parent; - mTab = tab; - - if (forList) { - setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); - } - - update(); - } - - public void bindTab(ActionBar.Tab tab) { - mTab = tab; - update(); - } - - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - // Re-measure if we went beyond our maximum size. - if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { - super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY), - heightMeasureSpec); - } - } - - public void update() { - final ActionBar.Tab tab = mTab; - final View custom = tab.getCustomView(); - if (custom != null) { - final ViewParent customParent = custom.getParent(); - if (customParent != this) { - if (customParent != null) ((ViewGroup) customParent).removeView(custom); - addView(custom); - } - mCustomView = custom; - if (mTextView != null) mTextView.setVisibility(GONE); - if (mIconView != null) { - mIconView.setVisibility(GONE); - mIconView.setImageDrawable(null); - } - } else { - if (mCustomView != null) { - removeView(mCustomView); - mCustomView = null; - } - - final Drawable icon = tab.getIcon(); - final CharSequence text = tab.getText(); - - if (icon != null) { - if (mIconView == null) { - ImageView iconView = new ImageView(getContext()); - LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - lp.gravity = Gravity.CENTER_VERTICAL; - iconView.setLayoutParams(lp); - addView(iconView, 0); - mIconView = iconView; - } - mIconView.setImageDrawable(icon); - mIconView.setVisibility(VISIBLE); - } else if (mIconView != null) { - mIconView.setVisibility(GONE); - mIconView.setImageDrawable(null); - } - - if (text != null) { - if (mTextView == null) { - CapitalizingTextView textView = new CapitalizingTextView(getContext(), null, - R.attr.actionBarTabTextStyle); - textView.setEllipsize(TruncateAt.END); - LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - lp.gravity = Gravity.CENTER_VERTICAL; - textView.setLayoutParams(lp); - addView(textView); - mTextView = textView; - } - mTextView.setTextCompat(text); - mTextView.setVisibility(VISIBLE); - } else if (mTextView != null) { - mTextView.setVisibility(GONE); - mTextView.setText(null); - } - - if (mIconView != null) { - mIconView.setContentDescription(tab.getContentDescription()); - } - } - } - - public ActionBar.Tab getTab() { - return mTab; - } - } - - private class TabAdapter extends BaseAdapter { - @Override - public int getCount() { - return mTabLayout.getChildCount(); - } - - @Override - public Object getItem(int position) { - return ((TabView) mTabLayout.getChildAt(position)).getTab(); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = createTabView((ActionBar.Tab) getItem(position), true); - } else { - ((TabView) convertView).bindTab((ActionBar.Tab) getItem(position)); - } - return convertView; - } - } - - private class TabClickListener implements OnClickListener { - public void onClick(View view) { - TabView tabView = (TabView) view; - tabView.getTab().select(); - final int tabCount = mTabLayout.getChildCount(); - for (int i = 0; i < tabCount; i++) { - final View child = mTabLayout.getChildAt(i); - child.setSelected(child == view); - } - } - } - - protected class VisibilityAnimListener implements Animator.AnimatorListener { - private boolean mCanceled = false; - private int mFinalVisibility; - - public VisibilityAnimListener withFinalVisibility(int visibility) { - mFinalVisibility = visibility; - return this; - } - - @Override - public void onAnimationStart(Animator animation) { - setVisibility(VISIBLE); - mVisibilityAnim = animation; - mCanceled = false; - } - - @Override - public void onAnimationEnd(Animator animation) { - if (mCanceled) return; - - mVisibilityAnim = null; - setVisibility(mFinalVisibility); - } - - @Override - public void onAnimationCancel(Animator animation) { - mCanceled = true; - } - - @Override - public void onAnimationRepeat(Animator animation) { - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java deleted file mode 100644 index 81b4cd4d2..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (C) 2010 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.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 { - private Object mTag; - - /** - * Set a tag object associated with this ActionMode. - * - *

Like the tag available to views, this allows applications to associate arbitrary - * data with an ActionMode for later reference. - * - * @param tag Tag to associate with this ActionMode - * - * @see #getTag() - */ - public void setTag(Object tag) { - mTag = tag; - } - - /** - * Retrieve the tag object associated with this ActionMode. - * - *

Like the tag available to views, this allows applications to associate arbitrary - * data with an ActionMode for later reference. - * - * @return Tag associated with this ActionMode - * - * @see #setTag(Object) - */ - public Object getTag() { - return mTag; - } - - /** - * 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); - - /** - * 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 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 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 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); - - /** - * Invalidate the action mode and refresh menu content. The mode's - * {@link ActionMode.Callback} will have its - * {@link 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(); - - /** - * Finish and close this action mode. The action mode's {@link ActionMode.Callback} will - * have its {@link Callback#onDestroyActionMode(ActionMode)} method called. - */ - public abstract void finish(); - - /** - * Returns the menu of actions that this action mode presents. - * @return The action mode's menu. - */ - public abstract Menu getMenu(); - - /** - * Returns the current title of this action mode. - * @return Title text - */ - public abstract CharSequence getTitle(); - - /** - * Returns the current subtitle of this action mode. - * @return Subtitle text - */ - public abstract CharSequence getSubtitle(); - - /** - * Returns the current custom view for this action mode. - * @return The current custom view - */ - public abstract View getCustomView(); - - /** - * Returns a {@link MenuInflater} with the ActionMode's context. - */ - public abstract MenuInflater getMenuInflater(); - - /** - * Returns whether the UI presenting this action mode can take focus or not. - * This is used by internal components within the framework that would otherwise - * present an action mode UI that requires focus, such as an EditText as a custom view. - * - * @return true if the UI used to show this action mode can take focus - * @hide Internal use only - */ - public boolean isUiFocusable() { - return true; - } - - /** - * Callback interface for action modes. Supplied to - * {@link View#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 Callback#onCreateActionMode(ActionMode, Menu)} once on initial - * creation
  • - *
  • {@link Callback#onPrepareActionMode(ActionMode, Menu)} after creation - * and any time the {@link ActionMode} is invalidated
  • - *
  • {@link Callback#onActionItemClicked(ActionMode, MenuItem)} any time a - * contextual action button is clicked
  • - *
  • {@link Callback#onDestroyActionMode(ActionMode)} when the action mode - * is closed
  • - *
- */ - public interface Callback { - /** - * 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. - */ - public boolean onCreateActionMode(ActionMode mode, Menu menu); - - /** - * 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. - */ - public boolean onPrepareActionMode(ActionMode mode, Menu menu); - - /** - * 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. - */ - public boolean onActionItemClicked(ActionMode mode, MenuItem item); - - /** - * Called when an action mode is about to be exited and destroyed. - * - * @param mode The current ActionMode being destroyed - */ - public void onDestroyActionMode(ActionMode mode); - } -} \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java deleted file mode 100644 index ae7cb1fe0..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * 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 com.actionbarsherlock.view; - -import android.content.Context; -import android.view.View; - -/** - * This class is a mediator for accomplishing a given task, for example sharing a file. - * It is responsible for creating a view that performs an action that accomplishes the task. - * This class also implements other functions such a performing a default action. - *

- * An ActionProvider can be optionally specified for a {@link MenuItem} and in such a - * case it will be responsible for creating the action view that appears in the - * {@link android.app.ActionBar} as a substitute for the menu item when the item is - * displayed as an action item. Also the provider is responsible for performing a - * default action if a menu item placed on the overflow menu of the ActionBar is - * selected and none of the menu item callbacks has handled the selection. For this - * case the provider can also optionally provide a sub-menu for accomplishing the - * task at hand. - *

- *

- * There are two ways for using an action provider for creating and handling of action views: - *

    - *
  • - * Setting the action provider on a {@link MenuItem} directly by calling - * {@link MenuItem#setActionProvider(ActionProvider)}. - *
  • - *
  • - * Declaring the action provider in the menu XML resource. For example: - *
    - * 
    - *   <item android:id="@+id/my_menu_item"
    - *     android:title="Title"
    - *     android:icon="@drawable/my_menu_item_icon"
    - *     android:showAsAction="ifRoom"
    - *     android:actionProviderClass="foo.bar.SomeActionProvider" />
    - * 
    - * 
    - *
  • - *
- *

- * - * @see MenuItem#setActionProvider(ActionProvider) - * @see MenuItem#getActionProvider() - */ -public abstract class ActionProvider { - private SubUiVisibilityListener mSubUiVisibilityListener; - - /** - * Creates a new instance. - * - * @param context Context for accessing resources. - */ - public ActionProvider(Context context) { - } - - /** - * Factory method for creating new action views. - * - * @return A new action view. - */ - public abstract View onCreateActionView(); - - /** - * Performs an optional default action. - *

- * For the case of an action provider placed in a menu item not shown as an action this - * method is invoked if previous callbacks for processing menu selection has handled - * the event. - *

- *

- * A menu item selection is processed in the following order: - *

    - *
  • - * Receiving a call to {@link MenuItem.OnMenuItemClickListener#onMenuItemClick - * MenuItem.OnMenuItemClickListener.onMenuItemClick}. - *
  • - *
  • - * Receiving a call to {@link android.app.Activity#onOptionsItemSelected(MenuItem) - * Activity.onOptionsItemSelected(MenuItem)} - *
  • - *
  • - * Receiving a call to {@link android.app.Fragment#onOptionsItemSelected(MenuItem) - * Fragment.onOptionsItemSelected(MenuItem)} - *
  • - *
  • - * Launching the {@link android.content.Intent} set via - * {@link MenuItem#setIntent(android.content.Intent) MenuItem.setIntent(android.content.Intent)} - *
  • - *
  • - * Invoking this method. - *
  • - *
- *

- *

- * The default implementation does not perform any action and returns false. - *

- */ - public boolean onPerformDefaultAction() { - return false; - } - - /** - * Determines if this ActionProvider has a submenu associated with it. - * - *

Associated submenus will be shown when an action view is not. This - * provider instance will receive a call to {@link #onPrepareSubMenu(SubMenu)} - * after the call to {@link #onPerformDefaultAction()} and before a submenu is - * displayed to the user. - * - * @return true if the item backed by this provider should have an associated submenu - */ - public boolean hasSubMenu() { - return false; - } - - /** - * Called to prepare an associated submenu for the menu item backed by this ActionProvider. - * - *

if {@link #hasSubMenu()} returns true, this method will be called when the - * menu item is selected to prepare the submenu for presentation to the user. Apps - * may use this to create or alter submenu content right before display. - * - * @param subMenu Submenu that will be displayed - */ - public void onPrepareSubMenu(SubMenu subMenu) { - } - - /** - * Notify the system that the visibility of an action view's sub-UI such as - * an anchored popup has changed. This will affect how other system - * visibility notifications occur. - * - * @hide Pending future API approval - */ - public void subUiVisibilityChanged(boolean isVisible) { - if (mSubUiVisibilityListener != null) { - mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible); - } - } - - /** - * @hide Internal use only - */ - public void setSubUiVisibilityListener(SubUiVisibilityListener listener) { - mSubUiVisibilityListener = listener; - } - - /** - * @hide Internal use only - */ - public interface SubUiVisibilityListener { - public void onSubUiVisibilityChanged(boolean isVisible); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java deleted file mode 100644 index 43281b013..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 com.actionbarsherlock.view; - -/** - * When a {@link View} implements this interface it will receive callbacks - * when expanded or collapsed as an action view alongside the optional, - * app-specified callbacks to {@link OnActionExpandListener}. - * - *

See {@link MenuItem} for more information about action views. - * See {@link android.app.ActionBar} for more information about the action bar. - */ -public interface CollapsibleActionView { - /** - * Called when this view is expanded as an action view. - * See {@link MenuItem#expandActionView()}. - */ - public void onActionViewExpanded(); - - /** - * Called when this view is collapsed as an action view. - * See {@link MenuItem#collapseActionView()}. - */ - public void onActionViewCollapsed(); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java deleted file mode 100644 index 951f4ccef..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * 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.view; - -import android.content.ComponentName; -import android.content.Intent; -import android.view.KeyEvent; - -/** - * Interface for managing the items in a menu. - *

- * By default, every Activity supports an options menu of actions or options. - * You can add items to this menu and handle clicks on your additions. The - * easiest way of adding menu items is inflating an XML file into the - * {@link Menu} via {@link MenuInflater}. The easiest way of attaching code to - * clicks is via {@link Activity#onOptionsItemSelected(MenuItem)} and - * {@link Activity#onContextItemSelected(MenuItem)}. - *

- * Different menu types support different features: - *

    - *
  1. Context menus: Do not support item shortcuts and item icons. - *
  2. Options menus: The icon menus do not support item check - * marks and only show the item's - * {@link MenuItem#setTitleCondensed(CharSequence) condensed title}. The - * expanded menus (only available if six or more menu items are visible, - * reached via the 'More' item in the icon menu) do not show item icons, and - * item check marks are discouraged. - *
  3. Sub menus: Do not support item icons, or nested sub menus. - *
- * - *
- *

Developer Guides

- *

For more information about creating menus, read the - * Menus developer guide.

- *
- */ -public interface Menu { - - /** - * 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; - - /** - * Value to use for group and item identifier integers when you don't care - * about them. - */ - static final int NONE = 0; - - /** - * First value for group and item identifier integers. - */ - static final int FIRST = 1; - - // Implementation note: Keep these CATEGORY_* in sync with the category enum - // in attrs.xml - - /** - * Category code for the order integer for items/groups that are part of a - * container -- or/add this with your base value. - */ - static final int CATEGORY_CONTAINER = 0x00010000; - - /** - * Category code for the order integer for items/groups that are provided by - * the system -- or/add this with your base value. - */ - static final int CATEGORY_SYSTEM = 0x00020000; - - /** - * Category code for the order integer for items/groups that are - * user-supplied secondary (infrequently used) options -- or/add this with - * your base value. - */ - static final int CATEGORY_SECONDARY = 0x00030000; - - /** - * Category code for the order integer for items/groups that are - * alternative actions on the data that is currently displayed -- or/add - * this with your base value. - */ - static final int CATEGORY_ALTERNATIVE = 0x00040000; - - /** - * Flag for {@link #addIntentOptions}: if set, do not automatically remove - * any existing menu items in the same group. - */ - static final int FLAG_APPEND_TO_GROUP = 0x0001; - - /** - * Flag for {@link #performShortcut}: if set, do not close the menu after - * executing the shortcut. - */ - static final int FLAG_PERFORM_NO_CLOSE = 0x0001; - - /** - * Flag for {@link #performShortcut(int, KeyEvent, int)}: if set, always - * close the menu after executing the shortcut. Closing the menu also resets - * the prepared state. - */ - static final int FLAG_ALWAYS_PERFORM_CLOSE = 0x0002; - - /** - * Add a new item to the menu. This item displays the given title for its - * label. - * - * @param title The text to display for the item. - * @return The newly added menu item. - */ - public MenuItem add(CharSequence title); - - /** - * Add a new item to the menu. This item displays the given title for its - * label. - * - * @param titleRes Resource identifier of title string. - * @return The newly added menu item. - */ - public MenuItem add(int titleRes); - - /** - * Add a new item to the menu. This item displays the given title for its - * label. - * - * @param groupId The group identifier that this item should be part of. - * This can be used to define groups of items for batch state - * changes. Normally use {@link #NONE} if an item should not be in a - * group. - * @param itemId Unique item ID. Use {@link #NONE} if you do not need a - * unique ID. - * @param order The order for the item. Use {@link #NONE} if you do not care - * about the order. See {@link MenuItem#getOrder()}. - * @param title The text to display for the item. - * @return The newly added menu item. - */ - public MenuItem add(int groupId, int itemId, int order, CharSequence title); - - /** - * Variation on {@link #add(int, int, int, CharSequence)} that takes a - * string resource identifier instead of the string itself. - * - * @param groupId The group identifier that this item should be part of. - * This can also be used to define groups of items for batch state - * changes. Normally use {@link #NONE} if an item should not be in a - * group. - * @param itemId Unique item ID. Use {@link #NONE} if you do not need a - * unique ID. - * @param order The order for the item. Use {@link #NONE} if you do not care - * about the order. See {@link MenuItem#getOrder()}. - * @param titleRes Resource identifier of title string. - * @return The newly added menu item. - */ - public MenuItem add(int groupId, int itemId, int order, int titleRes); - - /** - * Add a new sub-menu to the menu. This item displays the given title for - * its label. To modify other attributes on the submenu's menu item, use - * {@link SubMenu#getItem()}. - * - * @param title The text to display for the item. - * @return The newly added sub-menu - */ - SubMenu addSubMenu(final CharSequence title); - - /** - * Add a new sub-menu to the menu. This item displays the given title for - * its label. To modify other attributes on the submenu's menu item, use - * {@link SubMenu#getItem()}. - * - * @param titleRes Resource identifier of title string. - * @return The newly added sub-menu - */ - SubMenu addSubMenu(final int titleRes); - - /** - * Add a new sub-menu to the menu. This item displays the given - * title for its label. To modify other attributes on the - * submenu's menu item, use {@link SubMenu#getItem()}. - *

- * Note that you can only have one level of sub-menus, i.e. you cannnot add - * a subMenu to a subMenu: An {@link UnsupportedOperationException} will be - * thrown if you try. - * - * @param groupId The group identifier that this item should be part of. - * This can also be used to define groups of items for batch state - * changes. Normally use {@link #NONE} if an item should not be in a - * group. - * @param itemId Unique item ID. Use {@link #NONE} if you do not need a - * unique ID. - * @param order The order for the item. Use {@link #NONE} if you do not care - * about the order. See {@link MenuItem#getOrder()}. - * @param title The text to display for the item. - * @return The newly added sub-menu - */ - SubMenu addSubMenu(final int groupId, final int itemId, int order, final CharSequence title); - - /** - * Variation on {@link #addSubMenu(int, int, int, CharSequence)} that takes - * a string resource identifier for the title instead of the string itself. - * - * @param groupId The group identifier that this item should be part of. - * This can also be used to define groups of items for batch state - * changes. Normally use {@link #NONE} if an item should not be in a group. - * @param itemId Unique item ID. Use {@link #NONE} if you do not need a unique ID. - * @param order The order for the item. Use {@link #NONE} if you do not care about the - * order. See {@link MenuItem#getOrder()}. - * @param titleRes Resource identifier of title string. - * @return The newly added sub-menu - */ - SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes); - - /** - * Add a group of menu items corresponding to actions that can be performed - * for a particular Intent. The Intent is most often configured with a null - * action, the data that the current activity is working with, and includes - * either the {@link Intent#CATEGORY_ALTERNATIVE} or - * {@link Intent#CATEGORY_SELECTED_ALTERNATIVE} to find activities that have - * said they would like to be included as optional action. You can, however, - * use any Intent you want. - * - *

- * See {@link android.content.pm.PackageManager#queryIntentActivityOptions} - * for more * details on the caller, specifics, and - * intent arguments. The list returned by that function is used - * to populate the resulting menu items. - * - *

- * All of the menu items of possible options for the intent will be added - * with the given group and id. You can use the group to control ordering of - * the items in relation to other items in the menu. Normally this function - * will automatically remove any existing items in the menu in the same - * group and place a divider above and below the added items; this behavior - * can be modified with the flags parameter. For each of the - * generated items {@link MenuItem#setIntent} is called to associate the - * appropriate Intent with the item; this means the activity will - * automatically be started for you without having to do anything else. - * - * @param groupId The group identifier that the items should be part of. - * This can also be used to define groups of items for batch state - * changes. Normally use {@link #NONE} if the items should not be in - * a group. - * @param itemId Unique item ID. Use {@link #NONE} if you do not need a - * unique ID. - * @param order The order for the items. Use {@link #NONE} if you do not - * care about the order. See {@link MenuItem#getOrder()}. - * @param caller The current activity component name as defined by - * queryIntentActivityOptions(). - * @param specifics Specific items to place first as defined by - * queryIntentActivityOptions(). - * @param intent Intent describing the kinds of items to populate in the - * list as defined by queryIntentActivityOptions(). - * @param flags Additional options controlling how the items are added. - * @param outSpecificItems Optional array in which to place the menu items - * that were generated for each of the specifics that were - * requested. Entries may be null if no activity was found for that - * specific action. - * @return The number of menu items that were added. - * - * @see #FLAG_APPEND_TO_GROUP - * @see MenuItem#setIntent - * @see android.content.pm.PackageManager#queryIntentActivityOptions - */ - public int addIntentOptions(int groupId, int itemId, int order, - ComponentName caller, Intent[] specifics, - Intent intent, int flags, MenuItem[] outSpecificItems); - - /** - * Remove the item with the given identifier. - * - * @param id The item to be removed. If there is no item with this - * identifier, nothing happens. - */ - public void removeItem(int id); - - /** - * Remove all items in the given group. - * - * @param groupId The group to be removed. If there are no items in this - * group, nothing happens. - */ - public void removeGroup(int groupId); - - /** - * Remove all existing items from the menu, leaving it empty as if it had - * just been created. - */ - public void clear(); - - /** - * Control whether a particular group of items can show a check mark. This - * is similar to calling {@link MenuItem#setCheckable} on all of the menu items - * with the given group identifier, but in addition you can control whether - * this group contains a mutually-exclusive set items. This should be called - * after the items of the group have been added to the menu. - * - * @param group The group of items to operate on. - * @param checkable Set to true to allow a check mark, false to - * disallow. The default is false. - * @param exclusive If set to true, only one item in this group can be - * checked at a time; checking an item will automatically - * uncheck all others in the group. If set to false, each - * item can be checked independently of the others. - * - * @see MenuItem#setCheckable - * @see MenuItem#setChecked - */ - public void setGroupCheckable(int group, boolean checkable, boolean exclusive); - - /** - * Show or hide all menu items that are in the given group. - * - * @param group The group of items to operate on. - * @param visible If true the items are visible, else they are hidden. - * - * @see MenuItem#setVisible - */ - public void setGroupVisible(int group, boolean visible); - - /** - * Enable or disable all menu items that are in the given group. - * - * @param group The group of items to operate on. - * @param enabled If true the items will be enabled, else they will be disabled. - * - * @see MenuItem#setEnabled - */ - public void setGroupEnabled(int group, boolean enabled); - - /** - * Return whether the menu currently has item items that are visible. - * - * @return True if there is one or more item visible, - * else false. - */ - public boolean hasVisibleItems(); - - /** - * Return the menu item with a particular identifier. - * - * @param id The identifier to find. - * - * @return The menu item object, or null if there is no item with - * this identifier. - */ - public MenuItem findItem(int id); - - /** - * Get the number of items in the menu. Note that this will change any - * times items are added or removed from the menu. - * - * @return The item count. - */ - public int size(); - - /** - * Gets the menu item at the given index. - * - * @param index The index of the menu item to return. - * @return The menu item. - * @exception IndexOutOfBoundsException - * when {@code index < 0 || >= size()} - */ - public MenuItem getItem(int index); - - /** - * Closes the menu, if open. - */ - public void close(); - - /** - * Execute the menu item action associated with the given shortcut - * character. - * - * @param keyCode The keycode of the shortcut key. - * @param event Key event message. - * @param flags Additional option flags or 0. - * - * @return If the given shortcut exists and is shown, returns - * true; else returns false. - * - * @see #FLAG_PERFORM_NO_CLOSE - */ - public boolean performShortcut(int keyCode, KeyEvent event, int flags); - - /** - * Is a keypress one of the defined shortcut keys for this window. - * @param keyCode the key code from {@link KeyEvent} to check. - * @param event the {@link KeyEvent} to use to help check. - */ - boolean isShortcutKey(int keyCode, KeyEvent event); - - /** - * Execute the menu item action associated with the given menu identifier. - * - * @param id Identifier associated with the menu item. - * @param flags Additional option flags or 0. - * - * @return If the given identifier exists and is shown, returns - * true; else returns false. - * - * @see #FLAG_PERFORM_NO_CLOSE - */ - public boolean performIdentifierAction(int id, int flags); - - - /** - * Control whether the menu should be running in qwerty mode (alphabetic - * shortcuts) or 12-key mode (numeric shortcuts). - * - * @param isQwerty If true the menu will use alphabetic shortcuts; else it - * will use numeric shortcuts. - */ - public void setQwertyMode(boolean isQwerty); -} - diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java deleted file mode 100644 index 5a0f40859..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java +++ /dev/null @@ -1,495 +0,0 @@ -/* - * 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.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.TypedArray; -import android.content.res.XmlResourceParser; -import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; -import android.util.Xml; -import android.view.InflateException; -import android.view.View; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.view.menu.MenuItemImpl; - -/** - * 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 class MenuInflater { - private static final String LOG_TAG = "MenuInflater"; - - /** 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"; - - private static final int NO_ID = 0; - - private static final Class[] ACTION_VIEW_CONSTRUCTOR_SIGNATURE = new Class[] {Context.class}; - - private static final Class[] ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE = ACTION_VIEW_CONSTRUCTOR_SIGNATURE; - - private final Object[] mActionViewConstructorArguments; - - private final Object[] mActionProviderConstructorArguments; - - private Context mContext; - private Object mRealOwner; - - /** - * Constructs a menu inflater. - * - * @see Activity#getMenuInflater() - */ - public MenuInflater(Context context) { - mContext = context; - mRealOwner = context; - mActionViewConstructorArguments = new Object[] {context}; - mActionProviderConstructorArguments = mActionViewConstructorArguments; - } - - /** - * Constructs a menu inflater. - * - * @see Activity#getMenuInflater() - * @hide - */ - public MenuInflater(Context context, Object realOwner) { - mContext = context; - mRealOwner = realOwner; - mActionViewConstructorArguments = new Object[] {context}; - mActionProviderConstructorArguments = mActionViewConstructorArguments; - } - - /** - * 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. - */ - public void inflate(int menuRes, Menu menu) { - XmlResourceParser parser = null; - try { - parser = mContext.getResources().getLayout(menuRes); - AttributeSet attrs = Xml.asAttributeSet(parser); - - parseMenu(parser, attrs, menu); - } 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, Menu menu) - throws XmlPullParserException, IOException { - MenuState menuState = new MenuState(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 - SubMenu 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()) { - if (menuState.itemActionProvider != null && - menuState.itemActionProvider.hasSubMenu()) { - menuState.addSubMenuItem(); - } else { - 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(); - } - } - - private static class InflatedOnMenuItemClickListener - implements MenuItem.OnMenuItemClickListener { - private static final Class[] PARAM_TYPES = new Class[] { MenuItem.class }; - - private Object mRealOwner; - private Method mMethod; - - public InflatedOnMenuItemClickListener(Object realOwner, String methodName) { - mRealOwner = realOwner; - Class c = realOwner.getClass(); - try { - mMethod = c.getMethod(methodName, PARAM_TYPES); - } catch (Exception e) { - InflateException ex = new InflateException( - "Couldn't resolve menu item onClick handler " + methodName + - " in class " + c.getName()); - ex.initCause(e); - throw ex; - } - } - - public boolean onMenuItemClick(MenuItem item) { - try { - if (mMethod.getReturnType() == Boolean.TYPE) { - return (Boolean) mMethod.invoke(mRealOwner, item); - } else { - mMethod.invoke(mRealOwner, item); - return true; - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - /** - * State for the current menu. - *

- * Groups can not be nested unless there is another menu (which will have - * its state class). - */ - private class MenuState { - private Menu 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 CharSequence itemTitle; - private CharSequence 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; - - /** - * Sync to attrs.xml enum, values in MenuItem: - * - 0: never - * - 1: ifRoom - * - 2: always - * - -1: Safe sentinel for "no value". - */ - private int itemShowAsAction; - - private int itemActionViewLayout; - private String itemActionViewClassName; - private String itemActionProviderClassName; - - private String itemListenerMethodName; - - private ActionProvider itemActionProvider; - - private static final int defaultGroupId = NO_ID; - private static final int defaultItemId = 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; - - public MenuState(final Menu 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, - R.styleable.SherlockMenuGroup); - - groupId = a.getResourceId(R.styleable.SherlockMenuGroup_android_id, defaultGroupId); - groupCategory = a.getInt(R.styleable.SherlockMenuGroup_android_menuCategory, defaultItemCategory); - groupOrder = a.getInt(R.styleable.SherlockMenuGroup_android_orderInCategory, defaultItemOrder); - groupCheckable = a.getInt(R.styleable.SherlockMenuGroup_android_checkableBehavior, defaultItemCheckable); - groupVisible = a.getBoolean(R.styleable.SherlockMenuGroup_android_visible, defaultItemVisible); - groupEnabled = a.getBoolean(R.styleable.SherlockMenuGroup_android_enabled, defaultItemEnabled); - - a.recycle(); - } - - /** - * Called when the parser is pointing to an item tag. - */ - public void readItem(AttributeSet attrs) { - TypedArray a = mContext.obtainStyledAttributes(attrs, - R.styleable.SherlockMenuItem); - - // Inherit attributes from the group as default value - itemId = a.getResourceId(R.styleable.SherlockMenuItem_android_id, defaultItemId); - final int category = a.getInt(R.styleable.SherlockMenuItem_android_menuCategory, groupCategory); - final int order = a.getInt(R.styleable.SherlockMenuItem_android_orderInCategory, groupOrder); - itemCategoryOrder = (category & Menu.CATEGORY_MASK) | (order & Menu.USER_MASK); - itemTitle = a.getText(R.styleable.SherlockMenuItem_android_title); - itemTitleCondensed = a.getText(R.styleable.SherlockMenuItem_android_titleCondensed); - itemIconResId = a.getResourceId(R.styleable.SherlockMenuItem_android_icon, 0); - itemAlphabeticShortcut = - getShortcut(a.getString(R.styleable.SherlockMenuItem_android_alphabeticShortcut)); - itemNumericShortcut = - getShortcut(a.getString(R.styleable.SherlockMenuItem_android_numericShortcut)); - if (a.hasValue(R.styleable.SherlockMenuItem_android_checkable)) { - // Item has attribute checkable, use it - itemCheckable = a.getBoolean(R.styleable.SherlockMenuItem_android_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(R.styleable.SherlockMenuItem_android_checked, defaultItemChecked); - itemVisible = a.getBoolean(R.styleable.SherlockMenuItem_android_visible, groupVisible); - itemEnabled = a.getBoolean(R.styleable.SherlockMenuItem_android_enabled, groupEnabled); - - TypedValue value = new TypedValue(); - a.getValue(R.styleable.SherlockMenuItem_android_showAsAction, value); - itemShowAsAction = value.type == TypedValue.TYPE_INT_HEX ? value.data : -1; - - itemListenerMethodName = a.getString(R.styleable.SherlockMenuItem_android_onClick); - itemActionViewLayout = a.getResourceId(R.styleable.SherlockMenuItem_android_actionLayout, 0); - - // itemActionViewClassName = a.getString(R.styleable.SherlockMenuItem_android_actionViewClass); - value = new TypedValue(); - a.getValue(R.styleable.SherlockMenuItem_android_actionViewClass, value); - itemActionViewClassName = value.type == TypedValue.TYPE_STRING ? value.string.toString() : null; - - // itemActionProviderClassName = a.getString(R.styleable.SherlockMenuItem_android_actionProviderClass); - value = new TypedValue(); - a.getValue(R.styleable.SherlockMenuItem_android_actionProviderClass, value); - itemActionProviderClassName = value.type == TypedValue.TYPE_STRING ? value.string.toString() : null; - - final boolean hasActionProvider = itemActionProviderClassName != null; - if (hasActionProvider && itemActionViewLayout == 0 && itemActionViewClassName == null) { - itemActionProvider = newInstance(itemActionProviderClassName, - ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE, - mActionProviderConstructorArguments); - } else { - if (hasActionProvider) { - Log.w(LOG_TAG, "Ignoring attribute 'actionProviderClass'." - + " Action view already specified."); - } - itemActionProvider = null; - } - - a.recycle(); - - itemAdded = false; - } - - private char getShortcut(String shortcutString) { - if (shortcutString == null) { - return 0; - } else { - return shortcutString.charAt(0); - } - } - - private void setItem(MenuItem 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 (mContext.isRestricted()) { - throw new IllegalStateException("The android:onClick attribute cannot " - + "be used within a restricted context"); - } - item.setOnMenuItemClickListener( - new InflatedOnMenuItemClickListener(mRealOwner, itemListenerMethodName)); - } - - if (itemCheckable >= 2) { - if (item instanceof MenuItemImpl) { - MenuItemImpl impl = (MenuItemImpl) item; - impl.setExclusiveCheckable(true); - } else { - menu.setGroupCheckable(groupId, true, true); - } - } - - boolean actionViewSpecified = false; - if (itemActionViewClassName != null) { - View actionView = (View) newInstance(itemActionViewClassName, - ACTION_VIEW_CONSTRUCTOR_SIGNATURE, mActionViewConstructorArguments); - item.setActionView(actionView); - actionViewSpecified = true; - } - if (itemActionViewLayout > 0) { - if (!actionViewSpecified) { - item.setActionView(itemActionViewLayout); - actionViewSpecified = true; - } else { - Log.w(LOG_TAG, "Ignoring attribute 'itemActionViewLayout'." - + " Action view already specified."); - } - } - if (itemActionProvider != null) { - item.setActionProvider(itemActionProvider); - } - } - - public void addItem() { - itemAdded = true; - setItem(menu.add(groupId, itemId, itemCategoryOrder, itemTitle)); - } - - public SubMenu addSubMenuItem() { - itemAdded = true; - SubMenu subMenu = menu.addSubMenu(groupId, itemId, itemCategoryOrder, itemTitle); - setItem(subMenu.getItem()); - return subMenu; - } - - public boolean hasAddedItem() { - return itemAdded; - } - - @SuppressWarnings("unchecked") - private T newInstance(String className, Class[] constructorSignature, - Object[] arguments) { - try { - Class clazz = mContext.getClassLoader().loadClass(className); - Constructor constructor = clazz.getConstructor(constructorSignature); - return (T) constructor.newInstance(arguments); - } catch (Exception e) { - Log.w(LOG_TAG, "Cannot instantiate class: " + className, e); - } - return null; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java deleted file mode 100644 index 7fc3aa430..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java +++ /dev/null @@ -1,598 +0,0 @@ -/* - * Copyright (C) 2008 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.view; - -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View; - -/** - * Interface for direct access to a previously created menu item. - *

- * An Item is returned by calling one of the {@link android.view.Menu#add} - * methods. - *

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

- *

Developer Guides

- *

For information about creating menus, read the - * Menus developer guide.

- *
- */ -public interface MenuItem { - /* - * These should be kept in sync with attrs.xml enum constants for showAsAction - */ - /** 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; - /** 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; - /** - * 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; - - /** - * 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; - - /** - * This item's action view collapses to a normal menu item. - * When expanded, the action view temporarily takes over - * a larger segment of its container. - */ - public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = android.view.MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW; - - /** - * Interface definition for a callback to be invoked when a menu item is - * clicked. - * - * @see Activity#onContextItemSelected(MenuItem) - * @see Activity#onOptionsItemSelected(MenuItem) - */ - public interface 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 boolean onMenuItemClick(MenuItem item); - } - - /** - * Interface definition for a callback to be invoked when a menu item - * marked with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} is - * expanded or collapsed. - * - * @see MenuItem#expandActionView() - * @see MenuItem#collapseActionView() - * @see MenuItem#setShowAsActionFlags(int) - */ - public interface OnActionExpandListener { - /** - * Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} - * is expanded. - * @param item Item that was expanded - * @return true if the item should expand, false if expansion should be suppressed. - */ - public boolean onMenuItemActionExpand(MenuItem item); - - /** - * Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} - * is collapsed. - * @param item Item that was collapsed - * @return true if the item should collapse, false if collapsing should be suppressed. - */ - public boolean onMenuItemActionCollapse(MenuItem item); - } - - /** - * Return the identifier for this menu item. The identifier can not - * be changed after the menu is created. - * - * @return The menu item's identifier. - */ - public int getItemId(); - - /** - * Return the group identifier that this menu item is part of. The group - * identifier can not be changed after the menu is created. - * - * @return The menu item's group identifier. - */ - public int getGroupId(); - - /** - * Return the category and order within the category of this item. This - * item will be shown before all items (within its category) that have - * order greater than this value. - *

- * An order integer contains the item's category (the upper bits of the - * integer; set by or/add the category with the order within the - * category) and the ordering of the item within that category (the - * lower bits). Example categories are {@link Menu#CATEGORY_SYSTEM}, - * {@link Menu#CATEGORY_SECONDARY}, {@link Menu#CATEGORY_ALTERNATIVE}, - * {@link Menu#CATEGORY_CONTAINER}. See {@link Menu} for a full list. - * - * @return The order of this item. - */ - public int getOrder(); - - /** - * Change the title associated with this item. - * - * @param title The new text to be displayed. - * @return This Item so additional setters can be called. - */ - public MenuItem setTitle(CharSequence title); - - /** - * Change the title associated with this item. - *

- * Some menu types do not sufficient space to show the full title, and - * instead a condensed title is preferred. See {@link Menu} for more - * information. - * - * @param title The resource id of the new text to be displayed. - * @return This Item so additional setters can be called. - * @see #setTitleCondensed(CharSequence) - */ - - public MenuItem setTitle(int title); - - /** - * Retrieve the current title of the item. - * - * @return The title. - */ - public CharSequence getTitle(); - - /** - * Change the condensed title associated with this item. The condensed - * title is used in situations where the normal title may be too long to - * be displayed. - * - * @param title The new text to be displayed as the condensed title. - * @return This Item so additional setters can be called. - */ - public MenuItem setTitleCondensed(CharSequence title); - - /** - * Retrieve the current condensed title of the item. If a condensed - * title was never set, it will return the normal title. - * - * @return The condensed title, if it exists. - * Otherwise the normal title. - */ - public CharSequence getTitleCondensed(); - - /** - * Change the icon associated with this item. This icon will not always be - * shown, so the title should be sufficient in describing this item. See - * {@link Menu} for the menu types that support icons. - * - * @param icon The new icon (as a Drawable) to be displayed. - * @return This Item so additional setters can be called. - */ - public MenuItem setIcon(Drawable icon); - - /** - * Change the icon associated with this item. This icon will not always be - * shown, so the title should be sufficient in describing this item. See - * {@link Menu} for the menu types that support icons. - *

- * This method will set the resource ID of the icon which will be used to - * lazily get the Drawable when this item is being shown. - * - * @param iconRes The new icon (as a resource ID) to be displayed. - * @return This Item so additional setters can be called. - */ - public MenuItem setIcon(int iconRes); - - /** - * Returns the icon for this item as a Drawable (getting it from resources if it hasn't been - * loaded before). - * - * @return The icon as a Drawable. - */ - public Drawable getIcon(); - - /** - * Change the Intent associated with this item. By default there is no - * Intent associated with a menu item. If you set one, and nothing - * else handles the item, then the default behavior will be to call - * {@link android.content.Context#startActivity} with the given Intent. - * - *

Note that setIntent() can not be used with the versions of - * {@link Menu#add} that take a Runnable, because {@link Runnable#run} - * does not return a value so there is no way to tell if it handled the - * item. In this case it is assumed that the Runnable always handles - * the item, and the intent will never be started. - * - * @see #getIntent - * @param intent The Intent to associated with the item. This Intent - * object is not copied, so be careful not to - * modify it later. - * @return This Item so additional setters can be called. - */ - public MenuItem setIntent(Intent intent); - - /** - * Return the Intent associated with this item. This returns a - * reference to the Intent which you can change as desired to modify - * what the Item is holding. - * - * @see #setIntent - * @return Returns the last value supplied to {@link #setIntent}, or - * null. - */ - public Intent getIntent(); - - /** - * Change both the numeric and alphabetic shortcut associated with this - * item. Note that the shortcut will be triggered when the key that - * generates the given character is pressed alone or along with with the alt - * key. Also note that case is not significant and that alphabetic shortcut - * characters will be displayed in lower case. - *

- * See {@link Menu} for the menu types that support shortcuts. - * - * @param numericChar The numeric shortcut key. This is the shortcut when - * using a numeric (e.g., 12-key) keyboard. - * @param alphaChar The alphabetic shortcut key. This is the shortcut when - * using a keyboard with alphabetic keys. - * @return This Item so additional setters can be called. - */ - public MenuItem setShortcut(char numericChar, char alphaChar); - - /** - * Change the numeric shortcut associated with this item. - *

- * See {@link Menu} for the menu types that support shortcuts. - * - * @param numericChar The numeric shortcut key. This is the shortcut when - * using a 12-key (numeric) keyboard. - * @return This Item so additional setters can be called. - */ - public MenuItem setNumericShortcut(char numericChar); - - /** - * Return the char for this menu item's numeric (12-key) shortcut. - * - * @return Numeric character to use as a shortcut. - */ - public char getNumericShortcut(); - - /** - * Change the alphabetic shortcut associated with this item. The shortcut - * will be triggered when the key that generates the given character is - * pressed alone or along with with the alt key. Case is not significant and - * shortcut characters will be displayed in lower case. Note that menu items - * with the characters '\b' or '\n' as shortcuts will get triggered by the - * Delete key or Carriage Return key, respectively. - *

- * See {@link Menu} for the menu types that support shortcuts. - * - * @param alphaChar The alphabetic shortcut key. This is the shortcut when - * using a keyboard with alphabetic keys. - * @return This Item so additional setters can be called. - */ - public MenuItem setAlphabeticShortcut(char alphaChar); - - /** - * Return the char for this menu item's alphabetic shortcut. - * - * @return Alphabetic character to use as a shortcut. - */ - public char getAlphabeticShortcut(); - - /** - * Control whether this item can display a check mark. Setting this does - * not actually display a check mark (see {@link #setChecked} for that); - * rather, it ensures there is room in the item in which to display a - * check mark. - *

- * See {@link Menu} for the menu types that support check marks. - * - * @param checkable Set to true to allow a check mark, false to - * disallow. The default is false. - * @see #setChecked - * @see #isCheckable - * @see Menu#setGroupCheckable - * @return This Item so additional setters can be called. - */ - public MenuItem setCheckable(boolean checkable); - - /** - * Return whether the item can currently display a check mark. - * - * @return If a check mark can be displayed, returns true. - * - * @see #setCheckable - */ - public boolean isCheckable(); - - /** - * Control whether this item is shown with a check mark. Note that you - * must first have enabled checking with {@link #setCheckable} or else - * the check mark will not appear. If this item is a member of a group that contains - * mutually-exclusive items (set via {@link Menu#setGroupCheckable(int, boolean, boolean)}, - * the other items in the group will be unchecked. - *

- * See {@link Menu} for the menu types that support check marks. - * - * @see #setCheckable - * @see #isChecked - * @see Menu#setGroupCheckable - * @param checked Set to true to display a check mark, false to hide - * it. The default value is false. - * @return This Item so additional setters can be called. - */ - public MenuItem setChecked(boolean checked); - - /** - * Return whether the item is currently displaying a check mark. - * - * @return If a check mark is displayed, returns true. - * - * @see #setChecked - */ - public boolean isChecked(); - - /** - * Sets the visibility of the menu item. Even if a menu item is not visible, - * it may still be invoked via its shortcut (to completely disable an item, - * set it to invisible and {@link #setEnabled(boolean) disabled}). - * - * @param visible If true then the item will be visible; if false it is - * hidden. - * @return This Item so additional setters can be called. - */ - public MenuItem setVisible(boolean visible); - - /** - * Return the visibility of the menu item. - * - * @return If true the item is visible; else it is hidden. - */ - public boolean isVisible(); - - /** - * Sets whether the menu item is enabled. Disabling a menu item will not - * allow it to be invoked via its shortcut. The menu item will still be - * visible. - * - * @param enabled If true then the item will be invokable; if false it is - * won't be invokable. - * @return This Item so additional setters can be called. - */ - public MenuItem setEnabled(boolean enabled); - - /** - * Return the enabled state of the menu item. - * - * @return If true the item is enabled and hence invokable; else it is not. - */ - public boolean isEnabled(); - - /** - * Check whether this item has an associated sub-menu. I.e. it is a - * sub-menu of another menu. - * - * @return If true this item has a menu; else it is a - * normal item. - */ - public boolean hasSubMenu(); - - /** - * Get the sub-menu to be invoked when this item is selected, if it has - * one. See {@link #hasSubMenu()}. - * - * @return The associated menu if there is one, else null - */ - public SubMenu getSubMenu(); - - /** - * Set a custom listener for invocation of this menu item. In most - * situations, it is more efficient and easier to use - * {@link Activity#onOptionsItemSelected(MenuItem)} or - * {@link Activity#onContextItemSelected(MenuItem)}. - * - * @param menuItemClickListener The object to receive invokations. - * @return This Item so additional setters can be called. - * @see Activity#onOptionsItemSelected(MenuItem) - * @see Activity#onContextItemSelected(MenuItem) - */ - public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener); - - /** - * Gets the extra information linked to this menu item. This extra - * information is set by the View that added this menu item to the - * menu. - * - * @see OnCreateContextMenuListener - * @return The extra information linked to the View that added this - * menu item to the menu. This can be null. - */ - public ContextMenuInfo getMenuInfo(); - - /** - * 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}. - * 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}. SHOW_AS_ACTION_NEVER is the default. - * - * @see android.app.ActionBar - * @see #setActionView(View) - */ - public void setShowAsAction(int actionEnum); - - /** - * 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}. - * SHOW_AS_ACTION_WITH_TEXT requests that when the item is shown as an action, - * it should be shown with a text label. - * - *

Note: This method differs from {@link #setShowAsAction(int)} only in that it - * returns the current MenuItem instance for call chaining. - * - * @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}. SHOW_AS_ACTION_NEVER is the default. - * - * @see android.app.ActionBar - * @see #setActionView(View) - * @return This MenuItem instance for call chaining. - */ - public MenuItem setShowAsActionFlags(int actionEnum); - - /** - * 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. - *

- * Note: Setting an action view overrides the action provider - * set via {@link #setActionProvider(ActionProvider)}. - *

- * - * @param view View to use for presenting this item to the user. - * @return This Item so additional setters can be called. - * - * @see #setShowAsAction(int) - */ - public MenuItem setActionView(View view); - - /** - * 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. - *

- * Note: Setting an action view overrides the action provider - * set via {@link #setActionProvider(ActionProvider)}. - *

- * - * @param resId Layout resource to use for presenting this item to the user. - * @return This Item so additional setters can be called. - * - * @see #setShowAsAction(int) - */ - public MenuItem setActionView(int resId); - - /** - * Returns the currently set action view for this menu item. - * - * @return This item's action view - * - * @see #setActionView(View) - * @see #setShowAsAction(int) - */ - public View getActionView(); - - /** - * Sets the {@link ActionProvider} responsible for creating an action view if - * the item is placed on the action bar. The provider also provides a default - * action invoked if the item is placed in the overflow menu. - *

- * Note: Setting an action provider overrides the action view - * set via {@link #setActionView(int)} or {@link #setActionView(View)}. - *

- * - * @param actionProvider The action provider. - * @return This Item so additional setters can be called. - * - * @see ActionProvider - */ - public MenuItem setActionProvider(ActionProvider actionProvider); - - /** - * Gets the {@link ActionProvider}. - * - * @return The action provider. - * - * @see ActionProvider - * @see #setActionProvider(ActionProvider) - */ - public ActionProvider getActionProvider(); - - /** - * Expand the action view associated with this menu item. - * The menu item must have an action view set, as well as - * the showAsAction flag {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. - * If a listener has been set using {@link #setOnActionExpandListener(OnActionExpandListener)} - * it will have its {@link OnActionExpandListener#onMenuItemActionExpand(MenuItem)} - * method invoked. The listener may return false from this method to prevent expanding - * the action view. - * - * @return true if the action view was expanded, false otherwise. - */ - public boolean expandActionView(); - - /** - * Collapse the action view associated with this menu item. - * The menu item must have an action view set, as well as the showAsAction flag - * {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. If a listener has been set using - * {@link #setOnActionExpandListener(OnActionExpandListener)} it will have its - * {@link OnActionExpandListener#onMenuItemActionCollapse(MenuItem)} method invoked. - * The listener may return false from this method to prevent collapsing the action view. - * - * @return true if the action view was collapsed, false otherwise. - */ - public boolean collapseActionView(); - - /** - * Returns true if this menu item's action view has been expanded. - * - * @return true if the item's action view is expanded, false otherwise. - * - * @see #expandActionView() - * @see #collapseActionView() - * @see #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW - * @see OnActionExpandListener - */ - public boolean isActionViewExpanded(); - - /** - * Set an {@link OnActionExpandListener} on this menu item to be notified when - * the associated action view is expanded or collapsed. The menu item must - * be configured to expand or collapse its action view using the flag - * {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. - * - * @param listener Listener that will respond to expand/collapse events - * @return This menu item instance for call chaining - */ - public MenuItem setOnActionExpandListener(OnActionExpandListener listener); -} \ No newline at end of file diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java deleted file mode 100644 index 397fd1c2d..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2007 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.view; - -import android.graphics.drawable.Drawable; -import android.view.View; - -/** - * Subclass of {@link Menu} for sub menus. - *

- * Sub menus do not support item icons, or nested sub menus. - * - *

- *

Developer Guides

- *

For information about creating menus, read the - * Menus developer guide.

- *
- */ - -public interface SubMenu extends Menu { - /** - * Sets the submenu header's title to the title given in titleRes - * resource identifier. - * - * @param titleRes The string resource identifier used for the title. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderTitle(int titleRes); - - /** - * Sets the submenu header's title to the title given in title. - * - * @param title The character sequence used for the title. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderTitle(CharSequence title); - - /** - * Sets the submenu header's icon to the icon given in iconRes - * resource id. - * - * @param iconRes The resource identifier used for the icon. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderIcon(int iconRes); - - /** - * Sets the submenu header's icon to the icon given in icon - * {@link Drawable}. - * - * @param icon The {@link Drawable} used for the icon. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderIcon(Drawable icon); - - /** - * Sets the header of the submenu to the {@link View} given in - * view. This replaces the header title and icon (and those - * replace this). - * - * @param view The {@link View} used for the header. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setHeaderView(View view); - - /** - * Clears the header of the submenu. - */ - public void clearHeader(); - - /** - * Change the icon associated with this submenu's item in its parent menu. - * - * @see MenuItem#setIcon(int) - * @param iconRes The new icon (as a resource ID) to be displayed. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setIcon(int iconRes); - - /** - * Change the icon associated with this submenu's item in its parent menu. - * - * @see MenuItem#setIcon(Drawable) - * @param icon The new icon (as a Drawable) to be displayed. - * @return This SubMenu so additional setters can be called. - */ - public SubMenu setIcon(Drawable icon); - - /** - * Gets the {@link MenuItem} that represents this submenu in the parent - * menu. Use this for setting additional item attributes. - * - * @return The {@link MenuItem} that launches the submenu when invoked. - */ - public MenuItem getItem(); -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java deleted file mode 100644 index a340a4291..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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.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 { - public static final long FEATURE_ACTION_BAR = android.view.Window.FEATURE_ACTION_BAR; - public static final long FEATURE_ACTION_BAR_OVERLAY = android.view.Window.FEATURE_ACTION_BAR_OVERLAY; - public static final long FEATURE_ACTION_MODE_OVERLAY = android.view.Window.FEATURE_ACTION_MODE_OVERLAY; - public static final long FEATURE_NO_TITLE = android.view.Window.FEATURE_NO_TITLE; - public static final long FEATURE_PROGRESS = android.view.Window.FEATURE_PROGRESS; - public static final long FEATURE_INDETERMINATE_PROGRESS = android.view.Window.FEATURE_INDETERMINATE_PROGRESS; - - /** - * Create a new instance for a context. - * - * @param context Context. - */ - private Window(Context context) { - super(context); - } - - - public interface Callback { - /** - * Called when a panel's menu item has been selected by the user. - * - * @param featureId The panel that the menu is in. - * @param item The menu item that was selected. - * - * @return boolean Return true to finish processing of selection, or - * false to perform the normal menu handling (calling its - * Runnable or sending a Message to its target Handler). - */ - public boolean onMenuItemSelected(int featureId, MenuItem item); - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java deleted file mode 100644 index d7f110fc6..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java +++ /dev/null @@ -1,1104 +0,0 @@ -/* - * 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 com.actionbarsherlock.widget; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.database.DataSetObservable; -import android.os.Handler; -import android.text.TextUtils; -import android.util.Log; -import android.util.Xml; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -/** - *

- * This class represents a data model for choosing a component for handing a - * given {@link Intent}. The model is responsible for querying the system for - * activities that can handle the given intent and order found activities - * based on historical data of previous choices. The historical data is stored - * in an application private file. If a client does not want to have persistent - * choice history the file can be omitted, thus the activities will be ordered - * based on historical usage for the current session. - *

- *

- * For each backing history file there is a singleton instance of this class. Thus, - * several clients that specify the same history file will share the same model. Note - * that if multiple clients are sharing the same model they should implement semantically - * equivalent functionality since setting the model intent will change the found - * activities and they may be inconsistent with the functionality of some of the clients. - * For example, choosing a share activity can be implemented by a single backing - * model and two different views for performing the selection. If however, one of the - * views is used for sharing but the other for importing, for example, then each - * view should be backed by a separate model. - *

- *

- * The way clients interact with this class is as follows: - *

- *

- *

- * 
- *  // Get a model and set it to a couple of clients with semantically similar function.
- *  ActivityChooserModel dataModel =
- *      ActivityChooserModel.get(context, "task_specific_history_file_name.xml");
- *
- *  ActivityChooserModelClient modelClient1 = getActivityChooserModelClient1();
- *  modelClient1.setActivityChooserModel(dataModel);
- *
- *  ActivityChooserModelClient modelClient2 = getActivityChooserModelClient2();
- *  modelClient2.setActivityChooserModel(dataModel);
- *
- *  // Set an intent to choose a an activity for.
- *  dataModel.setIntent(intent);
- * 
- * 
- * 

- *

- * Note: This class is thread safe. - *

- * - * @hide - */ -class ActivityChooserModel extends DataSetObservable { - - /** - * Client that utilizes an {@link ActivityChooserModel}. - */ - public interface ActivityChooserModelClient { - - /** - * Sets the {@link ActivityChooserModel}. - * - * @param dataModel The model. - */ - public void setActivityChooserModel(ActivityChooserModel dataModel); - } - - /** - * Defines a sorter that is responsible for sorting the activities - * based on the provided historical choices and an intent. - */ - public interface ActivitySorter { - - /** - * Sorts the activities in descending order of relevance - * based on previous history and an intent. - * - * @param intent The {@link Intent}. - * @param activities Activities to be sorted. - * @param historicalRecords Historical records. - */ - // This cannot be done by a simple comparator since an Activity weight - // is computed from history. Note that Activity implements Comparable. - public void sort(Intent intent, List activities, - List historicalRecords); - } - - /** - * Listener for choosing an activity. - */ - public interface OnChooseActivityListener { - - /** - * Called when an activity has been chosen. The client can decide whether - * an activity can be chosen and if so the caller of - * {@link ActivityChooserModel#chooseActivity(int)} will receive and {@link Intent} - * for launching it. - *

- * Note: Modifying the intent is not permitted and - * any changes to the latter will be ignored. - *

- * - * @param host The listener's host model. - * @param intent The intent for launching the chosen activity. - * @return Whether the intent is handled and should not be delivered to clients. - * - * @see ActivityChooserModel#chooseActivity(int) - */ - public boolean onChooseActivity(ActivityChooserModel host, Intent intent); - } - - /** - * Flag for selecting debug mode. - */ - private static final boolean DEBUG = false; - - /** - * Tag used for logging. - */ - private static final String LOG_TAG = ActivityChooserModel.class.getSimpleName(); - - /** - * The root tag in the history file. - */ - private static final String TAG_HISTORICAL_RECORDS = "historical-records"; - - /** - * The tag for a record in the history file. - */ - private static final String TAG_HISTORICAL_RECORD = "historical-record"; - - /** - * Attribute for the activity. - */ - private static final String ATTRIBUTE_ACTIVITY = "activity"; - - /** - * Attribute for the choice time. - */ - private static final String ATTRIBUTE_TIME = "time"; - - /** - * Attribute for the choice weight. - */ - private static final String ATTRIBUTE_WEIGHT = "weight"; - - /** - * The default name of the choice history file. - */ - public static final String DEFAULT_HISTORY_FILE_NAME = - "activity_choser_model_history.xml"; - - /** - * The default maximal length of the choice history. - */ - public static final int DEFAULT_HISTORY_MAX_LENGTH = 50; - - /** - * The amount with which to inflate a chosen activity when set as default. - */ - private static final int DEFAULT_ACTIVITY_INFLATION = 5; - - /** - * Default weight for a choice record. - */ - private static final float DEFAULT_HISTORICAL_RECORD_WEIGHT = 1.0f; - - /** - * The extension of the history file. - */ - private static final String HISTORY_FILE_EXTENSION = ".xml"; - - /** - * An invalid item index. - */ - private static final int INVALID_INDEX = -1; - - /** - * Lock to guard the model registry. - */ - private static final Object sRegistryLock = new Object(); - - /** - * This the registry for data models. - */ - private static final Map sDataModelRegistry = - new HashMap(); - - /** - * Lock for synchronizing on this instance. - */ - private final Object mInstanceLock = new Object(); - - /** - * List of activities that can handle the current intent. - */ - private final List mActivites = new ArrayList(); - - /** - * List with historical choice records. - */ - private final List mHistoricalRecords = new ArrayList(); - - /** - * Context for accessing resources. - */ - private final Context mContext; - - /** - * The name of the history file that backs this model. - */ - private final String mHistoryFileName; - - /** - * The intent for which a activity is being chosen. - */ - private Intent mIntent; - - /** - * The sorter for ordering activities based on intent and past choices. - */ - private ActivitySorter mActivitySorter = new DefaultSorter(); - - /** - * The maximal length of the choice history. - */ - private int mHistoryMaxSize = DEFAULT_HISTORY_MAX_LENGTH; - - /** - * Flag whether choice history can be read. In general many clients can - * share the same data model and {@link #readHistoricalData()} may be called - * by arbitrary of them any number of times. Therefore, this class guarantees - * that the very first read succeeds and subsequent reads can be performed - * only after a call to {@link #persistHistoricalData()} followed by change - * of the share records. - */ - private boolean mCanReadHistoricalData = true; - - /** - * Flag whether the choice history was read. This is used to enforce that - * before calling {@link #persistHistoricalData()} a call to - * {@link #persistHistoricalData()} has been made. This aims to avoid a - * scenario in which a choice history file exits, it is not read yet and - * it is overwritten. Note that always all historical records are read in - * full and the file is rewritten. This is necessary since we need to - * purge old records that are outside of the sliding window of past choices. - */ - private boolean mReadShareHistoryCalled = false; - - /** - * Flag whether the choice records have changed. In general many clients can - * share the same data model and {@link #persistHistoricalData()} may be called - * by arbitrary of them any number of times. Therefore, this class guarantees - * that choice history will be persisted only if it has changed. - */ - private boolean mHistoricalRecordsChanged = true; - - /** - * Hander for scheduling work on client tread. - */ - private final Handler mHandler = new Handler(); - - /** - * Policy for controlling how the model handles chosen activities. - */ - private OnChooseActivityListener mActivityChoserModelPolicy; - - /** - * Gets the data model backed by the contents of the provided file with historical data. - * Note that only one data model is backed by a given file, thus multiple calls with - * the same file name will return the same model instance. If no such instance is present - * it is created. - *

- * Note: To use the default historical data file clients should explicitly - * pass as file name {@link #DEFAULT_HISTORY_FILE_NAME}. If no persistence of the choice - * history is desired clients should pass null for the file name. In such - * case a new model is returned for each invocation. - *

- * - *

- * Always use difference historical data files for semantically different actions. - * For example, sharing is different from importing. - *

- * - * @param context Context for loading resources. - * @param historyFileName File name with choice history, null - * if the model should not be backed by a file. In this case the activities - * will be ordered only by data from the current session. - * - * @return The model. - */ - public static ActivityChooserModel get(Context context, String historyFileName) { - synchronized (sRegistryLock) { - ActivityChooserModel dataModel = sDataModelRegistry.get(historyFileName); - if (dataModel == null) { - dataModel = new ActivityChooserModel(context, historyFileName); - sDataModelRegistry.put(historyFileName, dataModel); - } - dataModel.readHistoricalData(); - return dataModel; - } - } - - /** - * Creates a new instance. - * - * @param context Context for loading resources. - * @param historyFileName The history XML file. - */ - private ActivityChooserModel(Context context, String historyFileName) { - mContext = context.getApplicationContext(); - if (!TextUtils.isEmpty(historyFileName) - && !historyFileName.endsWith(HISTORY_FILE_EXTENSION)) { - mHistoryFileName = historyFileName + HISTORY_FILE_EXTENSION; - } else { - mHistoryFileName = historyFileName; - } - } - - /** - * Sets an intent for which to choose a activity. - *

- * Note: Clients must set only semantically similar - * intents for each data model. - *

- * - * @param intent The intent. - */ - public void setIntent(Intent intent) { - synchronized (mInstanceLock) { - if (mIntent == intent) { - return; - } - mIntent = intent; - loadActivitiesLocked(); - } - } - - /** - * Gets the intent for which a activity is being chosen. - * - * @return The intent. - */ - public Intent getIntent() { - synchronized (mInstanceLock) { - return mIntent; - } - } - - /** - * Gets the number of activities that can handle the intent. - * - * @return The activity count. - * - * @see #setIntent(Intent) - */ - public int getActivityCount() { - synchronized (mInstanceLock) { - return mActivites.size(); - } - } - - /** - * Gets an activity at a given index. - * - * @return The activity. - * - * @see ActivityResolveInfo - * @see #setIntent(Intent) - */ - public ResolveInfo getActivity(int index) { - synchronized (mInstanceLock) { - return mActivites.get(index).resolveInfo; - } - } - - /** - * Gets the index of a the given activity. - * - * @param activity The activity index. - * - * @return The index if found, -1 otherwise. - */ - public int getActivityIndex(ResolveInfo activity) { - List activities = mActivites; - final int activityCount = activities.size(); - for (int i = 0; i < activityCount; i++) { - ActivityResolveInfo currentActivity = activities.get(i); - if (currentActivity.resolveInfo == activity) { - return i; - } - } - return INVALID_INDEX; - } - - /** - * Chooses a activity to handle the current intent. This will result in - * adding a historical record for that action and construct intent with - * its component name set such that it can be immediately started by the - * client. - *

- * Note: By calling this method the client guarantees - * that the returned intent will be started. This intent is returned to - * the client solely to let additional customization before the start. - *

- * - * @return An {@link Intent} for launching the activity or null if the - * policy has consumed the intent. - * - * @see HistoricalRecord - * @see OnChooseActivityListener - */ - public Intent chooseActivity(int index) { - ActivityResolveInfo chosenActivity = mActivites.get(index); - - ComponentName chosenName = new ComponentName( - chosenActivity.resolveInfo.activityInfo.packageName, - chosenActivity.resolveInfo.activityInfo.name); - - Intent choiceIntent = new Intent(mIntent); - choiceIntent.setComponent(chosenName); - - if (mActivityChoserModelPolicy != null) { - // Do not allow the policy to change the intent. - Intent choiceIntentCopy = new Intent(choiceIntent); - final boolean handled = mActivityChoserModelPolicy.onChooseActivity(this, - choiceIntentCopy); - if (handled) { - return null; - } - } - - HistoricalRecord historicalRecord = new HistoricalRecord(chosenName, - System.currentTimeMillis(), DEFAULT_HISTORICAL_RECORD_WEIGHT); - addHisoricalRecord(historicalRecord); - - return choiceIntent; - } - - /** - * Sets the listener for choosing an activity. - * - * @param listener The listener. - */ - public void setOnChooseActivityListener(OnChooseActivityListener listener) { - mActivityChoserModelPolicy = listener; - } - - /** - * Gets the default activity, The default activity is defined as the one - * with highest rank i.e. the first one in the list of activities that can - * handle the intent. - * - * @return The default activity, null id not activities. - * - * @see #getActivity(int) - */ - public ResolveInfo getDefaultActivity() { - synchronized (mInstanceLock) { - if (!mActivites.isEmpty()) { - return mActivites.get(0).resolveInfo; - } - } - return null; - } - - /** - * Sets the default activity. The default activity is set by adding a - * historical record with weight high enough that this activity will - * become the highest ranked. Such a strategy guarantees that the default - * will eventually change if not used. Also the weight of the record for - * setting a default is inflated with a constant amount to guarantee that - * it will stay as default for awhile. - * - * @param index The index of the activity to set as default. - */ - public void setDefaultActivity(int index) { - ActivityResolveInfo newDefaultActivity = mActivites.get(index); - ActivityResolveInfo oldDefaultActivity = mActivites.get(0); - - final float weight; - if (oldDefaultActivity != null) { - // Add a record with weight enough to boost the chosen at the top. - weight = oldDefaultActivity.weight - newDefaultActivity.weight - + DEFAULT_ACTIVITY_INFLATION; - } else { - weight = DEFAULT_HISTORICAL_RECORD_WEIGHT; - } - - ComponentName defaultName = new ComponentName( - newDefaultActivity.resolveInfo.activityInfo.packageName, - newDefaultActivity.resolveInfo.activityInfo.name); - HistoricalRecord historicalRecord = new HistoricalRecord(defaultName, - System.currentTimeMillis(), weight); - addHisoricalRecord(historicalRecord); - } - - /** - * Reads the history data from the backing file if the latter - * was provided. Calling this method more than once before a call - * to {@link #persistHistoricalData()} has been made has no effect. - *

- * Note: Historical data is read asynchronously and - * as soon as the reading is completed any registered - * {@link DataSetObserver}s will be notified. Also no historical - * data is read until this method is invoked. - *

- */ - private void readHistoricalData() { - synchronized (mInstanceLock) { - if (!mCanReadHistoricalData || !mHistoricalRecordsChanged) { - return; - } - mCanReadHistoricalData = false; - mReadShareHistoryCalled = true; - if (!TextUtils.isEmpty(mHistoryFileName)) { - /*AsyncTask.*/SERIAL_EXECUTOR.execute(new HistoryLoader()); - } - } - } - - private static final Executor SERIAL_EXECUTOR = Executors.newSingleThreadExecutor(); - - /** - * Persists the history data to the backing file if the latter - * was provided. Calling this method before a call to {@link #readHistoricalData()} - * throws an exception. Calling this method more than one without choosing an - * activity has not effect. - * - * @throws IllegalStateException If this method is called before a call to - * {@link #readHistoricalData()}. - */ - private void persistHistoricalData() { - synchronized (mInstanceLock) { - if (!mReadShareHistoryCalled) { - throw new IllegalStateException("No preceding call to #readHistoricalData"); - } - if (!mHistoricalRecordsChanged) { - return; - } - mHistoricalRecordsChanged = false; - mCanReadHistoricalData = true; - if (!TextUtils.isEmpty(mHistoryFileName)) { - /*AsyncTask.*/SERIAL_EXECUTOR.execute(new HistoryPersister()); - } - } - } - - /** - * Sets the sorter for ordering activities based on historical data and an intent. - * - * @param activitySorter The sorter. - * - * @see ActivitySorter - */ - public void setActivitySorter(ActivitySorter activitySorter) { - synchronized (mInstanceLock) { - if (mActivitySorter == activitySorter) { - return; - } - mActivitySorter = activitySorter; - sortActivities(); - } - } - - /** - * Sorts the activities based on history and an intent. If - * a sorter is not specified this a default implementation is used. - * - * @see #setActivitySorter(ActivitySorter) - */ - private void sortActivities() { - synchronized (mInstanceLock) { - if (mActivitySorter != null && !mActivites.isEmpty()) { - mActivitySorter.sort(mIntent, mActivites, - Collections.unmodifiableList(mHistoricalRecords)); - notifyChanged(); - } - } - } - - /** - * Sets the maximal size of the historical data. Defaults to - * {@link #DEFAULT_HISTORY_MAX_LENGTH} - *

- * Note: Setting this property will immediately - * enforce the specified max history size by dropping enough old - * historical records to enforce the desired size. Thus, any - * records that exceed the history size will be discarded and - * irreversibly lost. - *

- * - * @param historyMaxSize The max history size. - */ - public void setHistoryMaxSize(int historyMaxSize) { - synchronized (mInstanceLock) { - if (mHistoryMaxSize == historyMaxSize) { - return; - } - mHistoryMaxSize = historyMaxSize; - pruneExcessiveHistoricalRecordsLocked(); - sortActivities(); - } - } - - /** - * Gets the history max size. - * - * @return The history max size. - */ - public int getHistoryMaxSize() { - synchronized (mInstanceLock) { - return mHistoryMaxSize; - } - } - - /** - * Gets the history size. - * - * @return The history size. - */ - public int getHistorySize() { - synchronized (mInstanceLock) { - return mHistoricalRecords.size(); - } - } - - /** - * Adds a historical record. - * - * @param historicalRecord The record to add. - * @return True if the record was added. - */ - private boolean addHisoricalRecord(HistoricalRecord historicalRecord) { - synchronized (mInstanceLock) { - final boolean added = mHistoricalRecords.add(historicalRecord); - if (added) { - mHistoricalRecordsChanged = true; - pruneExcessiveHistoricalRecordsLocked(); - persistHistoricalData(); - sortActivities(); - } - return added; - } - } - - /** - * Prunes older excessive records to guarantee {@link #mHistoryMaxSize}. - */ - private void pruneExcessiveHistoricalRecordsLocked() { - List choiceRecords = mHistoricalRecords; - final int pruneCount = choiceRecords.size() - mHistoryMaxSize; - if (pruneCount <= 0) { - return; - } - mHistoricalRecordsChanged = true; - for (int i = 0; i < pruneCount; i++) { - HistoricalRecord prunedRecord = choiceRecords.remove(0); - if (DEBUG) { - Log.i(LOG_TAG, "Pruned: " + prunedRecord); - } - } - } - - /** - * Loads the activities. - */ - private void loadActivitiesLocked() { - mActivites.clear(); - if (mIntent != null) { - List resolveInfos = - mContext.getPackageManager().queryIntentActivities(mIntent, 0); - final int resolveInfoCount = resolveInfos.size(); - for (int i = 0; i < resolveInfoCount; i++) { - ResolveInfo resolveInfo = resolveInfos.get(i); - mActivites.add(new ActivityResolveInfo(resolveInfo)); - } - sortActivities(); - } else { - notifyChanged(); - } - } - - /** - * Represents a record in the history. - */ - public final static class HistoricalRecord { - - /** - * The activity name. - */ - public final ComponentName activity; - - /** - * The choice time. - */ - public final long time; - - /** - * The record weight. - */ - public final float weight; - - /** - * Creates a new instance. - * - * @param activityName The activity component name flattened to string. - * @param time The time the activity was chosen. - * @param weight The weight of the record. - */ - public HistoricalRecord(String activityName, long time, float weight) { - this(ComponentName.unflattenFromString(activityName), time, weight); - } - - /** - * Creates a new instance. - * - * @param activityName The activity name. - * @param time The time the activity was chosen. - * @param weight The weight of the record. - */ - public HistoricalRecord(ComponentName activityName, long time, float weight) { - this.activity = activityName; - this.time = time; - this.weight = weight; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((activity == null) ? 0 : activity.hashCode()); - result = prime * result + (int) (time ^ (time >>> 32)); - result = prime * result + Float.floatToIntBits(weight); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - HistoricalRecord other = (HistoricalRecord) obj; - if (activity == null) { - if (other.activity != null) { - return false; - } - } else if (!activity.equals(other.activity)) { - return false; - } - if (time != other.time) { - return false; - } - if (Float.floatToIntBits(weight) != Float.floatToIntBits(other.weight)) { - return false; - } - return true; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("["); - builder.append("; activity:").append(activity); - builder.append("; time:").append(time); - builder.append("; weight:").append(new BigDecimal(weight)); - builder.append("]"); - return builder.toString(); - } - } - - /** - * Represents an activity. - */ - public final class ActivityResolveInfo implements Comparable { - - /** - * The {@link ResolveInfo} of the activity. - */ - public final ResolveInfo resolveInfo; - - /** - * Weight of the activity. Useful for sorting. - */ - public float weight; - - /** - * Creates a new instance. - * - * @param resolveInfo activity {@link ResolveInfo}. - */ - public ActivityResolveInfo(ResolveInfo resolveInfo) { - this.resolveInfo = resolveInfo; - } - - @Override - public int hashCode() { - return 31 + Float.floatToIntBits(weight); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ActivityResolveInfo other = (ActivityResolveInfo) obj; - if (Float.floatToIntBits(weight) != Float.floatToIntBits(other.weight)) { - return false; - } - return true; - } - - public int compareTo(ActivityResolveInfo another) { - return Float.floatToIntBits(another.weight) - Float.floatToIntBits(weight); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("["); - builder.append("resolveInfo:").append(resolveInfo.toString()); - builder.append("; weight:").append(new BigDecimal(weight)); - builder.append("]"); - return builder.toString(); - } - } - - /** - * Default activity sorter implementation. - */ - private final class DefaultSorter implements ActivitySorter { - private static final float WEIGHT_DECAY_COEFFICIENT = 0.95f; - - private final Map mPackageNameToActivityMap = - new HashMap(); - - public void sort(Intent intent, List activities, - List historicalRecords) { - Map packageNameToActivityMap = - mPackageNameToActivityMap; - packageNameToActivityMap.clear(); - - final int activityCount = activities.size(); - for (int i = 0; i < activityCount; i++) { - ActivityResolveInfo activity = activities.get(i); - activity.weight = 0.0f; - String packageName = activity.resolveInfo.activityInfo.packageName; - packageNameToActivityMap.put(packageName, activity); - } - - final int lastShareIndex = historicalRecords.size() - 1; - float nextRecordWeight = 1; - for (int i = lastShareIndex; i >= 0; i--) { - HistoricalRecord historicalRecord = historicalRecords.get(i); - String packageName = historicalRecord.activity.getPackageName(); - ActivityResolveInfo activity = packageNameToActivityMap.get(packageName); - if (activity != null) { - activity.weight += historicalRecord.weight * nextRecordWeight; - nextRecordWeight = nextRecordWeight * WEIGHT_DECAY_COEFFICIENT; - } - } - - Collections.sort(activities); - - if (DEBUG) { - for (int i = 0; i < activityCount; i++) { - Log.i(LOG_TAG, "Sorted: " + activities.get(i)); - } - } - } - } - - /** - * Command for reading the historical records from a file off the UI thread. - */ - private final class HistoryLoader implements Runnable { - - public void run() { - FileInputStream fis = null; - try { - fis = mContext.openFileInput(mHistoryFileName); - } catch (FileNotFoundException fnfe) { - if (DEBUG) { - Log.i(LOG_TAG, "Could not open historical records file: " + mHistoryFileName); - } - return; - } - try { - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(fis, null); - - int type = XmlPullParser.START_DOCUMENT; - while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { - type = parser.next(); - } - - if (!TAG_HISTORICAL_RECORDS.equals(parser.getName())) { - throw new XmlPullParserException("Share records file does not start with " - + TAG_HISTORICAL_RECORDS + " tag."); - } - - List readRecords = new ArrayList(); - - while (true) { - type = parser.next(); - if (type == XmlPullParser.END_DOCUMENT) { - break; - } - if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { - continue; - } - String nodeName = parser.getName(); - if (!TAG_HISTORICAL_RECORD.equals(nodeName)) { - throw new XmlPullParserException("Share records file not well-formed."); - } - - String activity = parser.getAttributeValue(null, ATTRIBUTE_ACTIVITY); - final long time = - Long.parseLong(parser.getAttributeValue(null, ATTRIBUTE_TIME)); - final float weight = - Float.parseFloat(parser.getAttributeValue(null, ATTRIBUTE_WEIGHT)); - - HistoricalRecord readRecord = new HistoricalRecord(activity, time, - weight); - readRecords.add(readRecord); - - if (DEBUG) { - Log.i(LOG_TAG, "Read " + readRecord.toString()); - } - } - - if (DEBUG) { - Log.i(LOG_TAG, "Read " + readRecords.size() + " historical records."); - } - - synchronized (mInstanceLock) { - Set uniqueShareRecords = - new LinkedHashSet(readRecords); - - // Make sure no duplicates. Example: Read a file with - // one record, add one record, persist the two records, - // add a record, read the persisted records - the - // read two records should not be added again. - List historicalRecords = mHistoricalRecords; - final int historicalRecordsCount = historicalRecords.size(); - for (int i = historicalRecordsCount - 1; i >= 0; i--) { - HistoricalRecord historicalRecord = historicalRecords.get(i); - uniqueShareRecords.add(historicalRecord); - } - - if (historicalRecords.size() == uniqueShareRecords.size()) { - return; - } - - // Make sure the oldest records go to the end. - historicalRecords.clear(); - historicalRecords.addAll(uniqueShareRecords); - - mHistoricalRecordsChanged = true; - - // Do this on the client thread since the client may be on the UI - // thread, wait for data changes which happen during sorting, and - // perform UI modification based on the data change. - mHandler.post(new Runnable() { - public void run() { - pruneExcessiveHistoricalRecordsLocked(); - sortActivities(); - } - }); - } - } catch (XmlPullParserException xppe) { - Log.e(LOG_TAG, "Error reading historical recrod file: " + mHistoryFileName, xppe); - } catch (IOException ioe) { - Log.e(LOG_TAG, "Error reading historical recrod file: " + mHistoryFileName, ioe); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException ioe) { - /* ignore */ - } - } - } - } - } - - /** - * Command for persisting the historical records to a file off the UI thread. - */ - private final class HistoryPersister implements Runnable { - - public void run() { - FileOutputStream fos = null; - List records = null; - - synchronized (mInstanceLock) { - records = new ArrayList(mHistoricalRecords); - } - - try { - fos = mContext.openFileOutput(mHistoryFileName, Context.MODE_PRIVATE); - } catch (FileNotFoundException fnfe) { - Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, fnfe); - return; - } - - XmlSerializer serializer = Xml.newSerializer(); - - try { - serializer.setOutput(fos, null); - serializer.startDocument("UTF-8", true); - serializer.startTag(null, TAG_HISTORICAL_RECORDS); - - final int recordCount = records.size(); - for (int i = 0; i < recordCount; i++) { - HistoricalRecord record = records.remove(0); - serializer.startTag(null, TAG_HISTORICAL_RECORD); - serializer.attribute(null, ATTRIBUTE_ACTIVITY, record.activity.flattenToString()); - serializer.attribute(null, ATTRIBUTE_TIME, String.valueOf(record.time)); - serializer.attribute(null, ATTRIBUTE_WEIGHT, String.valueOf(record.weight)); - serializer.endTag(null, TAG_HISTORICAL_RECORD); - if (DEBUG) { - Log.i(LOG_TAG, "Wrote " + record.toString()); - } - } - - serializer.endTag(null, TAG_HISTORICAL_RECORDS); - serializer.endDocument(); - - if (DEBUG) { - Log.i(LOG_TAG, "Wrote " + recordCount + " historical records."); - } - } catch (IllegalArgumentException iae) { - Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, iae); - } catch (IllegalStateException ise) { - Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, ise); - } catch (IOException ioe) { - Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, ioe); - } finally { - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - /* ignore */ - } - } - } - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java deleted file mode 100644 index e19ea9e9e..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java +++ /dev/null @@ -1,827 +0,0 @@ -/* - * 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 com.actionbarsherlock.widget; - -import android.os.Build; -import com.actionbarsherlock.R; -import com.actionbarsherlock.internal.widget.IcsLinearLayout; -import com.actionbarsherlock.internal.widget.IcsListPopupWindow; -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.widget.ActivityChooserModel.ActivityChooserModelClient; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.database.DataSetObserver; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.PopupWindow; -import android.widget.TextView; - -/** - * This class is a view for choosing an activity for handling a given {@link Intent}. - *

- * The view is composed of two adjacent buttons: - *

    - *
  • - * The left button is an immediate action and allows one click activity choosing. - * Tapping this button immediately executes the intent without requiring any further - * user input. Long press on this button shows a popup for changing the default - * activity. - *
  • - *
  • - * The right button is an overflow action and provides an optimized menu - * of additional activities. Tapping this button shows a popup anchored to this - * view, listing the most frequently used activities. This list is initially - * limited to a small number of items in frequency used order. The last item, - * "Show all..." serves as an affordance to display all available activities. - *
  • - *
- *

- * - * @hide - */ -class ActivityChooserView extends ViewGroup implements ActivityChooserModelClient { - - /** - * An adapter for displaying the activities in an {@link AdapterView}. - */ - private final ActivityChooserViewAdapter mAdapter; - - /** - * Implementation of various interfaces to avoid publishing them in the APIs. - */ - private final Callbacks mCallbacks; - - /** - * The content of this view. - */ - private final IcsLinearLayout mActivityChooserContent; - - /** - * Stores the background drawable to allow hiding and latter showing. - */ - private final Drawable mActivityChooserContentBackground; - - /** - * The expand activities action button; - */ - private final FrameLayout mExpandActivityOverflowButton; - - /** - * The image for the expand activities action button; - */ - private final ImageView mExpandActivityOverflowButtonImage; - - /** - * The default activities action button; - */ - private final FrameLayout mDefaultActivityButton; - - /** - * The image for the default activities action button; - */ - private final ImageView mDefaultActivityButtonImage; - - /** - * The maximal width of the list popup. - */ - private final int mListPopupMaxWidth; - - /** - * The ActionProvider hosting this view, if applicable. - */ - ActionProvider mProvider; - - /** - * Observer for the model data. - */ - private final DataSetObserver mModelDataSetOberver = new DataSetObserver() { - - @Override - public void onChanged() { - super.onChanged(); - mAdapter.notifyDataSetChanged(); - } - @Override - public void onInvalidated() { - super.onInvalidated(); - mAdapter.notifyDataSetInvalidated(); - } - }; - - private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - if (isShowingPopup()) { - if (!isShown()) { - getListPopupWindow().dismiss(); - } else { - getListPopupWindow().show(); - if (mProvider != null) { - mProvider.subUiVisibilityChanged(true); - } - } - } - } - }; - - /** - * Popup window for showing the activity overflow list. - */ - private IcsListPopupWindow mListPopupWindow; - - /** - * Listener for the dismissal of the popup/alert. - */ - private PopupWindow.OnDismissListener mOnDismissListener; - - /** - * Flag whether a default activity currently being selected. - */ - private boolean mIsSelectingDefaultActivity; - - /** - * The count of activities in the popup. - */ - private int mInitialActivityCount = ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT; - - /** - * Flag whether this view is attached to a window. - */ - private boolean mIsAttachedToWindow; - - /** - * String resource for formatting content description of the default target. - */ - private int mDefaultActionButtonContentDescription; - - private final Context mContext; - - /** - * Create a new instance. - * - * @param context The application environment. - */ - public ActivityChooserView(Context context) { - this(context, null); - } - - /** - * Create a new instance. - * - * @param context The application environment. - * @param attrs A collection of attributes. - */ - public ActivityChooserView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - /** - * Create a new instance. - * - * @param context The application environment. - * @param attrs A collection of attributes. - * @param defStyle The default style to apply to this view. - */ - public ActivityChooserView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mContext = context; - - TypedArray attributesArray = context.obtainStyledAttributes(attrs, - R.styleable.SherlockActivityChooserView, defStyle, 0); - - mInitialActivityCount = attributesArray.getInt( - R.styleable.SherlockActivityChooserView_initialActivityCount, - ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT); - - Drawable expandActivityOverflowButtonDrawable = attributesArray.getDrawable( - R.styleable.SherlockActivityChooserView_expandActivityOverflowButtonDrawable); - - attributesArray.recycle(); - - LayoutInflater inflater = LayoutInflater.from(mContext); - inflater.inflate(R.layout.abs__activity_chooser_view, this, true); - - mCallbacks = new Callbacks(); - - mActivityChooserContent = (IcsLinearLayout) findViewById(R.id.abs__activity_chooser_view_content); - mActivityChooserContentBackground = mActivityChooserContent.getBackground(); - - mDefaultActivityButton = (FrameLayout) findViewById(R.id.abs__default_activity_button); - mDefaultActivityButton.setOnClickListener(mCallbacks); - mDefaultActivityButton.setOnLongClickListener(mCallbacks); - mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.abs__image); - - mExpandActivityOverflowButton = (FrameLayout) findViewById(R.id.abs__expand_activities_button); - mExpandActivityOverflowButton.setOnClickListener(mCallbacks); - mExpandActivityOverflowButtonImage = - (ImageView) mExpandActivityOverflowButton.findViewById(R.id.abs__image); - mExpandActivityOverflowButtonImage.setImageDrawable(expandActivityOverflowButtonDrawable); - - mAdapter = new ActivityChooserViewAdapter(); - mAdapter.registerDataSetObserver(new DataSetObserver() { - @Override - public void onChanged() { - super.onChanged(); - updateAppearance(); - } - }); - - Resources resources = context.getResources(); - mListPopupMaxWidth = Math.max(resources.getDisplayMetrics().widthPixels / 2, - resources.getDimensionPixelSize(R.dimen.abs__config_prefDialogWidth)); - } - - /** - * {@inheritDoc} - */ - public void setActivityChooserModel(ActivityChooserModel dataModel) { - mAdapter.setDataModel(dataModel); - if (isShowingPopup()) { - dismissPopup(); - showPopup(); - } - } - - /** - * Sets the background for the button that expands the activity - * overflow list. - * - * Note: Clients would like to set this drawable - * as a clue about the action the chosen activity will perform. For - * example, if a share activity is to be chosen the drawable should - * give a clue that sharing is to be performed. - * - * @param drawable The drawable. - */ - public void setExpandActivityOverflowButtonDrawable(Drawable drawable) { - mExpandActivityOverflowButtonImage.setImageDrawable(drawable); - } - - /** - * Sets the content description for the button that expands the activity - * overflow list. - * - * description as a clue about the action performed by the button. - * For example, if a share activity is to be chosen the content - * description should be something like "Share with". - * - * @param resourceId The content description resource id. - */ - public void setExpandActivityOverflowButtonContentDescription(int resourceId) { - CharSequence contentDescription = mContext.getString(resourceId); - mExpandActivityOverflowButtonImage.setContentDescription(contentDescription); - } - - /** - * Set the provider hosting this view, if applicable. - * @hide Internal use only - */ - public void setProvider(ActionProvider provider) { - mProvider = provider; - } - - /** - * Shows the popup window with activities. - * - * @return True if the popup was shown, false if already showing. - */ - public boolean showPopup() { - if (isShowingPopup() || !mIsAttachedToWindow) { - return false; - } - mIsSelectingDefaultActivity = false; - showPopupUnchecked(mInitialActivityCount); - return true; - } - - /** - * Shows the popup no matter if it was already showing. - * - * @param maxActivityCount The max number of activities to display. - */ - private void showPopupUnchecked(int maxActivityCount) { - if (mAdapter.getDataModel() == null) { - throw new IllegalStateException("No data model. Did you call #setDataModel?"); - } - - getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); - - final boolean defaultActivityButtonShown = - mDefaultActivityButton.getVisibility() == VISIBLE; - - final int activityCount = mAdapter.getActivityCount(); - final int maxActivityCountOffset = defaultActivityButtonShown ? 1 : 0; - if (maxActivityCount != ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED - && activityCount > maxActivityCount + maxActivityCountOffset) { - mAdapter.setShowFooterView(true); - mAdapter.setMaxActivityCount(maxActivityCount - 1); - } else { - mAdapter.setShowFooterView(false); - mAdapter.setMaxActivityCount(maxActivityCount); - } - - IcsListPopupWindow popupWindow = getListPopupWindow(); - if (!popupWindow.isShowing()) { - if (mIsSelectingDefaultActivity || !defaultActivityButtonShown) { - mAdapter.setShowDefaultActivity(true, defaultActivityButtonShown); - } else { - mAdapter.setShowDefaultActivity(false, false); - } - final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth); - popupWindow.setContentWidth(contentWidth); - popupWindow.show(); - if (mProvider != null) { - mProvider.subUiVisibilityChanged(true); - } - popupWindow.getListView().setContentDescription(mContext.getString( - R.string.abs__activitychooserview_choose_application)); - } - } - - /** - * Dismisses the popup window with activities. - * - * @return True if dismissed, false if already dismissed. - */ - public boolean dismissPopup() { - if (isShowingPopup()) { - getListPopupWindow().dismiss(); - ViewTreeObserver viewTreeObserver = getViewTreeObserver(); - if (viewTreeObserver.isAlive()) { - viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); - } - } - return true; - } - - /** - * Gets whether the popup window with activities is shown. - * - * @return True if the popup is shown. - */ - public boolean isShowingPopup() { - return getListPopupWindow().isShowing(); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - ActivityChooserModel dataModel = mAdapter.getDataModel(); - if (dataModel != null) { - dataModel.registerObserver(mModelDataSetOberver); - } - mIsAttachedToWindow = true; - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - ActivityChooserModel dataModel = mAdapter.getDataModel(); - if (dataModel != null) { - try { - dataModel.unregisterObserver(mModelDataSetOberver); - } catch (IllegalStateException e) { - //Oh, well... fixes issue #557 - } - } - ViewTreeObserver viewTreeObserver = getViewTreeObserver(); - if (viewTreeObserver.isAlive()) { - viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); - } - mIsAttachedToWindow = false; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - View child = mActivityChooserContent; - // If the default action is not visible we want to be as tall as the - // ActionBar so if this widget is used in the latter it will look as - // a normal action button. - if (mDefaultActivityButton.getVisibility() != VISIBLE) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), - MeasureSpec.EXACTLY); - } - measureChild(child, widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(child.getMeasuredWidth(), child.getMeasuredHeight()); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - mActivityChooserContent.layout(0, 0, right - left, bottom - top); - if (getListPopupWindow().isShowing()) { - showPopupUnchecked(mAdapter.getMaxActivityCount()); - } else { - dismissPopup(); - } - } - - public ActivityChooserModel getDataModel() { - return mAdapter.getDataModel(); - } - - /** - * Sets a listener to receive a callback when the popup is dismissed. - * - * @param listener The listener to be notified. - */ - public void setOnDismissListener(PopupWindow.OnDismissListener listener) { - mOnDismissListener = listener; - } - - /** - * Sets the initial count of items shown in the activities popup - * i.e. the items before the popup is expanded. This is an upper - * bound since it is not guaranteed that such number of intent - * handlers exist. - * - * @param itemCount The initial popup item count. - */ - public void setInitialActivityCount(int itemCount) { - mInitialActivityCount = itemCount; - } - - /** - * Sets a content description of the default action button. This - * resource should be a string taking one formatting argument and - * will be used for formatting the content description of the button - * dynamically as the default target changes. For example, a resource - * pointing to the string "share with %1$s" will result in a content - * description "share with Bluetooth" for the Bluetooth activity. - * - * @param resourceId The resource id. - */ - public void setDefaultActionButtonContentDescription(int resourceId) { - mDefaultActionButtonContentDescription = resourceId; - } - - /** - * Gets the list popup window which is lazily initialized. - * - * @return The popup. - */ - private IcsListPopupWindow getListPopupWindow() { - if (mListPopupWindow == null) { - mListPopupWindow = new IcsListPopupWindow(getContext()); - mListPopupWindow.setAdapter(mAdapter); - mListPopupWindow.setAnchorView(ActivityChooserView.this); - mListPopupWindow.setModal(true); - mListPopupWindow.setOnItemClickListener(mCallbacks); - mListPopupWindow.setOnDismissListener(mCallbacks); - } - return mListPopupWindow; - } - - /** - * Updates the buttons state. - */ - private void updateAppearance() { - // Expand overflow button. - if (mAdapter.getCount() > 0) { - mExpandActivityOverflowButton.setEnabled(true); - } else { - mExpandActivityOverflowButton.setEnabled(false); - } - // Default activity button. - final int activityCount = mAdapter.getActivityCount(); - final int historySize = mAdapter.getHistorySize(); - if (activityCount > 0 && historySize > 0) { - mDefaultActivityButton.setVisibility(VISIBLE); - ResolveInfo activity = mAdapter.getDefaultActivity(); - PackageManager packageManager = mContext.getPackageManager(); - mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager)); - if (mDefaultActionButtonContentDescription != 0) { - CharSequence label = activity.loadLabel(packageManager); - String contentDescription = mContext.getString( - mDefaultActionButtonContentDescription, label); - mDefaultActivityButton.setContentDescription(contentDescription); - } - } else { - mDefaultActivityButton.setVisibility(View.GONE); - } - // Activity chooser content. - if (mDefaultActivityButton.getVisibility() == VISIBLE) { - mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground); - } else { - mActivityChooserContent.setBackgroundDrawable(null); - mActivityChooserContent.setPadding(0, 0, 0, 0); - } - } - - /** - * Interface implementation to avoid publishing them in the APIs. - */ - private class Callbacks implements AdapterView.OnItemClickListener, - View.OnClickListener, View.OnLongClickListener, PopupWindow.OnDismissListener { - - // AdapterView#OnItemClickListener - public void onItemClick(AdapterView parent, View view, int position, long id) { - ActivityChooserViewAdapter adapter = (ActivityChooserViewAdapter) parent.getAdapter(); - final int itemViewType = adapter.getItemViewType(position); - switch (itemViewType) { - case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_FOOTER: { - showPopupUnchecked(ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED); - } break; - case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_ACTIVITY: { - dismissPopup(); - if (mIsSelectingDefaultActivity) { - // The item at position zero is the default already. - if (position > 0) { - mAdapter.getDataModel().setDefaultActivity(position); - } - } else { - // If the default target is not shown in the list, the first - // item in the model is default action => adjust index - position = mAdapter.getShowDefaultActivity() ? position : position + 1; - Intent launchIntent = mAdapter.getDataModel().chooseActivity(position); - if (launchIntent != null) { - mContext.startActivity(launchIntent); - } - } - } break; - default: - throw new IllegalArgumentException(); - } - } - - // View.OnClickListener - public void onClick(View view) { - if (view == mDefaultActivityButton) { - dismissPopup(); - ResolveInfo defaultActivity = mAdapter.getDefaultActivity(); - final int index = mAdapter.getDataModel().getActivityIndex(defaultActivity); - Intent launchIntent = mAdapter.getDataModel().chooseActivity(index); - if (launchIntent != null) { - mContext.startActivity(launchIntent); - } - } else if (view == mExpandActivityOverflowButton) { - mIsSelectingDefaultActivity = false; - showPopupUnchecked(mInitialActivityCount); - } else { - throw new IllegalArgumentException(); - } - } - - // OnLongClickListener#onLongClick - @Override - public boolean onLongClick(View view) { - if (view == mDefaultActivityButton) { - if (mAdapter.getCount() > 0) { - mIsSelectingDefaultActivity = true; - showPopupUnchecked(mInitialActivityCount); - } - } else { - throw new IllegalArgumentException(); - } - return true; - } - - // PopUpWindow.OnDismissListener#onDismiss - public void onDismiss() { - notifyOnDismissListener(); - if (mProvider != null) { - mProvider.subUiVisibilityChanged(false); - } - } - - private void notifyOnDismissListener() { - if (mOnDismissListener != null) { - mOnDismissListener.onDismiss(); - } - } - } - - private static class SetActivated { - public static void invoke(View view, boolean activated) { - view.setActivated(activated); - } - } - - private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; - - /** - * Adapter for backing the list of activities shown in the popup. - */ - private class ActivityChooserViewAdapter extends BaseAdapter { - - public static final int MAX_ACTIVITY_COUNT_UNLIMITED = Integer.MAX_VALUE; - - public static final int MAX_ACTIVITY_COUNT_DEFAULT = 4; - - private static final int ITEM_VIEW_TYPE_ACTIVITY = 0; - - private static final int ITEM_VIEW_TYPE_FOOTER = 1; - - private static final int ITEM_VIEW_TYPE_COUNT = 3; - - private ActivityChooserModel mDataModel; - - private int mMaxActivityCount = MAX_ACTIVITY_COUNT_DEFAULT; - - private boolean mShowDefaultActivity; - - private boolean mHighlightDefaultActivity; - - private boolean mShowFooterView; - - public void setDataModel(ActivityChooserModel dataModel) { - ActivityChooserModel oldDataModel = mAdapter.getDataModel(); - if (oldDataModel != null && isShown()) { - try { - oldDataModel.unregisterObserver(mModelDataSetOberver); - } catch (IllegalStateException e) { - //Oh, well... fixes issue #557 - } - } - mDataModel = dataModel; - if (dataModel != null && isShown()) { - dataModel.registerObserver(mModelDataSetOberver); - } - notifyDataSetChanged(); - } - - @Override - public int getItemViewType(int position) { - if (mShowFooterView && position == getCount() - 1) { - return ITEM_VIEW_TYPE_FOOTER; - } else { - return ITEM_VIEW_TYPE_ACTIVITY; - } - } - - @Override - public int getViewTypeCount() { - return ITEM_VIEW_TYPE_COUNT; - } - - public int getCount() { - int count = 0; - int activityCount = mDataModel.getActivityCount(); - if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { - activityCount--; - } - count = Math.min(activityCount, mMaxActivityCount); - if (mShowFooterView) { - count++; - } - return count; - } - - public Object getItem(int position) { - final int itemViewType = getItemViewType(position); - switch (itemViewType) { - case ITEM_VIEW_TYPE_FOOTER: - return null; - case ITEM_VIEW_TYPE_ACTIVITY: - if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { - position++; - } - return mDataModel.getActivity(position); - default: - throw new IllegalArgumentException(); - } - } - - public long getItemId(int position) { - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - final int itemViewType = getItemViewType(position); - switch (itemViewType) { - case ITEM_VIEW_TYPE_FOOTER: - if (convertView == null || convertView.getId() != ITEM_VIEW_TYPE_FOOTER) { - convertView = LayoutInflater.from(getContext()).inflate( - R.layout.abs__activity_chooser_view_list_item, parent, false); - convertView.setId(ITEM_VIEW_TYPE_FOOTER); - TextView titleView = (TextView) convertView.findViewById(R.id.abs__title); - titleView.setText(mContext.getString( - R.string.abs__activity_chooser_view_see_all)); - } - return convertView; - case ITEM_VIEW_TYPE_ACTIVITY: - if (convertView == null || convertView.getId() != R.id.abs__list_item) { - convertView = LayoutInflater.from(getContext()).inflate( - R.layout.abs__activity_chooser_view_list_item, parent, false); - } - PackageManager packageManager = mContext.getPackageManager(); - // Set the icon - ImageView iconView = (ImageView) convertView.findViewById(R.id.abs__icon); - ResolveInfo activity = (ResolveInfo) getItem(position); - iconView.setImageDrawable(activity.loadIcon(packageManager)); - // Set the title. - TextView titleView = (TextView) convertView.findViewById(R.id.abs__title); - titleView.setText(activity.loadLabel(packageManager)); - if (IS_HONEYCOMB) { - // Highlight the default. - if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) { - SetActivated.invoke(convertView, true); - } else { - SetActivated.invoke(convertView, false); - } - } - return convertView; - default: - throw new IllegalArgumentException(); - } - } - - public int measureContentWidth() { - // The user may have specified some of the target not to be shown but we - // want to measure all of them since after expansion they should fit. - final int oldMaxActivityCount = mMaxActivityCount; - mMaxActivityCount = MAX_ACTIVITY_COUNT_UNLIMITED; - - int contentWidth = 0; - View itemView = null; - - final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - final int count = getCount(); - - for (int i = 0; i < count; i++) { - itemView = getView(i, itemView, null); - itemView.measure(widthMeasureSpec, heightMeasureSpec); - contentWidth = Math.max(contentWidth, itemView.getMeasuredWidth()); - } - - mMaxActivityCount = oldMaxActivityCount; - - return contentWidth; - } - - public void setMaxActivityCount(int maxActivityCount) { - if (mMaxActivityCount != maxActivityCount) { - mMaxActivityCount = maxActivityCount; - notifyDataSetChanged(); - } - } - - public ResolveInfo getDefaultActivity() { - return mDataModel.getDefaultActivity(); - } - - public void setShowFooterView(boolean showFooterView) { - if (mShowFooterView != showFooterView) { - mShowFooterView = showFooterView; - notifyDataSetChanged(); - } - } - - public int getActivityCount() { - return mDataModel.getActivityCount(); - } - - public int getHistorySize() { - return mDataModel.getHistorySize(); - } - - public int getMaxActivityCount() { - return mMaxActivityCount; - } - - public ActivityChooserModel getDataModel() { - return mDataModel; - } - - public void setShowDefaultActivity(boolean showDefaultActivity, - boolean highlightDefaultActivity) { - if (mShowDefaultActivity != showDefaultActivity - || mHighlightDefaultActivity != highlightDefaultActivity) { - mShowDefaultActivity = showDefaultActivity; - mHighlightDefaultActivity = highlightDefaultActivity; - notifyDataSetChanged(); - } - } - - public boolean getShowDefaultActivity() { - return mShowDefaultActivity; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java deleted file mode 100644 index c9e7897d4..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java +++ /dev/null @@ -1,1811 +0,0 @@ -/* - * Copyright (C) 2010 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.widget; - -import android.app.PendingIntent; -import android.app.SearchManager; -import android.app.SearchableInfo; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.database.Cursor; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.ResultReceiver; -import android.speech.RecognizerIntent; -import android.support.v4.view.KeyEventCompat; -import android.support.v4.widget.CursorAdapter; -import android.text.Editable; -import android.text.InputType; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.text.style.ImageSpan; -import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewTreeObserver; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityNodeInfo; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.AutoCompleteTextView; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; -import com.actionbarsherlock.R; -import com.actionbarsherlock.view.CollapsibleActionView; - -import java.lang.reflect.Method; -import java.util.WeakHashMap; - -import static com.actionbarsherlock.widget.SuggestionsAdapter.getColumnString; - -/** - * A widget that provides a user interface for the user to enter a search query and submit a request - * to a search provider. Shows a list of query suggestions or results, if available, and allows the - * user to pick a suggestion or result to launch into. - * - *

- * When the SearchView is used in an ActionBar as an action view for a collapsible menu item, it - * needs to be set to iconified by default using {@link #setIconifiedByDefault(boolean) - * setIconifiedByDefault(true)}. This is the default, so nothing needs to be done. - *

- *

- * If you want the search field to always be visible, then call setIconifiedByDefault(false). - *

- * - *
- *

Developer Guides

- *

For information about using {@code SearchView}, read the - * Search developer guide.

- *
- * - * @see android.view.MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW - * @attr ref android.R.styleable#SearchView_iconifiedByDefault - * @attr ref android.R.styleable#SearchView_imeOptions - * @attr ref android.R.styleable#SearchView_inputType - * @attr ref android.R.styleable#SearchView_maxWidth - * @attr ref android.R.styleable#SearchView_queryHint - */ -public class SearchView extends LinearLayout implements CollapsibleActionView { - - private static final boolean DBG = false; - private static final String LOG_TAG = "SearchView"; - - /** - * Private constant for removing the microphone in the keyboard. - */ - private static final String IME_OPTION_NO_MICROPHONE = "nm"; - - private OnQueryTextListener mOnQueryChangeListener; - private OnCloseListener mOnCloseListener; - private OnFocusChangeListener mOnQueryTextFocusChangeListener; - private OnSuggestionListener mOnSuggestionListener; - private OnClickListener mOnSearchClickListener; - - private boolean mIconifiedByDefault; - private boolean mIconified; - private CursorAdapter mSuggestionsAdapter; - private View mSearchButton; - private View mSubmitButton; - private View mSearchPlate; - private View mSubmitArea; - private ImageView mCloseButton; - private View mSearchEditFrame; - private View mVoiceButton; - private SearchAutoComplete mQueryTextView; - private View mDropDownAnchor; - private ImageView mSearchHintIcon; - private boolean mSubmitButtonEnabled; - private CharSequence mQueryHint; - private boolean mQueryRefinement; - private boolean mClearingFocus; - private int mMaxWidth; - private boolean mVoiceButtonEnabled; - private CharSequence mOldQueryText; - private CharSequence mUserQuery; - private boolean mExpandedInActionView; - private int mCollapsedImeOptions; - - private SearchableInfo mSearchable; - private Bundle mAppSearchData; - - /* - * SearchView can be set expanded before the IME is ready to be shown during - * initial UI setup. The show operation is asynchronous to account for this. - */ - private Runnable mShowImeRunnable = new Runnable() { - public void run() { - InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - - if (imm != null) { - showSoftInputUnchecked(SearchView.this, imm, 0); - } - } - }; - - private Runnable mUpdateDrawableStateRunnable = new Runnable() { - public void run() { - updateFocusedState(); - } - }; - - private Runnable mReleaseCursorRunnable = new Runnable() { - public void run() { - if (mSuggestionsAdapter != null && mSuggestionsAdapter instanceof SuggestionsAdapter) { - mSuggestionsAdapter.changeCursor(null); - } - } - }; - - // For voice searching - private final Intent mVoiceWebSearchIntent; - private final Intent mVoiceAppSearchIntent; - - // A weak map of drawables we've gotten from other packages, so we don't load them - // more than once. - private final WeakHashMap mOutsideDrawablesCache = - new WeakHashMap(); - - /** - * Callbacks for changes to the query text. - */ - public interface OnQueryTextListener { - - /** - * Called when the user submits the query. This could be due to a key press on the - * keyboard or due to pressing a submit button. - * The listener can override the standard behavior by returning true - * to indicate that it has handled the submit request. Otherwise return false to - * let the SearchView handle the submission by launching any associated intent. - * - * @param query the query text that is to be submitted - * - * @return true if the query has been handled by the listener, false to let the - * SearchView perform the default action. - */ - boolean onQueryTextSubmit(String query); - - /** - * Called when the query text is changed by the user. - * - * @param newText the new content of the query text field. - * - * @return false if the SearchView should perform the default action of showing any - * suggestions if available, true if the action was handled by the listener. - */ - boolean onQueryTextChange(String newText); - } - - public interface OnCloseListener { - - /** - * The user is attempting to close the SearchView. - * - * @return true if the listener wants to override the default behavior of clearing the - * text field and dismissing it, false otherwise. - */ - boolean onClose(); - } - - /** - * Callback interface for selection events on suggestions. These callbacks - * are only relevant when a SearchableInfo has been specified by {@link #setSearchableInfo}. - */ - public interface OnSuggestionListener { - - /** - * Called when a suggestion was selected by navigating to it. - * @param position the absolute position in the list of suggestions. - * - * @return true if the listener handles the event and wants to override the default - * behavior of possibly rewriting the query based on the selected item, false otherwise. - */ - boolean onSuggestionSelect(int position); - - /** - * Called when a suggestion was clicked. - * @param position the absolute position of the clicked item in the list of suggestions. - * - * @return true if the listener handles the event and wants to override the default - * behavior of launching any intent or submitting a search query specified on that item. - * Return false otherwise. - */ - boolean onSuggestionClick(int position); - } - - public SearchView(Context context) { - this(context, null); - } - - public SearchView(Context context, AttributeSet attrs) { - super(context, attrs); - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { - throw new IllegalStateException("SearchView is API 8+ only."); - } - - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(R.layout.abs__search_view, this, true); - - mSearchButton = findViewById(R.id.abs__search_button); - mQueryTextView = (SearchAutoComplete) findViewById(R.id.abs__search_src_text); - mQueryTextView.setSearchView(this); - - mSearchEditFrame = findViewById(R.id.abs__search_edit_frame); - mSearchPlate = findViewById(R.id.abs__search_plate); - mSubmitArea = findViewById(R.id.abs__submit_area); - mSubmitButton = findViewById(R.id.abs__search_go_btn); - mCloseButton = (ImageView) findViewById(R.id.abs__search_close_btn); - mVoiceButton = findViewById(R.id.abs__search_voice_btn); - mSearchHintIcon = (ImageView) findViewById(R.id.abs__search_mag_icon); - - mSearchButton.setOnClickListener(mOnClickListener); - mCloseButton.setOnClickListener(mOnClickListener); - mSubmitButton.setOnClickListener(mOnClickListener); - mVoiceButton.setOnClickListener(mOnClickListener); - mQueryTextView.setOnClickListener(mOnClickListener); - - mQueryTextView.addTextChangedListener(mTextWatcher); - mQueryTextView.setOnEditorActionListener(mOnEditorActionListener); - mQueryTextView.setOnItemClickListener(mOnItemClickListener); - mQueryTextView.setOnItemSelectedListener(mOnItemSelectedListener); - mQueryTextView.setOnKeyListener(mTextKeyListener); - // Inform any listener of focus changes - mQueryTextView.setOnFocusChangeListener(new OnFocusChangeListener() { - - public void onFocusChange(View v, boolean hasFocus) { - if (mOnQueryTextFocusChangeListener != null) { - mOnQueryTextFocusChangeListener.onFocusChange(SearchView.this, hasFocus); - } - } - }); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockSearchView, 0, 0); - setIconifiedByDefault(a.getBoolean(R.styleable.SherlockSearchView_iconifiedByDefault, true)); - int maxWidth = a.getDimensionPixelSize(R.styleable.SherlockSearchView_android_maxWidth, -1); - if (maxWidth != -1) { - setMaxWidth(maxWidth); - } - CharSequence queryHint = a.getText(R.styleable.SherlockSearchView_queryHint); - if (!TextUtils.isEmpty(queryHint)) { - setQueryHint(queryHint); - } - int imeOptions = a.getInt(R.styleable.SherlockSearchView_android_imeOptions, -1); - if (imeOptions != -1) { - setImeOptions(imeOptions); - } - int inputType = a.getInt(R.styleable.SherlockSearchView_android_inputType, -1); - if (inputType != -1) { - setInputType(inputType); - } - - a.recycle(); - - boolean focusable = true; - - a = context.obtainStyledAttributes(attrs, R.styleable.SherlockView, 0, 0); - focusable = a.getBoolean(R.styleable.SherlockView_android_focusable, focusable); - a.recycle(); - setFocusable(focusable); - - // Save voice intent for later queries/launching - mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); - mVoiceWebSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mVoiceWebSearchIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, - RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); - - mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); - mVoiceAppSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - mDropDownAnchor = findViewById(mQueryTextView.getDropDownAnchor()); - if (mDropDownAnchor != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mDropDownAnchor.addOnLayoutChangeListener(new OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) { - adjustDropDownSizeAndPosition(); - } - }); - } else { - mDropDownAnchor.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override public void onGlobalLayout() { - adjustDropDownSizeAndPosition(); - } - }); - } - } - - updateViewsVisibility(mIconifiedByDefault); - updateQueryHint(); - } - - /** - * Sets the SearchableInfo for this SearchView. Properties in the SearchableInfo are used - * to display labels, hints, suggestions, create intents for launching search results screens - * and controlling other affordances such as a voice button. - * - * @param searchable a SearchableInfo can be retrieved from the SearchManager, for a specific - * activity or a global search provider. - */ - public void setSearchableInfo(SearchableInfo searchable) { - mSearchable = searchable; - if (mSearchable != null) { - updateSearchAutoComplete(); - updateQueryHint(); - } - // Cache the voice search capability - mVoiceButtonEnabled = hasVoiceSearch(); - - if (mVoiceButtonEnabled) { - // Disable the microphone on the keyboard, as a mic is displayed near the text box - // TODO: use imeOptions to disable voice input when the new API will be available - mQueryTextView.setPrivateImeOptions(IME_OPTION_NO_MICROPHONE); - } - updateViewsVisibility(isIconified()); - } - - /** - * Sets the APP_DATA for legacy SearchDialog use. - * @param appSearchData bundle provided by the app when launching the search dialog - * @hide - */ - public void setAppSearchData(Bundle appSearchData) { - mAppSearchData = appSearchData; - } - - /** - * Sets the IME options on the query text field. - * - * @see TextView#setImeOptions(int) - * @param imeOptions the options to set on the query text field - * - * @attr ref android.R.styleable#SearchView_imeOptions - */ - public void setImeOptions(int imeOptions) { - mQueryTextView.setImeOptions(imeOptions); - } - - /** - * Returns the IME options set on the query text field. - * @return the ime options - * @see TextView#setImeOptions(int) - * - * @attr ref android.R.styleable#SearchView_imeOptions - */ - public int getImeOptions() { - return mQueryTextView.getImeOptions(); - } - - /** - * Sets the input type on the query text field. - * - * @see TextView#setInputType(int) - * @param inputType the input type to set on the query text field - * - * @attr ref android.R.styleable#SearchView_inputType - */ - public void setInputType(int inputType) { - mQueryTextView.setInputType(inputType); - } - - /** - * Returns the input type set on the query text field. - * @return the input type - * - * @attr ref android.R.styleable#SearchView_inputType - */ - public int getInputType() { - return mQueryTextView.getInputType(); - } - - /** @hide */ - @Override - public boolean requestFocus(int direction, Rect previouslyFocusedRect) { - // Don't accept focus if in the middle of clearing focus - if (mClearingFocus) return false; - // Check if SearchView is focusable. - if (!isFocusable()) return false; - // If it is not iconified, then give the focus to the text field - if (!isIconified()) { - boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect); - if (result) { - updateViewsVisibility(false); - } - return result; - } else { - return super.requestFocus(direction, previouslyFocusedRect); - } - } - - /** @hide */ - @Override - public void clearFocus() { - mClearingFocus = true; - setImeVisibility(false); - super.clearFocus(); - mQueryTextView.clearFocus(); - mClearingFocus = false; - } - - /** - * Sets a listener for user actions within the SearchView. - * - * @param listener the listener object that receives callbacks when the user performs - * actions in the SearchView such as clicking on buttons or typing a query. - */ - public void setOnQueryTextListener(OnQueryTextListener listener) { - mOnQueryChangeListener = listener; - } - - /** - * Sets a listener to inform when the user closes the SearchView. - * - * @param listener the listener to call when the user closes the SearchView. - */ - public void setOnCloseListener(OnCloseListener listener) { - mOnCloseListener = listener; - } - - /** - * Sets a listener to inform when the focus of the query text field changes. - * - * @param listener the listener to inform of focus changes. - */ - public void setOnQueryTextFocusChangeListener(OnFocusChangeListener listener) { - mOnQueryTextFocusChangeListener = listener; - } - - /** - * Sets a listener to inform when a suggestion is focused or clicked. - * - * @param listener the listener to inform of suggestion selection events. - */ - public void setOnSuggestionListener(OnSuggestionListener listener) { - mOnSuggestionListener = listener; - } - - /** - * Sets a listener to inform when the search button is pressed. This is only - * relevant when the text field is not visible by default. Calling {@link #setIconified - * setIconified(false)} can also cause this listener to be informed. - * - * @param listener the listener to inform when the search button is clicked or - * the text field is programmatically de-iconified. - */ - public void setOnSearchClickListener(OnClickListener listener) { - mOnSearchClickListener = listener; - } - - /** - * Returns the query string currently in the text field. - * - * @return the query string - */ - public CharSequence getQuery() { - return mQueryTextView.getText(); - } - - /** - * Sets a query string in the text field and optionally submits the query as well. - * - * @param query the query string. This replaces any query text already present in the - * text field. - * @param submit whether to submit the query right now or only update the contents of - * text field. - */ - public void setQuery(CharSequence query, boolean submit) { - mQueryTextView.setText(query); - if (query != null) { - mQueryTextView.setSelection(mQueryTextView.length()); - mUserQuery = query; - } - - // If the query is not empty and submit is requested, submit the query - if (submit && !TextUtils.isEmpty(query)) { - onSubmitQuery(); - } - } - - /** - * Sets the hint text to display in the query text field. This overrides any hint specified - * in the SearchableInfo. - * - * @param hint the hint text to display - * - * @attr ref android.R.styleable#SearchView_queryHint - */ - public void setQueryHint(CharSequence hint) { - mQueryHint = hint; - updateQueryHint(); - } - - /** - * Gets the hint text to display in the query text field. - * @return the query hint text, if specified, null otherwise. - * - * @attr ref android.R.styleable#SearchView_queryHint - */ - public CharSequence getQueryHint() { - if (mQueryHint != null) { - return mQueryHint; - } else if (mSearchable != null) { - CharSequence hint = null; - int hintId = mSearchable.getHintId(); - if (hintId != 0) { - hint = getContext().getString(hintId); - } - return hint; - } - return null; - } - - /** - * Sets the default or resting state of the search field. If true, a single search icon is - * shown by default and expands to show the text field and other buttons when pressed. Also, - * if the default state is iconified, then it collapses to that state when the close button - * is pressed. Changes to this property will take effect immediately. - * - *

The default value is true.

- * - * @param iconified whether the search field should be iconified by default - * - * @attr ref android.R.styleable#SearchView_iconifiedByDefault - */ - public void setIconifiedByDefault(boolean iconified) { - if (mIconifiedByDefault == iconified) return; - mIconifiedByDefault = iconified; - updateViewsVisibility(iconified); - updateQueryHint(); - } - - /** - * Returns the default iconified state of the search field. - * @return - * - * @attr ref android.R.styleable#SearchView_iconifiedByDefault - */ - public boolean isIconfiedByDefault() { - return mIconifiedByDefault; - } - - /** - * Iconifies or expands the SearchView. Any query text is cleared when iconified. This is - * a temporary state and does not override the default iconified state set by - * {@link #setIconifiedByDefault(boolean)}. If the default state is iconified, then - * a false here will only be valid until the user closes the field. And if the default - * state is expanded, then a true here will only clear the text field and not close it. - * - * @param iconify a true value will collapse the SearchView to an icon, while a false will - * expand it. - */ - public void setIconified(boolean iconify) { - if (iconify) { - onCloseClicked(); - } else { - onSearchClicked(); - } - } - - /** - * Returns the current iconified state of the SearchView. - * - * @return true if the SearchView is currently iconified, false if the search field is - * fully visible. - */ - public boolean isIconified() { - return mIconified; - } - - /** - * Enables showing a submit button when the query is non-empty. In cases where the SearchView - * is being used to filter the contents of the current activity and doesn't launch a separate - * results activity, then the submit button should be disabled. - * - * @param enabled true to show a submit button for submitting queries, false if a submit - * button is not required. - */ - public void setSubmitButtonEnabled(boolean enabled) { - mSubmitButtonEnabled = enabled; - updateViewsVisibility(isIconified()); - } - - /** - * Returns whether the submit button is enabled when necessary or never displayed. - * - * @return whether the submit button is enabled automatically when necessary - */ - public boolean isSubmitButtonEnabled() { - return mSubmitButtonEnabled; - } - - /** - * Specifies if a query refinement button should be displayed alongside each suggestion - * or if it should depend on the flags set in the individual items retrieved from the - * suggestions provider. Clicking on the query refinement button will replace the text - * in the query text field with the text from the suggestion. This flag only takes effect - * if a SearchableInfo has been specified with {@link #setSearchableInfo(SearchableInfo)} - * and not when using a custom adapter. - * - * @param enable true if all items should have a query refinement button, false if only - * those items that have a query refinement flag set should have the button. - * - * @see SearchManager#SUGGEST_COLUMN_FLAGS - * @see SearchManager#FLAG_QUERY_REFINEMENT - */ - public void setQueryRefinementEnabled(boolean enable) { - mQueryRefinement = enable; - if (mSuggestionsAdapter instanceof SuggestionsAdapter) { - ((SuggestionsAdapter) mSuggestionsAdapter).setQueryRefinement( - enable ? SuggestionsAdapter.REFINE_ALL : SuggestionsAdapter.REFINE_BY_ENTRY); - } - } - - /** - * Returns whether query refinement is enabled for all items or only specific ones. - * @return true if enabled for all items, false otherwise. - */ - public boolean isQueryRefinementEnabled() { - return mQueryRefinement; - } - - /** - * You can set a custom adapter if you wish. Otherwise the default adapter is used to - * display the suggestions from the suggestions provider associated with the SearchableInfo. - * - * @see #setSearchableInfo(SearchableInfo) - */ - public void setSuggestionsAdapter(CursorAdapter adapter) { - mSuggestionsAdapter = adapter; - - mQueryTextView.setAdapter(mSuggestionsAdapter); - } - - /** - * Returns the adapter used for suggestions, if any. - * @return the suggestions adapter - */ - public CursorAdapter getSuggestionsAdapter() { - return mSuggestionsAdapter; - } - - /** - * Makes the view at most this many pixels wide - * - * @attr ref android.R.styleable#SearchView_maxWidth - */ - public void setMaxWidth(int maxpixels) { - mMaxWidth = maxpixels; - - requestLayout(); - } - - /** - * Gets the specified maximum width in pixels, if set. Returns zero if - * no maximum width was specified. - * @return the maximum width of the view - * - * @attr ref android.R.styleable#SearchView_maxWidth - */ - public int getMaxWidth() { - return mMaxWidth; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Let the standard measurements take effect in iconified state. - if (isIconified()) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - return; - } - - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int width = MeasureSpec.getSize(widthMeasureSpec); - - switch (widthMode) { - case MeasureSpec.AT_MOST: - // If there is an upper limit, don't exceed maximum width (explicit or implicit) - if (mMaxWidth > 0) { - width = Math.min(mMaxWidth, width); - } else { - width = Math.min(getPreferredWidth(), width); - } - break; - case MeasureSpec.EXACTLY: - // If an exact width is specified, still don't exceed any specified maximum width - if (mMaxWidth > 0) { - width = Math.min(mMaxWidth, width); - } - break; - case MeasureSpec.UNSPECIFIED: - // Use maximum width, if specified, else preferred width - width = mMaxWidth > 0 ? mMaxWidth : getPreferredWidth(); - break; - } - widthMode = MeasureSpec.EXACTLY; - super.onMeasure(MeasureSpec.makeMeasureSpec(width, widthMode), heightMeasureSpec); - } - - private int getPreferredWidth() { - return getContext().getResources() - .getDimensionPixelSize(R.dimen.abs__search_view_preferred_width); - } - - private void updateViewsVisibility(final boolean collapsed) { - mIconified = collapsed; - // Visibility of views that are visible when collapsed - final int visCollapsed = collapsed ? VISIBLE : GONE; - // Is there text in the query - final boolean hasText = !TextUtils.isEmpty(mQueryTextView.getText()); - - mSearchButton.setVisibility(visCollapsed); - updateSubmitButton(hasText); - mSearchEditFrame.setVisibility(collapsed ? GONE : VISIBLE); - mSearchHintIcon.setVisibility(mIconifiedByDefault ? GONE : VISIBLE); - updateCloseButton(); - updateVoiceButton(!hasText); - updateSubmitArea(); - } - - private boolean hasVoiceSearch() { - if (mSearchable != null && mSearchable.getVoiceSearchEnabled()) { - Intent testIntent = null; - if (mSearchable.getVoiceSearchLaunchWebSearch()) { - testIntent = mVoiceWebSearchIntent; - } else if (mSearchable.getVoiceSearchLaunchRecognizer()) { - testIntent = mVoiceAppSearchIntent; - } - if (testIntent != null) { - ResolveInfo ri = getContext().getPackageManager().resolveActivity(testIntent, - PackageManager.MATCH_DEFAULT_ONLY); - return ri != null; - } - } - return false; - } - - private boolean isSubmitAreaEnabled() { - return (mSubmitButtonEnabled || mVoiceButtonEnabled) && !isIconified(); - } - - private void updateSubmitButton(boolean hasText) { - int visibility = GONE; - if (mSubmitButtonEnabled && isSubmitAreaEnabled() && hasFocus() - && (hasText || !mVoiceButtonEnabled)) { - visibility = VISIBLE; - } - mSubmitButton.setVisibility(visibility); - } - - private void updateSubmitArea() { - int visibility = GONE; - if (isSubmitAreaEnabled() - && (mSubmitButton.getVisibility() == VISIBLE - || mVoiceButton.getVisibility() == VISIBLE)) { - visibility = VISIBLE; - } - mSubmitArea.setVisibility(visibility); - } - - private void updateCloseButton() { - final boolean hasText = !TextUtils.isEmpty(mQueryTextView.getText()); - // Should we show the close button? It is not shown if there's no focus, - // field is not iconified by default and there is no text in it. - final boolean showClose = hasText || (mIconifiedByDefault && !mExpandedInActionView); - mCloseButton.setVisibility(showClose ? VISIBLE : GONE); - mCloseButton.getDrawable().setState(hasText ? ENABLED_STATE_SET : EMPTY_STATE_SET); - } - - private void postUpdateFocusedState() { - post(mUpdateDrawableStateRunnable); - } - - private void updateFocusedState() { - boolean focused = mQueryTextView.hasFocus(); - mSearchPlate.getBackground().setState(focused ? FOCUSED_STATE_SET : EMPTY_STATE_SET); - mSubmitArea.getBackground().setState(focused ? FOCUSED_STATE_SET : EMPTY_STATE_SET); - invalidate(); - } - - @Override - protected void onDetachedFromWindow() { - removeCallbacks(mUpdateDrawableStateRunnable); - post(mReleaseCursorRunnable); - super.onDetachedFromWindow(); - } - - private void setImeVisibility(final boolean visible) { - if (visible) { - post(mShowImeRunnable); - } else { - removeCallbacks(mShowImeRunnable); - InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - - if (imm != null) { - imm.hideSoftInputFromWindow(getWindowToken(), 0); - } - } - } - - /** - * Called by the SuggestionsAdapter - * @hide - */ - /* package */void onQueryRefine(CharSequence queryText) { - setQuery(queryText); - } - - private final OnClickListener mOnClickListener = new OnClickListener() { - - public void onClick(View v) { - if (v == mSearchButton) { - onSearchClicked(); - } else if (v == mCloseButton) { - onCloseClicked(); - } else if (v == mSubmitButton) { - onSubmitQuery(); - } else if (v == mVoiceButton) { - onVoiceClicked(); - } else if (v == mQueryTextView) { - forceSuggestionQuery(); - } - } - }; - - /** - * Handles the key down event for dealing with action keys. - * - * @param keyCode This is the keycode of the typed key, and is the same value as - * found in the KeyEvent parameter. - * @param event The complete event record for the typed key - * - * @return true if the event was handled here, or false if not. - */ - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (mSearchable == null) { - return false; - } - - // if it's an action specified by the searchable activity, launch the - // entered query with the action key - // TODO SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); - // TODO if ((actionKey != null) && (actionKey.getQueryActionMsg() != null)) { - // TODO launchQuerySearch(keyCode, actionKey.getQueryActionMsg(), mQueryTextView.getText() - // TODO .toString()); - // TODO return true; - // TODO } - - return super.onKeyDown(keyCode, event); - } - - /** - * React to the user typing "enter" or other hardwired keys while typing in - * the search box. This handles these special keys while the edit box has - * focus. - */ - View.OnKeyListener mTextKeyListener = new View.OnKeyListener() { - public boolean onKey(View v, int keyCode, KeyEvent event) { - // guard against possible race conditions - if (mSearchable == null) { - return false; - } - - if (DBG) { - Log.d(LOG_TAG, "mTextListener.onKey(" + keyCode + "," + event + "), selection: " - + mQueryTextView.getListSelection()); - } - - // If a suggestion is selected, handle enter, search key, and action keys - // as presses on the selected suggestion - if (mQueryTextView.isPopupShowing() - && mQueryTextView.getListSelection() != ListView.INVALID_POSITION) { - return onSuggestionsKey(v, keyCode, event); - } - - // If there is text in the query box, handle enter, and action keys - // The search key is handled by the dialog's onKeyDown(). - if (!mQueryTextView.isEmpty() && KeyEventCompat.hasNoModifiers(event)) { - if (event.getAction() == KeyEvent.ACTION_UP) { - if (keyCode == KeyEvent.KEYCODE_ENTER) { - v.cancelLongPress(); - - // Launch as a regular search. - launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, mQueryTextView.getText() - .toString()); - return true; - } - } - if (event.getAction() == KeyEvent.ACTION_DOWN) { - // TODO SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); - // TODO if ((actionKey != null) && (actionKey.getQueryActionMsg() != null)) { - // TODO launchQuerySearch(keyCode, actionKey.getQueryActionMsg(), mQueryTextView - // TODO .getText().toString()); - // TODO return true; - // TODO } - } - } - return false; - } - }; - - /** - * React to the user typing while in the suggestions list. First, check for - * action keys. If not handled, try refocusing regular characters into the - * EditText. - */ - private boolean onSuggestionsKey(View v, int keyCode, KeyEvent event) { - // guard against possible race conditions (late arrival after dismiss) - if (mSearchable == null) { - return false; - } - if (mSuggestionsAdapter == null) { - return false; - } - if (event.getAction() == KeyEvent.ACTION_DOWN && KeyEventCompat.hasNoModifiers(event)) { - // First, check for enter or search (both of which we'll treat as a - // "click") - if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH - || keyCode == KeyEvent.KEYCODE_TAB) { - int position = mQueryTextView.getListSelection(); - return onItemClicked(position, KeyEvent.KEYCODE_UNKNOWN, null); - } - - // Next, check for left/right moves, which we use to "return" the - // user to the edit view - if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { - // give "focus" to text editor, with cursor at the beginning if - // left key, at end if right key - // TODO: Reverse left/right for right-to-left languages, e.g. - // Arabic - int selPoint = (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) ? 0 : mQueryTextView - .length(); - mQueryTextView.setSelection(selPoint); - mQueryTextView.setListSelection(0); - mQueryTextView.clearListSelection(); - ensureImeVisible(mQueryTextView, true); - - return true; - } - - // Next, check for an "up and out" move - if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mQueryTextView.getListSelection()) { - // TODO: restoreUserQuery(); - // let ACTV complete the move - return false; - } - - // Next, check for an "action key" - // TODO SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); - // TODO if ((actionKey != null) - // TODO && ((actionKey.getSuggestActionMsg() != null) || (actionKey - // TODO .getSuggestActionMsgColumn() != null))) { - // TODO // launch suggestion using action key column - // TODO int position = mQueryTextView.getListSelection(); - // TODO if (position != ListView.INVALID_POSITION) { - // TODO Cursor c = mSuggestionsAdapter.getCursor(); - // TODO if (c.moveToPosition(position)) { - // TODO final String actionMsg = getActionKeyMessage(c, actionKey); - // TODO if (actionMsg != null && (actionMsg.length() > 0)) { - // TODO return onItemClicked(position, keyCode, actionMsg); - // TODO } - // TODO } - // TODO } - // TODO } - } - return false; - } - - /** - * For a given suggestion and a given cursor row, get the action message. If - * not provided by the specific row/column, also check for a single - * definition (for the action key). - * - * @param c The cursor providing suggestions - * @param actionKey The actionkey record being examined - * - * @return Returns a string, or null if no action key message for this - * suggestion - */ - // TODO private static String getActionKeyMessage(Cursor c, SearchableInfo.ActionKeyInfo actionKey) { - // TODO String result = null; - // TODO // check first in the cursor data, for a suggestion-specific message - // TODO final String column = actionKey.getSuggestActionMsgColumn(); - // TODO if (column != null) { - // TODO result = SuggestionsAdapter.getColumnString(c, column); - // TODO } - // TODO // If the cursor didn't give us a message, see if there's a single - // TODO // message defined - // TODO // for the actionkey (for all suggestions) - // TODO if (result == null) { - // TODO result = actionKey.getSuggestActionMsg(); - // TODO } - // TODO return result; - // TODO } - - private int getSearchIconId() { - TypedValue outValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.searchViewSearchIcon, - outValue, true); - return outValue.resourceId; - } - - private CharSequence getDecoratedHint(CharSequence hintText) { - // If the field is always expanded, then don't add the search icon to the hint - if (!mIconifiedByDefault) return hintText; - - SpannableStringBuilder ssb = new SpannableStringBuilder(" "); // for the icon - ssb.append(hintText); - Drawable searchIcon = getContext().getResources().getDrawable(getSearchIconId()); - int textSize = (int) (mQueryTextView.getTextSize() * 1.25); - searchIcon.setBounds(0, 0, textSize, textSize); - ssb.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - return ssb; - } - - private void updateQueryHint() { - if (mQueryHint != null) { - mQueryTextView.setHint(getDecoratedHint(mQueryHint)); - } else if (mSearchable != null) { - CharSequence hint = null; - int hintId = mSearchable.getHintId(); - if (hintId != 0) { - hint = getContext().getString(hintId); - } - if (hint != null) { - mQueryTextView.setHint(getDecoratedHint(hint)); - } - } else { - mQueryTextView.setHint(getDecoratedHint("")); - } - } - - /** - * Updates the auto-complete text view. - */ - private void updateSearchAutoComplete() { - // TODO mQueryTextView.setDropDownAnimationStyle(0); // no animation - mQueryTextView.setThreshold(mSearchable.getSuggestThreshold()); - mQueryTextView.setImeOptions(mSearchable.getImeOptions()); - int inputType = mSearchable.getInputType(); - // We only touch this if the input type is set up for text (which it almost certainly - // should be, in the case of search!) - if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) { - // The existence of a suggestions authority is the proxy for "suggestions - // are available here" - inputType &= ~InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE; - if (mSearchable.getSuggestAuthority() != null) { - inputType |= InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE; - // TYPE_TEXT_FLAG_AUTO_COMPLETE means that the text editor is performing - // auto-completion based on its own semantics, which it will present to the user - // as they type. This generally means that the input method should not show its - // own candidates, and the spell checker should not be in action. The text editor - // supplies its candidates by calling InputMethodManager.displayCompletions(), - // which in turn will call InputMethodSession.displayCompletions(). - inputType |= InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; - } - } - mQueryTextView.setInputType(inputType); - if (mSuggestionsAdapter != null) { - mSuggestionsAdapter.changeCursor(null); - } - // attach the suggestions adapter, if suggestions are available - // The existence of a suggestions authority is the proxy for "suggestions available here" - if (mSearchable.getSuggestAuthority() != null) { - mSuggestionsAdapter = new SuggestionsAdapter(getContext(), - this, mSearchable, mOutsideDrawablesCache); - mQueryTextView.setAdapter(mSuggestionsAdapter); - ((SuggestionsAdapter) mSuggestionsAdapter).setQueryRefinement( - mQueryRefinement ? SuggestionsAdapter.REFINE_ALL - : SuggestionsAdapter.REFINE_BY_ENTRY); - } - } - - /** - * Update the visibility of the voice button. There are actually two voice search modes, - * either of which will activate the button. - * @param empty whether the search query text field is empty. If it is, then the other - * criteria apply to make the voice button visible. - */ - private void updateVoiceButton(boolean empty) { - int visibility = GONE; - if (mVoiceButtonEnabled && !isIconified() && empty) { - visibility = VISIBLE; - mSubmitButton.setVisibility(GONE); - } - mVoiceButton.setVisibility(visibility); - } - - private final OnEditorActionListener mOnEditorActionListener = new OnEditorActionListener() { - - /** - * Called when the input method default action key is pressed. - */ - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - onSubmitQuery(); - return true; - } - }; - - private void onTextChanged(CharSequence newText) { - CharSequence text = mQueryTextView.getText(); - mUserQuery = text; - boolean hasText = !TextUtils.isEmpty(text); - updateSubmitButton(hasText); - updateVoiceButton(!hasText); - updateCloseButton(); - updateSubmitArea(); - if (mOnQueryChangeListener != null && !TextUtils.equals(newText, mOldQueryText)) { - mOnQueryChangeListener.onQueryTextChange(newText.toString()); - } - mOldQueryText = newText.toString(); - } - - private void onSubmitQuery() { - CharSequence query = mQueryTextView.getText(); - if (query != null && TextUtils.getTrimmedLength(query) > 0) { - if (mOnQueryChangeListener == null - || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) { - if (mSearchable != null) { - launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString()); - setImeVisibility(false); - } - dismissSuggestions(); - } - } - } - - private void dismissSuggestions() { - mQueryTextView.dismissDropDown(); - } - - private void onCloseClicked() { - CharSequence text = mQueryTextView.getText(); - if (TextUtils.isEmpty(text)) { - if (mIconifiedByDefault) { - // If the app doesn't override the close behavior - if (mOnCloseListener == null || !mOnCloseListener.onClose()) { - // hide the keyboard and remove focus - clearFocus(); - // collapse the search field - updateViewsVisibility(true); - } - } - } else { - mQueryTextView.setText(""); - mQueryTextView.requestFocus(); - setImeVisibility(true); - } - - } - - private void onSearchClicked() { - updateViewsVisibility(false); - mQueryTextView.requestFocus(); - setImeVisibility(true); - if (mOnSearchClickListener != null) { - mOnSearchClickListener.onClick(this); - } - } - - private void onVoiceClicked() { - // guard against possible race conditions - if (mSearchable == null) { - return; - } - SearchableInfo searchable = mSearchable; - try { - if (searchable.getVoiceSearchLaunchWebSearch()) { - Intent webSearchIntent = createVoiceWebSearchIntent(mVoiceWebSearchIntent, - searchable); - getContext().startActivity(webSearchIntent); - } else if (searchable.getVoiceSearchLaunchRecognizer()) { - Intent appSearchIntent = createVoiceAppSearchIntent(mVoiceAppSearchIntent, - searchable); - getContext().startActivity(appSearchIntent); - } - } catch (ActivityNotFoundException e) { - // Should not happen, since we check the availability of - // voice search before showing the button. But just in case... - Log.w(LOG_TAG, "Could not find voice search activity"); - } - } - - void onTextFocusChanged() { - updateViewsVisibility(isIconified()); - // Delayed update to make sure that the focus has settled down and window focus changes - // don't affect it. A synchronous update was not working. - postUpdateFocusedState(); - if (mQueryTextView.hasFocus()) { - forceSuggestionQuery(); - } - } - - @Override - public void onWindowFocusChanged(boolean hasWindowFocus) { - super.onWindowFocusChanged(hasWindowFocus); - - postUpdateFocusedState(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onActionViewCollapsed() { - clearFocus(); - updateViewsVisibility(true); - mQueryTextView.setImeOptions(mCollapsedImeOptions); - mExpandedInActionView = false; - } - - /** - * {@inheritDoc} - */ - @Override - public void onActionViewExpanded() { - if (mExpandedInActionView) return; - - mExpandedInActionView = true; - mCollapsedImeOptions = mQueryTextView.getImeOptions(); - mQueryTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN); - mQueryTextView.setText(""); - setIconified(false); - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - event.setClassName(SearchView.class.getName()); - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setClassName(SearchView.class.getName()); - } - - private void adjustDropDownSizeAndPosition() { - if (mDropDownAnchor.getWidth() > 1) { - Resources res = getContext().getResources(); - int anchorPadding = mSearchPlate.getPaddingLeft(); - Rect dropDownPadding = new Rect(); - int iconOffset = mIconifiedByDefault - ? res.getDimensionPixelSize(R.dimen.abs__dropdownitem_icon_width) - + res.getDimensionPixelSize(R.dimen.abs__dropdownitem_text_padding_left) - : 0; - mQueryTextView.getDropDownBackground().getPadding(dropDownPadding); - mQueryTextView.setDropDownHorizontalOffset(-(dropDownPadding.left + iconOffset) - + anchorPadding); - mQueryTextView.setDropDownWidth(mDropDownAnchor.getWidth() + dropDownPadding.left - + dropDownPadding.right + iconOffset - (anchorPadding)); - } - } - - private boolean onItemClicked(int position, int actionKey, String actionMsg) { - if (mOnSuggestionListener == null - || !mOnSuggestionListener.onSuggestionClick(position)) { - launchSuggestion(position, KeyEvent.KEYCODE_UNKNOWN, null); - setImeVisibility(false); - dismissSuggestions(); - return true; - } - return false; - } - - private boolean onItemSelected(int position) { - if (mOnSuggestionListener == null - || !mOnSuggestionListener.onSuggestionSelect(position)) { - rewriteQueryFromSuggestion(position); - return true; - } - return false; - } - - private final OnItemClickListener mOnItemClickListener = new OnItemClickListener() { - - /** - * Implements OnItemClickListener - */ - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (DBG) Log.d(LOG_TAG, "onItemClick() position " + position); - onItemClicked(position, KeyEvent.KEYCODE_UNKNOWN, null); - } - }; - - private final OnItemSelectedListener mOnItemSelectedListener = new OnItemSelectedListener() { - - /** - * Implements OnItemSelectedListener - */ - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (DBG) Log.d(LOG_TAG, "onItemSelected() position " + position); - SearchView.this.onItemSelected(position); - } - - /** - * Implements OnItemSelectedListener - */ - public void onNothingSelected(AdapterView parent) { - if (DBG) - Log.d(LOG_TAG, "onNothingSelected()"); - } - }; - - /** - * Query rewriting. - */ - private void rewriteQueryFromSuggestion(int position) { - CharSequence oldQuery = mQueryTextView.getText(); - Cursor c = mSuggestionsAdapter.getCursor(); - if (c == null) { - return; - } - if (c.moveToPosition(position)) { - // Get the new query from the suggestion. - CharSequence newQuery = mSuggestionsAdapter.convertToString(c); - if (newQuery != null) { - // The suggestion rewrites the query. - // Update the text field, without getting new suggestions. - setQuery(newQuery); - } else { - // The suggestion does not rewrite the query, restore the user's query. - setQuery(oldQuery); - } - } else { - // We got a bad position, restore the user's query. - setQuery(oldQuery); - } - } - - /** - * Launches an intent based on a suggestion. - * - * @param position The index of the suggestion to create the intent from. - * @param actionKey The key code of the action key that was pressed, - * or {@link KeyEvent#KEYCODE_UNKNOWN} if none. - * @param actionMsg The message for the action key that was pressed, - * or null if none. - * @return true if a successful launch, false if could not (e.g. bad position). - */ - private boolean launchSuggestion(int position, int actionKey, String actionMsg) { - Cursor c = mSuggestionsAdapter.getCursor(); - if ((c != null) && c.moveToPosition(position)) { - - Intent intent = createIntentFromSuggestion(c, actionKey, actionMsg); - - // launch the intent - launchIntent(intent); - - return true; - } - return false; - } - - /** - * Launches an intent, including any special intent handling. - */ - private void launchIntent(Intent intent) { - if (intent == null) { - return; - } - try { - // If the intent was created from a suggestion, it will always have an explicit - // component here. - getContext().startActivity(intent); - } catch (RuntimeException ex) { - Log.e(LOG_TAG, "Failed launch activity: " + intent, ex); - } - } - - /** - * Sets the text in the query box, without updating the suggestions. - */ - private void setQuery(CharSequence query) { - setText(mQueryTextView, query, true); - // Move the cursor to the end - mQueryTextView.setSelection(TextUtils.isEmpty(query) ? 0 : query.length()); - } - - private void launchQuerySearch(int actionKey, String actionMsg, String query) { - String action = Intent.ACTION_SEARCH; - Intent intent = createIntent(action, null, null, query, actionKey, actionMsg); - getContext().startActivity(intent); - } - - /** - * Constructs an intent from the given information and the search dialog state. - * - * @param action Intent action. - * @param data Intent data, or null. - * @param extraData Data for {@link SearchManager#EXTRA_DATA_KEY} or null. - * @param query Intent query, or null. - * @param actionKey The key code of the action key that was pressed, - * or {@link KeyEvent#KEYCODE_UNKNOWN} if none. - * @param actionMsg The message for the action key that was pressed, - * or null if none. - * @return The intent. - */ - private Intent createIntent(String action, Uri data, String extraData, String query, - int actionKey, String actionMsg) { - // Now build the Intent - Intent intent = new Intent(action); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - // We need CLEAR_TOP to avoid reusing an old task that has other activities - // on top of the one we want. We don't want to do this in in-app search though, - // as it can be destructive to the activity stack. - if (data != null) { - intent.setData(data); - } - intent.putExtra(SearchManager.USER_QUERY, mUserQuery); - if (query != null) { - intent.putExtra(SearchManager.QUERY, query); - } - if (extraData != null) { - intent.putExtra(SearchManager.EXTRA_DATA_KEY, extraData); - } - if (mAppSearchData != null) { - intent.putExtra(SearchManager.APP_DATA, mAppSearchData); - } - if (actionKey != KeyEvent.KEYCODE_UNKNOWN) { - intent.putExtra(SearchManager.ACTION_KEY, actionKey); - intent.putExtra(SearchManager.ACTION_MSG, actionMsg); - } - intent.setComponent(mSearchable.getSearchActivity()); - return intent; - } - - /** - * Create and return an Intent that can launch the voice search activity for web search. - */ - private Intent createVoiceWebSearchIntent(Intent baseIntent, SearchableInfo searchable) { - Intent voiceIntent = new Intent(baseIntent); - ComponentName searchActivity = searchable.getSearchActivity(); - voiceIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, searchActivity == null ? null - : searchActivity.flattenToShortString()); - return voiceIntent; - } - - /** - * Create and return an Intent that can launch the voice search activity, perform a specific - * voice transcription, and forward the results to the searchable activity. - * - * @param baseIntent The voice app search intent to start from - * @return A completely-configured intent ready to send to the voice search activity - */ - private Intent createVoiceAppSearchIntent(Intent baseIntent, SearchableInfo searchable) { - ComponentName searchActivity = searchable.getSearchActivity(); - - // create the necessary intent to set up a search-and-forward operation - // in the voice search system. We have to keep the bundle separate, - // because it becomes immutable once it enters the PendingIntent - Intent queryIntent = new Intent(Intent.ACTION_SEARCH); - queryIntent.setComponent(searchActivity); - PendingIntent pending = PendingIntent.getActivity(getContext(), 0, queryIntent, - PendingIntent.FLAG_ONE_SHOT); - - // Now set up the bundle that will be inserted into the pending intent - // when it's time to do the search. We always build it here (even if empty) - // because the voice search activity will always need to insert "QUERY" into - // it anyway. - Bundle queryExtras = new Bundle(); - - // Now build the intent to launch the voice search. Add all necessary - // extras to launch the voice recognizer, and then all the necessary extras - // to forward the results to the searchable activity - Intent voiceIntent = new Intent(baseIntent); - - // Add all of the configuration options supplied by the searchable's metadata - String languageModel = RecognizerIntent.LANGUAGE_MODEL_FREE_FORM; - String prompt = null; - String language = null; - int maxResults = 1; - - Resources resources = getResources(); - if (searchable.getVoiceLanguageModeId() != 0) { - languageModel = resources.getString(searchable.getVoiceLanguageModeId()); - } - if (searchable.getVoicePromptTextId() != 0) { - prompt = resources.getString(searchable.getVoicePromptTextId()); - } - if (searchable.getVoiceLanguageId() != 0) { - language = resources.getString(searchable.getVoiceLanguageId()); - } - if (searchable.getVoiceMaxResults() != 0) { - maxResults = searchable.getVoiceMaxResults(); - } - voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, languageModel); - voiceIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, prompt); - voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language); - voiceIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, maxResults); - voiceIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, searchActivity == null ? null - : searchActivity.flattenToShortString()); - - // Add the values that configure forwarding the results - voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT, pending); - voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT_BUNDLE, queryExtras); - - return voiceIntent; - } - - /** - * When a particular suggestion has been selected, perform the various lookups required - * to use the suggestion. This includes checking the cursor for suggestion-specific data, - * and/or falling back to the XML for defaults; It also creates REST style Uri data when - * the suggestion includes a data id. - * - * @param c The suggestions cursor, moved to the row of the user's selection - * @param actionKey The key code of the action key that was pressed, - * or {@link KeyEvent#KEYCODE_UNKNOWN} if none. - * @param actionMsg The message for the action key that was pressed, - * or null if none. - * @return An intent for the suggestion at the cursor's position. - */ - private Intent createIntentFromSuggestion(Cursor c, int actionKey, String actionMsg) { - try { - // use specific action if supplied, or default action if supplied, or fixed default - String action = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_ACTION); - - if (action == null) { - action = mSearchable.getSuggestIntentAction(); - } - if (action == null) { - action = Intent.ACTION_SEARCH; - } - - // use specific data if supplied, or default data if supplied - String data = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA); - if (data == null) { - data = mSearchable.getSuggestIntentData(); - } - // then, if an ID was provided, append it. - if (data != null) { - String id = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); - if (id != null) { - data = data + "/" + Uri.encode(id); - } - } - Uri dataUri = (data == null) ? null : Uri.parse(data); - - String query = getColumnString(c, SearchManager.SUGGEST_COLUMN_QUERY); - String extraData = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA); - - return createIntent(action, dataUri, extraData, query, actionKey, actionMsg); - } catch (RuntimeException e ) { - int rowNum; - try { // be really paranoid now - rowNum = c.getPosition(); - } catch (RuntimeException e2 ) { - rowNum = -1; - } - Log.w(LOG_TAG, "Search suggestions cursor at row " + rowNum + - " returned exception.", e); - return null; - } - } - - private void forceSuggestionQuery() { - try { - Method before = SearchAutoComplete.class.getMethod("doBeforeTextChanged"); - Method after = SearchAutoComplete.class.getMethod("doAfterTextChanged"); - before.setAccessible(true); - after.setAccessible(true); - before.invoke(mQueryTextView); - after.invoke(mQueryTextView); - } catch (Exception e) { - // Oh well... - } - } - - static boolean isLandscapeMode(Context context) { - return context.getResources().getConfiguration().orientation - == Configuration.ORIENTATION_LANDSCAPE; - } - - /** - * Callback to watch the text field for empty/non-empty - */ - private TextWatcher mTextWatcher = new TextWatcher() { - - public void beforeTextChanged(CharSequence s, int start, int before, int after) { } - - public void onTextChanged(CharSequence s, int start, - int before, int after) { - SearchView.this.onTextChanged(s); - } - - public void afterTextChanged(Editable s) { - } - }; - - /** - * Local subclass for AutoCompleteTextView. - * @hide - */ - public static class SearchAutoComplete extends AutoCompleteTextView { - - private int mThreshold; - private SearchView mSearchView; - - public SearchAutoComplete(Context context) { - super(context); - mThreshold = getThreshold(); - } - - public SearchAutoComplete(Context context, AttributeSet attrs) { - super(context, attrs); - mThreshold = getThreshold(); - } - - public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mThreshold = getThreshold(); - } - - void setSearchView(SearchView searchView) { - mSearchView = searchView; - } - - @Override - public void setThreshold(int threshold) { - super.setThreshold(threshold); - mThreshold = threshold; - } - - /** - * Returns true if the text field is empty, or contains only whitespace. - */ - private boolean isEmpty() { - return TextUtils.getTrimmedLength(getText()) == 0; - } - - /** - * We override this method to avoid replacing the query box text when a - * suggestion is clicked. - */ - @Override - protected void replaceText(CharSequence text) { - } - - /** - * We override this method to avoid an extra onItemClick being called on - * the drop-down's OnItemClickListener by - * {@link AutoCompleteTextView#onKeyUp(int, KeyEvent)} when an item is - * clicked with the trackball. - */ - @Override - public void performCompletion() { - } - - /** - * We override this method to be sure and show the soft keyboard if - * appropriate when the TextView has focus. - */ - @Override - public void onWindowFocusChanged(boolean hasWindowFocus) { - super.onWindowFocusChanged(hasWindowFocus); - - if (hasWindowFocus && mSearchView.hasFocus() && getVisibility() == VISIBLE) { - InputMethodManager inputManager = (InputMethodManager) getContext() - .getSystemService(Context.INPUT_METHOD_SERVICE); - inputManager.showSoftInput(this, 0); - // If in landscape mode, then make sure that - // the ime is in front of the dropdown. - if (isLandscapeMode(getContext())) { - ensureImeVisible(this, true); - } - } - } - - @Override - protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { - super.onFocusChanged(focused, direction, previouslyFocusedRect); - mSearchView.onTextFocusChanged(); - } - - /** - * We override this method so that we can allow a threshold of zero, - * which ACTV does not. - */ - @Override - public boolean enoughToFilter() { - return mThreshold <= 0 || super.enoughToFilter(); - } - - @Override - public boolean onKeyPreIme(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - // special case for the back key, we do not even try to send it - // to the drop down list but instead, consume it immediately - if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - KeyEvent.DispatcherState state = getKeyDispatcherState(); - if (state != null) { - state.startTracking(event, this); - } - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP) { - KeyEvent.DispatcherState state = getKeyDispatcherState(); - if (state != null) { - state.handleUpEvent(event); - } - if (event.isTracking() && !event.isCanceled()) { - mSearchView.clearFocus(); - mSearchView.setImeVisibility(false); - return true; - } - } - } - return super.onKeyPreIme(keyCode, event); - } - - } - - private static void ensureImeVisible(AutoCompleteTextView view, boolean visible) { - try { - Method method = AutoCompleteTextView.class.getMethod("ensureImeVisible", boolean.class); - method.setAccessible(true); - method.invoke(view, visible); - } catch (Exception e) { - //Oh well... - } - } - - private static void showSoftInputUnchecked(View view, InputMethodManager imm, int flags) { - try { - Method method = imm.getClass().getMethod("showSoftInputUnchecked", int.class, ResultReceiver.class); - method.setAccessible(true); - method.invoke(imm, flags, null); - } catch (Exception e) { - //Fallback to public API which hopefully does mostly the same thing - imm.showSoftInput(view, flags); - } - } - - private static void setText(AutoCompleteTextView view, CharSequence text, boolean filter) { - try { - Method method = AutoCompleteTextView.class.getMethod("setText", CharSequence.class, boolean.class); - method.setAccessible(true); - method.invoke(view, text, filter); - } catch (Exception e) { - //Fallback to public API which hopefully does mostly the same thing - view.setText(text); - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java deleted file mode 100644 index 83e9f0ca9..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * 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 com.actionbarsherlock.widget; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.graphics.drawable.Drawable; -import android.util.TypedValue; -import android.view.View; - -import com.actionbarsherlock.R; -import com.actionbarsherlock.view.ActionProvider; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener; -import com.actionbarsherlock.view.SubMenu; -import com.actionbarsherlock.widget.ActivityChooserModel.OnChooseActivityListener; - -/** - * This is a provider for a share action. It is responsible for creating views - * that enable data sharing and also to show a sub menu with sharing activities - * if the hosting item is placed on the overflow menu. - *

- * Here is how to use the action provider with custom backing file in a {@link MenuItem}: - *

- *

- *

- * 
- *  // In Activity#onCreateOptionsMenu
- *  public boolean onCreateOptionsMenu(Menu menu) {
- *      // Get the menu item.
- *      MenuItem menuItem = menu.findItem(R.id.my_menu_item);
- *      // Get the provider and hold onto it to set/change the share intent.
- *      mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
- *      // Set history different from the default before getting the action
- *      // view since a call to {@link MenuItem#getActionView() MenuItem.getActionView()} calls
- *      // {@link ActionProvider#onCreateActionView()} which uses the backing file name. Omit this
- *      // line if using the default share history file is desired.
- *      mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");
- *      . . .
- *  }
- *
- *  // Somewhere in the application.
- *  public void doShare(Intent shareIntent) {
- *      // When you want to share set the share intent.
- *      mShareActionProvider.setShareIntent(shareIntent);
- *  }
- * 
- * - *

- *

- * Note: While the sample snippet demonstrates how to use this provider - * in the context of a menu item, the use of the provider is not limited to menu items. - *

- * - * @see ActionProvider - */ -public class ShareActionProvider extends ActionProvider { - - /** - * Listener for the event of selecting a share target. - */ - public interface OnShareTargetSelectedListener { - - /** - * Called when a share target has been selected. The client can - * decide whether to handle the intent or rely on the default - * behavior which is launching it. - *

- * Note: Modifying the intent is not permitted and - * any changes to the latter will be ignored. - *

- * - * @param source The source of the notification. - * @param intent The intent for launching the chosen share target. - * @return Whether the client has handled the intent. - */ - public boolean onShareTargetSelected(ShareActionProvider source, Intent intent); - } - - /** - * The default for the maximal number of activities shown in the sub-menu. - */ - private static final int DEFAULT_INITIAL_ACTIVITY_COUNT = 4; - - /** - * The the maximum number activities shown in the sub-menu. - */ - private int mMaxShownActivityCount = DEFAULT_INITIAL_ACTIVITY_COUNT; - - /** - * Listener for handling menu item clicks. - */ - private final ShareMenuItemOnMenuItemClickListener mOnMenuItemClickListener = - new ShareMenuItemOnMenuItemClickListener(); - - /** - * The default name for storing share history. - */ - public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml"; - - /** - * Context for accessing resources. - */ - private final Context mContext; - - /** - * The name of the file with share history data. - */ - private String mShareHistoryFileName = DEFAULT_SHARE_HISTORY_FILE_NAME; - - private OnShareTargetSelectedListener mOnShareTargetSelectedListener; - - private OnChooseActivityListener mOnChooseActivityListener; - - /** - * Creates a new instance. - * - * @param context Context for accessing resources. - */ - public ShareActionProvider(Context context) { - super(context); - mContext = context; - } - - /** - * Sets a listener to be notified when a share target has been selected. - * The listener can optionally decide to handle the selection and - * not rely on the default behavior which is to launch the activity. - *

- * Note: If you choose the backing share history file - * you will still be notified in this callback. - *

- * @param listener The listener. - */ - public void setOnShareTargetSelectedListener(OnShareTargetSelectedListener listener) { - mOnShareTargetSelectedListener = listener; - setActivityChooserPolicyIfNeeded(); - } - - /** - * {@inheritDoc} - */ - @Override - public View onCreateActionView() { - // Create the view and set its data model. - ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); - ActivityChooserView activityChooserView = new ActivityChooserView(mContext); - activityChooserView.setActivityChooserModel(dataModel); - - // Lookup and set the expand action icon. - TypedValue outTypedValue = new TypedValue(); - mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); - Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId); - activityChooserView.setExpandActivityOverflowButtonDrawable(drawable); - activityChooserView.setProvider(this); - - // Set content description. - activityChooserView.setDefaultActionButtonContentDescription( - R.string.abs__shareactionprovider_share_with_application); - activityChooserView.setExpandActivityOverflowButtonContentDescription( - R.string.abs__shareactionprovider_share_with); - - return activityChooserView; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean hasSubMenu() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public void onPrepareSubMenu(SubMenu subMenu) { - // Clear since the order of items may change. - subMenu.clear(); - - ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); - PackageManager packageManager = mContext.getPackageManager(); - - final int expandedActivityCount = dataModel.getActivityCount(); - final int collapsedActivityCount = Math.min(expandedActivityCount, mMaxShownActivityCount); - - // Populate the sub-menu with a sub set of the activities. - for (int i = 0; i < collapsedActivityCount; i++) { - ResolveInfo activity = dataModel.getActivity(i); - subMenu.add(0, i, i, activity.loadLabel(packageManager)) - .setIcon(activity.loadIcon(packageManager)) - .setOnMenuItemClickListener(mOnMenuItemClickListener); - } - - if (collapsedActivityCount < expandedActivityCount) { - // Add a sub-menu for showing all activities as a list item. - SubMenu expandedSubMenu = subMenu.addSubMenu(Menu.NONE, collapsedActivityCount, - collapsedActivityCount, - mContext.getString(R.string.abs__activity_chooser_view_see_all)); - for (int i = 0; i < expandedActivityCount; i++) { - ResolveInfo activity = dataModel.getActivity(i); - expandedSubMenu.add(0, i, i, activity.loadLabel(packageManager)) - .setIcon(activity.loadIcon(packageManager)) - .setOnMenuItemClickListener(mOnMenuItemClickListener); - } - } - } - - /** - * Sets the file name of a file for persisting the share history which - * history will be used for ordering share targets. This file will be used - * for all view created by {@link #onCreateActionView()}. Defaults to - * {@link #DEFAULT_SHARE_HISTORY_FILE_NAME}. Set to null - * if share history should not be persisted between sessions. - *

- * Note: The history file name can be set any time, however - * only the action views created by {@link #onCreateActionView()} after setting - * the file name will be backed by the provided file. - *

- * - * @param shareHistoryFile The share history file name. - */ - public void setShareHistoryFileName(String shareHistoryFile) { - mShareHistoryFileName = shareHistoryFile; - setActivityChooserPolicyIfNeeded(); - } - - /** - * Sets an intent with information about the share action. Here is a - * sample for constructing a share intent: - *

- *

-     * 
-     *  Intent shareIntent = new Intent(Intent.ACTION_SEND);
-     *  shareIntent.setType("image/*");
-     *  Uri uri = Uri.fromFile(new File(getFilesDir(), "foo.jpg"));
-     *  shareIntent.putExtra(Intent.EXTRA_STREAM, uri.toString());
-     * 
- * - *

- * - * @param shareIntent The share intent. - * - * @see Intent#ACTION_SEND - * @see Intent#ACTION_SEND_MULTIPLE - */ - public void setShareIntent(Intent shareIntent) { - ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, - mShareHistoryFileName); - dataModel.setIntent(shareIntent); - } - - /** - * Reusable listener for handling share item clicks. - */ - private class ShareMenuItemOnMenuItemClickListener implements OnMenuItemClickListener { - @Override - public boolean onMenuItemClick(MenuItem item) { - ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, - mShareHistoryFileName); - final int itemId = item.getItemId(); - Intent launchIntent = dataModel.chooseActivity(itemId); - if (launchIntent != null) { - mContext.startActivity(launchIntent); - } - return true; - } - } - - /** - * Set the activity chooser policy of the model backed by the current - * share history file if needed which is if there is a registered callback. - */ - private void setActivityChooserPolicyIfNeeded() { - if (mOnShareTargetSelectedListener == null) { - return; - } - if (mOnChooseActivityListener == null) { - mOnChooseActivityListener = new ShareAcitivityChooserModelPolicy(); - } - ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); - dataModel.setOnChooseActivityListener(mOnChooseActivityListener); - } - - /** - * Policy that delegates to the {@link OnShareTargetSelectedListener}, if such. - */ - private class ShareAcitivityChooserModelPolicy implements OnChooseActivityListener { - @Override - public boolean onChooseActivity(ActivityChooserModel host, Intent intent) { - if (mOnShareTargetSelectedListener != null) { - return mOnShareTargetSelectedListener.onShareTargetSelected( - ShareActionProvider.this, intent); - } - return false; - } - } -} diff --git a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java b/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java deleted file mode 100644 index bd5cbd718..000000000 --- a/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java +++ /dev/null @@ -1,733 +0,0 @@ -/* - * Copyright (C) 2009 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.widget; - -import android.app.SearchManager; -import android.app.SearchableInfo; -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.ColorStateList; -import android.content.res.Resources; -import android.database.Cursor; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.support.v4.widget.ResourceCursorAdapter; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.style.TextAppearanceSpan; -import android.util.Log; -import android.util.TypedValue; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import com.actionbarsherlock.R; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.WeakHashMap; - -/** - * Provides the contents for the suggestion drop-down list. - * - * @hide - */ -class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListener { - - private static final boolean DBG = false; - private static final String LOG_TAG = "SuggestionsAdapter"; - private static final int QUERY_LIMIT = 50; - - static final int REFINE_NONE = 0; - static final int REFINE_BY_ENTRY = 1; - static final int REFINE_ALL = 2; - - private SearchManager mSearchManager; - private SearchView mSearchView; - private Context mProviderContext; - private WeakHashMap mOutsideDrawablesCache; - private boolean mClosed = false; - private int mQueryRefinement = REFINE_BY_ENTRY; - - // URL color - private ColorStateList mUrlColor; - - static final int INVALID_INDEX = -1; - - // Cached column indexes, updated when the cursor changes. - private int mText1Col = INVALID_INDEX; - private int mText2Col = INVALID_INDEX; - private int mText2UrlCol = INVALID_INDEX; - private int mIconName1Col = INVALID_INDEX; - private int mIconName2Col = INVALID_INDEX; - private int mFlagsCol = INVALID_INDEX; - - // private final Runnable mStartSpinnerRunnable; - // private final Runnable mStopSpinnerRunnable; - - /** - * The amount of time we delay in the filter when the user presses the delete key. - */ - //private static final long DELETE_KEY_POST_DELAY = 500L; - - public SuggestionsAdapter(Context context, SearchView searchView, - SearchableInfo mSearchable, WeakHashMap outsideDrawablesCache) { - super(context, - R.layout.abs__search_dropdown_item_icons_2line, - null, // no initial cursor - true); // auto-requery - mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); - mProviderContext = mContext; - mSearchView = searchView; - - mOutsideDrawablesCache = outsideDrawablesCache; - - // mStartSpinnerRunnable = new Runnable() { - // public void run() { - // // mSearchView.setWorking(true); // TODO: - // } - // }; - // - // mStopSpinnerRunnable = new Runnable() { - // public void run() { - // // mSearchView.setWorking(false); // TODO: - // } - // }; - - // delay 500ms when deleting -// TODO getFilter().setDelayer(new Filter.Delayer() { -// -// private int mPreviousLength = 0; -// -// public long getPostingDelay(CharSequence constraint) { -// if (constraint == null) return 0; -// -// long delay = constraint.length() < mPreviousLength ? DELETE_KEY_POST_DELAY : 0; -// mPreviousLength = constraint.length(); -// return delay; -// } -// }); - } - - /** - * Enables query refinement for all suggestions. This means that an additional icon - * will be shown for each entry. When clicked, the suggested text on that line will be - * copied to the query text field. - *

- * - * @param refineWhat which queries to refine. Possible values are {@link #REFINE_NONE}, - * {@link #REFINE_BY_ENTRY}, and {@link #REFINE_ALL}. - */ - public void setQueryRefinement(int refineWhat) { - mQueryRefinement = refineWhat; - } - - /** - * Returns the current query refinement preference. - * @return value of query refinement preference - */ - public int getQueryRefinement() { - return mQueryRefinement; - } - - /** - * Overridden to always return false, since we cannot be sure that - * suggestion sources return stable IDs. - */ - @Override - public boolean hasStableIds() { - return false; - } - - /** - * Use the search suggestions provider to obtain a live cursor. This will be called - * in a worker thread, so it's OK if the query is slow (e.g. round trip for suggestions). - * The results will be processed in the UI thread and changeCursor() will be called. - */ - @Override - public Cursor runQueryOnBackgroundThread(CharSequence constraint) { - if (DBG) Log.d(LOG_TAG, "runQueryOnBackgroundThread(" + constraint + ")"); - String query = (constraint == null) ? "" : constraint.toString(); - /** - * for in app search we show the progress spinner until the cursor is returned with - * the results. - */ - Cursor cursor = null; - if (mSearchView.getVisibility() != View.VISIBLE - || mSearchView.getWindowVisibility() != View.VISIBLE) { - return null; - } - //mSearchView.getWindow().getDecorView().post(mStartSpinnerRunnable); // TODO: - try { - cursor = getSuggestions(query, QUERY_LIMIT); - // trigger fill window so the spinner stays up until the results are copied over and - // closer to being ready - if (cursor != null) { - cursor.getCount(); - return cursor; - } - } catch (RuntimeException e) { - Log.w(LOG_TAG, "Search suggestions query threw an exception.", e); - } - // If cursor is null or an exception was thrown, stop the spinner and return null. - // changeCursor doesn't get called if cursor is null - // mSearchView.getWindow().getDecorView().post(mStopSpinnerRunnable); // TODO: - return null; - } - - public Cursor getSuggestions(String query, int limit) { - Uri.Builder uriBuilder = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() - .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() - - // append standard suggestion query path - uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); - - // inject query, either as selection args or inline - uriBuilder.appendPath(query); - - if (limit > 0) { - uriBuilder.appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(limit)); - } - - Uri uri = uriBuilder.build(); - - // finally, make the query - return mContext.getContentResolver().query(uri, null, null, null, null); - } - - public void close() { - if (DBG) Log.d(LOG_TAG, "close()"); - changeCursor(null); - mClosed = true; - } - - @Override - public void notifyDataSetChanged() { - if (DBG) Log.d(LOG_TAG, "notifyDataSetChanged"); - super.notifyDataSetChanged(); - - // mSearchView.onDataSetChanged(); // TODO: - - updateSpinnerState(getCursor()); - } - - @Override - public void notifyDataSetInvalidated() { - if (DBG) Log.d(LOG_TAG, "notifyDataSetInvalidated"); - super.notifyDataSetInvalidated(); - - updateSpinnerState(getCursor()); - } - - private void updateSpinnerState(Cursor cursor) { - Bundle extras = cursor != null ? cursor.getExtras() : null; - if (DBG) { - Log.d(LOG_TAG, "updateSpinnerState - extra = " - + (extras != null - ? extras.getBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS) - : null)); - } - // Check if the Cursor indicates that the query is not complete and show the spinner - if (extras != null - && extras.getBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS)) { - // mSearchView.getWindow().getDecorView().post(mStartSpinnerRunnable); // TODO: - return; - } - // If cursor is null or is done, stop the spinner - // mSearchView.getWindow().getDecorView().post(mStopSpinnerRunnable); // TODO: - } - - /** - * Cache columns. - */ - @Override - public void changeCursor(Cursor c) { - if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")"); - - if (mClosed) { - Log.w(LOG_TAG, "Tried to change cursor after adapter was closed."); - if (c != null) c.close(); - return; - } - - try { - super.changeCursor(c); - - if (c != null) { - mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); - mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2); - mText2UrlCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL); - mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); - mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2); - mFlagsCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FLAGS); - } - } catch (Exception e) { - Log.e(LOG_TAG, "error changing cursor and caching columns", e); - } - } - - /** - * Tags the view with cached child view look-ups. - */ - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - View v = super.newView(context, cursor, parent); - v.setTag(new ChildViewCache(v)); - return v; - } - - /** - * Cache of the child views of drop-drown list items, to avoid looking up the children - * each time the contents of a list item are changed. - */ - private final static class ChildViewCache { - public final TextView mText1; - public final TextView mText2; - public final ImageView mIcon1; - public final ImageView mIcon2; - public final ImageView mIconRefine; - - public ChildViewCache(View v) { - mText1 = (TextView) v.findViewById(android.R.id.text1); - mText2 = (TextView) v.findViewById(android.R.id.text2); - mIcon1 = (ImageView) v.findViewById(android.R.id.icon1); - mIcon2 = (ImageView) v.findViewById(android.R.id.icon2); - mIconRefine = (ImageView) v.findViewById(R.id.edit_query); - } - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - ChildViewCache views = (ChildViewCache) view.getTag(); - - int flags = 0; - if (mFlagsCol != INVALID_INDEX) { - flags = cursor.getInt(mFlagsCol); - } - if (views.mText1 != null) { - String text1 = getStringOrNull(cursor, mText1Col); - setViewText(views.mText1, text1); - } - if (views.mText2 != null) { - // First check TEXT_2_URL - CharSequence text2 = getStringOrNull(cursor, mText2UrlCol); - if (text2 != null) { - text2 = formatUrl(text2); - } else { - text2 = getStringOrNull(cursor, mText2Col); - } - - // If no second line of text is indicated, allow the first line of text - // to be up to two lines if it wants to be. - if (TextUtils.isEmpty(text2)) { - if (views.mText1 != null) { - views.mText1.setSingleLine(false); - views.mText1.setMaxLines(2); - } - } else { - if (views.mText1 != null) { - views.mText1.setSingleLine(true); - views.mText1.setMaxLines(1); - } - } - setViewText(views.mText2, text2); - } - - if (views.mIcon1 != null) { - setViewDrawable(views.mIcon1, getIcon1(cursor), View.INVISIBLE); - } - if (views.mIcon2 != null) { - setViewDrawable(views.mIcon2, getIcon2(cursor), View.GONE); - } - if (mQueryRefinement == REFINE_ALL - || (mQueryRefinement == REFINE_BY_ENTRY - && (flags & SearchManager.FLAG_QUERY_REFINEMENT) != 0)) { - views.mIconRefine.setVisibility(View.VISIBLE); - views.mIconRefine.setTag(views.mText1.getText()); - views.mIconRefine.setOnClickListener(this); - } else { - views.mIconRefine.setVisibility(View.GONE); - } - } - - public void onClick(View v) { - Object tag = v.getTag(); - if (tag instanceof CharSequence) { - mSearchView.onQueryRefine((CharSequence) tag); - } - } - - private CharSequence formatUrl(CharSequence url) { - if (mUrlColor == null) { - // Lazily get the URL color from the current theme. - TypedValue colorValue = new TypedValue(); - mContext.getTheme().resolveAttribute(R.attr.textColorSearchUrl, colorValue, true); - mUrlColor = mContext.getResources().getColorStateList(colorValue.resourceId); - } - - SpannableString text = new SpannableString(url); - text.setSpan(new TextAppearanceSpan(null, 0, 0, mUrlColor, null), - 0, url.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - return text; - } - - private void setViewText(TextView v, CharSequence text) { - // Set the text even if it's null, since we need to clear any previous text. - v.setText(text); - - if (TextUtils.isEmpty(text)) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - } - } - - private Drawable getIcon1(Cursor cursor) { - if (mIconName1Col == INVALID_INDEX) { - return null; - } - String value = cursor.getString(mIconName1Col); - Drawable drawable = getDrawableFromResourceValue(value); - if (drawable != null) { - return drawable; - } - return getDefaultIcon1(cursor); - } - - private Drawable getIcon2(Cursor cursor) { - if (mIconName2Col == INVALID_INDEX) { - return null; - } - String value = cursor.getString(mIconName2Col); - return getDrawableFromResourceValue(value); - } - - /** - * Sets the drawable in an image view, makes sure the view is only visible if there - * is a drawable. - */ - private void setViewDrawable(ImageView v, Drawable drawable, int nullVisibility) { - // Set the icon even if the drawable is null, since we need to clear any - // previous icon. - v.setImageDrawable(drawable); - - if (drawable == null) { - v.setVisibility(nullVisibility); - } else { - v.setVisibility(View.VISIBLE); - - // This is a hack to get any animated drawables (like a 'working' spinner) - // to animate. You have to setVisible true on an AnimationDrawable to get - // it to start animating, but it must first have been false or else the - // call to setVisible will be ineffective. We need to clear up the story - // about animated drawables in the future, see http://b/1878430. - drawable.setVisible(false, false); - drawable.setVisible(true, false); - } - } - - /** - * Gets the text to show in the query field when a suggestion is selected. - * - * @param cursor The Cursor to read the suggestion data from. The Cursor should already - * be moved to the suggestion that is to be read from. - * @return The text to show, or null if the query should not be - * changed when selecting this suggestion. - */ - @Override - public CharSequence convertToString(Cursor cursor) { - if (cursor == null) { - return null; - } - - String query = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_QUERY); - if (query != null) { - return query; - } - - return null; - } - - /** - * This method is overridden purely to provide a bit of protection against - * flaky content providers. - * - * @see android.widget.ListAdapter#getView(int, View, ViewGroup) - */ - @Override - public View getView(int position, View convertView, ViewGroup parent) { - try { - return super.getView(position, convertView, parent); - } catch (RuntimeException e) { - Log.w(LOG_TAG, "Search suggestions cursor threw exception.", e); - // Put exception string in item title - View v = newView(mContext, mCursor, parent); - if (v != null) { - ChildViewCache views = (ChildViewCache) v.getTag(); - TextView tv = views.mText1; - tv.setText(e.toString()); - } - return v; - } - } - - /** - * Gets a drawable given a value provided by a suggestion provider. - * - * This value could be just the string value of a resource id - * (e.g., "2130837524"), in which case we will try to retrieve a drawable from - * the provider's resources. If the value is not an integer, it is - * treated as a Uri and opened with - * {@link ContentResolver#openOutputStream(android.net.Uri, String)}. - * - * All resources and URIs are read using the suggestion provider's context. - * - * If the string is not formatted as expected, or no drawable can be found for - * the provided value, this method returns null. - * - * @param drawableId a string like "2130837524", - * "android.resource://com.android.alarmclock/2130837524", - * or "content://contacts/photos/253". - * @return a Drawable, or null if none found - */ - private Drawable getDrawableFromResourceValue(String drawableId) { - if (drawableId == null || drawableId.length() == 0 || "0".equals(drawableId)) { - return null; - } - try { - // First, see if it's just an integer - int resourceId = Integer.parseInt(drawableId); - // It's an int, look for it in the cache - String drawableUri = ContentResolver.SCHEME_ANDROID_RESOURCE - + "://" + mProviderContext.getPackageName() + "/" + resourceId; - // Must use URI as cache key, since ints are app-specific - Drawable drawable = checkIconCache(drawableUri); - if (drawable != null) { - return drawable; - } - // Not cached, find it by resource ID - drawable = mProviderContext.getResources().getDrawable(resourceId); - // Stick it in the cache, using the URI as key - storeInIconCache(drawableUri, drawable); - return drawable; - } catch (NumberFormatException nfe) { - // It's not an integer, use it as a URI - Drawable drawable = checkIconCache(drawableId); - if (drawable != null) { - return drawable; - } - Uri uri = Uri.parse(drawableId); - drawable = getDrawable(uri); - storeInIconCache(drawableId, drawable); - return drawable; - } catch (Resources.NotFoundException nfe) { - // It was an integer, but it couldn't be found, bail out - Log.w(LOG_TAG, "Icon resource not found: " + drawableId); - return null; - } - } - - /** - * Gets a drawable by URI, without using the cache. - * - * @return A drawable, or {@code null} if the drawable could not be loaded. - */ - private Drawable getDrawable(Uri uri) { - try { - String scheme = uri.getScheme(); - if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) { - // Load drawables through Resources, to get the source density information - try { - return getTheDrawable(uri); - } catch (Resources.NotFoundException ex) { - throw new FileNotFoundException("Resource does not exist: " + uri); - } - } else { - // Let the ContentResolver handle content and file URIs. - InputStream stream = mProviderContext.getContentResolver().openInputStream(uri); - if (stream == null) { - throw new FileNotFoundException("Failed to open " + uri); - } - try { - return Drawable.createFromStream(stream, null); - } finally { - try { - stream.close(); - } catch (IOException ex) { - Log.e(LOG_TAG, "Error closing icon stream for " + uri, ex); - } - } - } - } catch (FileNotFoundException fnfe) { - Log.w(LOG_TAG, "Icon not found: " + uri + ", " + fnfe.getMessage()); - return null; - } - } - - public Drawable getTheDrawable(Uri uri) throws FileNotFoundException { - String authority = uri.getAuthority(); - Resources r; - if (TextUtils.isEmpty(authority)) { - throw new FileNotFoundException("No authority: " + uri); - } else { - try { - r = mContext.getPackageManager().getResourcesForApplication(authority); - } catch (NameNotFoundException ex) { - throw new FileNotFoundException("No package found for authority: " + uri); - } - } - List path = uri.getPathSegments(); - if (path == null) { - throw new FileNotFoundException("No path: " + uri); - } - int len = path.size(); - int id; - if (len == 1) { - try { - id = Integer.parseInt(path.get(0)); - } catch (NumberFormatException e) { - throw new FileNotFoundException("Single path segment is not a resource ID: " + uri); - } - } else if (len == 2) { - id = r.getIdentifier(path.get(1), path.get(0), authority); - } else { - throw new FileNotFoundException("More than two path segments: " + uri); - } - if (id == 0) { - throw new FileNotFoundException("No resource found for: " + uri); - } - return r.getDrawable(id); - } - - private Drawable checkIconCache(String resourceUri) { - Drawable.ConstantState cached = mOutsideDrawablesCache.get(resourceUri); - if (cached == null) { - return null; - } - if (DBG) Log.d(LOG_TAG, "Found icon in cache: " + resourceUri); - return cached.newDrawable(); - } - - private void storeInIconCache(String resourceUri, Drawable drawable) { - if (drawable != null) { - mOutsideDrawablesCache.put(resourceUri, drawable.getConstantState()); - } - } - - /** - * Gets the left-hand side icon that will be used for the current suggestion - * if the suggestion contains an icon column but no icon or a broken icon. - * - * @param cursor A cursor positioned at the current suggestion. - * @return A non-null drawable. - */ - private Drawable getDefaultIcon1(Cursor cursor) { - // Fall back to a default icon - return mContext.getPackageManager().getDefaultActivityIcon(); - } - - /** - * Gets the activity or application icon for an activity. - * Uses the local icon cache for fast repeated lookups. - * - * @param component Name of an activity. - * @return A drawable, or {@code null} if neither the activity nor the application - * has an icon set. - */ - private Drawable getActivityIconWithCache(ComponentName component) { - // First check the icon cache - String componentIconKey = component.flattenToShortString(); - // Using containsKey() since we also store null values. - if (mOutsideDrawablesCache.containsKey(componentIconKey)) { - Drawable.ConstantState cached = mOutsideDrawablesCache.get(componentIconKey); - return cached == null ? null : cached.newDrawable(mProviderContext.getResources()); - } - // Then try the activity or application icon - Drawable drawable = getActivityIcon(component); - // Stick it in the cache so we don't do this lookup again. - Drawable.ConstantState toCache = drawable == null ? null : drawable.getConstantState(); - mOutsideDrawablesCache.put(componentIconKey, toCache); - return drawable; - } - - /** - * Gets the activity or application icon for an activity. - * - * @param component Name of an activity. - * @return A drawable, or {@code null} if neither the acitivy or the application - * have an icon set. - */ - private Drawable getActivityIcon(ComponentName component) { - PackageManager pm = mContext.getPackageManager(); - final ActivityInfo activityInfo; - try { - activityInfo = pm.getActivityInfo(component, PackageManager.GET_META_DATA); - } catch (NameNotFoundException ex) { - Log.w(LOG_TAG, ex.toString()); - return null; - } - int iconId = activityInfo.getIconResource(); - if (iconId == 0) return null; - String pkg = component.getPackageName(); - Drawable drawable = pm.getDrawable(pkg, iconId, activityInfo.applicationInfo); - if (drawable == null) { - Log.w(LOG_TAG, "Invalid icon resource " + iconId + " for " - + component.flattenToShortString()); - return null; - } - return drawable; - } - - /** - * Gets the value of a string column by name. - * - * @param cursor Cursor to read the value from. - * @param columnName The name of the column to read. - * @return The value of the given column, or null - * if the cursor does not contain the given column. - */ - public static String getColumnString(Cursor cursor, String columnName) { - int col = cursor.getColumnIndex(columnName); - return getStringOrNull(cursor, col); - } - - private static String getStringOrNull(Cursor cursor, int col) { - if (col == INVALID_INDEX) { - return null; - } - try { - return cursor.getString(col); - } catch (Exception e) { - Log.e(LOG_TAG, - "unexpected error retrieving valid column from cursor, " - + "did the remote process die?", e); - return null; - } - } -} diff --git a/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java b/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java deleted file mode 100644 index 47475c574..000000000 --- a/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.actionbarsherlock.internal; - -import org.junit.Test; - -import static com.actionbarsherlock.internal.ActionBarSherlockCompat.cleanActivityName; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; - -public class ManifestParsingTest { - @Test - public void testFullyQualifiedClassName() { - String expected = "com.other.package.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", "com.other.package.SomeClass"); - assertThat(expected, equalTo(actual)); - } - - @Test - public void testFullyQualifiedClassNameSamePackage() { - String expected = "com.jakewharton.test.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", "com.jakewharton.test.SomeClass"); - assertThat(expected, equalTo(actual)); - } - - @Test - public void testUnqualifiedClassName() { - String expected = "com.jakewharton.test.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", "SomeClass"); - assertThat(expected, equalTo(actual)); - } - - @Test - public void testRelativeClassName() { - String expected = "com.jakewharton.test.ui.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", ".ui.SomeClass"); - assertThat(expected, equalTo(actual)); - } -} \ No newline at end of file diff --git a/plugins/ActionBarSherlock/pom.xml b/plugins/ActionBarSherlock/pom.xml deleted file mode 100644 index ce4d4fca8..000000000 --- a/plugins/ActionBarSherlock/pom.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - 4.0.0 - - - org.sonatype.oss - oss-parent - 7 - - - com.actionbarsherlock - parent - pom - 4.2.0 - - ActionBarSherlock (Parent) - Android library for implementing the action bar design pattern using the backported sources of Ice Cream Sandwich. - http://actionbarsherlock.com - 2011 - - - library - samples - - - - https://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 - - - - - Jake Wharton - http://jakewharton.com - - - - GitHub Issues - https://github.com/JakeWharton/ActionBarSherlock/issues - - - - UTF-8 - UTF-8 - - 1.6 - 4.0.1.2 - 14 - r99 - - 3.3.2 - 4.10 - - JakeWharton - ActionBarSherlock - - - - - - com.google.android - android - ${android.version} - - - com.google.android - support-v4 - ${android-support.version} - system - ${basedir}/libs/android-support-v4.jar - - - com.nineoldandroids - library - 2.4.0 - - - com.github.rtyley - roboguice-sherlock - 1.4 - - - junit - junit - ${junit.version} - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.5 - - ${java.version} - ${java.version} - - - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - 3.3.2 - - - ${android.platform} - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.9.1 - - true - - - - - org.apache.maven.plugins - maven-site-plugin - 3.0 - - true - - - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.2.2 - - true - - - - - com.github.github - site-maven-plugin - 0.5 - - - site - - site - - - - - Creating site for ${project.version}. - website - - - - - diff --git a/proguard.cfg b/proguard.cfg index 3abb0dca8..c13bba26e 100644 --- a/proguard.cfg +++ b/proguard.cfg @@ -40,7 +40,3 @@ -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } - --keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock { - (android.app.Activity, int); -} diff --git a/project.properties b/project.properties index edd9b8718..1f49bd1ff 100644 --- a/project.properties +++ b/project.properties @@ -13,8 +13,7 @@ java.encoding=utf8 # Project target. target=android-19 extensible.libs.classpath=compile-only-libs -android.library.reference.1=plugins/ActionBarSherlock/library -android.library.reference.2=plugins/Android-PullToRefresh/library -android.library.reference.3=plugins/ckChangeLog/library -android.library.reference.4=plugins/HoloColorPicker -android.library.reference.5=plugins/openpgp-api-library +android.library.reference.1=plugins/Android-PullToRefresh/library +android.library.reference.2=plugins/ckChangeLog/library +android.library.reference.3=plugins/HoloColorPicker +android.library.reference.4=plugins/openpgp-api-library diff --git a/res/menu/folder_list_option.xml b/res/menu/folder_list_option.xml index 5fc7305ea..1588e2fe7 100644 --- a/res/menu/folder_list_option.xml +++ b/res/menu/folder_list_option.xml @@ -10,7 +10,7 @@ android:icon="?attr/iconActionSearchFolder" android:showAsAction="always|collapseActionView" android:title="@string/filter_folders_action" - android:actionViewClass="com.actionbarsherlock.widget.SearchView"/> + android:actionViewClass="android.widget.SearchView"/> diff --git a/res/values-v14/themes.xml b/res/values-v14/themes.xml index 279698c8e..e0b863a6f 100644 --- a/res/values-v14/themes.xml +++ b/res/values-v14/themes.xml @@ -1,7 +1,7 @@ - diff --git a/res/values/themes.xml b/res/values/themes.xml index a8bbb9a66..40cf9fb9a 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -3,7 +3,7 @@ - -

XML attributes - *