From f460904d9e8db2f79ba61548eb95e03e54dcf1ca Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 26 Mar 2013 16:11:45 -0700 Subject: [PATCH 1/4] Updating Android app to v1.1 (revision 31). --- .../.settings/org.eclipse.jdt.core.prefs | 11 + media/android/NewsBlur/AndroidManifest.xml | 4 +- .../libs/ActionBarSherlock/.classpath | 8 + .../NewsBlur/libs/ActionBarSherlock/.project | 33 + .../.settings/org.eclipse.jdt.core.prefs | 4 + .../ActionBarSherlock/AndroidManifest.xml | 6 + .../NewsBlur/libs/ActionBarSherlock/README.md | 15 + .../ActionBarSherlock/bin/AndroidManifest.xml | 6 + .../NewsBlur/libs/ActionBarSherlock/bin/R.txt | 576 +++ .../bin/actionbarsherlock.jar | Bin 0 -> 438928 bytes .../libs/ActionBarSherlock/bin/jarlist.cache | 3 + .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 213 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 213 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 212 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 224 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 224 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 263 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 255 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 219 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 218 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 261 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 219 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 219 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 214 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 212 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 242 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 241 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 174 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 174 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 172 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 183 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 183 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 183 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 216 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 214 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 217 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 214 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 1335 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1375 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 548 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 438 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 791 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 605 bytes .../drawable-hdpi/abs__ic_clear_disabled.png | Bin 0 -> 996 bytes .../drawable-hdpi/abs__ic_clear_normal.png | Bin 0 -> 1498 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 409 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 451 bytes .../bin/res/drawable-hdpi/abs__ic_go.png | Bin 0 -> 815 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 254 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 126 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 136 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 578 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 607 bytes .../bin/res/drawable-hdpi/abs__ic_search.png | Bin 0 -> 1287 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 973 bytes .../drawable-hdpi/abs__ic_voice_search.png | Bin 0 -> 2013 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 705 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 176 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 132 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 132 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 176 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 176 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 176 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 176 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 203 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 204 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 885 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 997 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 183 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 183 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 858 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 858 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 183 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 183 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 1819 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 2380 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 324 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 325 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 315 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 315 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 513 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 508 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 445 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 443 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 156 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 149 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 155 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 153 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 173 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 170 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 176 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 168 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 181 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 181 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 187 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 187 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 199 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 199 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 199 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 209 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 209 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 245 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 240 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 206 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 206 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 238 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 206 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 206 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 199 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 198 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 224 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 221 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 174 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 174 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 171 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 182 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 183 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 183 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 199 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 199 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 199 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 199 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 866 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 943 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 384 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 312 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 554 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 462 bytes .../drawable-mdpi/abs__ic_clear_disabled.png | Bin 0 -> 1505 bytes .../drawable-mdpi/abs__ic_clear_normal.png | Bin 0 -> 1024 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 740 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 552 bytes .../bin/res/drawable-mdpi/abs__ic_go.png | Bin 0 -> 1020 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 575 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 113 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 123 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 464 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 479 bytes .../bin/res/drawable-mdpi/abs__ic_search.png | Bin 0 -> 1287 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 1379 bytes .../drawable-mdpi/abs__ic_voice_search.png | Bin 0 -> 942 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 604 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 175 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 132 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 132 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 175 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 175 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 175 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 175 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 190 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 191 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 620 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 717 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 175 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 175 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 545 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 545 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 175 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 175 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 1102 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1527 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 279 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 292 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 272 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 272 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 418 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 419 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 363 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 359 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 155 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 151 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 155 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 157 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 176 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 166 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 174 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 167 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 175 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 175 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 182 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 182 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 227 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 227 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 227 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 237 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 236 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 277 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 268 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 236 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 236 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 343 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 236 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 236 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 228 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 227 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 255 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 252 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 180 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 180 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 182 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 199 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 200 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 199 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 231 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 229 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 231 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 228 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 2037 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 2058 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 626 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 527 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 1049 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 782 bytes .../drawable-xhdpi/abs__ic_clear_disabled.png | Bin 0 -> 1525 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1219 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1532 bytes .../bin/res/drawable-xhdpi/abs__ic_go.png | Bin 0 -> 1739 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 840 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 132 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 148 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 833 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 869 bytes .../bin/res/drawable-xhdpi/abs__ic_search.png | Bin 0 -> 2783 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 2761 bytes .../drawable-xhdpi/abs__ic_voice_search.png | Bin 0 -> 2039 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1215 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 178 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 139 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 139 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 178 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 178 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 178 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 178 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 218 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 217 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 1278 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1435 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 180 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 180 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 1239 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 1239 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 180 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 180 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2490 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 3083 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 370 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 369 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 358 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 358 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 625 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 609 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 548 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 543 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 157 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 150 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 156 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 157 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 196 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 198 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 188 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 192 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 191 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 191 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 182 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 199 bytes .../com/actionbarsherlock/BuildConfig.java | 6 + .../gen/com/actionbarsherlock/R.java | 3275 +++++++++++++++++ .../libs/android-support-v4.jar | Bin 0 -> 271754 bytes .../NewsBlur/libs/ActionBarSherlock/pom.xml | 148 + .../libs/ActionBarSherlock/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 0 -> 144 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 138 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 144 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 135 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2863 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 2859 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 146 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 145 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 192 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 146 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 146 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 139 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 155 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 145 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 104 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 102 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 112 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 108 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 110 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 108 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 149 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 145 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 147 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 147 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 1414 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1537 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 602 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 546 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 713 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 737 bytes .../drawable-hdpi/abs__ic_clear_disabled.png | Bin 0 -> 1774 bytes .../drawable-hdpi/abs__ic_clear_normal.png | Bin 0 -> 1945 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1504 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1540 bytes .../res/drawable-hdpi/abs__ic_go.png | Bin 0 -> 1415 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 1252 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 144 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 148 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 467 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 505 bytes .../res/drawable-hdpi/abs__ic_search.png | Bin 0 -> 2280 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 2271 bytes .../drawable-hdpi/abs__ic_voice_search.png | Bin 0 -> 2070 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1833 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 154 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 159 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 154 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 159 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 159 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 189 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 189 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 922 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1061 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 178 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 174 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 917 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 917 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 188 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 188 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2081 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1811 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 311 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 312 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 306 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 306 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 524 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 523 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 464 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 458 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 148 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 145 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 110 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 105 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 108 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 103 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 111 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 112 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 129 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 134 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 123 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 123 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2849 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 191 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 168 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 133 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 127 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 123 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 139 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 133 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 101 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 99 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 109 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 105 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 107 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 105 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 127 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 124 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 130 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 128 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 882 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1003 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 466 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 438 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 566 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 552 bytes .../drawable-mdpi/abs__ic_clear_disabled.png | Bin 0 -> 1775 bytes .../drawable-mdpi/abs__ic_clear_normal.png | Bin 0 -> 1869 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 740 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 743 bytes .../res/drawable-mdpi/abs__ic_go.png | Bin 0 -> 1538 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 570 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 122 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 131 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 332 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 355 bytes .../res/drawable-mdpi/abs__ic_search.png | Bin 0 -> 2280 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 1541 bytes .../drawable-mdpi/abs__ic_voice_search.png | Bin 0 -> 1937 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 794 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 151 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 158 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 151 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 158 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 158 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 172 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 171 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 651 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 720 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 165 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 159 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 572 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 572 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 170 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 170 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 1336 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1165 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 254 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 255 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 249 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 249 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 417 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 424 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 370 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 370 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 148 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 151 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 150 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 155 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 106 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 100 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 105 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 98 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 107 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 107 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 109 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 109 bytes .../abs__progress_medium_holo.xml | 34 + .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 165 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 157 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 166 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 153 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 152 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2878 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 2873 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 290 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 163 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 158 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 152 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 171 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 160 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 109 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 108 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 112 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 113 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 115 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 113 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 166 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 161 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 174 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 161 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 2159 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 2302 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 741 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 661 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 970 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 915 bytes .../drawable-xhdpi/abs__ic_clear_disabled.png | Bin 0 -> 2531 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1315 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1447 bytes .../res/drawable-xhdpi/abs__ic_go.png | Bin 0 -> 1983 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 836 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 167 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 184 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 699 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 935 bytes .../res/drawable-xhdpi/abs__ic_search.png | Bin 0 -> 3784 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 3037 bytes .../drawable-xhdpi/abs__ic_voice_search.png | Bin 0 -> 3053 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1414 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 158 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 83 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 83 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 163 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 158 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 163 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 163 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 190 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 188 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 1362 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1551 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 174 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 172 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 1309 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 1309 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 184 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 184 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2769 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 2432 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 395 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 394 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 381 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 381 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 680 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 671 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 609 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 602 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 153 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 149 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 126 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 126 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 125 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 127 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 128 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 128 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 126 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 + .../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 + .../res/layout/abs__screen_simple.xml | 38 + ...abs__screen_simple_overlay_action_mode.xml | 38 + .../abs__search_dropdown_item_icons_2line.xml | 89 + .../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 + .../res/values-land/abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 36 + .../res/values-large/abs__dimens.xml | 29 + .../res/values-sw600dp/abs__bools.xml | 19 + .../res/values-sw600dp/abs__dimens.xml | 38 + .../res/values-v11/abs__themes.xml | 12 + .../res/values-v14/abs__styles.xml | 123 + .../res/values-v14/abs__themes.xml | 34 + .../res/values-w360dp/abs__dimens.xml | 22 + .../res/values-w480dp/abs__bools.xml | 22 + .../res/values-w480dp/abs__config.xml | 29 + .../res/values-w500dp/abs__dimens.xml | 22 + .../res/values-w600dp/abs__dimens.xml | 22 + .../res/values-xlarge/abs__dimens.xml | 45 + .../res/values/abs__attrs.xml | 432 +++ .../res/values/abs__bools.xml | 22 + .../res/values/abs__colors.xml | 27 + .../res/values/abs__config.xml | 43 + .../res/values/abs__dimens.xml | 67 + .../ActionBarSherlock/res/values/abs__ids.xml | 26 + .../res/values/abs__strings.xml | 53 + .../res/values/abs__styles.xml | 412 +++ .../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 + media/android/NewsBlur/project.properties | 2 +- 697 files changed, 41457 insertions(+), 3 deletions(-) create mode 100644 media/android/NewsBlur/.settings/org.eclipse.jdt.core.prefs create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/.classpath create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/.project create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/.settings/org.eclipse.jdt.core.prefs create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/AndroidManifest.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/README.md create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/AndroidManifest.xml create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/R.txt create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/actionbarsherlock.jar create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/jarlist.cache create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__dialog_full_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_cab_done_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_clear_disabled.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_clear_normal.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_go.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_share_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_search.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_voice_search.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_activated_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_divider_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_divider_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_bg_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_primary_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_48_inner_holo.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_48_outer_holo.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__dialog_full_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_cab_done_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_disabled.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_normal.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_go.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_share_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_search.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_voice_search.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_activated_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_divider_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_divider_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_bg_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_primary_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_48_inner_holo.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_48_outer_holo.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_disabled.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_go.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_search.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_voice_search.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_activated_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_divider_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_focused_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_longpressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_48_inner_holo.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_48_outer_holo.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/BuildConfig.java create mode 100644 media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/R.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/libs/android-support-v4.jar create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/pom.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/project.properties create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_disabled.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_normal.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_go.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_search.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_activated_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_disabled.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_normal.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_voice_search.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_activated_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_primary_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_48_inner_holo.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_48_outer_holo.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_voice_search.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_divider_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_focused_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_outer_holo.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_view.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-land/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-large/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-v11/abs__themes.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__styles.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__themes.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__attrs.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__bools.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__colors.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__config.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__dimens.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__ids.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__strings.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__styles.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__themes.xml create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionMode.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java create mode 100755 media/android/NewsBlur/libs/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java diff --git a/media/android/NewsBlur/.settings/org.eclipse.jdt.core.prefs b/media/android/NewsBlur/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..8000cd6ca --- /dev/null +++ b/media/android/NewsBlur/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/media/android/NewsBlur/AndroidManifest.xml b/media/android/NewsBlur/AndroidManifest.xml index 88b3ccffb..cf3cdf734 100644 --- a/media/android/NewsBlur/AndroidManifest.xml +++ b/media/android/NewsBlur/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="31" + android:versionName="1.1" > + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/.project b/media/android/NewsBlur/libs/ActionBarSherlock/.project new file mode 100644 index 000000000..31c647017 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/.project @@ -0,0 +1,33 @@ + + + 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/media/android/NewsBlur/libs/ActionBarSherlock/.settings/org.eclipse.jdt.core.prefs b/media/android/NewsBlur/libs/ActionBarSherlock/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..b080d2ddc --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/AndroidManifest.xml b/media/android/NewsBlur/libs/ActionBarSherlock/AndroidManifest.xml new file mode 100755 index 000000000..7b8a84824 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/README.md b/media/android/NewsBlur/libs/ActionBarSherlock/README.md new file mode 100755 index 000000000..e8a2c080e --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/README.md @@ -0,0 +1,15 @@ +ActionBarSherlock Library +========================= + +This folder contains the main library which should be linked against as an +Android library project in your application. + +For more information see the "Including In Your Project" section of the +[usage page][1]. + + + + + + + [1]: http://actionbarsherlock.com/usage.html diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/AndroidManifest.xml b/media/android/NewsBlur/libs/ActionBarSherlock/bin/AndroidManifest.xml new file mode 100644 index 000000000..7b8a84824 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/bin/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/R.txt b/media/android/NewsBlur/libs/ActionBarSherlock/bin/R.txt new file mode 100644 index 000000000..4227548c8 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/bin/R.txt @@ -0,0 +1,576 @@ +int attr actionBarDivider 0x7f01000e +int attr actionBarItemBackground 0x7f01000f +int attr actionBarSize 0x7f01000d +int attr actionBarSplitStyle 0x7f01000b +int attr actionBarStyle 0x7f01000a +int attr actionBarTabBarStyle 0x7f010007 +int attr actionBarTabStyle 0x7f010006 +int attr actionBarTabTextStyle 0x7f010008 +int attr actionBarWidgetTheme 0x7f01000c +int attr actionButtonStyle 0x7f01003a +int attr actionDropDownStyle 0x7f010039 +int attr actionMenuTextAppearance 0x7f010010 +int attr actionMenuTextColor 0x7f010011 +int attr actionModeBackground 0x7f010014 +int attr actionModeCloseButtonStyle 0x7f010013 +int attr actionModeCloseDrawable 0x7f010016 +int attr actionModePopupWindowStyle 0x7f010018 +int attr actionModeShareDrawable 0x7f010017 +int attr actionModeSplitBackground 0x7f010015 +int attr actionModeStyle 0x7f010012 +int attr actionOverflowButtonStyle 0x7f010009 +int attr actionSpinnerItemStyle 0x7f01003f +int attr activatedBackgroundIndicator 0x7f010047 +int attr activityChooserViewStyle 0x7f010046 +int attr background 0x7f010002 +int attr backgroundSplit 0x7f010003 +int attr backgroundStacked 0x7f01004e +int attr buttonStyleSmall 0x7f010019 +int attr customNavigationLayout 0x7f01004f +int attr displayOptions 0x7f010049 +int attr divider 0x7f010005 +int attr dividerVertical 0x7f010038 +int attr dropDownListViewStyle 0x7f01003c +int attr dropdownListPreferredItemHeight 0x7f01003e +int attr expandActivityOverflowButtonDrawable 0x7f01005e +int attr headerBackground 0x7f010058 +int attr height 0x7f010004 +int attr homeAsUpIndicator 0x7f01003b +int attr homeLayout 0x7f010050 +int attr horizontalDivider 0x7f010056 +int attr icon 0x7f01004c +int attr iconifiedByDefault 0x7f01005f +int attr indeterminateProgressStyle 0x7f010052 +int attr initialActivityCount 0x7f01005d +int attr itemBackground 0x7f010059 +int attr itemIconDisabledAlpha 0x7f01005b +int attr itemPadding 0x7f010054 +int attr itemTextAppearance 0x7f010055 +int attr listPopupWindowStyle 0x7f010045 +int attr listPreferredItemHeightSmall 0x7f010032 +int attr listPreferredItemPaddingLeft 0x7f010033 +int attr listPreferredItemPaddingRight 0x7f010034 +int attr logo 0x7f01004d +int attr navigationMode 0x7f010048 +int attr popupMenuStyle 0x7f01003d +int attr preserveIconSpacing 0x7f01005c +int attr progressBarPadding 0x7f010053 +int attr progressBarStyle 0x7f010051 +int attr queryHint 0x7f010060 +int attr searchAutoCompleteTextView 0x7f010024 +int attr searchDropdownBackground 0x7f010025 +int attr searchResultListItemHeight 0x7f01002f +int attr searchViewCloseIcon 0x7f010026 +int attr searchViewEditQuery 0x7f01002a +int attr searchViewEditQueryBackground 0x7f01002b +int attr searchViewGoIcon 0x7f010027 +int attr searchViewSearchIcon 0x7f010028 +int attr searchViewTextField 0x7f01002c +int attr searchViewTextFieldRight 0x7f01002d +int attr searchViewVoiceIcon 0x7f010029 +int attr selectableItemBackground 0x7f01001a +int attr spinnerDropDownItemStyle 0x7f010023 +int attr spinnerItemStyle 0x7f010022 +int attr subtitle 0x7f01004b +int attr subtitleTextStyle 0x7f010001 +int attr textAppearanceLargePopupMenu 0x7f01001c +int attr textAppearanceListItemSmall 0x7f010035 +int attr textAppearanceSearchResultSubtitle 0x7f010031 +int attr textAppearanceSearchResultTitle 0x7f010030 +int attr textAppearanceSmall 0x7f01001e +int attr textAppearanceSmallPopupMenu 0x7f01001d +int attr textColorPrimary 0x7f01001f +int attr textColorPrimaryDisableOnly 0x7f010020 +int attr textColorPrimaryInverse 0x7f010021 +int attr textColorSearchUrl 0x7f01002e +int attr title 0x7f01004a +int attr titleTextStyle 0x7f010000 +int attr verticalDivider 0x7f010057 +int attr windowActionBar 0x7f010041 +int attr windowActionBarOverlay 0x7f010042 +int attr windowActionModeOverlay 0x7f010043 +int attr windowAnimationStyle 0x7f01005a +int attr windowContentOverlay 0x7f01001b +int attr windowMinWidthMajor 0x7f010036 +int attr windowMinWidthMinor 0x7f010037 +int attr windowNoTitle 0x7f010040 +int attr windowSplitActionBar 0x7f010044 +int bool abs__action_bar_embed_tabs 0x7f050000 +int bool abs__action_bar_expanded_action_views_exclusive 0x7f050002 +int bool abs__config_actionMenuItemAllCaps 0x7f050004 +int bool abs__config_allowActionMenuItemTextWithIcon 0x7f050005 +int bool abs__config_showMenuShortcutsWhenKeyboardPresent 0x7f050003 +int bool abs__split_action_bar_is_narrow 0x7f050001 +int color abs__background_holo_dark 0x7f060000 +int color abs__background_holo_light 0x7f060001 +int color abs__bright_foreground_disabled_holo_dark 0x7f060004 +int color abs__bright_foreground_disabled_holo_light 0x7f060005 +int color abs__bright_foreground_holo_dark 0x7f060002 +int color abs__bright_foreground_holo_light 0x7f060003 +int color abs__bright_foreground_inverse_holo_dark 0x7f060006 +int color abs__bright_foreground_inverse_holo_light 0x7f060007 +int color abs__holo_blue_light 0x7f060008 +int color abs__primary_text_disable_only_holo_dark 0x7f060009 +int color abs__primary_text_disable_only_holo_light 0x7f06000a +int color abs__primary_text_holo_dark 0x7f06000b +int color abs__primary_text_holo_light 0x7f06000c +int dimen abs__action_bar_default_height 0x7f070001 +int dimen abs__action_bar_icon_vertical_padding 0x7f070002 +int dimen abs__action_bar_subtitle_bottom_margin 0x7f070006 +int dimen abs__action_bar_subtitle_text_size 0x7f070004 +int dimen abs__action_bar_subtitle_top_margin 0x7f070005 +int dimen abs__action_bar_title_text_size 0x7f070003 +int dimen abs__action_button_min_width 0x7f070007 +int dimen abs__alert_dialog_title_height 0x7f070008 +int dimen abs__config_prefDialogWidth 0x7f070000 +int dimen abs__dialog_min_width_major 0x7f070009 +int dimen abs__dialog_min_width_minor 0x7f07000a +int dimen abs__dropdownitem_icon_width 0x7f07000d +int dimen abs__dropdownitem_text_padding_left 0x7f07000b +int dimen abs__dropdownitem_text_padding_right 0x7f07000c +int dimen abs__search_view_preferred_width 0x7f07000f +int dimen abs__search_view_text_min_width 0x7f07000e +int dimen action_button_min_width 0x7f070010 +int drawable abs__ab_bottom_solid_dark_holo 0x7f020000 +int drawable abs__ab_bottom_solid_inverse_holo 0x7f020001 +int drawable abs__ab_bottom_solid_light_holo 0x7f020002 +int drawable abs__ab_bottom_transparent_dark_holo 0x7f020003 +int drawable abs__ab_bottom_transparent_light_holo 0x7f020004 +int drawable abs__ab_share_pack_holo_dark 0x7f020005 +int drawable abs__ab_share_pack_holo_light 0x7f020006 +int drawable abs__ab_solid_dark_holo 0x7f020007 +int drawable abs__ab_solid_light_holo 0x7f020008 +int drawable abs__ab_solid_shadow_holo 0x7f020009 +int drawable abs__ab_stacked_solid_dark_holo 0x7f02000a +int drawable abs__ab_stacked_solid_light_holo 0x7f02000b +int drawable abs__ab_stacked_transparent_dark_holo 0x7f02000c +int drawable abs__ab_stacked_transparent_light_holo 0x7f02000d +int drawable abs__ab_transparent_dark_holo 0x7f02000e +int drawable abs__ab_transparent_light_holo 0x7f02000f +int drawable abs__activated_background_holo_dark 0x7f020010 +int drawable abs__activated_background_holo_light 0x7f020011 +int drawable abs__btn_cab_done_default_holo_dark 0x7f020012 +int drawable abs__btn_cab_done_default_holo_light 0x7f020013 +int drawable abs__btn_cab_done_focused_holo_dark 0x7f020014 +int drawable abs__btn_cab_done_focused_holo_light 0x7f020015 +int drawable abs__btn_cab_done_holo_dark 0x7f020016 +int drawable abs__btn_cab_done_holo_light 0x7f020017 +int drawable abs__btn_cab_done_pressed_holo_dark 0x7f020018 +int drawable abs__btn_cab_done_pressed_holo_light 0x7f020019 +int drawable abs__cab_background_bottom_holo_dark 0x7f02001a +int drawable abs__cab_background_bottom_holo_light 0x7f02001b +int drawable abs__cab_background_top_holo_dark 0x7f02001c +int drawable abs__cab_background_top_holo_light 0x7f02001d +int drawable abs__dialog_full_holo_dark 0x7f02001e +int drawable abs__dialog_full_holo_light 0x7f02001f +int drawable abs__ic_ab_back_holo_dark 0x7f020020 +int drawable abs__ic_ab_back_holo_light 0x7f020021 +int drawable abs__ic_cab_done_holo_dark 0x7f020022 +int drawable abs__ic_cab_done_holo_light 0x7f020023 +int drawable abs__ic_clear 0x7f020024 +int drawable abs__ic_clear_disabled 0x7f020025 +int drawable abs__ic_clear_holo_light 0x7f020026 +int drawable abs__ic_clear_normal 0x7f020027 +int drawable abs__ic_clear_search_api_disabled_holo_light 0x7f020028 +int drawable abs__ic_clear_search_api_holo_light 0x7f020029 +int drawable abs__ic_go 0x7f02002a +int drawable abs__ic_go_search_api_holo_light 0x7f02002b +int drawable abs__ic_menu_moreoverflow_holo_dark 0x7f02002c +int drawable abs__ic_menu_moreoverflow_holo_light 0x7f02002d +int drawable abs__ic_menu_moreoverflow_normal_holo_dark 0x7f02002e +int drawable abs__ic_menu_moreoverflow_normal_holo_light 0x7f02002f +int drawable abs__ic_menu_share_holo_dark 0x7f020030 +int drawable abs__ic_menu_share_holo_light 0x7f020031 +int drawable abs__ic_search 0x7f020032 +int drawable abs__ic_search_api_holo_light 0x7f020033 +int drawable abs__ic_voice_search 0x7f020034 +int drawable abs__ic_voice_search_api_holo_light 0x7f020035 +int drawable abs__item_background_holo_dark 0x7f020036 +int drawable abs__item_background_holo_light 0x7f020037 +int drawable abs__list_activated_holo 0x7f020038 +int drawable abs__list_divider_holo_dark 0x7f020039 +int drawable abs__list_divider_holo_light 0x7f02003a +int drawable abs__list_focused_holo 0x7f02003b +int drawable abs__list_longpressed_holo 0x7f02003c +int drawable abs__list_pressed_holo_dark 0x7f02003d +int drawable abs__list_pressed_holo_light 0x7f02003e +int drawable abs__list_selector_background_transition_holo_dark 0x7f02003f +int drawable abs__list_selector_background_transition_holo_light 0x7f020040 +int drawable abs__list_selector_disabled_holo_dark 0x7f020041 +int drawable abs__list_selector_disabled_holo_light 0x7f020042 +int drawable abs__list_selector_holo_dark 0x7f020043 +int drawable abs__list_selector_holo_light 0x7f020044 +int drawable abs__menu_dropdown_panel_holo_dark 0x7f020045 +int drawable abs__menu_dropdown_panel_holo_light 0x7f020046 +int drawable abs__progress_bg_holo_dark 0x7f020047 +int drawable abs__progress_bg_holo_light 0x7f020048 +int drawable abs__progress_horizontal_holo_dark 0x7f020049 +int drawable abs__progress_horizontal_holo_light 0x7f02004a +int drawable abs__progress_medium_holo 0x7f02004b +int drawable abs__progress_primary_holo_dark 0x7f02004c +int drawable abs__progress_primary_holo_light 0x7f02004d +int drawable abs__progress_secondary_holo_dark 0x7f02004e +int drawable abs__progress_secondary_holo_light 0x7f02004f +int drawable abs__search_dropdown_dark 0x7f020050 +int drawable abs__search_dropdown_light 0x7f020051 +int drawable abs__spinner_48_inner_holo 0x7f020052 +int drawable abs__spinner_48_outer_holo 0x7f020053 +int drawable abs__spinner_ab_default_holo_dark 0x7f020054 +int drawable abs__spinner_ab_default_holo_light 0x7f020055 +int drawable abs__spinner_ab_disabled_holo_dark 0x7f020056 +int drawable abs__spinner_ab_disabled_holo_light 0x7f020057 +int drawable abs__spinner_ab_focused_holo_dark 0x7f020058 +int drawable abs__spinner_ab_focused_holo_light 0x7f020059 +int drawable abs__spinner_ab_holo_dark 0x7f02005a +int drawable abs__spinner_ab_holo_light 0x7f02005b +int drawable abs__spinner_ab_pressed_holo_dark 0x7f02005c +int drawable abs__spinner_ab_pressed_holo_light 0x7f02005d +int drawable abs__tab_indicator_ab_holo 0x7f02005e +int drawable abs__tab_selected_focused_holo 0x7f02005f +int drawable abs__tab_selected_holo 0x7f020060 +int drawable abs__tab_selected_pressed_holo 0x7f020061 +int drawable abs__tab_unselected_pressed_holo 0x7f020062 +int drawable abs__textfield_search_default_holo_dark 0x7f020063 +int drawable abs__textfield_search_default_holo_light 0x7f020064 +int drawable abs__textfield_search_right_default_holo_dark 0x7f020065 +int drawable abs__textfield_search_right_default_holo_light 0x7f020066 +int drawable abs__textfield_search_right_selected_holo_dark 0x7f020067 +int drawable abs__textfield_search_right_selected_holo_light 0x7f020068 +int drawable abs__textfield_search_selected_holo_dark 0x7f020069 +int drawable abs__textfield_search_selected_holo_light 0x7f02006a +int drawable abs__textfield_searchview_holo_dark 0x7f02006b +int drawable abs__textfield_searchview_holo_light 0x7f02006c +int drawable abs__textfield_searchview_right_holo_dark 0x7f02006d +int drawable abs__textfield_searchview_right_holo_light 0x7f02006e +int id abs__action_bar 0x7f040022 +int id abs__action_bar_container 0x7f040021 +int id abs__action_bar_subtitle 0x7f040011 +int id abs__action_bar_title 0x7f040010 +int id abs__action_context_bar 0x7f040023 +int id abs__action_menu_divider 0x7f04000c +int id abs__action_menu_presenter 0x7f04000d +int id abs__action_mode_bar 0x7f040026 +int id abs__action_mode_bar_stub 0x7f040025 +int id abs__action_mode_close_button 0x7f040014 +int id abs__activity_chooser_view_content 0x7f040015 +int id abs__checkbox 0x7f04001e +int id abs__content 0x7f04001d +int id abs__default_activity_button 0x7f040018 +int id abs__expand_activities_button 0x7f040016 +int id abs__home 0x7f04000a +int id abs__icon 0x7f04001a +int id abs__image 0x7f040017 +int id abs__imageButton 0x7f040012 +int id abs__list_item 0x7f040019 +int id abs__progress_circular 0x7f04000e +int id abs__progress_horizontal 0x7f04000f +int id abs__radio 0x7f040020 +int id abs__search_badge 0x7f040029 +int id abs__search_bar 0x7f040028 +int id abs__search_button 0x7f04002a +int id abs__search_close_btn 0x7f04002f +int id abs__search_edit_frame 0x7f04002b +int id abs__search_go_btn 0x7f040031 +int id abs__search_mag_icon 0x7f04002c +int id abs__search_plate 0x7f04002d +int id abs__search_src_text 0x7f04002e +int id abs__search_voice_btn 0x7f040032 +int id abs__shortcut 0x7f04001f +int id abs__split_action_bar 0x7f040024 +int id abs__submit_area 0x7f040030 +int id abs__textButton 0x7f040013 +int id abs__title 0x7f04001b +int id abs__titleDivider 0x7f04001c +int id abs__up 0x7f04000b +int id disableHome 0x7f040009 +int id edit_query 0x7f040027 +int id homeAsUp 0x7f040006 +int id listMode 0x7f040002 +int id normal 0x7f040001 +int id showCustom 0x7f040008 +int id showHome 0x7f040005 +int id showTitle 0x7f040007 +int id tabMode 0x7f040003 +int id useLogo 0x7f040004 +int id wrap_content 0x7f040000 +int integer abs__max_action_buttons 0x7f080000 +int layout abs__action_bar_home 0x7f030000 +int layout abs__action_bar_tab 0x7f030001 +int layout abs__action_bar_tab_bar_view 0x7f030002 +int layout abs__action_bar_title_item 0x7f030003 +int layout abs__action_menu_item_layout 0x7f030004 +int layout abs__action_menu_layout 0x7f030005 +int layout abs__action_mode_bar 0x7f030006 +int layout abs__action_mode_close_item 0x7f030007 +int layout abs__activity_chooser_view 0x7f030008 +int layout abs__activity_chooser_view_list_item 0x7f030009 +int layout abs__dialog_title_holo 0x7f03000a +int layout abs__list_menu_item_checkbox 0x7f03000b +int layout abs__list_menu_item_icon 0x7f03000c +int layout abs__list_menu_item_layout 0x7f03000d +int layout abs__list_menu_item_radio 0x7f03000e +int layout abs__popup_menu_item_layout 0x7f03000f +int layout abs__screen_action_bar 0x7f030010 +int layout abs__screen_action_bar_overlay 0x7f030011 +int layout abs__screen_simple 0x7f030012 +int layout abs__screen_simple_overlay_action_mode 0x7f030013 +int layout abs__search_dropdown_item_icons_2line 0x7f030014 +int layout abs__search_view 0x7f030015 +int layout abs__simple_dropdown_hint 0x7f030016 +int layout sherlock_spinner_dropdown_item 0x7f030017 +int layout sherlock_spinner_item 0x7f030018 +int string abs__action_bar_home_description 0x7f090000 +int string abs__action_bar_up_description 0x7f090001 +int string abs__action_menu_overflow_description 0x7f090002 +int string abs__action_mode_done 0x7f090003 +int string abs__activity_chooser_view_dialog_title_default 0x7f090005 +int string abs__activity_chooser_view_see_all 0x7f090004 +int string abs__activitychooserview_choose_application 0x7f090007 +int string abs__searchview_description_clear 0x7f09000c +int string abs__searchview_description_query 0x7f09000b +int string abs__searchview_description_search 0x7f09000a +int string abs__searchview_description_submit 0x7f09000d +int string abs__searchview_description_voice 0x7f09000e +int string abs__share_action_provider_share_with 0x7f090006 +int string abs__shareactionprovider_share_with 0x7f090008 +int string abs__shareactionprovider_share_with_application 0x7f090009 +int style DialogWindowTitle_Sherlock 0x7f0a0036 +int style DialogWindowTitle_Sherlock_Light 0x7f0a0037 +int style Sherlock___TextAppearance_Small 0x7f0a004a +int style Sherlock___Theme 0x7f0a004e +int style Sherlock___Theme_DarkActionBar 0x7f0a0050 +int style Sherlock___Theme_Dialog 0x7f0a0051 +int style Sherlock___Theme_Light 0x7f0a004f +int style Sherlock___Widget_ActionBar 0x7f0a0001 +int style Sherlock___Widget_ActionMode 0x7f0a0016 +int style Sherlock___Widget_ActivityChooserView 0x7f0a001e +int style Sherlock___Widget_Holo_DropDownItem 0x7f0a0029 +int style Sherlock___Widget_Holo_ListView 0x7f0a0026 +int style Sherlock___Widget_Holo_Spinner 0x7f0a0023 +int style Sherlock___Widget_SearchAutoCompleteTextView 0x7f0a0033 +int style TextAppearance_Sherlock_DialogWindowTitle 0x7f0a0048 +int style TextAppearance_Sherlock_Light_DialogWindowTitle 0x7f0a0049 +int style TextAppearance_Sherlock_Light_Small 0x7f0a004c +int style TextAppearance_Sherlock_Light_Widget_PopupMenu_Large 0x7f0a0043 +int style TextAppearance_Sherlock_Light_Widget_PopupMenu_Small 0x7f0a0045 +int style TextAppearance_Sherlock_Small 0x7f0a004b +int style TextAppearance_Sherlock_Widget_ActionBar_Menu 0x7f0a0038 +int style TextAppearance_Sherlock_Widget_ActionBar_Subtitle 0x7f0a003b +int style TextAppearance_Sherlock_Widget_ActionBar_Subtitle_Inverse 0x7f0a003c +int style TextAppearance_Sherlock_Widget_ActionBar_Title 0x7f0a0039 +int style TextAppearance_Sherlock_Widget_ActionBar_Title_Inverse 0x7f0a003a +int style TextAppearance_Sherlock_Widget_ActionMode_Subtitle 0x7f0a003f +int style TextAppearance_Sherlock_Widget_ActionMode_Subtitle_Inverse 0x7f0a0040 +int style TextAppearance_Sherlock_Widget_ActionMode_Title 0x7f0a003d +int style TextAppearance_Sherlock_Widget_ActionMode_Title_Inverse 0x7f0a003e +int style TextAppearance_Sherlock_Widget_DropDownHint 0x7f0a004d +int style TextAppearance_Sherlock_Widget_DropDownItem 0x7f0a0047 +int style TextAppearance_Sherlock_Widget_PopupMenu 0x7f0a0041 +int style TextAppearance_Sherlock_Widget_PopupMenu_Large 0x7f0a0042 +int style TextAppearance_Sherlock_Widget_PopupMenu_Small 0x7f0a0044 +int style TextAppearance_Sherlock_Widget_TextView_SpinnerItem 0x7f0a0046 +int style Theme_Sherlock 0x7f0a0052 +int style Theme_Sherlock_Dialog 0x7f0a0057 +int style Theme_Sherlock_Light 0x7f0a0053 +int style Theme_Sherlock_Light_DarkActionBar 0x7f0a0054 +int style Theme_Sherlock_Light_Dialog 0x7f0a0058 +int style Theme_Sherlock_Light_NoActionBar 0x7f0a0056 +int style Theme_Sherlock_NoActionBar 0x7f0a0055 +int style Widget 0x7f0a0000 +int style Widget_Sherlock_ActionBar 0x7f0a0002 +int style Widget_Sherlock_ActionBar_Solid 0x7f0a0003 +int style Widget_Sherlock_ActionBar_TabBar 0x7f0a000a +int style Widget_Sherlock_ActionBar_TabText 0x7f0a000d +int style Widget_Sherlock_ActionBar_TabView 0x7f0a0007 +int style Widget_Sherlock_ActionButton 0x7f0a0010 +int style Widget_Sherlock_ActionButton_CloseMode 0x7f0a0012 +int style Widget_Sherlock_ActionButton_Overflow 0x7f0a0014 +int style Widget_Sherlock_ActionMode 0x7f0a0017 +int style Widget_Sherlock_ActivityChooserView 0x7f0a001f +int style Widget_Sherlock_Button_Small 0x7f0a0021 +int style Widget_Sherlock_DropDownItem_Spinner 0x7f0a002a +int style Widget_Sherlock_Light_ActionBar 0x7f0a0004 +int style Widget_Sherlock_Light_ActionBar_Solid 0x7f0a0005 +int style Widget_Sherlock_Light_ActionBar_Solid_Inverse 0x7f0a0006 +int style Widget_Sherlock_Light_ActionBar_TabBar 0x7f0a000b +int style Widget_Sherlock_Light_ActionBar_TabBar_Inverse 0x7f0a000c +int style Widget_Sherlock_Light_ActionBar_TabText 0x7f0a000e +int style Widget_Sherlock_Light_ActionBar_TabText_Inverse 0x7f0a000f +int style Widget_Sherlock_Light_ActionBar_TabView 0x7f0a0008 +int style Widget_Sherlock_Light_ActionBar_TabView_Inverse 0x7f0a0009 +int style Widget_Sherlock_Light_ActionButton 0x7f0a0011 +int style Widget_Sherlock_Light_ActionButton_CloseMode 0x7f0a0013 +int style Widget_Sherlock_Light_ActionButton_Overflow 0x7f0a0015 +int style Widget_Sherlock_Light_ActionMode 0x7f0a0018 +int style Widget_Sherlock_Light_ActionMode_Inverse 0x7f0a0019 +int style Widget_Sherlock_Light_ActivityChooserView 0x7f0a0020 +int style Widget_Sherlock_Light_Button_Small 0x7f0a0022 +int style Widget_Sherlock_Light_DropDownItem_Spinner 0x7f0a002b +int style Widget_Sherlock_Light_ListPopupWindow 0x7f0a001b +int style Widget_Sherlock_Light_ListView_DropDown 0x7f0a0028 +int style Widget_Sherlock_Light_PopupMenu 0x7f0a001d +int style Widget_Sherlock_Light_PopupWindow_ActionMode 0x7f0a002d +int style Widget_Sherlock_Light_ProgressBar 0x7f0a002f +int style Widget_Sherlock_Light_ProgressBar_Horizontal 0x7f0a0031 +int style Widget_Sherlock_Light_SearchAutoCompleteTextView 0x7f0a0035 +int style Widget_Sherlock_Light_Spinner_DropDown_ActionBar 0x7f0a0025 +int style Widget_Sherlock_ListPopupWindow 0x7f0a001a +int style Widget_Sherlock_ListView_DropDown 0x7f0a0027 +int style Widget_Sherlock_PopupMenu 0x7f0a001c +int style Widget_Sherlock_PopupWindow_ActionMode 0x7f0a002c +int style Widget_Sherlock_ProgressBar 0x7f0a002e +int style Widget_Sherlock_ProgressBar_Horizontal 0x7f0a0030 +int style Widget_Sherlock_SearchAutoCompleteTextView 0x7f0a0034 +int style Widget_Sherlock_Spinner_DropDown_ActionBar 0x7f0a0024 +int style Widget_Sherlock_TextView_SpinnerItem 0x7f0a0032 +int[] styleable SherlockActionBar { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005, 0x7f010048, 0x7f010049, 0x7f01004a, 0x7f01004b, 0x7f01004c, 0x7f01004d, 0x7f01004e, 0x7f01004f, 0x7f010050, 0x7f010051, 0x7f010052, 0x7f010053, 0x7f010054 } +int styleable SherlockActionBar_background 2 +int styleable SherlockActionBar_backgroundSplit 3 +int styleable SherlockActionBar_backgroundStacked 12 +int styleable SherlockActionBar_customNavigationLayout 13 +int styleable SherlockActionBar_displayOptions 7 +int styleable SherlockActionBar_divider 5 +int styleable SherlockActionBar_height 4 +int styleable SherlockActionBar_homeLayout 14 +int styleable SherlockActionBar_icon 10 +int styleable SherlockActionBar_indeterminateProgressStyle 16 +int styleable SherlockActionBar_itemPadding 18 +int styleable SherlockActionBar_logo 11 +int styleable SherlockActionBar_navigationMode 6 +int styleable SherlockActionBar_progressBarPadding 17 +int styleable SherlockActionBar_progressBarStyle 15 +int styleable SherlockActionBar_subtitle 9 +int styleable SherlockActionBar_subtitleTextStyle 1 +int styleable SherlockActionBar_title 8 +int styleable SherlockActionBar_titleTextStyle 0 +int[] styleable SherlockActionMenuItemView { 0x0101013f } +int styleable SherlockActionMenuItemView_android_minWidth 0 +int[] styleable SherlockActionMode { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004 } +int styleable SherlockActionMode_background 2 +int styleable SherlockActionMode_backgroundSplit 3 +int styleable SherlockActionMode_height 4 +int styleable SherlockActionMode_subtitleTextStyle 1 +int styleable SherlockActionMode_titleTextStyle 0 +int[] styleable SherlockActivityChooserView { 0x010100d4, 0x7f01005d, 0x7f01005e } +int styleable SherlockActivityChooserView_android_background 0 +int styleable SherlockActivityChooserView_expandActivityOverflowButtonDrawable 2 +int styleable SherlockActivityChooserView_initialActivityCount 1 +int[] styleable SherlockMenuGroup { 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, 0x010101df, 0x010101e0 } +int styleable SherlockMenuGroup_android_checkableBehavior 5 +int styleable SherlockMenuGroup_android_enabled 0 +int styleable SherlockMenuGroup_android_id 1 +int styleable SherlockMenuGroup_android_menuCategory 3 +int styleable SherlockMenuGroup_android_orderInCategory 4 +int styleable SherlockMenuGroup_android_visible 2 +int[] styleable SherlockMenuItem { 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, 0x01010194, 0x010101de, 0x010101df, 0x010101e1, 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, 0x0101026f, 0x010102d9, 0x010102fb, 0x010102fc, 0x01010389 } +int styleable SherlockMenuItem_android_actionLayout 14 +int styleable SherlockMenuItem_android_actionProviderClass 16 +int styleable SherlockMenuItem_android_actionViewClass 15 +int styleable SherlockMenuItem_android_alphabeticShortcut 9 +int styleable SherlockMenuItem_android_checkable 11 +int styleable SherlockMenuItem_android_checked 3 +int styleable SherlockMenuItem_android_enabled 1 +int styleable SherlockMenuItem_android_icon 0 +int styleable SherlockMenuItem_android_id 2 +int styleable SherlockMenuItem_android_menuCategory 5 +int styleable SherlockMenuItem_android_numericShortcut 10 +int styleable SherlockMenuItem_android_onClick 12 +int styleable SherlockMenuItem_android_orderInCategory 6 +int styleable SherlockMenuItem_android_showAsAction 13 +int styleable SherlockMenuItem_android_title 7 +int styleable SherlockMenuItem_android_titleCondensed 8 +int styleable SherlockMenuItem_android_visible 4 +int[] styleable SherlockMenuView { 0x7f010055, 0x7f010056, 0x7f010057, 0x7f010058, 0x7f010059, 0x7f01005a, 0x7f01005b, 0x7f01005c } +int styleable SherlockMenuView_headerBackground 3 +int styleable SherlockMenuView_horizontalDivider 1 +int styleable SherlockMenuView_itemBackground 4 +int styleable SherlockMenuView_itemIconDisabledAlpha 6 +int styleable SherlockMenuView_itemTextAppearance 0 +int styleable SherlockMenuView_preserveIconSpacing 7 +int styleable SherlockMenuView_verticalDivider 2 +int styleable SherlockMenuView_windowAnimationStyle 5 +int[] styleable SherlockSearchView { 0x0101011f, 0x01010220, 0x01010264, 0x7f01005f, 0x7f010060 } +int styleable SherlockSearchView_android_imeOptions 2 +int styleable SherlockSearchView_android_inputType 1 +int styleable SherlockSearchView_android_maxWidth 0 +int styleable SherlockSearchView_iconifiedByDefault 3 +int styleable SherlockSearchView_queryHint 4 +int[] styleable SherlockSpinner { 0x010100af, 0x01010175, 0x01010176, 0x0101017b, 0x01010262, 0x010102ac, 0x010102ad, 0x010103ef } +int styleable SherlockSpinner_android_dropDownHorizontalOffset 5 +int styleable SherlockSpinner_android_dropDownSelector 1 +int styleable SherlockSpinner_android_dropDownVerticalOffset 6 +int styleable SherlockSpinner_android_dropDownWidth 4 +int styleable SherlockSpinner_android_gravity 0 +int styleable SherlockSpinner_android_popupBackground 2 +int styleable SherlockSpinner_android_popupPromptView 7 +int styleable SherlockSpinner_android_prompt 3 +int[] styleable SherlockTheme { 0x01010057, 0x7f010006, 0x7f010007, 0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b, 0x7f01000c, 0x7f01000d, 0x7f01000e, 0x7f01000f, 0x7f010010, 0x7f010011, 0x7f010012, 0x7f010013, 0x7f010014, 0x7f010015, 0x7f010016, 0x7f010017, 0x7f010018, 0x7f010019, 0x7f01001a, 0x7f01001b, 0x7f01001c, 0x7f01001d, 0x7f01001e, 0x7f01001f, 0x7f010020, 0x7f010021, 0x7f010022, 0x7f010023, 0x7f010024, 0x7f010025, 0x7f010026, 0x7f010027, 0x7f010028, 0x7f010029, 0x7f01002a, 0x7f01002b, 0x7f01002c, 0x7f01002d, 0x7f01002e, 0x7f01002f, 0x7f010030, 0x7f010031, 0x7f010032, 0x7f010033, 0x7f010034, 0x7f010035, 0x7f010036, 0x7f010037, 0x7f010038, 0x7f010039, 0x7f01003a, 0x7f01003b, 0x7f01003c, 0x7f01003d, 0x7f01003e, 0x7f01003f, 0x7f010040, 0x7f010041, 0x7f010042, 0x7f010043, 0x7f010044, 0x7f010045, 0x7f010046, 0x7f010047 } +int styleable SherlockTheme_actionBarDivider 9 +int styleable SherlockTheme_actionBarItemBackground 10 +int styleable SherlockTheme_actionBarSize 8 +int styleable SherlockTheme_actionBarSplitStyle 6 +int styleable SherlockTheme_actionBarStyle 5 +int styleable SherlockTheme_actionBarTabBarStyle 2 +int styleable SherlockTheme_actionBarTabStyle 1 +int styleable SherlockTheme_actionBarTabTextStyle 3 +int styleable SherlockTheme_actionBarWidgetTheme 7 +int styleable SherlockTheme_actionButtonStyle 53 +int styleable SherlockTheme_actionDropDownStyle 52 +int styleable SherlockTheme_actionMenuTextAppearance 11 +int styleable SherlockTheme_actionMenuTextColor 12 +int styleable SherlockTheme_actionModeBackground 15 +int styleable SherlockTheme_actionModeCloseButtonStyle 14 +int styleable SherlockTheme_actionModeCloseDrawable 17 +int styleable SherlockTheme_actionModePopupWindowStyle 19 +int styleable SherlockTheme_actionModeShareDrawable 18 +int styleable SherlockTheme_actionModeSplitBackground 16 +int styleable SherlockTheme_actionModeStyle 13 +int styleable SherlockTheme_actionOverflowButtonStyle 4 +int styleable SherlockTheme_actionSpinnerItemStyle 58 +int styleable SherlockTheme_activatedBackgroundIndicator 66 +int styleable SherlockTheme_activityChooserViewStyle 65 +int styleable SherlockTheme_android_windowIsFloating 0 +int styleable SherlockTheme_buttonStyleSmall 20 +int styleable SherlockTheme_dividerVertical 51 +int styleable SherlockTheme_dropDownListViewStyle 55 +int styleable SherlockTheme_dropdownListPreferredItemHeight 57 +int styleable SherlockTheme_homeAsUpIndicator 54 +int styleable SherlockTheme_listPopupWindowStyle 64 +int styleable SherlockTheme_listPreferredItemHeightSmall 45 +int styleable SherlockTheme_listPreferredItemPaddingLeft 46 +int styleable SherlockTheme_listPreferredItemPaddingRight 47 +int styleable SherlockTheme_popupMenuStyle 56 +int styleable SherlockTheme_searchAutoCompleteTextView 31 +int styleable SherlockTheme_searchDropdownBackground 32 +int styleable SherlockTheme_searchResultListItemHeight 42 +int styleable SherlockTheme_searchViewCloseIcon 33 +int styleable SherlockTheme_searchViewEditQuery 37 +int styleable SherlockTheme_searchViewEditQueryBackground 38 +int styleable SherlockTheme_searchViewGoIcon 34 +int styleable SherlockTheme_searchViewSearchIcon 35 +int styleable SherlockTheme_searchViewTextField 39 +int styleable SherlockTheme_searchViewTextFieldRight 40 +int styleable SherlockTheme_searchViewVoiceIcon 36 +int styleable SherlockTheme_selectableItemBackground 21 +int styleable SherlockTheme_spinnerDropDownItemStyle 30 +int styleable SherlockTheme_spinnerItemStyle 29 +int styleable SherlockTheme_textAppearanceLargePopupMenu 23 +int styleable SherlockTheme_textAppearanceListItemSmall 48 +int styleable SherlockTheme_textAppearanceSearchResultSubtitle 44 +int styleable SherlockTheme_textAppearanceSearchResultTitle 43 +int styleable SherlockTheme_textAppearanceSmall 25 +int styleable SherlockTheme_textAppearanceSmallPopupMenu 24 +int styleable SherlockTheme_textColorPrimary 26 +int styleable SherlockTheme_textColorPrimaryDisableOnly 27 +int styleable SherlockTheme_textColorPrimaryInverse 28 +int styleable SherlockTheme_textColorSearchUrl 41 +int styleable SherlockTheme_windowActionBar 60 +int styleable SherlockTheme_windowActionBarOverlay 61 +int styleable SherlockTheme_windowActionModeOverlay 62 +int styleable SherlockTheme_windowContentOverlay 22 +int styleable SherlockTheme_windowMinWidthMajor 49 +int styleable SherlockTheme_windowMinWidthMinor 50 +int styleable SherlockTheme_windowNoTitle 59 +int styleable SherlockTheme_windowSplitActionBar 63 +int[] styleable SherlockView { 0x010100da } +int styleable SherlockView_android_focusable 0 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/actionbarsherlock.jar b/media/android/NewsBlur/libs/ActionBarSherlock/bin/actionbarsherlock.jar new file mode 100644 index 0000000000000000000000000000000000000000..424256e1f807572ad978921371aaab28775470d2 GIT binary patch literal 438928 zcmb@tW0Ymxvgciuwr$(CGb?SIJ8iqtwry0}wry70HY?dx&pEfpdv5oA?zuhQwa5N4 z*WT;HZ$-q6_(x26DPRzkFA%>!tUew>U;aNA$`_C?GNQ_Yv=Xvn^fH375@MoC%5*Yf zA7fv>>>U7ok(UC8s0hkO0r~wOpx1C@wa1;kUddOaR9+P8N;4> zTlhI&Z0r<`1X>bYkTW+!SKP0Jklrg}HzSgyXICSZrhvu=D&>BzwivI`I!Rk`E^v@! z+L+J>#XV{?oY9txa5(z!tPA1k$CRQd!PA10x%F;WgR`xeb5mVsx zIH}k<`8kC^FsV>FQY6K~TxvyvS`?Tj8KtGjz^BiOCf&5-3!`iqY z6!C>>Lx%SfL)laeDmOcGU5A=XT_?x~a`j5d4>^zNjJ_?_uV911S z(@QBNgSH0F*U>*1QxR-rnT+2_L`4ZQ^H5B(p_SdS^Y|X6BJZr^d0>kdpV9wNES%E| zS^mw4|8FS@{2LVI9Zc*D9R6#A^p0Va0v7yjkRqMTDG+FsMkzuWG@(h!{sbhM1Opy* zm`(|fuB#i|pBX{?J@}-X>8ebF6Gm?RuZOQkchEhoQ<5+c%~tHaX;I;oPjn=U8x)Va zop#|l%1CFsj$@i?Z!>!TD$ZC-!age8)*J~|Sy2?B{QL`YBpQaHFTv}%?b!w;D zSwo)5^6WiIxQOwoJTI$M15Z~Q1;+!-0~vlAO*ldryqUeOyapR3svC;5aEQyL;_cEy z1QPG(e!!sqtvWzanw+K zs$5+F%XsaR5yEWI$U<{VF6UPB9AvuSDUDevGUsG&N+Doom{-vk5-z4o%=K(Gl1M_| zh1}4+>|$eIDE0iQ3U{dpRKj8-1;oXZVxNIZ`2&y|d0YVb|Q>TD#06p-`~ z+_gK{wHyXX6=pFMLWK6%gPi7QUADtWr_q{{dH1cx^AkUiCa6-vXl*UHd0I)eYyr!b z+*7S0rzPho&=Us%g0$vh>;CGt;-1=vLmd1{rD#9FbcGnLrUQ7Uj_4`KuO=&$=~1D1 zGQ*}dO514)<7|3AlF4PB{24WvOu%G&DP%CJNQdJTZ%k>x+Mmq%`p=JTBkn#AP~57B z+1q>|4{03vXvtxnbS+4NU!8G!9D&wUD>BPRNOjGQ1cu2bJ8}zvvw*mZW%%*Iuuzt= zsb74~CIaANEFi=cw9) zo&jyRHIK-){^6-Hj9x^iz-JBe5IaVQ+pqW|r3lb>OH(J>59#*-8>YB+Uw+zNx0uf0 zuM`hn0y=c6<~8qpo*Db4X>?cvw*Z4!U96U(*8_=av_Lm=-X2en=#}?OhIvJZb2PXk z+IoeKyraxW2ul(LXN{d^&60#dZ|Np|U2_fBbKu@lcRvx+>I_FG0w*d3_@S#U zEgqukL`AB?wy#XV{Z1s=eS+go+dAV;;RzAVS82|(6VSKO(8NfiteP(DxXBKsHWVqz zuq2S-c?MFn1J!&&MvQJ|zvSfVBGQzY6dLdg*=ylIXaNrg7j@O7X}O|`Di-Wze8K1{ z;S6uy6|KvuW;B>}HV|{->=_JgCCU_r{-@|I$}P~;O^?Dp(B-SM1EAj}o1;lQ;)Pd@ zE)=1)Y7eYyuyT7vLDI6)c|nGRsd#4%2>4+}Yk1h`*=Cmux#^ib8z;kIyereS%%+#e zT!M=&$OmpzW^yU9-rS|d*ezRvXN~Qcrvt|Fh`tl&H$1>qw?SUBDRJv~=xdE!h0Sd+sCY)8l>uZ0!kO2GfB1Nk~FpG=05 zVo&GFXxTP^vi+Ab@Ik%VkrF()KKvsXd+xNMUQ0_}#%02S_ks)f=jo|#-w{}Q^0k*( z*u$Wx*o6oDo39z>T`k`Q9a({Wc~c-U{7jBSA=3Cr5z>{xHe8(|99_QN*f|kg2@*VG zU8rmkeYPY|kGQL3YfJ)T;R3(lC$NW}Cw^;Wx}s7TX=baN6mq5JzCL7i$K472FSf2o z>FqXQIMrV&DYH0L9d_W5l$Kya0gL!9MGIR79i6N`Mm6uc=XeRqK>Ec%3vHaIg2cKc zA|YW{QUebVekX%>9An6B@OlS#usFhD~-tO*QVV#*``bOmP(2P*%RQJAkXoEItHD=QA;cgcUMN z-MM1&?S$D!yv2Iq4_>-v)Wo|9zlLZB4iW-IXRI?*=*dJHBXk^~1k1_2WJ|kqQJY3O z=aWdsGTID%_~B{~2x7EQ=AP4!lcXZ(@)h)^G~LWEhs+haBD?FQRY z6t3#b%Iq^=R#V|ES>6Zf2(-L!slKN!zX#)r=+;6#&>qIojIfs_;tGEwgS-Yka7a{} zQ8*P6RNmr$#ngD!4|&RlSFBpTcA>dplK`%k*5;Lf8aeyXnClPKsU3B?B(_z@MAeB4 zNmT&qyb}IQzCs-MOdm|T{R#Q_p!Ey@v4~9G%TyyRty+&>MnhD)Tomx;WphI}Eimu| z`4O*}Y)?`I5{s7@AA6Y+AKO%v7}C-jYE60Y)y8FOxDpJ6&2~`a6-!#J*Oemo0!Jx5 zgy-7WkQ)=g4SZqHw$~y{V2jYzyp6~KsbP!Z23uzVTSwK^&k1W~Nl3x?lLPB}K1gl@ zf$U);LIR@U+{BfdkEVdnuqx3gF@5ZtD#Xj$lmF2gP0AaMYAYnDPcB(2FQ|>ul;TG$ zQ#Ae#d7{Kvj-o{(zf!^{@Si=H_bYBaGx(P;3h;lI3-bKlgNwE%Z~wVD$8X5?2_OVb`)i5{UVp-~4&`pH z3_#m<2=x|1QuPWMb}&fcHnv$ww8uVM=sthpOXN}^Mv`b4Z8Dwm;!JaSxqZ2Z(T6Wb zLjro$ovAA_eG_0e!PrnJ1-j~`^Wg|#;`wx7%Tm=+h-iqjAMT44c+_<%sx0hkoKAn* z$Al&ZvgB2>!1cOyxzU1(Oc@&<^cd`wyT_3>9% zXFu1n6!mP>IYocgSxXKVJXhYg;VvS-Rz2HV>}j$Z^)s`*=F**SK1vGov`8arU{hCP z*U1xpJ$CGP3i?J2Y9DXnmqr;Fcn3>_yeLuSvlaL&4R>x)>he{=8lPp;T?B-`Q2} z@1p6yu9+nN2X9x-<{xid#@5(G%-qKOw;}wel%M;-c9{ z-v~i$l6rD!PC{x*)m2VnQo8okzfgU(AP7Dq|7Ia{7Sae``Z1TUVPJ2bk{oh6C7oES&Q6>H#2`V`mIQ$dlymkcQE;6WaT*j0{$CUCrq;jZ+@W zCc@J|RWfKwhac>QwPWh;LTlO<5dA5u&eKE(wm0-{*ffy#hFulA66wr&j&T;sX-Mfx zIzt#obDS=O*%0sCmWXZa;h-RWz-4)LhQNYh77#J7hzjmT%KVJ!f=+({e48KI_ybV$ z|3`rTO#%N8fC%0N*7@dve*os{w#`_|vC313IE+lLwZULTwVSXPe=Y^!Z+}Yy3~GgQ zgrx0EVsCmLZRH?;SA!99f(T;*Csa|v=uBR+UQHIe7<>iQ5YNzylPE?WuiHHz*ISQ& zV5HR^Ot%gN@4J&-QcP5|6=~Y6ErSrA{~(kGoP4G`_ipt$ZXQw#C1w<;yeT9~V>G^X zxN!=-{lEs6pv*Et-wk8vWJWOXB32Y2aN3DTw~K*DuMD`J^E_r}_CFE{4fw$SdOnh+hbo3FR5MJcS<(DKfP(?E zQiPpCn62Sz@U(CR*a062foesjj@m|H?%#v8_2KUhA^!gLCnHs0oD23K*L0>%9X$2T z(1|T87p2i-MEzXWS{VA&K|p1yYwel_nnUfb(E>yk>y#m8T2$Lf{u;P`Jka(~ND{C~vn548VU^oWwHwfGItyWr+G zzxY0)#$2}F#v=*3BT(Byx6uaY0oVxIn19oP;_rz;dJ>_At&A-jsnifZT0U=3;Wu;>6q_?qE97QpW@~TQwjN4X=^Zz}gl0Q8>_GU5-I^jK zRgZKxNVX1X`xq^RaX)`zH0nLoy({*N<%JwSahbU*QI$5+T7Rz~iIn~Wl59xRW14S> zI`7Gttnc;n$6o*`_R9&Ov_Nl)mS-WD1%D;vVzN&CvA>w_Uw-|uKh?kGC-pz#_uuM9 zzY)s*K?v*tPEN))HydZiW@Ttu1cr<>g1S6QI}QS$tW)oq`T5%huN8)L49N+l8JXSh z$gVp3r#6HeW?A;zX?X1KX=3%9`18a-a741*HGGR|GVp_6 zZ;wLqSVpGirmX1cTxlIa3>}OZW=c#7B9P5c0m40s#EQ0XcvFyl0wyjYFU86CFFWKo zlR}*SP3iAdH_87I$Nx?_`j1G6Y@I(V1V5PYO|a9cx14-U5rGD=!(A&yFkxt;2K!-) z=N|Y)!BEx1l48mL;C2`Mv^jn72CMHs4DoeGC#^HKOgd^){LID5v7l?4K~Dj7>#zA*ws|^} z7}>}L*iF@cOp&wYo$ik-tNpDhiu}JI{3{mzt9BVBCn)(_cB_bPvs|Lc_VUZsWr|He zKwu#NQAL7qyIx9Tv5y~(oUq#6a=8A=M`i4CLv*N*UzU-7T=ueQ-Tmd>F1tX~ZN{fa zU2UkHGUS=A*P~N82KH{i;I>~oW}RaM92~PASu0&VEFpF;)vk3LmU`T#N^CypINWZ> zcNFrexj%k`#*JACn>go`Rj`}qd=o-!tV$mi^^C)dX z8iUl&I!gb1g6-P{G?bZPPZfMBT2gaLsC*!z&}%4LK}2u4xXA-rzWuxh->LOg({zxB zWzIF%kE69|R~xq%dU#*(9*19b=ybjL+1mo0tH`whem2Y~m(4;S`qN1dG9G|V%u_o+ z$2A1m6=TSRM>pni`PR?Q;nOgP^(+}|P!sFXq-gOGxO-Lz$&3I$y8##xm(-6^l|aMZ zL>g^DL8-Hsh)_cAjeTgIB6myAZ%2<2>D!9?mn5@L82CamA$Oe~L%}4> zeXzfaZ6_y(I)2X4B_wc{UBp52%LD|f5?9S2l!&+Ah7X*u|Dd}YW?g0H!;eA{D$V)5 zW?&a%+DYwtw~(HBob$$x(tKTJ<9owweNDRPa7KLSPIZAj@~3AY#PVqfnCD{X1pQdar!Fx^a4aPdY3$kUny0bVN5AWN2Ni|JLc;@pV{RR5&b!NySm3jLRQ z>lqvz3>IQi5zgfvNw4qea2nn&srM%?#T~2~IP{x4gJnpf_EMtwV>_Td>f77N8IF9E27&Mmz? z-|UD7+va|587MqbnxF2VJlra*pAQb3wKsqQ;}4U&rOV8x#SvWfV48b+Pw{-U8MM~* zikCL7#%jTJmCyKUsYk->&Y{cqHR`#+Z+g2PCUsL#Yb%{E=!FwFXBZu1(}#Jz>T8Qo zz1m)`AGduAn={L;o^k;j}^5c^FMdsEea&faL`W-y_OEl%|9+co}U%Q4GY26(kr9l{g<}c~ls6l@rKPi=N2)d#xQRD(mJA zbl8*CB2o^l@lJSbjyzgGh!!{)@oU7j_0rfyFHEW(3^}l<=R|K6ql3$c{;^1udXC;4B)>YZO={8*fcki^gbrBpJ(W z>DkO-4rOT~QVuoQYU72r(|NT|?@&r9&xiA8HkqWo=N&0{)fDW>WhukHn5khJWl#KI zV~l=)$osXOx2q~`^nx}Rq&q5{JL~BBJjhmiS$d^|6Yo-ke+iS>;xQh=!t! z5@`L&!Xhgc_X{g>^vlV)s1JC`dekq#NI5l8b2K(-NbIRYXa+yGRfj{g{>4g+JpxO! z1Z!1nQm~i6lo2bYG_k_fEsW__Z%#0yhI?bK$$I7i%N>=5k$3^qU4uTH5MRP@-ibC< zZajM=K2dWc)$Y<*+OUNftQvW_dr_M0PVF7a78XC%kIsiVixDt|oVfrE;|e@6_@5wB zd|VGJ8e@6iNz^io>j|yrNK)}8M1OQ`+l>@5kzF2J?lI`|nIHo8IP_(S3F0KxM{R2| z`H9?~lXn-H84Kx->_`}G11m>Fn}AV>mDD_=x9p+7GgpLH-L^=+bIWm29iu+K)bjdpY!P=#(N~?A+OLs8lOT~vhxgY>r z+jJ07lpoBhEz0|qw#tiIwC%7b2|k<4r*~x^K0o;6UmSe2P*;t_V`i+OQl}Ru`69rr zp+R3cVCJp3&uccUUmv#Ed04qo_n_w}z5H||=mWlT_ef_->e^#*@vSJTrsZ;+)~HWC zrsutno=Bh&zQ>R{yHj7C^QY7trj+`vmdg8IvR?bT4O73~eFV`$3tG1i#abS4E%_T4 z)#p^FrRpr87lh;F1ZEBfBdwC-E8^W5^v<0V@yjOfDRc{4zlZ+xD5x^IvtCR>KFf-| zV^~ExFVbw6&7ep~yvxXP%6M`#8UjO2!+il>0@HHeiL4mWEi*PSdjWzme*ZcM<#~Ws zMt3)kgugu1Oj^AzR=Q3oT)L2JAYa%`-g$dsuahL9!M5@>qcE&Om^a5}mD-oRYK%H; zA#WnVLw3-t+#MP#x!yg3Y>Dev0<)fTiA<~J^P3v;WWww1(^$&!&pk)B>h=CN#$sM+ z_ZyvT3%_kG*mBa$M$uTMO>Y1VvhPfK^i{4wkkv#cZBh= zWc+?klcSrX8Zf=dtyN<*bs@A<_Z~%|DgoB1ULhK>fMTHV#T=H^h}sr0{O2!&%9a@x z<5(f~A6XoCAnEP0xsBykdk|iY{btxhO?9##Fh;`=ZFs!?CYc-V2-*D})2K0dwNVMq znHOEpHE1&SPQhsJ7TF%K?k&l0+HyWNJ(}yGQ7saVti&#CE(O6Cnq@8U@5(`walLF! zO(7RaSj&wqfo?t(a^j4+Mc1_@rBb8A3_y*;hz>hGvMsFCK^`}7-o`LZ3!HPZ8LI_J z4d|~pmNbs~(3Ts+HJ^Tgbw+NkMcb%~JsMM&mWJ)TF-nc1-`^B8q9dcW+h{KvO=0)? zhwT&eoqGwDQ_yk1@6c3QekxsZM$6r71fySx#+hCaCYGs?1#-)EYP%zJE?oH;c->HR zZa}od8&Doc$Rox?rjQrUlU62i}ZSLzl{O0{`i_B z0nAAZZ0ym?yUzm_yK)QFjH5b2Zr4z5FLC&Ak^Q+taDT8)f7xCmsAA=mwu3V594M zLYp@z{mCQjTRAcV{f_pBPnO^{De(&IX0EaAm_&!@=w`Cojh5siw>xzAvVuc=Yi!)MNZ9Fn`&2aYzD&nN;epVPj_4dk z8+H@A{^?XOp2S-q2R=Vu?4!LSwaLuNGJj_6cc(ndxdV88j*R=)%(0!>lb55npBkOvci$i2XFEWos15_Q$lhc-d7{cK=KCBZ z_C?FJtRTjeQfYmDGxF_ghl@GlQp>`Tm0NPU-uEUBy951DI90m! z#t|yrP+(^}Tz9j$kIJZL_XrG-eAf$vEZ_sPOGfka+;}o2xGyGX+5I+8QE;`M;#iUq zj3YYVe6ZAj5~^83E*S@G-}RV+gYZgS^h}=*gilKP=z0&w>jB<1qC0HAh zB}F<>A{TwsI4%D{^RPk5B%RNwZNjc*nN!7p?XjIQv)FKYVO8be%gi%$L zdRX=?$r95-$JD6Rl2f%^)nY33*FqZP)RKIyRKsUQa#4q^_5@$>!Z_0|-8V!})A|y{ z1oWyWc~NTVgab&zXax{b5hLwTRB%S>p+hJrLgRaFxp0(nB*lt3MV9^e{4m9e5|qir ze9*-z)rD3z{UA$XEbR=XLNjUc+0@v4LPAkWcRi_fRL$@^rJ~X$#fpStX{8oi$|Z8? zT0TH{va*tuBt)$Qw7no5AzdDV4vHapP)lNQOJs3NW^s#u@$r;VIPF|^KZ+J|@k+7* zl-PMtoz6F#ka?FeQQ3CkX7qAKWzR6;b1{#y+bM}gXY#`G@dKVA0?7l(q%RN`DPO%sddvf4xsOLYlZZ{l`=(}>6+5YbGu1qmiRALTT-1ZJw_$yR z9-V7_8x74ws(i(XLgdjh7Ma=Y#H`&33}!ILoe3j%dDOm-#zQSGOgL4yoLD)o9jf5OpL{_oB;iL`;ct+SK7frEjy<3E(FBo#{~Y!wV2Su}{i#CZ81L1^ZA zY>+7gnp&W1!7M#LWA*FAC>Pr#nv7Y`0c_Z2e4GUz;Zq#CfCWtFA!xLr=z^_xg~g|h za~cA4bH4NJBi<|b?58GjUw-df^6%!#Z`Y90NfQq(nsv_e6lJQN`5G#}wR!Ez#a+l@ zt`f}x^G0*FbCX5IRHnQZw)ZQY(` zD(L5B8fW3=3?ToRR_*?p2j|M%UrM(@{Fm~eM(5kUn;95;h-YOQ$0YeQ7N3!pj9XrDnJu^4ig6lmpRQ>6I`3iYk;yRq9 zUv5O9oZ5Mm^$m*k1C18-)LesXSw2fKA!2fgW|uJ)3@2rYgmLhA3GB6{K>eR7?HPgd zX{47ExOG;iChbD*sx01>LhdfH5$Do!1NNvR_0*H^izD?%%ShA={oFtaaRE7d3h09{ z!!ru(*s5VvIGnfpgbw92%|v#;L`*?|+`pOV9_c>1rAhmg+Q@4J)EStm)|D-tVQsh= zV{(42#9vtc=*JCn{7k~&OYOpU@{G#N-E0x3-Hqr8`TEiGOK3+fDqE-FBVu!X;8F#| zmQY-`#Q1*O3AYmu<|4!(*c*?h|C$s2k(uYL_XsolZu?8WAbhr|TW^3cjNbJ&Lw^Kb z$AH~HKmiOr_m7TH>O`Tyxz=d5u0%wuSK=C?pn_G}0U!H#{1Vet*CM%DI`3dv4_B!i z{l3+M{27`3IxlIT31%d0?5$qqi6@MCqrGmTrYJS0TFBAnsO3?X+9<8|ePC^^6GtcU zn9yhF%($+B*n3nu2|aG2S~Sx5mWx0Rf0RRsST$&M60|ZB;|__9UH!|J-gV-Mcj#fT z=_`T@5ahFqf+Jt#*P+D^G{O_^Z;ma_bMr97drsME8k)awicHibh;5@88`Mtv2!*!V zh4^#TUhL%@2<0gDA%nCDb?vJ)M>`KB$&PWZoCiH}Ucg*q*OH*FgYS`9Pffq&cOM)} zIJGKGIE724kmEm|Mnqj~U#J2ZbsN0I;xw5-;Smz>imCtHB%V2fyx-B$Yy?r&_5)SR z%>cdR0%{-N)wVuyO?e*0o3n{&$Pm9mOoPATJlY)gHgzHK`c5>Km?UBg`(11K3Mg=vp9h149!B2&furb7qNY<3Xw28+3o`U zS&m2%5lRuOm@Sx?iD7o6!~r05u62w|3``8n-@g#g3|7Ec37{bZbEod>Z-dNf!w|4) z!|+&T{xx|Z?t{%Y@|z0L-*!3p{%vlu1}^5Ne+@PLE3>F*UK^l4=LG~-f`UX)Q10bp z$&yRW2o(!OA)vV0dL#A2YU4WXT2MFz;7|vp5R1fnQSM&v4_{wCo7Y%U&-(>C>|bu9QA;Z@ZvxxnAa~B?2y4-E-Kox_K>$cUUViqEAp8Z&~gFsSjfDGWqfb9IFKnBW- zrlPoIiyf#6zE93D8%)oeGd?D%{ANE&=l3?pL6bQ%##_2QrR6GrFq$&JK0GrrZ0 z0#&$^v*1BESX6GHBriUl^PQzp*^hTr;4rClSG+C3B2Q@@l};1(b!9$Fs8HRvARb2yLJl+ zyZ$?7Kess%n*jBY9?PJXYF&fMahK6Hfu1n7RgZD&ebS(Jx>OAw7s$nuFjB?x-IOXc zK!}VT%>b2do`lI5q^`8Wbe~280jQfWc^i`9QR_rmrvZ5v zAcwi@Rz)Gyn&}$O0P=KL<}-TC^GKQbSe-BjYy#SsX@>QFpxZ#u@IyObm7nu1^KIgh zG9wV^F5UTWgM~D+W$^l!;K}BCvPd=l88g0lR5qB}qLbU!>x^zGlB6wwYd*Zf)B*S# zia`?HVWR+SH$yvQEwCKJwQabx1+$`Gs%2`+4US39Rxfh=%0VN za>PoxtxIHgnLw3xTZvrYrw8&Hv=V^5e4o3<#OlQbI4{QodhFw*5&5D#-=P0#P8t z&<33M)JaJjiMcO^?YDuSDFPGn`xyDo-M;N*J$QNhdI7Zzv515a6s|%ftJpY=Ep<|A zVf>l`;a!B8=Qq){U;O#S>l+7ls zV79!KZn4(D(hA#Zh~cLA^Gy(|1k{pho*RKDww4}9Ks zRiT%~;4}M7diBpzq8kXc+jLk(FzPdhX3RS~2<+`X2l6jb$f=UMf%tmL(yzx;g@`L6 zb78b?e`+f{ka|z_$u=Z`@ctKJ`!H^t&)@ud|JL~_|2@M0YzM2JIjo7G@MUngWN9U^ zLAE9enM-D|gh`s`#mdW{voJm*QLPo_=`Sr2*%C=rk&sV1Ugwy8#{_Wo$MAiDAGC96 z>?)GA-;U|xJ>vF!Tvwgb^ZopV_2sfR0s{uIMZ@_Fs}gM8nQGzAa-x3YG)@c~Rwm`A z_30pikp5{bp3-D-bkPBINCg%`>hwv`eU+~Gk>i0CU!xKmlm}fAzXT$IIS{hM@(u7Q z2&o18Dgz!A2w>`Rv@ptlTO7YC*B0BqpQA+4+=#z`pBf!@Jz;ASIo0MzWar!btu9}? z@V2BB`9PgbV#I5oU|~euQjim2J#nfONYx|5XuiUTDJZKbLE9iM9uE;iraC2JD2Yx& zR38IPWIxRWVoT-@+&JqQ>LIGxAizy}s8X?AgqO~^C=!JA61gP_Gj}CJog)Wyv>3nT z0m+mcTS3xz0ab}-@Hov4C)Z+LE5MAk zZl79`(SXQcThntVJKV|L=(-u zs~^>yOtN_|)FM3}7QE6pF-XBt?s1*VGQ-JUsQPtKEJN#jgM7~>L8{Z3!@$}FZPofb z@xWjcP~Hnt71jVmlDZm0*5d3QD*+k6jKy~4IT5(XeODir#8)46QS#c2gzF=29X_FRWBCGc<20LEJbSZoV5kwIzcnKX7;Q6RHF4d%lbC>9og+! zPwzv0*XI;t}&>Yz21c!f#RMcjhKKiZlJ1B-9g(Tz6C((gh3Qzd0 zdJ0eU?Et3FEsSrgRJM?Nn^c$o?IN8!*ySG9r^59wI13gLe~!8rs6*crvWVwM$pbQ) z9Y-FP@0Qn9Zw75}SCn3QJFsE+4L8LDCZzP#ztFrWZkp!E^+k8f`nYR~8TOZxI;!@g z*esB)`o1AuQNF3~cn86w_z+DEB(&X@e71bV$t01u5eK!bIWr1TI5FQ{N@F0PMGbG0P1pkwrZ#;`>?EcQq z*I@o`Yhw7@!1*7u^M51>m)|-0KjLRrDzqDp3hMB*4BM)eLqc&(qL6>l%p40Xh+r*? zyp>WoB_%9uF+51-rR-W!Mw$tLoi!IIJRAs$fO>w7MRe<=l@ASkG^ z{B_jv=Xxvm?<>LT{lz;itM%w@s`V(_@v_tVI;s7NFu!21fn*W#RAQ~5Q>-nvv641; z&xSoKGi!6!a{sQg|HTAUY`8AyhJ+MklBpun$dp+!pJ$H3Oq9hu=%sGXPO|0KS%uFq z3)Eq(L0W5Lu?o&a8|XY!76~h)rY<*Ngz+wT&weZtAV_U#TJ!Gb&&g$VIN{Vgk;thi z?|XrBwWi5!1cwe&0<=J8w)hFGnblZ_@F3x@SU@T$7y)K!{0M2mgIC(;Ao#EmAqGPF zB4}IeaT?2#1%OCrOKqG`iYU;MK5{aWnnGbQnvunBMeHBFZU0E6u$pf3PaaT@9>c`2 zT?L?x+0b8BZQP(ha;eX;SlAY~vd~L}KxnEL)D;S!Ftl{cGv11aUiOxDTwt%{P&65u z%yTbcx#LEs@zfgf*>Z#G;lK^a));F*KC&7)Y{bLm%VulG6b?GI5I_RHuuUEqQf!^=-y#?XpZ!h+?hGp znl|YPN!2VSX@-fQpu{nz=(2GyyEvA9ud3b*_Ky-JlFGw4u{A8Z6?Zf~l{u~t5~;pT z0p2V!^H^}jrp7TR=xE-l-4ZE}0t*yUd*6y|HgU~r`AwXT&FGO7V5{~{>IhXb)3WbV zMa(3fVQfLg`zMUoG!od0HI|WSXTl&wp8L~M$`$xAB%-c<{iYZlqNIhGnr{SW+(JWu1S6Cd7Ib9X zqq>q)zae2&ei9?a731QsEQ_X>5Y??RhY{19G9<@1EQclh0>xF@9w|0Cn z(Si`i$eRUhsH|L#F~p=+!9?AyH8iAy89iqgtgAT6ttv!JxlA|3jJaLG7%CFQyON>ByPf^u8zIJXlL4LxM1ScJW zTg21j_7@B^hfgpG_PSd^pJ0_RgU6<#tpL-SQyl87xdx-0xOY{;#Eq~Tsj{42q7yiB z@!Ae@Z7wLqCMAYUj zzCUuWF815Wt6~qNeBn&B!~#a2`5jFSBR`(U6-Y9 z%HCY7wGqF51q^Y#%*XCv6jWVy!%Mx;@dnazR(I8rH&XN?FViTy#UC$m|BNBwmE`Yn z=PqHHnFV8ddnbQ;&pQ=Tqw_4|H;Nlpn1HjjurUx`8e8F3^L&NNP~RJUmz+bsC&`>~ z_!{;Vu0*}Ry=jX%1jiFwmYc4ekMzX+05@1_Yqt6BV_LZU!43qkhKcND-)u<{mUFgq z^=_Y2!Z+7+<||N(#m$n{LHqX@sp2N)c;|YpI!`< zb#bMn`)-LB?)f9-xqzN2Ccw%7C6f`yUhm9@)Lb`bL%lj3&G*Y)RbNZIrU+TABV(6( zVlQ*AChw44`=+`rgo`|RPp=~NtYeLop}Z7O33Ze zJ5Oa#cc0c6<*W6r-H;L!yBl8ScDOF!O8#l@1JlvVgDRf?I;sR@@ zny4vKWMdsE*f3t+EUCxYR!@LAq;QO!QI+;kL-NYsBXEQjOZd zW(uRD5YtBB`Y{950>*kOOv~jVkS*ZGs3;Fnz$t2LPX2-)F2SIda{td2H*t% znBzXq`hJ?$VCYR3t?v4Lt4OAkoF~S9VauJt&S#>nTdw-GXm)*^<>}qv5_DS^;!-r> zFd>)vr0f{%rPuDWoutlBcW-&3Ht7YQ&U2xnLNC~(l_$P-+!SZ;iXQoXmSGzzaAz!( z7rY5Kcd;mvT>z3RWewpqLgQ!on$PP3sG1e&b7(or6Ov6LDVcD zW|@q*wQi>fJG}qZnb*wF5! z6U;;ys>uO$-x z^{@_X>n^mU7~1>7?xla1lJR@}W_A97IV7>IX=F!VzOqQzRB;FOjy`RY7#PGgK^1i2 zRb^(jPyJJSHq;dO_mONRH@2O$0p`V2q)DOhrlEy@=rOmKn1r}R1{g9>;s6Wfbn=jZ zrlQi^(NEn-fn*#Fm$m74^mo|znW@5JCBVz`PyEG`jmDZNT80w_BZ>B>Y~H8!;oIr% z?$59KSfsGlFiPg!=zHeNHI*o?P_KQA7xxB{M|ZW>S4M-|#aTLzZfxW+0rWtt{y-OgvouP9g1}Ygk)#$+*2bwMi)`P}qG`WRd>VG&^R;hHmR) z@2$kQ>o-sE3@P(Z;io_P=Kvkj-kAC5*^*?80P02b;9W zVf^fmBM~01%R>CxP$2gWo{ssR3`WWd&5?4aW1CWm;hy}Qg*{=Nalg5FW#Idy3n{zA9UjO*+x|q;*P}$wPaCy!$-EkXnUTLut;NwSPCfk^<#w@FFb|Hax{f7QVyO4`BQ-GjRYcb9{^ySr;}2n2U` zcXuZ^!QI{6Em*#j_wAm0r)Rq7{_w5EKX6!w&917aY7c>h8VHLd*3Z`#?Gdb-AIFX2 zwslgodq&r@I=~hRhbS0%x8(K~+TykB@?;8)L(B zTuH?1rj{Hc9)v@1B%%^m&ysy1UP8Q?){K{zS|8@#)yVBD+J~m?ci6h}FD93F7P|X&6SgN*xbU`RZO^T6E;}s&C7C|3A zc(pG1#b438au3ZWA&f3n#NN^yYEEEq8c-dCu@Gx-aBRVvukO1QIze_!9mzjrMr zKH~ZC+6%g!LGqB5!bKTc=iI^C7q#Oz)q{z?`*yV?qku^A6~V-x z%F)+CvN2;Oi0j1#m$9jPu6Yo=*ZjELM4plW7pm8QW9IA&)C~k`1)Qld55<0XDksCf zaH>v)!4fIAPdv{uSrohs)RwVvj@s>HE{QGkp}Fk@9Faf6%+A8`ZySP7!2@AODE zNzl??_*DB$y%$DY(n)+ZD6Qo&I){x%_Xlo1n(p#GCHHlvIAoa6zd?;rP5*$^#-L z8<#I4YvcD{y)U~`KF|@MK_L7e4TAq1L;drt6!UNZj$0WT*_i$@u>Zv_Ncr0?_|36m zma)$+n^8gC{9P$)lIPs_^6+W2Yre)|uMlx4b8dheQyNY<2?0PbASe^028!CDpJCjpx9U(y#!{wLP67r z!c6hgD;>S;0m|9UQsa^C)6abu{0V38DM`Cz0;qZlamZ22q3T$ zQbRBit7VNq4q+vYUJUkZ8LGSkplu?8r=b#Fx*t3D&l%{GR)s#?zO|t#92;<~l4Bah z{a9|Tps(FGxllA3-yI~LR?9mgC^vvoX}qIRK}j`9){p>AkS!Qvb)#@MrH_*6aI+p_ zAWY4u32n8Uwi;{HZr{-RER%hmuE}u2O}BTSN$$v=4AV#v@1`|2;GSZ(g!{s8E^43# zVP>%^Td>r~lHtO`le>5#6}Dtd0<;Y3($&ugGJ)eff{FKyl~oPfcx3IG4w;n4kt)Vr z1Gt1`%u(HuX=XdlF_LaEWWbD+5 zXhCx))OWwYGu&QBE8`?jX!7P9y9Y9A>5=0LhJV13H#dp6JCC2%Fpvp> z0xu2$0g%}h%V<^QYnujeq()huZtV{zYP1~H(r6K$r}kv&GLg?>Ul$SAj38>DQWI8h z0K$H1eRU5^fe3p}h&7)baAuw!T2A_Mp=eWa{he$x&_{F>E28A*&=v*r$X-<2&BM#| zsSu5RfMuPqmEAzp>6b9+8#gl@@w6F&ENWsJ6^dUJhQ?;qeVdJx!eGfWPlp6xwAYAcA4@c|FxXNR-7D?D&BTMaRRMoX9yqhU8a&I=E-23 zAKr4icadqQMb(m}xc#UtOoo9tyn(Rec@K)keJWqTqb0pRNkEvzv&2 zjL*jLwQ9Yd=t~46MoZ!wK#}q)%oCx9y+mrdJQj(V{vz{GCB8Nd3wnkn&>5xZQ_ZJS zCj-FDpoTG+N1Uq*xeQ1h6dccKjg1$ZKUs*FvCma#uKHgzx7GmGW1uXSq$_I90pz3m zVO8d^ykP_DvU}R7NV^#>g|gHLtHB*;Z|{a5AA&bP?ax!bWf~`8!K~eBznn%7AT_+y z-fMJYubYf}%^QfhHg@Vux&yd4a}RQFVs~Y)Sf_Oy3mP_@%9HyRcNXldyK|2gb>*-` zJRB#k*pj)NCV&A%Y-{6|-G&qNC3%A>%fOx;26y-3gRcU;bu>2R{AT4YC5w;YCyTS= zJd$N6a0XTMf};6?-ugOj@8gSMPo|{bqED3JPJ9id3Fk`Ygy{1$MLy;~6nEt_R{?Zb z=((3hSbh~}EDdUz(fQ|xl{5B$h+h^$=HKmt7<_c8Cz@S(!g~_*ATaO-BUC(#Ai_?t zin46(&&wO~yxjK9nG}evXhRdq(V+W|uG$cP@MH)CFGwFj+@CY;b`_cDSB%Ks-ZiscM zS)%f%=85rtyG91BA;u8TR3xk`gb!peW-!XaQxI7TH0GR(Dkq(CzV)V%U2sajK_qJF z-D5X^m?YNw#;C*K9-LtTV4FT6>!6k7ldzmGm`iavQ6lx;qA{YL)Do_St5;JduOwbv zjjzmRT7)!ufYdw-TM(&4AlJ<3)9@KMMXH}9U8FF2NHUorud*P_q+Xu9a}hCRp^$)z$S#kxW1#JU#9f>ja4BC7I$*ixq?{$HkMmNN~-ka zu^{G)BA8|ituNh{mbc@qJFuMzxprjh99zNfMR>DGy}nMCKSNxa)Pu~?PxTX~1hbs> zoXUG>rM_$)G0Q!@JV0*}fuEN+wbzSIWeXntIumZ+h58PrsDn0(!FAT@j1Mj5!x`G% z41f9=F*uhWQ&g8IupK2w0f+0{)FLY*??x`!p8FdW{i8e)!hA2VVnqDn6U3;$2iHPc zy{FyRn&aB45AB46_C)dGb9cP1eIu6Q#XmR@UVnfbEPuAwymM+WgE%*^DYd=kZ7uRu zGj?+|HgT2l0E=YH@R;I=RzOZ)l`M6A&F5#;ZLKQokkD2%k4}i3K52GCgt&uwU4whv zz{dW0SNQ7TNQ%oN_D?lWJN4HMeuaRwrxeFmyLGhWJ+Fw34@j<;&uu=PHqrJ2KEYhY z(nixOr@0MC-#N#a+>#mW848ANQ(dj-V;l4ls_!Jqu8Hp2G>>jhRpf$S9$aC=*2p$? zbeu~3lA0p7J&@lxA2KP0)mB?n-y-2$@AE!iQO|n4km36jCKk*icB6p{h(z<_?UsUJ zJ`;9d?Y8SkoZ)c1m!rHHNFzVv^W{8&obeg(O}rJrK5JNz_@NGT34Xk@4fG6ei1G(e ziZ}=$?S2TgVu?7&@1?*#RVb|21hu9>KRH2Paxh%BM6SQbdB%peluIsNEcl6kMqtiw@m`&CGH^@(76^!N9X60 z>#yra{LV*+zu#V8i9VSrE^Zr#nw)zln(Op8&#qHn!VEXEKq=}`i6(3gxA!}H8n)rK zBYtdoAHt&g#Ighs5&G%m)gBRFdV%l1NF|6Va>>yE$HH^sUqZy3K|4Yi7 zdaVC^4wcP34w^U|=AH0C)Q2rz2IaV$%al}Hrjy?mK1Mj7Q8oXyFSD8)1k~RPV#E* z@w7Ffg&IW3Y++w)mQ~PczG~iNJcg;5Rn)>SJ=tZw-zUVktTK)<)hOb~(l2D|Q&~K5 zA{C)Us%Mb6t89t#6HvxGH;|!rz`Kjwn3dNx#|n*)&1xE8!!%WYSMJge1%26WiLjkQOAXcO9NnevuYyDVdApQaKicR;#TI)gSbgEg9iPR%LQX ztAxE$H$jI$waAfs{i0&Nc4TPRY#|Pumio$8f<{#J5ntPh5j9b|qje{dXzy8acvvzX zsN=1$tO|cHx$b(}9GsPiJcmUiC@`+TyE;W=;ix|pcg8bKQ=qMa6%0MCQh)s-<3cv* z@aTPFvSRzSGjWHOK!4jhEZbIuxFX!`5+GIfGkjBz6fZ`sqbqYOvq*t~!Y-n# zArU=hX^r-@Dg|jOCh?d#Sfj~Sd}BM95Wa8MOE3zHB-ix&_LJ(nM^E*z*cT`}#nLsh zLlY4zUnK9?)rs$fO0XNFzMM|qj(9}fm0?wSBVhFwncu^8LTmeA88sft;s}P=`Bj-i z>Vnk637S|Lhm?~*0jr&sa|i~NkVDYtEKQTp=gzm-g+sB|KNdr4$>#J)b$U}KWX!4e zz9ZB>F8z4rE0%f0MRL;fY}sj9{xmacA3N!>8l+)okQ7%b3gIQd-bmtktltC zkha2i|IUtdW;I+UZ#H-$!~LX~qHY^>3w&jXQ?_tE9~GFIo!QbEjnk7?q(3=7O0rtj z51@>v`HwQ5^M91{|MPVG7XhE@X@IXvFzmajmmfUQ8pz zcQ8}2FoN6v^X|yL?yXMNZS?#Jewans$8w2F#8BQ{Xfr*nDJe+W#(VCj^OK7)qlwkp_u||;Ydv-!IWQTPrU^=q&0a=A7 zF$b-&)INUG4bF=2l%UaOc-_X|pc$`a`IUY*oxUvX^!Y>*F!xr%6|Yq)r(mqV`i0{t#4UZ2-Pn9+ z|M{XY4u>g|wdbt2wT0&bRtp7X-QysT^9)M1rdBwDhq6cf+^VFo%te%d9C+`f$82M1=<;|Vo!o`cdB&IdjV+fq;mGz&{a4L&E~Xw3P)AN|9D~hz)bnZ) zhhc!0poFu-u(TFn7&hJjvlmzQGE`U>j=O;+kUx|C$pwS#=m|S*T<&>|;6P3?FJr@_ zt8i)B8e)O0sX5meafuLfh;VH#5H;bxQyb$pHr#E8Om&*WE$tC&-b&lzQTL=b)A-tE z%Fcyd9$&XKw9wWt;kq4v?t%s-gmPW_jI1h;P%j%H9+>bSm#M5y;OaTKd%9JbUf!64 z6R^RsNOsuTHtAlm&P^bceQc1OpaXwDEt0EJb2Dk484yB33)3u4)jtE@0>$o+kcbue2R|>xc$S0V$h(3WsI)=?NqDZ=0bU;MZdjNU zN2y)Zc5tESjKTq7Kp#NEteDccV{ch)r$>6W=pHc^b`aH~{$`9^x9?8&*DvMquCoxu z?m#owWTiV6?s8gkU7;(pp(G8QxurD1y!^*--@-PsvC21JfVy&c08!#SF~j#Xp|X&J zI{g(cd4c@B83Mw|QReX&$@WF_%Y=JHGsq|%If%+W#3}0~>x)r?b(|}7I81KF%EyHm z=@;;g&<~K>#QFHBRj^&K^UgV}BFPzj#2@+FTT6_}Dp~e?nC&*p@!!Mn!lGc{=w+TO8+T?z2iJ z*z+903az_Tdqh_z#(af5EexA@K|JCt)-+|MK(TxxjH^oIf;iqw*4kN`NbprfvlHI{ z$!ZM{e3nNNWVlKZPgd%qR|XB6Q788a>xQqH!^WGV3t$Q#Y#zPEvpvVnyZseX2yDOR zV(`+&Ddt3uz8S|8?!H(^IlX>o+KRuo9U6xoHI7t>>?S>Nq!=f93SBxuXLT2*_I{EL zorR;a=q)5u3=*eV*dqdt5%RY4P|^tzu5K^4oxkxLGqR^ug&4!PeMNh(DqqrD;9EQ={JC+Cx$+AiQKV6CNpC`UL;;r*CjmQ!JPE$=akJ5tz0%#o>X z;j=9|=R14v50bUHKk%hIdAf(<%sU7t`|8OxD9-;iD9XOV7%9I+SM9x_u!ri3DT`?M zFav?`C~BeK-KHk#OWg`W5q(p|5RdzF_M7hP*ga}`2{eaVC$a8Jw}}xRm?cLSOI9xy zf5xwt!r!%N5PPZA7TX0@srt|3S5(&J-=fj*4!x|T57?Q4A1K;UmQ>1|AwqZ>$kAwV>gYH}v=EE~hmS~n*1mwK7 zrw~(wm?LzQ->V(oRWf5Va^v|m1I~gG?kyKJ!MwR%#NjPp4ozu%d0DubBK^%TjhI(I z2tX&tbmDdw%5R4|m8n+2iY?2R7O{7V&k@q>ACo`U%p&35to8&h-b(gz zXVW8ks%mAYV`$H8YdP@lG1I>*o}A4ovg*I@T9vM7@32iZkzE!BBPGa??Yht9cUTbj z5d9F9=`BJ2tuGE0m?0u7h?z@|yIN!-h6WjvXUyiq<*Qjr!7Mx`VKEr+V~vKbyA@ic zKq&AkOzXF(r22LX&}4|2KI`*mfUtN7X7$f$KLIy=5!EVE9Hy1sMhZb5#vm5;M|MHY zszk1!6tB$u6u^@$ZZi)e3!oz`YT_<`fXMEdq$EzFEHF{Sax4K~r=EvHWasG~w!Eb2 znnop`Jz{)3WO5~7T`U0SK&J-+2AukPL$&Bfte@qP8svn??*p33=&Zfa&){n}vCXnz z7cC7QQcSZj2D$O*NXJ(Z7jX=-G?Rlnwo-YYshPNlI{F(M6cWuzk&Z<7cXYVr4?tSD zCJ6iqt=XwB&r#}8Bg|uFe;GQVvZeQl8_?Y1>r;N_h?CB~?Fw^Zt!#$VS#FFlLkG3T1O^|StU>E15*^|9e9 zN+FKvr~{7anBb=#>ruO04hX)6dX?V^5HY8T57sk`OG&2dxJ=P=z}<2?I54{(U)D9i zOXvN|yxr&gE0DeMd*Id{6`>|E-o_;deqjeGmlm(7mx)wuFz!rY&ho)2qHaXGYz3yb zC7I3Ix{z%|kG6}X$viI`Kwv>)G%Kht%M3hu?nZoL_|A2G{t0;Q5k}{ebPF`rLWL`- zpkS9OXn1qn=qj*Oe@FAar9fWP5nbwzF>`dez~7ifdD$Ip<*wFNiC`coigWNUfWEc^ z_dwc2+KKJLYQ9o`RDa(8;Y$L|1QO+y=niwB4ByU1Gw;Da@9A(iO(y*Q0-m=EiW4`2 znDyt!OO=Gjg`@{H`c4t}L4X*Gr6*{ZH)`11<+rdmT>MDM{h)h6&UOvX_7akOW4fgW z5uq&mdDqS3r_uh`Qe27g0w|G=sk!T299{u!m4~PzBB4$%e!@YYz9W8|Lw=~sJCBct z=XEfR`mirA!Y1N9CEi@DFhdb&OoWA3@~w}I64mcW=wRwP6UTFuGFhwKic$iwwydo% z3*q7U&P5E{3uS7^rze#6%C6Ph#T7p*A_R!n#E;Dl9WWL`PeZ3haw=#{bP5Z4pzlt1 zN_pWWa%hjJZT=oEN+W?Bg^Eco`gtFiO8?2y15kC5rbe!P6ri1~Oe z0R5nLBG!lATiw};L-}}DW!#UrR|3DZH(b}*J`~&j$g@)q{J;r&RmX1m)LKC5@Oz1xX%jBkaEWH|+B(dt7n+6@$FNzZy z=6JqFd3U>O_`#cP^hrrZn!@b?q@dG{HE@O}%@S2i?F({~W(JbVO_O#KYvGo(-=i(j z$BFyDIG@Q>j8Odp*;V}S$Zmzz{|(u#vCYb2{tg$S3}S`W`0^X1>Zg`w=nI)p*-U(H z?qCqxmsfB$LMRo(;M|wXLDE3f_goHTK3BcJWMV(0Waa&y>pW{Z-j z_0S!YU)mfLuxky~xuiyP!v~1?7Jrc4YQ~f5jbA`ySK%*Y_gCX*02B;&rMM{oYL3{! zE5&#}4t*o2_wAtz&x1V9X7Ie&y^`gY8@N4Y@CV?4?dHUfBry01ymMO*ZMTz86vz<* znO$<1(tj|!-)KsL|Hz^a<8ZELUq4T@LiHz7-Fgz!|pB`%%P zvq>`HW-YA_?;p(WycTn$Wp%2lnr}-XoFy6g7HJrf3+wIggm$X?4r@{bUu~~+ZbdwbL zd=zI1WK!+E%MS)(=6RHiFk!$8>BrqWwrfxK0iM*WK3nuADp_$MWY<6t5a>yXU(cx* z1U*T%M-#|6NG$9YNos&!l<#p)wkbpPPQeOoCA*OF`719Z224wZI?2XEhsOQ9_j-K_ z#TC_eSK%#BmvcHd^4-a0j()Hlafnn@ujxSo0HNJbAhfHslAx8i6K0J`!wYaZBe;-= zC(I+-?#xog)c``f>mO)#ezon>Nn_ckQyTls=nefD>DtSwOIfS7_fs$4R$tVli9~lHln|t-<|N)H-Xd-kxmB)t{(jiD;=>Pss*DVCbz-$H zgZLZT)dWJjC3T?S4hy?gE2H)xL@9E%=45APEhf&bpKHqmq+j4Nv{=K+>LDjhjNf`C zLVm>+)13Gv+`AV~l@&q-WSNfFhAEp2ISd8my{8oVIa`?5>1ceah|u0xX@m8~$})yYX|Xkm9+1!j=~gWt)Eg)3P6x z0a{qkPJc(LA8}~%^6!{|4UhPIj1|QM#4p{2NgDp-71_AgDTU}w3bfs4&-K!xd>+FW z_&qE)3lSwh8uHAECfW%YU0LyZqRQ)n5P#I%gIgd@3_4@#(>C2AM^d$A^OTL1o;SESp%{&A-;!wS*}BQ?_|>538pG zl1BoP^lD%G=g|_y;i}-lb*-!dYy4H|2DxBHnhY1iM!vBbWTF4WjWn(Tv!)v7#;Fvl zT@bk8q@T=^Sac{K!q#Piq%Yo-1uTOb-N?C*|9x4F72!M45elvvY2-e(MAC^kJBcqoL%;hH#*ToBJ zPkSs6UEh_ksEVFuWgKm}%p=1rnc5;8T{}Z*z`OQU{;W4g(;{Ep!L!@y{&gLQ5>ISj z4!%|;IA7&6T3+H{qtT8|@?rCz{u=W->lbTALhB&f?g0I7%(<>+c(c?C5a#MOsg`KbEEXYn@ z9mwp;>^%Co`2Ef7ia6XGw!V)5nccL%m|fGqnO)YunO!3wv#YnAp-TT_&5`T_ z4TK}ZN3S8gOu-&$?rEVuI-{7P23}3`2>hK1-WSz+QkgmFu@qNe&xqjNG4%=lKHCQ( znjiCkDmf@8q<5-!=ExZT;YXmaT+ei??}Y{2-l0CLP|rFxWVioO1c*Tdl1=aUZ!Hi% zG`x|m5J$$|p5Ft{Pdo%8TXS>Ft>(g<-^yT?+AP+IPUK;qbm%UBF)@JXh`?V$M0qh| zJ}og-!?ez$xB3kXUFH~Of>*OaKE;RY5*UqfGtT+l@FvICDtuQgs?D0hLWuGf%V5O4 zvH8IgW)3?=!JFVwjH{flDLJ#4`tn!3-`)aqGYuH;+5Z1@_5G)b{ZC@oRvk|a-IqcE zb5{vA0F%mAB##XySpilO&jtcE96>=AK}nzT=O?&~4VMO?_w$}>j%T5%vR=}o=i3FM zgPTbcfN(wX=}#`64wfhWr?#2|zmNBKq)&64^T-CN8-!THZ2H3MVm@Xl5Yg#V4*&78_ zlDA}&zy&5kS?ktbruV~S)^(%SrYR)P_5DRV?+MmH1`cJ0h0#%W&Aj?z!^9meS*io> zkfsimFXNdGf!O^7f8n~Q8EHOJbGo_g)^8rZMjUsl*1BZzH8LR()7sA~iMn zo#Daa4(}}5(e6}ecf8AvLs&@0RntWo&Q}cy`DynPP@m$W!7)p1sJZ$^nb+@FrW+3i zbriiS_rl=iORUuqgIdEhHSeUkLmac@{=w@)q$p+aX&gb+fRwIg!=8kIzbFis+hoUX z@bY6{E|uR*BX12I*yVd#PpmQn78F&}3n8Csl=?|j^E3l3SUo)8#!e`eI`! z6Tu2bpI*3bOt5VM;XAt@O6Dv4&Uzs`)&%;ycp*27hOwIn%f5Hne}G*j5)_}ZfXTmr zU9%?M`sKKTIHKFgE;2JGTo>OhARr`Ai$sa4|E&xO1(!~<4t;9t_kunKSk z^GgF@cZS-q=rBgPICw2vTKy#^JGPmn46O^c$Sqvq%cQLpGLuF?tDR4gda#nzJHMKW6+KoiaHI;IT-teIFv26E{gX-$J&6~*1f zeNPnch`)*<*jr(r(M3Ne#jn{IQMO9Q+Z&@_yD~`TmF6pPWyZTxUoAxm@|7WxJU?!QBo(_}*nW{O!NJ>g1h?@RS)ORsEG5)0?16P6izc+hx zV@YWE1r^YRRM2yB13_u1p2e^IF4uviZWf@~_q}_3a^2bYXx({=>uHn!d356mdB)I4 zJRTREAg*qBR=ha1p(+a4>}AgC%vwojhYh|D^~G@;mn}Bd!g1!>A95ZH12%l=St~1z zkLphX1+t@2Z7~~pS4W&4OoMk4>FG6$5jcw#S-&HUjn}YO%_>aNrzf9~m5EK)zc4!# z8gLSp^jTmu=KDgf5z(a^lbUUgqfgiblR_ZOPu+A^H8&he&N!3{5(LUU`w7xIt0Cs| z0~D+(>8LDj6tc#Bg(ikURdpyz>)dZjfr~W9Rr8X%@n*AhLM$Op$(~Y{HU%e{W;Wv) zfo2FRIHUqroLs(3L}-KbTGbZyaH49xBZq=Ex4(0zb89Zzq) zDf#kN_|FHa)$i?|PCoI;(abH&f4uHZ3aI^jyU?ZKK}H4 z-_OOhW|g=#6r{zi;kaGoFNm4kYz?7LE9UNelPZm^nxPiTNGzfW6h#6LR~P+lZAWbx zxFBN?ZI~-3cxy}JQE=9Ti!kP*Pl_vmJ>R7ao)w zu-y#J1v_I3GHt0cT%)gM+n7x)pTPj;c@4{lF!6HxR#~denkeXr-?9~*WHG%93WYFj zo*=s7#JM$Rr3fvXtK#x?4R(N~-yQjSx^o29*|PW$kI$ysl&N+zb(9)!tN?o@`U1Mk z7`9n%fHlTwM$pm$$}cH@TaK=L6VtnYdIpw07E=H43~=3|99eiQ@*t-bVNBN_EbLOzd14P-$O>EXPe zE%fk_NpN`V3$zAv!$IvCtYMEgu8nIpg|-Zn8hMv{Jis~(q-mx#KEq>(x&4SsJldJ3 z059H84bo(Q3k45SFf`iX!l|W3+_!ayU9);Yi=Qm8{j3^4xMZ?tpTIh~mvwNHFcF3} z9M>KAcv4lIEOB4iEd7SXEO?s6$H;VdnFXj$oXlQ=@ryv!iuxWid%6&G zle&rOsk4_c+I>Pizt|Ea2~l2jcLkCO@l#ET3mEOyp1DR8wwb;53!evW#YEk$r!3E- zCLpIE1Kc%bB`#JJv4*YfsGt^?J)D03@rZmwyhWrUusU9`qzoZb7TD;8``*OTuZq?u zBegn_>gjuI^$qt#I{wn2Plm^veFz1AkViJ8%mDhOyik6cFA!6vt;Y&N=vAJ!Xw~vM zk^Z>Uffi>l=YyM|Q+-y>jj0!mZ9+P38vG(%giEet?r+Z^4(J(#Dlatt~YuOxi^%QL9p1>Bz! zTnxt(77^`sW~t*ITLfu-d?DA?xFrtmG~G>q&~nSJMAYiVULH@&c>?eh69TY0=XYl~{*Wq`IhWsLtAEyk2HEYA;M zS>f!tjx+QvEVFvqB7YA$xhp>rGH{1rG1^5>W6KOPu=q`XB7ncjMTdnc=&+b4j^`@tRmG;$Vbt{qK7t9K<`+dci+CGzFb|- zHTvxgq78VnCE6T(a}TsYa~a9r@QTkT;8IFKyzQ<`S|*CBh)cg_1W;QQxOH+|C#8hG zT;p-LzGX$Vux5i!6?bp29=W|)5x2huhc*OL=!It1o zZR}4?7O~qI#ft)nvj`r=8h$^?2v8yE)co7BVIDd=q;#8|b1%sw<6#buVt1$Nq$ z*B?F#&JuaU=~>}xEP%9ba=s2r{-+GfSA@J zv59c{ZdDu}0p5zLR8_(T+=w*Q6^#;hif8ds+stZplV-g*xK4nfCIkG`i4I+DkSR4} zvT3uu8GBd4CPZmAfM@Y2KhzcKd1H0ntN$)l@I4C(>}a_1_4T1$A9bQj#aRIPQ18>F zn*(F!mmF|iA$4(%X{6xSt-&~id#fI^=*q?4l7j_mrteDgW2SMD1pIpretv0%F~J}y zr10vZ=gcgQPp$055&A8(tPvGP?VRQ?S1vrpiaCe{ZZbjbadzQCJ`|Dd43MrY7fL8? zgE7-I1bH}miS`>p0M-)5^?!N>uf>9$W-9hMI_~ZRj#u}s?!j#wK^<^C_F3s(96p-P zQ$I2_6y2_V+$&D$uPk6Q)Ng1kcYNyRQ5c(z3B0$~Bx%&IU`6b<-&w?w6hPD$A;Dkw z0`0ZEu0wzwO8DUR5n++>mVKTii}oOCQO4+XQI+ZZpe3>#&dV)H~q6q~`HKyH;= zflT@e=p4y^zR7`aT{*qeQk4OM!O-u5O|I)4Y@VLAqwSO@5{B2x$6WHmDyzm;ACVER z_mqa44bxtBNccXyql%3|Il;YC{WDlbe|ZK%J@c&~7Z!Lx&wv-uqlE?89eN}UVvvDk z(?9xK9K;U~=oth%GWPfU9(sQAA{Y^vW&wHzB0$do;*V#Lb36t6-msfv!sgQ(Z8tNdEqb%B6%J?)G7S!(2#;Mhm@P~u4tML#%Fw82 znJ?Qd3{_vz{@g35;}9`GkM)@l@`kHQg+WkKmuz?|XNs#?!0-LxgvFmnW6UVra0AYZ z;mHW695Kd4T~z3ppjBy*M2Xjd2>Abxut}n9qIT)Xu`OFHgt%u4Y8|0<)!CiEmoUE2l|K# z_`#k7f<(tGL$y=-cGrz0E5@!Il`UB)43*)ROXmBSyek1XD5Xv};I@EWgfCtgyf+G4 zWV9(%i_8|?ixOJm(uNusp=8dmQHlL^qoz>SVsxAP^zOUj+42Qb7;hbURKqorA?+c7 zA_u>!9(9chCIoqAl9h=j(PkQ3iuJy^M(=MyrQ9U#S&Q|s?`lf63~H8> z(``$R9IC7)C087O;7rjSa5!GzKHw5ixc&QgZq@#+X#0PDPygsQd%Hi6-ijF7*ccfa zTdO+(_byGH{{H?pC2zT-iJ=eoB-k|AawF794SkNC0Oq^`&VJ{>N6&u0 z-B9{#uFs+vYcOwo)k_UH;8xxFZVssF*(Prt)3a&$h5w_kTpEZ z0Tv4b6Imcna!#5d=Th%u?q`g>zypn5{QgzZnpiAXUTY=`axL6X{lw8AWC@{r7|}xT zECZDFA@TT!(=+n8reksHOJ}Mlx>%~(U*J=8m6t=V>DXd0*^=Nxtog)e+BOr(e2gok z`m2?13!zQ4vkc3WPqU?ayVJ@g&AVc|*h2X`e>$SuD@Z;d`;|+#fB6jEe*^Ypi0zn# zAr`%o?7u;|l_TPOR^C z+ml-|$x>C2rpN`~1anv!nHf{X9$yGcR~IjS$qj#&nPK`YlDtX7(Oe?mh(mw*MzYXa z_kR5T*pJ*#aDdESE&_9$$tSs;XXGQC5O09;R=HL)#(Kev44oN5Q!hkx%)F4SXZ`3TttMWAZiNa!G`dS7Hs+(*rLbvomfH-YVg>1f z*2*o|iKM*e8_Y1d_v)iZvQX#!D&Oy0g#1vkXxh|#_M^+4yxYog#omQx^Aeo$-_9|J z+IQ1df)h0)xQfQI)$M25fa$ywx46fid*zbv=?OYh8?_UacPf!WnVV_9&BXYSQ|D* z5AGF6u3F-8ywgfk|Hv1=io{v@9?E<{x!M<7;~z(aH;gy>!u#{n>n2&l3Oq3sh%hR&`-l)SIP(tT=Qsz+*0SArx}T$F9G7;S zje`Z7i?8rX5VlcTyn-wK9=WOt+BH^uRtx1#O;%M4t7>Au{Ce!o%qcSvgkD}>iFq1W zu6(whx;M3RUO#q*KN(cMDM1A=#{);2c4j9~8p$<<~lcvWuix>UzKMna?Hy#>A$e^&sy{>dfgKhlfaiIiK%u zT%;fe;zTm2JTrzn2;4wC{JjlmWxwfoIFZfT6n!p#Z0Lh*K@qBBYbJ@iAL*ejp38xP z=gq5E75eIDa1xy$_Rz%6hm|XHDf0|^d|r$9gVLB2)tP{j{GJ4$cv==L9f^~yCis#8O1j0 z`3=LFcZcGuWdH1`cNByM2{70Rq875oHh|z^3xT( z7qw3&I&5<@)qdC&S=xxOd?-Hvae{4Uusd|CW8}_x7FlXmi20a*tyx0h!9h^kmJ81rE~|-ZoVuTNkaBx zuxNoH_%iMsJuWW>GBs10d1z_vE*3otBC~UTj=X~DgVYx(;6R1ygRZ|$H}^_9m+V-d zkoJbtdgk*vnbWy|TWERV%L~pkAnih`aQ&)6VV#x!Qfo{|Ki}dh$F$EA!FhP&9+904;{l`K4$ZRfFtk&c>1>vc-Uj7du?viL ztqZdIkDcbtU%?(Cb-685A(S^0omy)7QH zZB83a;SRBPuxni1Fg|?qe%tt3Dwgg|b`i!`SDj%YnApyXi9)uwKM+T&b@s$M`vuZ* zHm{L1Lc+Ddj?$;b2~AfTUITV)Br+`l5xd@FUa8nC7-Wzs{7Man2^sPxQyGCX>Ij?v z@rQ5EE$-W{3m9*0i0I}%jP{FsB~>*}Q#=SO_I7Zv4IVS<`ZP2@LHY6O?Yoi!EqMM+cL-2G_x`_TWgZt-*UbqPz5N7moE4}2$r9c z6l=i(|3X%yq}mP9GOPMEq4%PDm9ejlpJBKbYB`LCw5@yJb}tu=gD=GhYkdg@KS{5A z!I`75Z)oYQ=Y?b%RZIUmm!+n`Sn>a{_D(UPgx$LCY}>YN+qP}nwr$(CZQHhO%y!S- zz4o7+}50QYl z%38+Kj_JMWImAyalK>x;OJBza{5iVbS8ZAYwK zJ)jIe5Mx>Kw^9#LT1(sw%W`gqH8^P4xU6TNNB=h^SnRLM7-4k)`oh6RSbY@>#?u*y zH{Df2y`Kfsj!bLx&zeCW8#@nF>p&I9S9UTRd$-VlmvMdzKPbD|Ove4MrPKJODPV6V zXf3Rm=32V}*LK0s&2dtq893+{psz%3!1`uCoSAhc!OVpeZN8PHLWvNUpl#Zji)8`V zfi2K&fL_Bl*!Y~o_#BNa?5S?>q*0uL?K;3K*8QKWAgi3YJ2T(Q`l#*Kg=0nI=m5|- zKJ@$1l7rBkdw3~dw!xB-9nHfZM0LM%&1&PGc0^9-bs(>Z3gC6=(NI?`n(N_4N}QL0 zB2Ml=`j0RgtA3+<_K|V@d`@A2fh%Vyr?^EL>;&bI-SQOaO(an62}b8nz$+eKJs_H~ zLZ3Z{33(lE}zGQqk=1==T!*<$0bN<_5R~mYA<0} zV+CoOeq?no3-^|}(yRdhTL(jZoI-iMNzYwlKnM1(5AzWbM!oeQ+7@kysWxwBn)g-`R?%&Iu}Mb<`Q^hz`m@{s7d+GDY3g0-LB4t zv8;*ofFB5yzc*H-SV9LA$`%_~ZxPIrI@$mfb_^l-4KwoGbdPYCSR)s@eHs@)+~ z@%{kMqP1NTT`C~`icU$IxKz_lQocTJvJVU(tDmEEmW>`OZcoy-Qq|A)KN;3R(}-AH zxm7#pgd@YC$0codfRtTwpp3aGwPmyCRHNryL#TWduYmjL2usG$a;#m04$uif@fr#~ zu+A5*ZMxE9U3&+mmDkOvoY%n80?%C{xDQu? z)*i+s&9eXNr8x*ICI;*-WBut8M2*ljD;&_g{9KF7YP76bL-(tXOBiuubazZ`U+hM;ol&|T6}{H~OuR)Vw!~H23a)1pzFp{VdKf!a{}O=PxZkHOQ5n3a1nt`BcUqVC%z9}eJ%?bS z-d#R4*`8&(_kJPE-pp+rz>2hHWHPqVVPY!-!^P;FyfM0^zD<+6YS@<9#krGUPPH>z z)ic~LamN4&N54t}4L`&!u?Y}H_f;mEXvzSt3e=N;Js373UR&O*g6_^F*@yKALjGeI z>Rc1B)=*$F)+A-cR~VqTr@tRVt<-8}CXt8$!OHs4!+`8!?c{EUVy5v3W4SdP!{$`I z7uk0C<}_9xEV$CYWuLWzaKxLmVJMyIh7>rU>WFq=V5zTyxf|Oz{{Xvqak~kdD;`{Z zp0@3NeiV@+IHjDdK)<~n>vrXiR`Ma%P#EyKUneg5OnF`go$CL&+T0j~eID)#VV!^I zZi2ZR{fg<1cXR-&!Ec4>?ER;pJPATwT48F0lgFL!_E36XAaZJF?Xyz#3)1aryxg+f zg>4bLee5>{m_DV}IP)RUdbEKeYe_B9tv0R&@~Kl~Fq$q>Xx1QNx(K_wmu0w1Ak`6? zk8(v{=5Mf}qVBN7Z>S3?-Mh7{T=tfT*ipl;IJOx;sDpDo7!1Zc6vq}-WW-dDy_tQ9C6fIDDq#4dTbE9q(@5H7As6Djaampi(w<6iHXfO^(Tl)<*(Y2rnS zMJ*v(Op$@gh5Rm|imOdT#BjvWK#|L&8RPWAcCd37F{~Sq@~H%k891W!{QTFJGd--x z)~r}c%wv>0ryhe>?y`D9&qt?*tsU(_t{{wa@Ib=66pS<}&Tj9+hbcRM-M!ZJP47cO z(Z}~cmp+TLW^5IRL(dKE=Wxo3qtFe_qZL@kAP((?qV?Anw$N^g4Lrf-?)?=)$q$+- zl8)2a1(PuZ`<PBnJO=7c!?l z&;BqroVJndUAfb=%3~3KQ2KjG=Awz$CZG_^RJRb|P>7<+Mln7g15gXJ4QUwpP;{ptc59U95JPML~s zNO2bLvqGvly;U6xk*wt}GoaeH0o435i!lfZG@1^tig73gUEpU1?r?ylLa^%zGlm^S ztE!Z`OyMid)<zj5j&wj_<<*uyYWW}!7JbLZ#fpu<6v(hD!8wv_ZC6da& zbI4r1|K})%eYUB%W%RDa^il29w$&wg%(~qgO(yi-fm76-4UB^7_46HuqfWG87T#AN zdX_M%;;(gKaMS4aEs-jWBQ#$S93r zxN5`hHC@K%(>Ajdx=k;>Hfv;)v%mob*@Tr)HjS_KN4qb4Ayz32Q%3hZ(j#+Nirp41E#vUW zAt2;MF^4IWj8+{jhs3_(m$gDt4#-f#D*j)BcG(%iR6UFED)*%HxPEf2Lo`GX@V0i; z+xZcf*d0VHP9m=$g6j{B9J-29VEV$SEQlRjRk7GxtYTp|5PV z&YgydC8Do4Rv~MoEfs(XPuoZQhLE~)ycTAiZ35qlC_Q+MhZA=ap>2vy3K=p(q>sr4 z@6=DcLtCM3qVUIP(c7Y=!mMdVxhm(P^X}80&~~|PIfWoai_FoU&EAG-fP*yM4SBR{{FP3p1Vsw5+umP>Mo+))nVLD?w|T3yslZcxjOVi zoPiabiDloW%--qzmY!UGxNpS8XVGpJnQpp&)lqQeu6MD?_Qps7L>gF!LJw%XL?%5= zo`{AjF<4t8VxezYZ|QBRYr@>U{5W%#^;yCOw=C6_61$shDBC{N5WqT|=AZys#~rurVI9)<&BXTTtRBNmt7!@=OEDMgSN@8g<}XDv zR@;TX!uWbm;_h@5#maSzO{tT!$XQV`mLkpF7eMujBPL%wOKh~o7m-@W3qfJQf}$)j zfdpvdqN=OSnrW9jO|9L+dSacV(xl7S@nKNt;vVGFBGVX$;(JU;ITlj!w;cJ(>dK~R z^gn7-wDlc3g$a6Foyzmm$F*o`Jz)h1=&aOwJd_!Uwk2r2sq31^$*Um7TnZo8RRZVA zTsZ-xHtlevv2*=zi-`m5A0Lp2`80-E^i)eG95o827LKVppL9$Ue`5(AItvEQ z9>B2Fs)$mO-#>$(O{)pU9^wN^`^w=wdH~9rN~4K{>)p@Yg=E8pt{9WUq?wN+xQ&CI z#Mjrh1*tUSv(5f^NTv{wJtSY(DminEEadYEVxFZYoiN+_`;E=&hZ0m_6c*rX$||Qd zk>i~kL*_)GdmwULTGkc<5)p}buhOd)msc%L5snVfm>Ggd-53kao(yt^c!3z>ikrwQ z$l2yrkI&|*>=)7>5@B7b+um77XhZVq2v7 zqEfF38_jHf(`b!v;q5;7n#9alUuJAIaJ-W}ko$({kteAQ3V$fa31OGIDf+)u{; z-JU!q3VP!4wy#w1gy~RaO(eaa^@4g&@Kk|Pnm{>TbzB4AT+~jWkEI?WTf2CKrfl@W zwGrntRuWheq)07Wz#1abAJ4Zw$N_3u=$iMo!VAL9DYnZb?%pCRa;PE}2sRn!RDvgU zQIHULOy=(?(~eGsR_P#CiR4h-!I7F5wX=TdIuZ3qrDfyr#M}X3INnH{9M;|i)!x01 zyTGB)Ouss)B(h!M3UJNPPN8L+a&qyAEn09Ih6v@3t0JncTJ8XAg$ivLC8-#cdL14) zN=2KHa`tc_n_+5TIxf+kELJ@J`!>Y=?I`pw`oOWn?o6lh(J=xP*FJ@yE_E$EZ1VqFTX&b=az9%cDf~vKLe(h-3bp-Y#xaU^%kV6BI!Is`WaLxpSk+eS zDI3J9MrleXG$GsWq%n;CFr^K{k*jDc0@ukdMfwR==%1isM*4`@24KVScCqQws&Zq6Jkbco+ zJ4nU6pOf3@Nb%rTE)A4ar-^JN~Wpd}A!#z^lGWWPAD(|my+s3Uu zw2AXrj{#KqbJ*}$Y1OY1=j7utX86h)xdURV4=##9Y2!GlxvilGKaAwae%kWPN9@^u z*NcAqh1mKOBL(oH_TTx+>aXC|4X0v+)SrId#n4VMsI7XAe#$)cO|a+PgHwO}GUs>d z6n9)ES&6Snc_onp8xQ^&548UDg8f$LthoKuSo_Be1wQ&`yvzaQ zQiI?dCRpIIcf1p}bri0lR;cER{)%(EGuA)hQWLspxdm8qr6v0Q(5k})2L|PmbF>o| z%xJ|08@sOd$RMyY_Ycy_UtthG&;xY{m1mBK-W;LjrbQS!3Yv5O2@*#(>65sNFNGPr zrnjSF#BCTBE|m0+XAWTPXAOu7`l$5Q@b%{O^+N*GWuyiI!U{-B3*iI^?9&17mJt?g z)P6zD%sW{EM&KQ~Ku)L(r1QzUMM+M5hY6wjF90tAHXVRj65717KUk;yQ1$zI4x0S8 zq#BQ1Ccye90`m~7apaMfSSc&&q$lP{F9vK%frF?vbqiDGx?!6sILml55v91vs@K zrE?*N_ny*g5p!w_ehftENd}YayW_>2%1pRHWK6;NXVEFN8{%nq6&5!G)#img84+^+ z0o9us6E@iLZEsSXT7u=jOXN2E(fKqOvo$|5 z07EWrCEsp?a~(CFS1onv4|IiBo4Y&zuxZ(5A9DLV0P*cb(;t zlpA)o5Ap`oT^wxRJ)x@wem6*UPsz~77xTlj1EKkC;U2S^+^mY)4Qm(QT7P@&pZkCV zy=agJt5zEKhKgz-!u%iuXhS)Om^qC&%UqH)o3=>ajiR;WGMl$o@M)EoVBiP(w38kpU|7uJ{;COtY;n(huxWVQ4a)lAI7>*l8OMWpT))R zDw#(9RU$(p;O3{5+CFSHob4C?^Ic{X0g#h6UKEyxi{O?4{Q3ib`$Mwb$H92(*9O36 z`tWUBO_H961Fb{LImJ1D zOW+DPQX)ElKQf0LAByC-08}I$aA*O6;(We3;Bn^OU#Vcz;9CZ5xfKtEUl5#DMF6) zbTeMAiR3!iyC3x)7DKO)4hsUdgd}tUk%#~(s(|m8i?o0d#vHM^hSJlrs%ar!%){}( zV$eNmHx&yR;X+d7j8(;i0*wvB&i?alUl`=~Z8LQq_ig=eArlnu@v<)2Ix!Ks@49YVs0uxlTo5Ps4#HO2dNFl_cm+|RD5W4eLF^iU=|4QF*X=N-vz0 z>ao5CSgbF1fSxW`-{OtP;sd*K0pi%f18V(W=1>KS={e^eP|ts;=Svd|2ktdhn(qTK zGsfZojK!$qWA#C$f?gehihp!qv_8;Ogwq^$z2=$NKi(+FOkh zz5ZqhfM!U5e5Am$4%EE;y59ahZ-2%Pi=AwJJrT66YkZ1YUfh-DI5g$#f((csD}mw% zeqUW#TQ&3%=@{O+jZHe4|utN4&&_jCgrhUPZ-AJWJJHc+M^$BW*BQR8w^Lww@+>K7lIJM%=T3+LUuY#<<_2L6u;#wi> z0C@`;^{AqCi?B{xoIKmKh<;0upeQ&s;_&kOo}(sLd>UyUD$n`PTz!C=qnc!OUWGBD(w2V8MZV*B#!42aRaX`KS-9!qw}u4r+NfcP2agdH2%O{t zFO!(#3x*)BY3IbUyYcrwf5}g2SVMm@A3FdJCn#j%S++glW7q~THgy3kzrq9-tDF1; zh&-#9ee;{eL&^4BY|wot;?TW#BA*28bE#u~z0&e8F7%kX1i)U|$yZpBUAGC3Ua+YL zAoUnLK_p*bvwbr7VLE-De^|bOKLJwrefA)}P;5s8?J#gdI)Deh1o~y-A?5Q290!4E zBAnf%o*cvvp(GLH7w2*hfKt;%1!|ggyy-lEErS5HL-SzZe=ge-c=xM@sCBNmbl%HZ zbj3^UEQh71%8FByMIH`=)kzz%XYp571C_D=c$8))rS)dR0Qrf|4h6H1M2;GhY#}`~dO4Uu?r57PlIb$>eW%^l6+O6|H8FuZh=tIsT?NJXy#I$%(lOka z({ha7tEsRV0GBa2*Sc^ZFO)(YX=rFnfnEsx5$-sSR8%0Z3{O&IP>wFN938S?h@DL? z>#t!*IE|DN>uDSyA_Ga%@Hw7_Uoma(jm*(9Q{;Znep}WeszCSxjL~O0;x)I*#)0BhDMF2K^}dL;7O~dd>_Vmfsg!helcSbEkmO(}q=O zBq6zd-q#A_5`+TGD5dx~K`O#kZ0x%iut!WRbSP~f1&`oN`iy#T3_{^+x3#7ZAEtqM z+%x~h4ZR8@{!jRCITd0p5n%&FFnd(|y0Ccmw_hOeOe{gef*_%k!(hrgj*$a71nLRA#(wpioub4O8QMNvmWRdKa^Dl!gCVON!IRFy(h z0LOTX?$MUY*k1tCTKOuN`IB;}A#tq1FV%taCS)>~piw~9@8eCX`^&XPkEkT-;d2RF z5@xc&4`bncoHrJ9So=6bv`roZ|2U5Xc7=#Gl@*QSFTy42Ek3fz&P#F%*J;~4q1vO^ z8tA3y%@Z&pAsRVA(R8Hv?}|2Vz`h^4lEe1}6CBEh0pVB{F)WK3m4|@toxndNZaeEO zjJf7>g0B%&vO~;SXZ>5Ek(!>C>wwXIueBM55Ts-)kRrGxt=$#6>>L_^D(f7LA8(Ei zM}dDH>#Jx`Y;m)|O#ru3G)MhDdoUaDz73L{e*`hP?8xlxfC)_#8_9>Dc;>K%Dn2VU zj+ySpahB*v;3a6`W@DigJ+;gbVSemnl+fEec>J2aYa7sa^3?PwrQ$6vk@m3)8~wf3 zD&X0HiZXIjPssNK@0WDBwf&`)Pn@^f0Th~gHWgYQ`n6oT9I|MSrEQV z_X9gVHD`(A1ZJGp#JTu(G!x*^nj^9Z?7&wX2{yjyCeZ2*{}BB#b;70h=zq zCfNX18WBdZeHRpRsGv@X8>BRHBu|&??{X*+9$vOj{lJ_}2is3_h_6kP8=y68ci{Q} zxJ{!QtaE6xPNo}RHd1xZ^?=z;uq#iPX~ejRx{xJFFAn<`g#mz4To{yFZlELZekL@? zuy8TSpxBCRQ3tYZ8wBmPLNb{s|940Ztit-dlf2N+_zu79fGr=3uq*9+#mXL%gg(#@ z$hcyawF4gu3=xF|pOKwJI5p)KuI~0sV`p;oc^4|1k;_IQb-ja3%GEfzeTF=B(t>qhdD#QH3WmELFqfa z{0%sAxQt%$3ukh~j9%4ScJf|s^1C9oGMx_fsct9vCJkza z(bD^%a|H*4;s+f^O`U|~USc91VcB1vWQA^YG222($S}5C(ZTy5l?TyLd_iY@ zMd7rpaN0Z2g%pP0Gb4fB>0qyV+m(^W6b9y+wrvIx^dlLb5MdzkLU20&~&hx zddwJ#YIcZ<=xMj)V~Q8kNU+uQ+qG?!qelnS5O77}CUEDMIc4HRA$%!VC-*&UtO4w) zPg9r6uoC}so|vNZiWkei#zOKZitj%qUx&>o9EZ=a4W|!ZUgsVygRyAGp;7N@Hs2(> zRegylq?>2ArBO{fg^D&BlHIgH)*1j#$H3~;a{eWaivvd|tPoQ)h}5`dad#r&Yg-3= zx{D`wp-G5_&DjDc-Y$=cvdrog!aX<-m(}5UBb!c&0qlNGz5}ODN&Ynf(jJXL2eaMf z1CVYS$<>uJA`PpeFS=5tN-{PsO{JBt724b7F`J5}FE|ewi(U<7wGO<5p zskZF`rp35{2A%8ELhE3voiGZ zxd27SoaAY~jP3Z@_*&TiwiG18rO0`NUEDJErTvmadYldQ%ng5-us%_v9y~~2Rzt0! z&uV?#J96i@{#-aBJtvq6`Mn!~K|NVJKmH!n&eehOjRyblo-?ba)WRWa>6B(hfBX@% zq|}bXtBMXYzw3S2s+HRhz%1`fO_a6$sHAtvY&8WksHPE_54!41Bqc6S;Bu*Xe3=#-b1&6g(Tj z45kj^lEa^Hj9n_=XRyS@($AGQaEdu|euTe3GSQ2HnwIQkw}ExvId9*+Tc zB`NTylCk6D7Ol_BU8&JcziA&nc@E)*>wHPOewwAa(NO$mvL&lOjUyv=`Bc2$)J!CG zCjn6Qgght|9_)H4q9g6zGNrD+XNyGx3rSneq=ib3vj)qJC7KuHGZtYrLTu)vC@-)x zCRLc^cF1(7Bsq(@D7`9ZSY#?TKfTEXbHyrMc{Tb$j62c>#XT^v$>_+YzA+TsK(Yzz zhz;~W{yzKUbi)olimv0^1x}sJ*yHH5P1e}geQ|IT+l7c7+uS#AgVIgj+_!##cnd~6 z5O|)h5Op9dX2C9T%G?!yAEl zbl9eTJpy@z=#IXnOY0k@d8Fu;;f-;d0DAN14);1~ddv2P)l29bXgjuhsC)GI67Kca zn@|&uWM*?+b6kgK*yBRnOVD7{+7JzyR*-chUDy#jp)8Y^A15hV+;_CE;0j>54|l8r zL>rRbNP|MR_Poac;d0W&wO(?_D2T^tk@uo7T4(J8y3p3Q&4q(5xnuislO@ZQv zn8!)Zh-YquReD2PMM|gMJ`9eI7EGQ-PwF~NObRX#ZW`fbS zCVnCX8l%Wzu4ye+ZmhjY1u4l$DsirPF+AYm$QlZ{hc_Vis>}Gqn2H)DJ_D?sP)nm%PF9ydI4s+e)0;8+Vv@eq zNz^+&JeetCd;`aE_UKDf*hD6GG*@;td04hjUSwyFxvRMwnYR0}*`3#wMg_0>ch%p}v}S5|m8p=|=HB~|RXl~MA!VCCrWQa9a#+DZEd%V5 zSb;{(1?;+5p(>gV+6fMkCF2oA>e7nRe6mX@7CDi-zILou_bM zfWIu;rK-ZfT0q^UpAswULfV=|-_)%F=~(c-eiib1RszYJ8R?}pq$zRwdNx26-y7`0 zSwSV6a`n<%(v^0&j$IjWIEU&krm0^D+1fGx#Lbr)8-+LPVF3gn#XdXxWk={lJJWs9+KI{6+ts z>eF{ZE4r~gkz@La$Kc5hc|9c$1)DL}*Cr2XJKSSM0zc})EWUw(rb6f%rIfCe7=y-{ z#_odpbmZwait!q-E_bB-GZ@IOL!e7 z*~gO6PNXDCwR71`a*QUY9^F=x5nNH!IK0v%DRWqtT#?0-OHYj~6%OGI#dA2_pFfY5|J}s@{{$D3HTX?%HzEE%;6gR3 zI!ah7=)SUm)(~2fLN+A@pjMVi{t$xI=9HVDRN`-x>6?}-Niz*QiPwx-AZ2K~7jgG| z?nlwz{ASo*TY3e%?7QwqF`ThSUb3k&*o`2Hw24m-y=OkTuU2y&Uw3YNf71Cygu)Fr z>a8?v+e>XyI+XfovMX(>&19xfVn?brq$Hg)xTl)O`IG{vve_0MZq&W=W2wgY9) zFg&-nOnDe)=~3)m>H3OeqDoCVm!PjEWMi9Lmu-6vC$c5N5 zC?zH!a4=)zMHiZf4^3;RvsrX&Aw$gL#uE+5wZ;-7ZHZ!l$Ki| zWA|&#FPV&!M*NM>e(2QUS50|cgoZFeH_Ava5u)|c9Wc5PLR)5=(2oTwkq0!0nY;V# z3z&{LXAeXmiP)eO)KET84Aiy;hE6$BmlFg#C2mbZ={QN#IJsRJtBg2x1w#e8NVGLL zmoFxG2$cU>7S~kTjA`SIG86=KPhnT}oGJ1fQ7N$Lu$>SAnbFnVVUYm59k^rHxb@>XcXr<}cZ9|wdbiUaP_ zNpmXvSTn!%!4^E`eUPZyJA}aQfk@RmWd+`tbqJDAGB|*b!N1QQ)XxaJb|dL1EY3PKUf1sAi1BvXly!6Iq{2o$!)&ay)7FM7(R6N&BO!HXVFlz>ptF>l z`S`5NBm@pw?X~3D`4aY_N zPH)8WJiGY`*oB7RT{{{5*;$|k2O?P^LC~uvody!9;TgrhpBM;Ur~quQF+hz77@*ua z&GiH+2>!H%0HMHI??t)W2)kdX(P!}3DbpT3qSS6OO2`0dy0H_po?G|x&1N;5@gLGh|(5DKgyT7 zQ;Cx8Pw!YJ%VN4FnHmy2$0bc<*?P@7^2>&Nys2$FlX3TyDB^5_Q|ng4W(^~V(1c73 zYGjSTWprDHeZ%co3YV}Z zzQj?pyh6T8_e{PB>OF6<$8_>1hI?iIs9U>CRlKU5VroCPPiXNd@{gf~n3`lZF3g#K zXOLt7w}~D7|49Ri-%A&^QRFJ}bI&?OuR3^|7R2vi_oSHTeV;L5nT4C^66PY9iJP*{ z)!&!Z^h)+Y00SWK3xf{}!%Hy4h&1XI_$(Sito`}4$(YS1WSxOI3--}$QX_ssLuLI? z_lSyl3=PMpE);4X=b#PLQYV2vTJ5%<@~Q4}U>MYS9M}<^94+xFnre5D7@YasXU#cZ z>|NM#I6{SJa~5!BUh*#d?2qXZXh*@@4qI<^V7|rPj_m;*jJ`4&lj#bHS8uVH?4K)u z$c@{L_OczdF)ZfBSiXThO5colRSi%0LW9asbGPT-_xV7KYyUAn3fUQzj&+ENlp)+3 zNR$sdr-J>4+Dc=jau4SivyKV%yg%e##%PVQnWKmMe%9;w`^x>7`J?-<-1bLUt|z7@ z?uR;_NE`1}MVZ9u63^JJCXW2;v3KX0*q1S$9MjAvXJ6+KMRXX_URkA-Sl{h=8IzB) zwxK7g4HO^Cr`k{i4tbPhxzQ!ef5DKL@v~D1zr~2`SCajI7l!;#G5QY-S)=aZjk1FB zkJQ7sQ5uy$Jh+4!Ko`;Sk3s_gwdjBuQaCXw%uaSUTYN$rgPraltt&;Fme!Hg%90va zg-!vjiugYkAYJfLt}Qh?uReA^wx3sSXFIRE#=BX>z(3na2zc`~%lQT(NC!MMrrWI5?YK5O*U~ywT04%GS+-e1p^^T9 zDI+dW%E-#2jzN&M=jp?xxzeWsAJo2>s#$@Q5Q`b%=#aMA&?8|UM!3XqJVdJ&!%NSj z#`!{}zwnFbhH61P82Og|sEk)qV5oi=Zk##)6w6;q@a82;5=n)s-wcz$ zO;{#dYpF3%=qfS1a7T?MPDBHq%_^-`k z43c90Et~b)_!?-|_jO#fs#Zzz^g06oRLXKxTnB?>&@4|X_8&+XCVA4`RCD!64oFHv z4b&9#VMvrI6m7-m;!vpu#R2Zd2U)Z0Dsx5qcjm<^M1kh;{A$Ge5guYf^&Ok51D+gD zMNw0OVQCTn*NFMY2ckU zShdP_!GUYSCCu7EPuUC(B^}T0a8pJ$cxOgy-Bh_QljyU-ey}ktlp-4$E)il@^KyO@ z64rwi%36hbTh1;1Aye(Cn)ukeBmY2-T@_Bykc6w?vbtBJWvWK=s!*(c;q0*;c%1yX zDC%;C^Q7e4lLZzAF;70hRi#FPs~*}Z@ypdWdCK!e`=tHl_!DLF(dRkC z@r8Js;m(+Hgw~kx_Q!Z50%CDx_ES@sp7SHuossY;2aqgp7E-NlA`ROi$T&>PHnQ|ihpsg4 zkYQaIhyp#76*%I>7g!>a>1GdYn&K_UuvX0o=f;Mih3iEco>a@Jbr~pSMhNhQz+k8O zbbARgk%31Ff}~#D2>0_oks+Hwc@DKzqs>D2893MNO1O&}1)kon7N2+;es@+}R^m1; zmhITKMJZR&e~Nq#vIs3xlGmrR;thf?nG{a_(VRU*@Y@vom=CTnc0)YSC-Lbh{!?RC zA%_S-BZQ`-9ac~9g0DH4w@95&Wb^QjcdPgQ@kT@rGxX-PJOr=0Fkm9|Q%R2TJ3)jy zqU;E9=c@p1*F%`Nh>c82yBZ)a)$=?-qSNE;UVSv(nREsR($JbG#9lLC9UzTO7F*G+ zFWBOk3A#L)q(4G$_2rIGAuD4n-oSVyL)9VDVt)yfM5&Y*5?TjED;E%~sZ^2|#i$;D zVXNE~2O25P&EJ4|Cr<1s5pWn;w^~hLi$l&(L4&Vf_inGI+HPHIo)&X@Owsd_U)abJS?i%4g2Aej zYqVNFx7Ya$GNz;913Qrnj=I#C4(X#C8H0eD0|EIL({I}D-SRn$|;SE=#_#f zXB%;Jm|a~XI^c5$(nP@f3iadivPgNXb?d!y0v}mmhS@Q_Z;Q0$0#3@odw4WWCLu z$42x#xf$lRVbr-4W2#WLKOMzq+h4653bu@_Z* zAk!s@gmPrCRd9WVVCC_->XLIeCKrc7`H{EZ2(d9k`8m|EkmOV!3?&p)j6`%WIn|0d zr=3k&W8pnhD1^lHt9nN%ERI*p(n5{SKTRi6AKR1U4Y9|-q))PoVlqq*+3JVjt;#v3avOBZ9P`7r21+66ccY-x7xc{45Xy`Nq3j0RQghe|9Sg1~wVUm4TXg<6 z@Mb2{kQOT~`(;62?p##^I97YO4DB7;N%vkb)&pjymV_eC`Ei~0Vl`!~?UVunlVFo1 z=2kAlsqXKb=(lQGLS=RWrA0BJS?~_<4&n!C21g65^Ax>j=)Im!|Scx`TIW~$H8{EFpfi1DgPmER|+D#V@ESGv>8(nh}$Gl=5CBn99 z%upTZ4_L*%q&>He^SNn(xncMis@W~yOtfdatoiY*C=3s&il7dzfn3+ujmK3 zdBC>-dhKo=2f4)C26*kS;_X2l$WMbj=OJ8z?M1xycS#<9N7ad>(6-H?CJPa#anMbRTzr!}CoF2SzF1C&Bwh<_ToODsuNua;6l)9v2{#GgO>SpQv1 z`Tw7}^8ffX6iuA$TpW!|oc<$^`cEsFqOzleq=x*nQ*R)oeOzP-EDSFIq-j{Axv5SA zzo5cPjqm$Rv};{E5i(=j*#(eovB$aUm+xbNcdn%8UU9T9onx{0S@&Erm$Q1&(S-m% zEX$PC^P2me<23i46Zic+Le~e#9%X{V5Na@0W897+zD8j`M+Y_cYrTth20Y-{o}Gr= ztMN#^AKQ^k0pny2T@~q_W@2@d%*YrltOpDojap0?APEh9-Ukd~y+sv4gfVA?7b6my zDs~=ru2F>F<)&K?{QX;LY47RhshD*sKus>0vp0SG@klWdPZ6%Cm{~HIcCi`23B7$L zc8koVio%#80g{c!P`k2>X92roDS)xNFgIiWLOl7%Xvl1i`i4?7J)6$300Og*7s#91 z8P8gJf}WNp41vW7yV&Ki#yS^93u@S*2{pPH(3y1~+>0d35@z#s#wO|8181I(GJ>AC zNwBnl6vtq<&Bp_Rws~eH`>ve9la1(4LhYDunhDXwznQM`w?>jRlo!h^xPqYv5{gXn zp=v}=wwqKj_>_ET4rpVL)v1;%8E?BlO`B=9Sx3SdRwd zU0$D|hiE13MPTc?ZBV_M4=fi1n_v4#O#O6ImX0ZU6hTpU0lt#tQjslqPODDk%m zO1qD_irE(P4ZR6EqCZBL5nKFDmEam(x)PA;5+pR1M=PFy^un^|v5~iHPdz6XT8dVU zgs#v~aSOFia2hHvytdCe7wUhp_72RI#^JVSY}>YN+qP{x>DcPnwr$%^c5FKxblkz@ z%(*kCrf!`(sQC)J_J6$(*7I8(t!$&!Pm@iy0vT=r(q7-pgmNniFYr!iMHX9Xs1c+3fMZ>wfBXVQXg{JSV@m|aADHd#pTGrR`%hS#h+GDDVdl!Agg%=t*t+2o}##1 z%dJ7AS2oQ-eU$)3=R;(E1#Z;G8L=&7d!kam7tqI`d?ZC{()&6}uI}(p(3@MopSAO* z&oGa)L>n3WRaTPO+CoxvyWu89*GJW+YwV6+-1g3Mlx2rR-1hpw4C~A%MtJSvdrlvS z5M*ghav#Y~3$Ki8JEWx*hoJ-^g;Nes4IwL+uwU{RJ{*Z+Nb(UI9h_+*)L$t4ihAa` z1KOPNHMSc9W3c!{__r=J=V0$`7-+*`5Cjxc{8xzfNt4*?fT(V>+8{c0=XejCowHw06|Em-zt#W9oO#{NYNQ~H|JuaR#{H1U)kL8#hAp8&}3x3zmkJ8j!@{K!|? z8pM|L6^ZiSYT08?uNVO_zwSJVYk-qqyA?jAr>QBU&8r^M2Q83puBYRFnBt=(8~~*hM^%l z#i4FWroSo*j|~4qX0O!@Z^6NVfEa(I_P_7k|NDU2|5IjvxMu&w>yx&3vim<*Bjk0yLqk_&(G)c^?N{L4M?J>!x=YetlQ6})f^qqG9tWny{U;) zm^#js!?dY#3|@TWPb!^f9o`r3~ydXp@i8<~26din`@j42D9 zB=t(jqRoa$1~w^N=$GW|@++(=(gA74EcyX&`#hp-w;1BISetZuBCdGIExM6~A;d`> z(7E7CElv8nNIt(Exq=I;_cyn-&vdf>F=4T@U{PFJBu*v8B50n()#@mThmX3RuGwzU55VEb$q! z2^wYCv_v4YSQ($!Brv1;S{)!uD1;or_X*2}A6JCYjbUw0&bnVr!e2=B+w|zM7$6u8 z4UrMBlEvMml|`v#Q=Hk)-crLV-e0FIf(<)>#xh*DW;Wh!%LVz{XgP;6o{s)1Y^9om zonLckeQus+|#1*36X z%jskIPnKev&{Ok({D(B(C6r)e7WMK z$kTZZRVWY(PmtIZr7xn7)bHD@pHN+^;JnAZ0(T)U;uf{}ZC4EX2fx@d`9=2O;Kcch zTVlzzT$7@n=8Y!$#o|sN+>PkHFxzuUfW(Q8K)y;0UK|hoaGnsLGVW9Qbb6G9tJWv14!_*xF+|qL3hQ>zds^HTat=#@PR<^mztYgz! z`c`TiMylsPJ7qNpP}f6QI>#|FCW)PTyNBFaM57R9M#CaA94j&qZPK*m1R6hz~ zkg83ei!e!dqaVWjkW6LPb2ubJuj(2xYJ9m9ycaPXXA6i@zAGtO;tEVc?<%p^#r{z3 z)qkh%&$-^qIO#fGk+F6zLB^XcvTwUA)>%Z?${lykXww=3eVHni9{vH>W&ME2unfqo zmCxf<)aw5X6Wl}cdtjEGJJXDGzEv`&HQDl3G}`#5>Ex1ea?dm^^T{g0GeXTtaQLCA zM^LK!D7O1|m5^&tGT-G1(Jo_2TYdX3#nES*e%Xu88L#1#lTtA_fA2p88KOGU=ouIY z2=+&m|9e3e|G(es{Lg~?U;E|%(C7dBqxEXqx~XZRf6euxhRZpKNJ&9~fux`%L9;-C z!yGIow4g}CBw@)duV!avA18S~?Mj0@DUV9}Y1rO?F27f#>Zp>_V;88&)CPxX*vk4n z7S=L+779K_1bhHacF%UVGr^J)7EeqPT~Bj*`#*R8ZNoYWdP5B8d~6_!8~x%!hP^mQ z$&B>8O53s2S`_OLG#gV5M_(%@=FfyUW48Vdh zpZLrmZ*a%)PNK9JffT8Iv>Xq_{*9&KUQF=YBZ|cc^33_u7L<`j)qG3!8qh0*d%j$hea?G4f$`;xK% z*c980urmNLc4ADX3*{maeUD5%CpKar2iGRRRY<1O8P9wVB-EUkG^K1u7=S zHpO<&ti(vy3*x)5kEF-+8*iUW$C7#Nb(5&Z!c68Z4lCKO0kEwkwrbz^=|4qGoy z3)Li_K;M(#IPnf3`i_lwji43QYDf6)M#%y; zs!ddc*!r?*;`4G z_%LMW+et(*w5~*cZMXVxM1f_^7Ln1HV2$f6Oo)WDn2|ohHIB~$?UpXz5>YE>_iRNb zkJk|qyJ(zIGpexauz%b3nx%^w?3PN3XsyqZJpnMQK!xNi6nK8Oww`EkC9QP}MYbGo zW%-bwMNd1o`N;K{08XYvDC-LcJceCn*e^QLN?i#Lj6YqQbUAHPw%uCQ!0;h8D3$=EkHei|kd%uQT}P1kXpIuMyO0@Pxzo{=P}RoTGn90!3fh<{Rc0tm-CxBCr4KI)-|C-MhWjgo9Y2H49U> zJ;JEu1_3x0a#>XEOw2j3yhm(U9dHxk2_^fx*?fTwOVrx=)1oK2GNLJ1Rhh5&asF7W z_N2I~g#BaNj)!D%Z&of~FYn6qT_zml{CMpe_>h)j^F>93u~NhO1<%WDlt=de0bMaG)4%VOLJ*?PDB=;OOtr?!C5FnzHz>w-jJdhrE^orEl#mT zM?U)cXa6Nxomf?6hOf!198UpaS@mJ@y3((NWKkB!xkY;Yk1Eq>z*hGkv$Hy(G(HA`=_#2LSGcBqw($NKHz zuKS@8$b}nK?Q^>3UJntIwrerG)J4(Iw>b>f?jRuRGH&+xt+e4Mcdh1`>DH5HY%(1>vb)Y%=^q9*n3 zW9Q_)PG%2unlm=0fWoRcwc|E}$`(_f3Q1mYn$Q)v454&86l!(S&9~}C@>f)Q#+%?T zhFZsrqf{i+QEZ?1p12+4w0n0VsJdhw=%R2~H4#J9oa4YI;Yu{>fnIJXB+ zWV_iC<;~rtUe-7}J(N|o1Xcsgt?~F(GU}Ygk!pTm;8Vp5Daa|b@yVk312pDnxGAU= znhHhA+`lzWsNHBR3urAD>-j)sy*Z}&w%F?pac%)=$ITH%d6f}TIFO}rpD7Y@I)ndI zrK;8?JzBXqE4#{fW}zD28w0<7S6+^M@qJ9WY8B`etQ(ee2*#hZK%`o<=~RrS)Hj+m z^=8(pymQ=#8cX4G7c1v900vs<3a1b$_B&^qaM4_M%DYPC?aaw95)B>i)ZizaQ`&k< z^Iu`}8-mYDbhyUG2!Mh>C;h*J!bxUo<223Su9y z#9!_xBlX^qy$pv8oZ>Pe2*i(mHqZk%3B%{St;ZD}+H* z_o@JyFH(L6)~C!tC=yD+!ryL&Wj{Lwsl1SHUW zAv?-2-i6i->AI|H9x66JT&&bR{Abdhc=CN^_)ix;g!R8F{Qe(M^Z)0$c9mr*K=%?L7DO9(~;DY6aCioPOJjsoBzlLXD0+*Yxzh6Ikz zxbM=L);|ELCrdI784xHqb+StdV3Vd~8%*bBb)DP&_wV`XWjRDmJI4I3c zPO%iF%URjz%<8vEaoSZTHo#lIfSJE?9;${g7jWiIUutR5azBz|?bWiD5{K&{Q4pXu zPlmrGW5XJkm)i=bDa-R7oF|pJiTo{2kk5w6A7m-xHfrH+In$Os;uW2GiSQJC`=0>HE8FDIXXZpi= zq(>vvkV3cX9SV^N6?m}KVvX%GJwshra3ZT+gElY154-L7t0ex)x;BtE8I++B+AUKxA0${|+~Q`; z%Tz!%kQ~KQKw7mPR{&5&s;O%xnx5#CG$zw19JC0n(|n*~#g1rFY%-6}nbWSk2_t8y z-P3reww9Fy0m^U{lVpkvtnPGWumlT7U7!1_i@5Rfzq+eNR8C_RimiaWz1f6obr~g)u ztB?wjsyZfwiOzL}iX12l1ap(qq$MDp)#ftRD>D8&5<;Wr6=p>L7R`XEN6XHY%4%sK z4#HNMjVEZiT`Dz3vI3&5$+QkTbBc<7<{TEoXuvLtwZM)Z(?NHp6)k}=ey@t2f8ctF z5oXw=Ygg~>G*P)b+w1#gaj2y&F!f zaZww@2cHhvsto1kcBdcN*Da-r*>%ww)F)xpAGF%KXdmCe{7#wo zn}bhe?^fl`+o$cJ4MjMHB@**omt2@94ig&X{FB`7S>3wj!9ev9@llYD2I^kXTr5;<1iA~~$Py^2P=;(AG;sm#E=-=sPT9FKph5+%b=Jj0Jm?oDV`SSFgl`XSQsfsFd#NME@vc|1EF`4-(f_Kdj^ zE&#r~h$W2U1dhi_p97%I1_<+{lFj%;n*;MYvMc4B1NS-N?;#}Ge$fqUAfWO^i10lC z?V}Z4+zq_un6w6v(}{><5c}>obHyWq2I^IqF=Il7zPl>P&97ppX78I*m!(scIizM# zEb0&d#F)#*&oK#aV==BXytR70*S(Kv78%p5Zs}}pM}lv`Y_5d)7?#J5VD39)`09}3 zan-$i$^0~jOr6;Y2+y2ZLv%@cw!-x~Zf{76Ub%zJ_H2l7lOwEp(B;V{r&A3jQ0{vs0Ezb!O z;CqMNV;H`QSMkJolfxZ|_k{m3ToA9z6@C2~EchV*uf8!H{~v}6|6`iK_k*iHdAjv$ z&fc&KN0I^w1%pCj-T+F}jUoaD0ZR%bBMT;RNFvwXxE|Yqk7%*tZ+NQFQA0vU6ickq zYKqhv)oE0()~J1|dJ?!eSo9(Je(B51&9(E87J5H>k+nF@zWsIUck6$feYcE=$PWT! znrea$HU#}UXcfiNbRGAOvm>MsLvaDqN>BOlDS}_Pe@pYw!IqXfxxTzR1ijW?0NoC1 z7`6VA4SR5rhg8T(BLdllX6LKSXkhE-##QvoDeArojkx#6HU_w~W}z%^V@XKey~7Fh zKOLfSB1o_H>f5?{0lVtSQ-?~X?cSK8aa3)l#3NnMQ(Rcmc{0Xd4kZO2ora3W*l9pG zJuWVs(2`%ssb#kps0W?~y5S_S^n~10#D#s$f;$Z>s;IK|(pcEJtaPh~Zo%F5LRKX}5W4KYfI$o2NqcO2LX6b7n?vt^HA+m;|;q`mlS~ zSDt1>CN3`Os;g--Ic);}YfEE8d#XtraZY%<)-aN}tCT(8E0HcFafRnu(bGBzSSDK` z9wBf*(9W0_onx4GQwvgxVy0nFoRy_96`D(uyYKv*C5PSm^!E&j7f)N{Db58uMOw67VM*dP_|&eWN_S&J_O5;UgVbyD@LK*W z4KkR(@2pqH+eZxss#P$rE%^L5wXVc)%IHE#&h^u;Vbw_{7*xri=pr7lEx4jZXc#%b zz8RIM5=_jcT86NRTtT2h1_D4un%TlS0siyVAr7K5VcgS|oeSZ;QfO+qy_zkTNzstU zFa*^o7N(pemfxhB@F)~qX}DxnrGT2xq+MA@ZJce{+6hHYI@wV5kWA=y%LO zmgX6P&)Wu8OPFrYvGEu|XK;e9OZHo`X{Y3vHb`pI6q2@wNRaZfgNbs&018t`O*4hu zV!_mo1=4zdv+~?ymtT+tN-*kbGmO4TW8wO*qN2%;Ntu?MFwabg^kMXrZzR$mRNq<= z&OJ4m>kAG1bwU!1=5Q;Go+tw;^A-k%S2o)#`f(!OLas<<->C8<~u4tt9pr$p3o%%d8jow+TiV^%7bg;ezbArv*9 zgZ+nhXtN*6Hs+BI;mO)&7ezm^Q3*~t-zymcC#8C@1|@2eST}U`m#y2cM95h2?NUM! zmr?mZ;84X*MV?D)^7zrCzCOzDM&b2045AWP%xuP<6GxabyoWF(HHU4)JU+?j9NA9f zY*I*xRJUR!an6HZ~DGcqAG`&33gMnAh&iC!cp1Yr++F9VI8SmR~hXDV9TixWn{Yghe@2m&! z6GFCEQa*7FF^;4A}2Df@lN@R8y`x_J;y@JxWaZw~(jQ;#&? zORNp7Eh7_sBdaxU05D=Z=01S;QVr{GY$bn&$N9kDC2>F*YvKrAp=wTm`F;R`t*Mr^ zwxy5CmfStT_fib=L=JZs)D3yr5MmknLv*DHh~}9JyTBiBKxBV~5}=SL&6|a8@hNMM z7*5-s*60Wo{a1d6h>oCykv|i}4hA9s|21g^F{axa(F`y*#_<^HKX64C5XIX0&4=M5 z67+0TOvxsC83JKAkUpYBvgg|zOHhWY6Q6C9FB~R~?<~HEvU?uD{u<4>na+um&+-EM zYW?ow==w{^#a;rolKM74OtS;6O@>E4ZF1hzNh$2M^0}eJN@WoCatd=*38Q`xaR$HD z;g0mIk}F(GNFP(K8P%1Egy96@fy({dxL?u+$T z)z@UTW#*o77DQ&kN$6H%diX_bJ?BBQ0)>KUc(`AJOSAx3(`N6|)^!|utQifu!px9A zjYYElmsAtmbv)>VEei4~&VocG>J}ZsGE=&F9WPk^{0_zvAas}h9w*@xUj6k#gR;4O zoUrI4)G)RF6f9S2j`BNFbP^(|8pra>`oQWexH_!xdfqp$fzldz)|X!)q>w50Hg3%b z>bTq(8Ke4K#)fio$^>5WkSdxVI3U<$Cshvqu-biBf}xR4TY4-suV9djYQMV?CpH3F z0WTg^Jtt7Svke=$EALQ7L-v#NH@0m@uIYviRut~O;}kY!az%G0n8(K$Op zm>}VaXNk&m!lmTagHa$%8!DpdP-;Yw%G3l7o1K`3T)jZFl8V-1D_15yTuXZ@gR~0o zp$q&~r$~Rjsw%6DY&di32r{ov>w3vSAshs5m z-cjtO=#te=Mn=nDBqD@Bu;TESh9W z8yEN+tZQPfPkN|~Yj-dRc1gK|Lb#=aUsQ>U{`H{sA{l8JJ^{&=?tOwtbLBh(TPgiH z4`&j+M`^d5mM85~75i4KxD&l@-zuknSEkJ1?{(k}B8yf^l8Ts}k?hyrMrR}(22SxduS{QQ%f%ZudboF< zIDd}rcZq4ZhgR{-oDp3Uw2J#HBBWufPyFE_295fPlODyQ176VtiVp!hmRURap;oVy zs}CtB2K}7NL)8CVaRlZ?DV!|1xo7l2YW?tr@ ze5mLe-};IUsy~v3=(>x_pb1^I zQe!8$ppksqR##b8y(iphPfQ{x=Dr8|k{u2>vh0EwS12AsrvP*@m}O+ zGXA|V_ov0y@{jpdO1YOy2tIH1U3?IbX^od!gpk{Nv6kcSPnz8i&7ufnDwENLO{QW7Wu$afhSc%1Zz_d?+4bkdcoH(CMrvX- zB-hN8Rc^Ro`b&0aoc_Ze3Jt}FZ1OBF z{hUHg6!X3|49=Gz3*}fOOOlz7MgAxp#dYemA+`vj0S``6r)Y@-W$;O_XXTJJ{qBud zq-k;1v)*aTHxP%zTW)9^B>n0FfF=1~bxAqkjd7KOm646$p@QGdcA>W2@)kZ$m*1pR zKQ}7_e5^=nytXR;d|g&e%Aq1%)r40rnMX^a3e3O>6&td`*caz)C~)(07Z}m2*&20_ zhL@z{fStvGNe*{5tF(r1=^;h#M->fW#|}IM$B{QEX7ttB}`aU zXkD9hGC`E^B`&1$>#} z^uxJhd+H_8IH0}Q914^TW3vTnuvMB+iujkG<}8AyoL`3c zW?;KT{~L9zs6g%R;x;7#_W;{`s_&^WOdCTTL66@pW5V*+i(i)yFVEkdl=PXlY1BkT zbVY0opwgyx)TL&0Me)mADsBBb)UKduG!)JK3F)qUOm%emquPql7g;o8_h6Q%0ELX?(8~Q!LZd&2}H|rHURv zI?aDACjXH;nX>0_E{UYqEG|pld$s$9m+ZRa$$k&=Y|gT`HnPPPI4-b!C(`SDVY^hE zE*hbRamwH{nz(%9!T2}P2>Cf$q7I)kGQj2#$aItFYu0n?4bUuML85qgD%k&%(3*dh z{59>#H%U1Uj_0tEOI=W9d$Z_!=sDB(Ck}-LV(`14=-6p*S<*TF_f8z|lp+DG3DFqo zPnI`*|4;8!q$Ve1_3!)8@|qE(XuY!J`76LEUX&NQ@Umio;(IHe>Kqk$^E-lq;=X0R4LCc-%BEq3W^8t1~nT%o{C}w?YQOT>0LxG69ykPgOZp zPFBPtgR72a#-0O4Bj-{MJ&k2!=k!% zC65302~yNLc85BizEZ-X*h7o}@#ddv@&~Ks&s$Y?pvsRq-!S)PC_76`J5zpS)j34| zFh|vAeXaJ0vZRYmKKj8h_b9N{B_H$c|0Ur5Cd;6!FMZ%iH_C@oJ%3RHnt{N*hbG$J zgfH)S9(o+@HnxCF=@x^WiR0H?xZ&%ny$rPJ(r?HpW4sO&cQc%SiQzShs_p=tqlz2I zTq!15VB0vIYP<<={`(H4)eil>plTQZ2J)|<7gXbhECr^fa8H%|FC#IFLTR^-$=k)q z9cyIfbQH7y=CU^vzCS|q0j3gk`jAKmoI(ig0bNJ*t^xen(&ha-h7tXTm;)b>Ao$lu z!tE;ZU$9y{1*bX699U^R!4O!ey|BkTFxSX|b#)>1w8ePIFpf7&YRX}8o|t`wEZTD& zKRPY6pqMD`k@Q>@wHaVcYO;aW9Va7DwLy26_D?sPnH>#OPk-SSn6Kwuq${68sQJxt zEXJEaTK!SP0Y>tFoNfb8A1%rP_J0Di->hSNyLv&}9sq6U0FO0>4u3&uN6hUW!W_4a zcQUk_F#MR8q23sM6#OsMt#jmXhoVA_rpqbrA?BSht78ZA1J|i^5kZlQjc2C&zOD+E)KKqN*nbCVp zL(q6_)Y2KUNTtN=A*A_CWjHtWN@*S*jN?UI2OYXlRM9iD@{+$JpO zU!*LbP8(m=L9)KpH;S~2MzD>j?K?>-O}jOacMxe*))+`sej?6J6wKY2`#UY}g?V%1 z=r|=n5#tW*=2?2_OE5w97mURK;J7W1xZ4XO_%3JLyicL6a~kP1k%4HI9~g2mH{lf0PQi-q!0#I%jc9RAeQDeb_QwpZ}{EmMRv>0c8qq6 zc3ii!6uF}VsTl_Cn1!?h^_G#6a|*wPf*rjD28L$=Yuk5Yi)|n#l~S)%l3(WYH_XLz zb<6k~6;Y2c&nKtLj$;DAA9d=0{%~{)LwcUoD*-&&3F~u}oFD8u?$#LVrfzAyVOefw z$y1I2G9tU%mPqKDA!0!R=DC@{1o$&{JtPc7Z#{_gRZ}?j(0}QuPZF(P5lgTj;g$H} zU_6ON9@1RN+-k?@@anu`H7NUz`2tkyO2&no?|O)NX>dOSDlUfjQq}=^A6DdrT)g31 z3GH*L=?S>(6>>jHYfYz{ZFAg1b5K-ZL@KGwup9a;`C=hTUcw%zvdXC@%uT{Q_J=X`GgSSPP+m* z`Q4C;=uU~jArB7xkJ33ILQ}32+p3EQ7srwBg`h6X=n_lrd}Y!}dOR%2CD2;5-fM{A z`y|*5kU|8ji@79knJ_Y!!sj6w(rRl*Kp~ejq+@2?QuB(xkQC?5cPMe4Bo|P}k*?vj zGmMR;+M@Vzv(5WL)=gMS1{>OT>$WR~8^jlIx2h1>V%jq7fj76nHgR?3-6tTFjh*MP z+-J`fgXia7uc7Zwkotn8@4&mp*V4f9r(T!AULjEXh^6mx0sMUhQT3ApYZ3R{EO@aA z_$rvO!^EJlbXfl~u>KiML_0f(#2%Pov679&f?>fzn<}Hk-t3qh3$8FRrD02CPU&Re z4yNAIa7DwJwt%ZvMNy+`O3Ou7%il0?axBP7*ao*#1PlI#l#at4*A{wa5q@TAeg7B^ z{?O)|kOq4gaS$@F3f{H}q)Ug!FlfQ&$_jiO;PdZs$nP%T(|nJMA@!Q%;2!`Cm~Ro~ zx^~L-B%!utSV=gQhL#?KmkBW|l%kp7$c?aYL0b->BbFZShVe^ zji#@TjvdSDI80}`c0u%S>UO;3KmO1TguBu!k2nOPf2@=O6PbZkA5CgItRo^|l9Q+3 zVUT+D66EIk_%umdoHy#jmpOrJfzxQ9CSwXwp4e5yyjkHwlhQ@Aw?YV_XfI!*Qp8&v~%xFK>|ISqfY>R8Pd=y^CzkB(w4{7S*dm zb}Tyr%VW1$jc^ZcJLNifx!lXh?U1b1oI+E~uX};cn19K^TiA$osRM7_!0ppu?Gr%h z!uxGklkXnEo5%q6T+FkCI`B#D2>Jw8xe06tGg8Y7c`5=j|0}979E-z+x4tv~G6sT`D_@HemDil<=Orf+4!-CW^V~%#zZ`v* zam*AoKzLzyHcm_D*A+DQlb`TwCI|F}^Ub$1$@r`F1^J%2D}}8Mi}V0*cR=@aU8{zYh9){;AnT zo5#ACXUS`85}ntTW?4S*>Ka&YXpj=TLA~*;i|B`@33`ZcG+vt^QAZq-Bf_u?`qlv& zeP@6rTgH;9#S>o_a|b*b&CO#@L3??p`=MYXmJ27c4Z?@s9}yHv`dh<45;Dr$v{0z5 z(<1{c#5^mT1bYQCB_yHx5EwmxOUjXJr&P+-I{jRq&XbCX#O~gKOeDzMGwHk*Fh*3| zqc61Vgr5C}W{%ak>YnLkX)}VJ{U<$SmDVDujmP{tmkJqbi{z7ga^9Bhn`U=h-@=Bj!7&# zr{F(i!ZIlZ!eUB<$nK0sUXi{34EP!{BBx?s92vDgWZAF^CRkR8F_fc8Nq9*hMq+N% zqp9kD;NZ&YSXjR|&)K_HG+A8pj$xE2ID21FkUO`8$Qx(V=+m|%CjhKG%u<_VCql)c z#zA&oZQD`L6&oAy&CSgl8_ZjI_N2|z(>oxfdf`*b;3Cgyqlz+hwHLz7Vuk=|A^^1m zaNkdAe34(TEb|RN%2@ZvpO?uHKcUk%V)IBsVQT6ZIX)oQdqO83eg0QRE?mJ7+B?|E zn96qsc>_J`pA?uvc|1yRPK-Gu(vr!!(9YmrCmb2}SXKHkt}rD$EEWm$h$Qvy`$W`G z76e7;9veM{#B4pf;qFq70eD2X2mO*P>;9?6r2ovSPcaTfm`mg7lwH19evQzW%wWey z4gF3Mx4cFTLq3R(TtsH>i!N35r9`_JvPm5p3V1L-CU8yyQ2~_t$ZbHZJWPTJkd$4( zHuEs%2*Yk{dF+RW-da*KB^_=|L{_YWA#}~u#zR-d*^m#^OGz0fkNS#2eDJ?5hB)DU z35oECjea3ADMMw@piyCRRG@lTp&)39w{F0OVBNZEL1j<_iE;94LUj}@y&?^sx_3ju(OT|S8XixCIw8Yx(<(}v zdZF*=TJ@N$0wtk8Nj^c)?suf>(E}tim+}{p%?yockFt4*(gbF!^B8@2h(4MYQHhxM zQ2q%{*At02<%7!k_4d}%MdcP)ZwHG9b&B!zF*ASIK+^9!EWtAIk;7h-i^Clg?G-74 z2{g+M0tM|Ft8xJ<9Fn52WoV6?2=C(8ENWj5e``CAp0DN6Ha5SaegnrN97YlnHW|pX z0t3xy|O}UVGG3<{Y5_|oK92eOXv-(WjC>$HF^En#k zR8>FRA9PG;6_ttz+z}t=C}dU^VfkBF$O92|I(2cQ56*;4QJROp712t0WilaNf`x&s zc)D(!3Mf0aC(suFMz~203|(^D$f8o2^y}C}jmfe^G1H~ihP@QC^!6?>>`{+OC(*aK zN-XQt(n=scXXNRo3^Q#y^NpB@Lvu<+lM%ioee%gV9Ej+*1X_%wYa1z#RwfO);K?Ec zj7XoP9qVI#4AF!-+YuBkMg__ZdSb+8v_B}8L!Tzt*O(4o8f*hGMaTxI1YU}4x;?Z1 z!h0x&F{sH)YA#f$$#=FM!&2OCh-y~C*s?-L0&bpZdQ8TwcMwamJuKUAlsq!J7kdXc zFmx5#(Y{m2tjI1rXBYs866=O_xQv|;YYfhvXnh@em|stg1iE5+lj_0_*KA^Xwe3_e z=Gvrn8)DRnJ^xlDK95JbUf(<7V((O!p@gcqAX&ta-eWwd&}b)>G=yul;0c`T$oI4y zx-L!*A(|68&{b4_spFL6ThQ8rYE(CH`$!Q5IF2>LbK>J4x}tRHf@os(c+FYC&y@B$ z`l3udN8?IYI##7n{yIFZN<@s@ik9ALU%|XZ>Ccm~HV|AhaPH^hz;4myTOj6eD1L|{ zyhsZgp`p-5h|Et)stwsaFiieLYrfM-pL-) zi--iu?}^9g9t~+?!6A9h@Uy3J^ADu1>QF}aRBk!8UzJo;I_hRQEbKrk*ak*0w>|t& z_|PE0M&Y`T1g^t)bZvVyc}R-)2&4W7KDA?{*(S<(k~ebE2b_LOfZ3mZ@r7#AA5^$I zurLnvMP>-S0l1g?LppRD0cTzg9#wiplZQGlOXhbcdT$wZ49;5hwcJpaO!qm4O0?>D z9FNg-q^g;{UU>By!z(s(cRU%l1nfQKK&AXVKxSS)3Z>YDRS0_RjSWZuCo|xX?o{|O zxWns6VLK9=Cn!YAMZtdr)RsKT((aNPNE*R5zXN+0mGVg(^C5swp)#p#AeK%M(t+fe zB(No+shlO&i9Pc@{hCl2#Rc5yW{UNsGC?Q0xhaUGSfWx8J7%j3*CpoFaXxdAJ9eX~ zBsNNZO}Z&_ydwle7rY2BS`&1sgxwi9w2!sfVbT)nq&W0ex?SCyYJ+o8fqzPA0AtEPmnls}Zg9V`N5xqx`_c(8WAV>6Xv{8M z#!X|TD$+MC%PnWUs@-}&M3hA7RvZ%Ew|!&ZeEcPA)o+GoQ2v`p|JU$-|4VkiPv%fY z0FWL30d9+O*%t}3tlx!;A+2S&iVIn& z6--pfYO?*X8%(xsj4{(z`@wIBeCr1fpq++ChPmfHS?wGS^*fC`qQjLoJ(fu;nMAcH z*V(qGksXGH1UM`Eh`PFkP8m%%n0#%VG1F4pL{kNYu9L-Iy3;(WimQu3*zzOkZIPS^ z?JY6qQ0+B4*0!L&Lv}I6EgET$x;IteXH=!$l;ThJZ!7gn2H|+1+znr9t@I2uOVXyx|UWte`3_$@cGVSVtm${fs z6;x#D)IFO)2^vjZ%JMhpf0(Vl1G8zN$$@}y^#508E3yBVW~=`J<0Jd=^!{JCe5IPY zp1417tT^*ucHVZ7kdTzbL2MKgGI-n+(7==mc$8&D9v~BqqEgVsi()vES4kGo4tF4mJeLb^A%$!FN(8R zuND@Z-pgCv7StE$oPOEIqL6JD)|cUFOX~$kOE}`c|eh9ljF=`jC#gluZId z%FKO=K`PhXiI?wvjlz8i+gT-e!B(r!#Wc~7AFIyCAcCaqjKVG7)u^muOi&#(8nlf} zsfwcM*JV=lhm(=zN2)}5lr*FNNCQ|D=+KtJMF}4us!gtR{3TrF2p|cwxvM}V>nKUk zGsoX`PUtQsaCZILY#)3s{F8F~^u+}oP?fAWD*w*JX>CN&5ueEI$eZEapd`!U!SayW z^{9%&f%e_E+*eRGM8!@EW6xVFOm%b^X>~a!C^f={nC&y%da$fcSb+XME!#dpKo?!7 zWm+Zj*a4WzWPSc7g1(L>Uz2!ZDD!C_(BP;UFCJyyHj@w{`#gU;AczkW|7Fh>SHTs^ z%roYGcPTNM?Dl?X9gy=vq{$og`5Jt+5rz%u5PNE^St9Y1x?5vkQmo1t=mimNExcqg zOd(rcV=_BNjg>3meb`Lu-RIwrS;*AC5OEw$)V9u7aVGqO$)(n;!FEZyR*8*%6S*|l z3UE~mZ4yTAavlw$MSo_{E}>zFZ8m;l@9C+R4~ehl3W=z+867&(2ga|1=KU8LjZgt% z|CR)rORWfCl(YWZBt=7njbi&Kwfct-Jo3##9m^N-(S>JIO@;n8CZa9DmzFPXb z##&uW$LOWivsR5F`sb)3m=SentX9o8)pIX_S)V??o$f8pL89rGSO z2mqhIo7mcL>f06TSozA)C%P7WLBKfkOZLIpDcrKJ`ta8WmsRO3ECu>&cZr2y6b3zVRT$Pn!Mzs%=ei}!9x`ej` z$CdCDRZ$mbpNfh-qhE}9 zGb3h?(cgyA#{1}KtV&n@w#l0}&xn=VMBRNw@Ytt47Zyt^AG zR?$nshw!mgZH?=zpZuB0e0ln)x#{z4@!o2&0jn>o$1790J_*yZt3GsN1sq(K<&g<^ zFC)yyA@S?9kLM!wcZi)Sb>FlwRvE|#?5{7@-*&%2iTCiMLg=`(pkHu)_22@!B>{N# z(S?jw004jfg_mB{WApbEK=WzBki+k5f$NLaX8?dQWK)J-6Zg}`_ag-gc`&NVCWft= zK&bCANwMm8((`4*E4oqVP!=wMr8Y1GMlTi;>8GmxGc9}24?qPUXO7QMs=~Og(O*?5$Lid4zYT?dtqretVA3* z^J_K;Nk!_|C6Qo#0h1Q5&exc1R#zQ4k`1Z8(S*%0|1D$rjYMoW-_l5r<{?U}3}j2x z?_Cf8vLC&EU?QShqa;29M<)nz?K?YQR@gb^c*$EcqcA9ivWcr{%>Ahg2{U(wS>45(3m<*gV274b3q%1np zvrd-CUT7=wz(9f_>YYlWM`rJRNOf!n_D0Y>8EYu^#&AG(QjMuQwk=@tdf{DjuDShU zF0;wc7ID^f?1|g$4mV7dqa_%WIm;86H}wiwrFMT6{`Y6)8qPz}pmuTpLE{#(k%o&e zD|}E}?v|{6W!gv`n=p;+fgf9R5nEuA8(3^uV;de$2qhDGfTs6OF`V1a;s;x}s}hER za;)K1c6dGH8{PLElMD;t4xF4xNa>Bvlkx!_#u&i6I~MPxGEXJElv-I$JN z1ja&e3AQODUih!I{ZzAJt#&qY`qd=0x_bbNP!ZhZ1v1Ors(6jgwYwoB;+tfct$_m> zF$@WZ`}4{+C>S;!7)I!iH9#ZszYF~A|NjF2e-Bz0Yq)zMJtBYi5E(UQ>WT&U6A8im z!UqTc)dgOFPgX_34-UdFOxk&1;zaApDpW1XeOCRr;$hkBmP-`ome;c8v0S+E^I2K3 zu+;QeTa?(%%)YQ8VHBU^9h>^v@!WO&+Ijyx8l2SSdZh9THgby-U897HWHR?pf{%2u z3^$6+0UHG*WksJ)$_cahLqd&XYe7FQ**ui-`+Ery2MNxE0}|%Xb6%WWt#Dv?8a$Rn zMl-`kzBQdd#)l1K0y#HDpKy@7&BvujQ|qJ{#r~+#2JeaBVv?N+LfrFUuR$$pe2}i@;DSDyk-+6R zftAL%seowqwGKTIO;b-~r&8wriJQ%B!CLW4ij)TM-sZLx$dNb*$;){}`r6v5L&fU) zzF2%WCxJv7qGShnwO8|m9(Bwk9kSB)P7Z+Bal>X6;{+^_a*+cFSVJIn11md56ey<* z4?H`y>uuJ1!6fR|GUq%(`s5nxY0xCcHZV~^$TD|^8)ViS=Jh*E@EQVh;R~Sr$`CAlO$N=aoP}; zL1i6=Sv_K%DPZXG`56$a+Dt+g~uRA!5c>kGB`Nw^^whb*dJm!lAC;015Fv9aq$d7Bw~v^3(9_dd~)# z+}|_0z*W-3gT@DjxCuBVG@9+&GF_=d&(^Ax5!7c1<01Yd>M%j~X zI&@XZ`rYWywSpP#aqpP!E*wfd@wIQY2gJVwF2~n9BftuxiBn=SQ5G-f)^RMTJ zA*@;=*Q7X5Mwk|nhGGF1@P8^fTD=KhX+o?XfY_u>aUnG`uV705pqn6A!6o4_>o&y1 zeQV35bMXf>n3k3{3W+%$6+Ir!^y=cS<=T*2>qE<#e3LOd>2|57tUT)3);6sp#@db(@T=<+hyC=W`EW5)=^2nj|&= zh!Q)m^RA>J?DzzePQ5N=k`x!(*1J9py&1I~-q^~oQGE!DN3sa{#BDjo*q!hJIJkug9yKxN`O@`|=U^%OF2KA?ht!BIqd1odpyi5iYe z-WA@;mXj|vE^TrIA8|qoalNNaQ!qD2@RmN{*`UKy)U!D)Xhi6ff76rHqO@ptR*S?# zHyZ=5BPIw%+rCTTMFtlv-yJK<>-Aj`%Q!|l|*YSRGkqF+U7>aL8s;17Q%Pb)FJn556fy!Iw=D_ z+kA)@+2to6Dz_>9%inpY2*~=>1&1+u<>y@TnTvK09Ge>-rB1qnbnJAe{WH^Glr)+_ z=8GilGtXp;TDNE;m+$8ZwkZ0W_49`0L2ODY8SD)SS)3t)v67mBr%Xt`{-Pk^!9$X5 zifElfsl=>H>ra`$EM2MG(+>%tJI=(B|>BnHB{3vT*f!)zo)89(; zfm`X-Ow7==^#ZeUH03lCVx-3u#->>gr#toHunSvp0(FQn0btq1o7;xkcJzE2l^+%FC(v0PDsq2JPRum%9Uk@+v_q^&IX>Jbb_RIIzCH@q<1y|{gr zi1gv#DtEP%a(zg7^*)RhXRQS$*8L_@r=t&V?VoA#ysiL^Z}Pgm;E$W~RIzWrn7Bp& zU)9EZOB=xXkOP(K8Z2HrLdnbesV-tbO0I^N#La=%Fy8@=HhZk-^m%<~fiI0lxM0Tu zx!wK$VkR1ELPAEAsXnYg>CGFKP!_D3BA66}F&jI(F>-XNMFF9Q{FO`uZk_vpMgrdg zfbn4pR57br%@CuQHpGwja&ce?1!|nKks*wncBDU+qhejA9fp9sa)HtR#hckW(A%QV z2y<;_wH6fPQ}r`n^U0=>WBG1h#T9!#3Vyfr2G8`!3d1*xK^LeT8LFeAJ7ZC)ev5;3 z%n@@32y;pRQ-P+EtCCJ%way^5w=Or581xl7A^d=W*{uP_6$xj*5`lrDX_fVI4qo(C(>_yDd&|a^wBJA+)%9vfyW~w%yYSwcQww)6n?quG=fGmy z^}^1SZY!O}?pb4H`{%p2OPeFw)s}pfXCLwvKj#)OlxsfZ)*yPDC{-JarR=Lz+cxM; z8TPe8N+(sRi8ne|ZZN5B?0x3a1!4`ORU-C_1j_>jsvu|;ddoWUl{n{?Gn8vL7^Yj{nj*%-K>V)Z2N$9E z=ax5=YcJ%_yBoMZ!^l_4oLhrX&tqhEwVeZ>b1=`p2dy!HucW&Ux3YFxa9whotYm)l z-1HT9^Dx&w$#+)ztJLKc73*-<)v|`Sm31{0>yX#Z8m_k~^j;aobDB7-w*_M;)aK}8 z#AYTl=Ey5(SN$&14G*H)ijqf1GZ*Cb)8u0w1x4a;FUi=>WseqR#$mErp;4mc&w=#I zIlz~`V~ot88wdAj`$Cjs@eAvhAx9(7cQc==`gSc9Xp-mNvCC4UoP_D|Ltg`wMS3uW zEvNf|IP4bwSCpTu(I{{1?JO?xH%H~@RURPZH`{rad`={;S?N?%Q_!zfTbz&d=j)*^?-CfPHOiseSvOt<=Cd{?`TbKphdL5@xtiZVe zeKQv=^C)px_`==~;|%%keop42V#LDF${SosVZAog(!MFr;Oa-wI*-KOJz+97%io*0 z-9ri5Jt085&m=QwDyEB%e8)3N1gngFkxyP_%W5Vbn}hY$qx0h+<__A1dCp9B%cSPl zC_J7nW;XrNCVh?x)F?fkE^+qf+UC{heT=sw&!y!!ZR43-4Z`BFP5$Ry-H6So3(}$_ zyK#bJb{>#-AWS#|O9k$Fi1A~wuqSWE%UWDR%qTC8EG$=b1PdwE#4VLY?bgB`qvC2D#ap#v1QW%yLfzPcK3 zYwilq5lJ8y$IM4(PE2Uj@7G?&XeYpHvL2xXm6JnH3qog9kMf9Ie?VH`Q=!Bjgx9+w z7as`RT~6s9@(&{(uc@zRzc1K-Dn)q?Ma4mA0Dvj7e^)80{qL2cjk%4nt(B3!jgf<` zxsfBSzKyx{4^+z5hW6)w{#@BQ5dG^y%G}Y(*v8o5{}hsPlM+Dua8=>~TH-cqOvH)x&faLu*P-M4i3Ay?lPP4HgN>>YIP4 zB$`*JG6%m5^t<0zR5xJ-WuZ`BXbUdd55W}AXok2NypU~ zgDkQ=vstC1|3Y?}TV9C9o`OcXBswY0^TAprC&$Jg; z@ZLV$y@6~=)qPjnXDNj^(`(uWbgUlSmHS|#jsZ|;@nSRG=0dhmOl?eQ1M)hXLZZ;dwosam4BY();^-3CVWSw@<%M))5K1&~oR$TV49JXgS2bp#syqhV+Z|o1juo^$E6aJn~1-q_!JE<{ZHOE5?ht ziKGW5)>?9FvGN)lWXlVqMiSIWv8mjLntBNXoPgEF>}M>)c!~=>CmRa6vK#WQoGSPXlh}GbqkZ2 zo^;{AivFJCV|&KqtL*E`mO3^c&=EL_ttpq?y8@9z%Ea6qmqZ(^d06MP@8_^mVj!IP zV1p7ZmF$T{z?``O$~JIItYnrDcuDY?G7~y(B;vfpiffnqI;o4hI$26KL&_~@azK_4d9)GmlUemH>U=giQdm`HWeC%~5lyO=M6dxoj9}q+ zhhogmc7Qbj6;F}7>(w`#$!m*E7Xd92<*E@UZIpvN^lN~Asx*k1VgY!m96XaEovj;w zuX9P1t7sxFh0~VDOsp)jq__@|WJ8G|(rmjit*wj(g1BYyR`6b<#Q?L~ zL!I-&QV||{p156*n&~ZOyl|SU*X_N|3r;IA)8Itf~#Fk4!~A_v)^5MZaN1p@f&~OdSUYouNHhS-Cta@xO`NKsT2y|xWE$1`pU3pm&VNCQ z>kRglQ=$0~GmLa-j2PwRE6_N{yJ9f`@)~Qyt=FV6faEc`kQJLKjeqf8e({cf z!N5S^-ij@=fq1*HgSLg>Ggx}^(Jdjc9nHS}_V!sK?mU#bg(2W8?kP z*Byi&EF}yBU}}ze=U?H86O{EEnTxjl}4FvQ} zIent$CgxlYDTg@Zw2o3y2cU)4E8%k;kNCi>zU8^*70^hCzcEQF^YwjWM=FYVnyfuk zdcO~Z+0YQvtm@9(TelOQLNxr5%9x@=`4g)mX1VDwx69)+tv;UrnN<*3?O8Z0;zkF{ zvVqY(rR%Z#!bC0m4lLm-uiZwx{J!{>a3K=@81P- zNnlB1f~KBL5e1KH^D`%pZE1pAKp_|qq@X}R5YzNr#>irBz$Rk5r);y|k6J<*`qiI| z+vm&AHBp5~0oScB`7|>%Gvo6=b<7w?q>|tP=(zrJ zTrDW!z2%_@%qvxr6^e_sq5VNa%YCz12x34OK6TWA4(;m0wW;4PbdW3akbT7;yP&;@6Pr4;dpZ*|E1rGX_U#z%-I`#0-x9fa z%clg=Znu;_`o!7Wt=pv?LwZZ#a*^yVm+iJ2QWg+SEr ztQSgJH>!={cMd0e^vIZjLf<919+GyLF(L#)&dag#xkS1iKpUPs8*+*w?-Bupu_=UDenXZ@WsUHM>`=FI&FFE3(uZvLUK{OKb;zfSA@kuJ+u?`a zLphpb^$!V4Dd0Pf!pke+n7YL&yehR;<0coGBc{>`itpD{COp_iR4hq(7hBWzlIb$HF z$7Zk02@*zzCtN7%wS?c0|421VQSB}f5CFhGPr3f*)2Z{HI-UP2U4BmLzm)r5*|nw> zk}}%YO!{{ErHe+(8Ze|1WXc8&H6*Y`F>rbC#6od!OOx8~>?@edrbb3*7s&t;5)d6C z{5Km9QhDQK!)+MMV3-iPMoHBkn#p^wk+Nd&NePgKokD4~kMglatO%#z;__oRK^e zE!Mn2s#S1 zqPGx!{C3IU0Jy;lBK6DkiKvqqKNf>CsLDha2}V%nQMmH~6F#?Tx(mpWgBFq zm37rI!>OFil*O4yLbz!*h+npS+z=J$Pw#(XB0S{P%*4U= zYp+a_83JEtQ#>62JZ6972fQ5)v9_5%heZU6Q5A2)gdn=&UBXzb(-&km6kvuT6P25# zf(ti1&@EL5Ilra^5JG|LdPv1?0(#Du7U(9K;#q5U;2oz$@Y_mXA^pWsy(J4l4CQR0p; z$#~b!oh+|<>n31MO@CNg&+yfOG9^W&4UJFs5blgkdqy}5=X4sob3iP0x6S48R#+`t z7UuF?vcTGac-~Z$k+^2~4Gj-_RSif*pH??!P+D%>7%(^1J6pigJ)kW%PO&8dy}gLQ z&2RTM?+h(OurE-0-HgYrpOm0ftj;=4jG;Q*GF3qJgdvS#TK}fJv0qm7?SOxzDnGC* z!0wAFzo99};1N91?8n)eDdor@?%k>PLQxIGgcGeTvTj_JD+DGXQ+J9mH&?IJhN7=rAv40`v9P;jCeWRnk(7O45N2Hp21%HRA`)m_`G7+QG zD-(Iw@OeP%1cksGG$7C72`@n|8exanGhaxw_wNZ8>O;~Z zvc`wjZ;Fd`w=^`OuCKV4VjR{-sza%3mA6F@h#H{_W=lMDL2-4fD#eZj452 zazoP!LUtiJjF$-ZAu9`CR}fgWhsT`t&CE~ys7t~orOFEwIpSP|QzQ$giITgENhhA5 zgOMxrV*8J_i;Ly~%KfC_fj@nz|5@7={!`j6;B0PX^sf}WS;hJX%Y??As-*^|*^h@b zAEq(X#cxHOf&u3a|4R@qU#_U7n+URsrgMtKeDr(H_7nMYWk$)aXz`Tw2Z+UCJ-dCQ z63HmDE<^GUG9>Fb>-chK_uK1{(l0g-Y6<*ru`D=`-S4#7C#9`;e zct?w+yNq}{@ouB!VU@!rb+N0dXkh#?ty*$UeZ^%G)vh0snRi8xyt-&R=6ZW`sY*S8 zo=vo>_pSpaaIFzI7uaYS$Rs$E63eB-EVTc)oF4Oj+~r0xC*UsefIk7)Owshh8K%2B6Tl>PVSCl&WGHbS9;UZ30DMNHAvuay_8*S3!q#8OXvNI(o?oC> zywBI%|I=(z?a4#ET=8Ng;A{|Fe$)_dU=>0Otn zp2Hnt;Tr(Sr3k+DOUFn&YOi?}h8G7Ey` zYi90(=^4GKrTpCb`K%?bkZQPO0YC4PgA1Em>a|xh{TA{#z7Xee4dVH1OP6| z<`3cwv;$V)OXMLYJs#8$l-C5iKUT<-`E`8DU&o9R=>_rCml+eCgA9`llEwAF=BOie zPjMrrS#GFWvzd79C?p1NPBh6+H?hx(r-Z0{;g)>qoI&CBn4*h5zl)(XuGsem%DmhP zc(x*5?73t4(9N`>(Q`Tx(ydV>`{p8%FkU*nI>y_5ga)`*7yND{him}^q=ce4q+lbm zqF8}9S!yE^A^dc{;1tJ#xJ{&l!Z>^g^pZGEBnMPNha`cK9r-b^`!8z&oD0bHHB^M! z?_z!81+HF#>DSaT)VH+#*c8RTElpT)m5^h@4<_uQ4zTky$M*a@5Mx>}6BIsTBr&t~ z2yyI!8nNvfq00b=kX(NnBN@Ap|44qp+`l3};G+z#hJF1Pj@Ve|K}YbXa9sSi5~lp0 zk}x4-J7XIoV;e*F|ISLQ6)q((e~3q{og~s)(irdh%Pr=X{De;VzSIFi#gY8x(BuKu z=@&50PK<<&nF6?zxCAeSuydgaKeW?(fXRU=?nc)cZpYbASI>LYKGCk)d;zwoX*MML znkXFb%xsCwj2A8?j#QOMrX>l9AJm}07&koww`*bGNG%h^27G#v z>_Mek#*17M7|b6N7btf3Q)`pOaI0b41!4z5xSD{b4E^`2t6|SS+Dda`>`v5 zPxCn9N{tYjgBtvGYJMj{Ih9j8y!p(}&8>*KDaI;>rLpJ45H&F{Y%kTyUQyZrHO0XX zYf5QJji5?YhsGX|K__Utd8q3m6e@1-`*gtM*fL`k=Ru(lq$tEFgutP%k^KWAdLc>g zdm&Me$hrErdH5vF5lgnwGkSD8nv(0ZM(fYIvAuiz>Q4{C6>#@GrsEmten+-z?|x>R znM!|MnpLz03OSxq>5px(o_n||ux#*m&j@D9L&~!<)7O8^>w6EK{8&c;0F?d|Hve!usF)Pye(W{-3+%|6S8mt86M_Dx-a8 zCrS$pkZfT$GzL`)qCyWv+H{I9JqT0gf^rAm!+@LC?THD z9%4KL+1XXLDJJb2r1Vb4xoc2;_w_RHxmSpns7} zRN*&eI{??K{p~34NGU8}j2_YlKFE}%ACl?4!*-cpn*IV6$RJ>V#?w?DmY3bXikb`V zuOAwLmr=A-P7qX=)S<*AXlyo~kUXBe&}AbV>5gvcxw0T+FR~VrrHYDdI#0%!bw6@^ z$yB7p8YyBxR^pi*ae34`&9JB`MmVtaKp;OFXel<{6>M=1MTn!vAcVQaZHzLIbbYLZ zHQ=-FyAI!y*q*j1te=dZ;2Pv&ElBzDFSmo|Z4 zL|o~=^i~hPFJejMZ6iiTkMfG#!f-kWrF4*&PUl%4Jb-JBo1J z72#Sm$|H}*FMpfF`-PzdG4H87&B*3lZ0c!#fUcGe9ttlN!d~oi{1d+ z#Da&N0>)q~!apDV-3LD6| z(8y=#_e2=B&>Czatf6YQ72g)QBJ|C{fdF(KM(nXte;-r1EWIlu@Vgf<*w+v48&3WU zp5sONqM&=IgvaFoy)W5gjK-0e0!bha0Xg=3o#&!fgXgFKsLDp91LUh7a&{8=T_)-eParBej&&U%fu6gZ4iHHG?IXUW5OF{SXzGcC>8+$Q}VI z+AsBSrN_hk0zkpTefveVz$RAcf8+a4X`oP?Rhjw|SBD}0okGg~rxa4g*2wt(^m%^z zvY05Pn#Se<)Nb$`Baq&Z1xUdDH59Z>;1?+K}C~HhbrkfJc8F2_H>iI6# z>Wis<{Q_K4`k|BjzM!}TePIN%zgla?9t0#ep*QXEJbKHy_B!4=*!_NcMFl{$*X9q? z7j}Ji5O}6uEeES@vGi!E+?`R6vGs_lbBsAmtFZc3GfMtZ)r8_j3K9J8HY2^9+q2@nI@dg!!TKPf?AxX zZXBVj0JcBxF+PUKA-ytFnJ%@CZ*X3O_t_>y==^Rm{qtZ|L?Icwwlz+xu!iqj+u;&J5A5vs;>+X9(4My|F9XJ)8#Y0Md7*Z_0PeyKoN=M_a{OM4Hlh+uF>jvw9AovoMz=<_vgSBb

PTip7M5(A>27 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


(wqZ0YkDhsDJEFIf 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 z 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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarDivider=0x7f01000e; + /** Custom item state list drawable background for action bar items. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarItemBackground=0x7f01000f; + /** Size of the Action Bar, including the contextual + bar used to present Action Modes. +

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

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

May be one of the following constant values.

+ ++++ + +
ConstantValueDescription
wrap_content0
+ */ + public static int actionBarSize=0x7f01000d; + /** Reference to a style for the split Action Bar. This style + controls the split component that holds the menu/action + buttons. actionBarStyle is still used for the primary + bar. +

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarTabBarStyle=0x7f010007; + /** Default style for tabs within an action bar +

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionBarTabTextStyle=0x7f010008; + /** Reference to a theme that should be used to inflate widgets + and layouts destined for the action bar. Most of the time + this will be a reference to the current theme, but when + the action bar has a significantly different contrast + profile than the rest of the activity the difference + can become important. If this is set to @null the current + theme will be used. +

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionDropDownStyle=0x7f010039; + /** TextAppearance style that will be applied to text that + appears within action menu items. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionMenuTextAppearance=0x7f010010; + /** Color for text that appears within action menu items. +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int actionMenuTextColor=0x7f010011; + /** Background drawable to use for action mode UI +

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModeCloseButtonStyle=0x7f010013; + /** Drawable to use for the close action mode button +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModeCloseDrawable=0x7f010016; + /** PopupWindow style to use for action modes when showing as a window overlay. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModePopupWindowStyle=0x7f010018; + /** Drawable to use for the Share action button in WebView selection action modes +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionModeShareDrawable=0x7f010017; + /** Background drawable to use for action mode UI in the lower split bar +

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

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int actionSpinnerItemStyle=0x7f01003f; + /** Drawable used as a background for activated items. +

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

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

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

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

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int backgroundSplit=0x7f010003; + /** Specifies a background drawable for a second stacked row of the action bar. +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int backgroundStacked=0x7f01004e; + /** Small Button style. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int buttonStyleSmall=0x7f010019; + /** Specifies a layout for custom navigation. Overrides navigationMode. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int customNavigationLayout=0x7f01004f; + /** Options affecting how the action bar is displayed. +

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

+ ++++ + + + + + + +
ConstantValueDescription
useLogo0x1
showHome0x2
homeAsUp0x4
showTitle0x8
showCustom0x10
disableHome0x20
+ */ + public static int displayOptions=0x7f010049; + /**

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

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

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

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int dropdownListPreferredItemHeight=0x7f01003e; + /** The drawable to show in the button for expanding the activities overflow popup. + Note: Clients would like to set this drawable + as a clue about the action the chosen activity will perform. For + example, if share activity is to be chosen the drawable should + give a clue that sharing is to be performed. + +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int expandActivityOverflowButtonDrawable=0x7f01005e; + /** Default background for the menu header. +

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

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

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int homeAsUpIndicator=0x7f01003b; + /** Specifies a layout to use for the "home" section of the action bar. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int homeLayout=0x7f010050; + /** Default horizontal divider between rows of menu items. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int horizontalDivider=0x7f010056; + /** Specifies the drawable used for the application icon. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int icon=0x7f01004c; + /** The default state of the SearchView. If true, it will be iconified when not in + use and expanded when clicked. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int iconifiedByDefault=0x7f01005f; + /** Specifies a style resource to use for an indeterminate progress spinner. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int indeterminateProgressStyle=0x7f010052; + /** The maximal number of items initially shown in the activity list. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int initialActivityCount=0x7f01005d; + /** Default background for each menu item. +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int itemBackground=0x7f010059; + /** Default disabled icon alpha for each menu item that shows an icon. +

Must be a floating point value, such as "1.2". +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int itemIconDisabledAlpha=0x7f01005b; + /** Specifies padding that should be applied to the left and right sides of + system-provided items in the bar. +

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

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int listPopupWindowStyle=0x7f010045; + /** A smaller, sleeker list item height. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int listPreferredItemHeightSmall=0x7f010032; + /** The preferred padding along the left edge of list items. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int listPreferredItemPaddingLeft=0x7f010033; + /** The preferred padding along the right edge of list items. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int listPreferredItemPaddingRight=0x7f010034; + /** Specifies the drawable used for the application logo. +

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

Must be one of the following constant values.

+ ++++ + + + +
ConstantValueDescription
normal0 Normal static title text
listMode1 The action bar will use a selection list for navigation.
tabMode2 The action bar will use a series of horizontal tabs for navigation.
+ */ + public static int navigationMode=0x7f010048; + /**

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int popupMenuStyle=0x7f01003d; + /** Whether space should be reserved in layout when an icon is missing. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int preserveIconSpacing=0x7f01005c; + /** Specifies the horizontal padding on either end for an embedded progress bar. +

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int progressBarPadding=0x7f010053; + /** Specifies a style resource to use for an embedded progress bar. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int progressBarStyle=0x7f010051; + /** An optional query hint string to be displayed in the empty query field. +

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

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int searchDropdownBackground=0x7f010025; + /** The list item height for search results. @hide +

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

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int searchViewEditQuery=0x7f01002a; + /** SearchView query refinement icon background +

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int searchViewSearchIcon=0x7f010028; + /** SearchView text field background for the left section +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int searchViewTextField=0x7f01002c; + /** SearchView text field background for the right section +

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int searchViewVoiceIcon=0x7f010029; + /** Background drawable for standalone items that need focus/pressed states. +

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int spinnerItemStyle=0x7f010022; + /** Specifies subtitle text used for navigationMode="normal" +

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int subtitleTextStyle=0x7f010001; + /** Text color, typeface, size, and style for the text inside of a popup menu. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int textAppearanceLargePopupMenu=0x7f01001c; + /** The preferred TextAppearance for the primary text of small list items. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int textAppearanceListItemSmall=0x7f010035; + /** Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int textAppearanceSearchResultSubtitle=0x7f010031; + /** Text color, typeface, size, and style for system search result title. Defaults to primary inverse text color. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int textAppearanceSearchResultTitle=0x7f010030; + /** Text color, typeface, size, and style for "small" text. Defaults to secondary text color. +

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int textAppearanceSmall=0x7f01001e; + /** Text color, typeface, size, and style for small text inside of a popup menu. +

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

Must be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

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

Must be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

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

Must be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int textColorPrimaryInverse=0x7f010021; + /** Text color for urls in search suggestions, used by things like global search and the browser. @hide +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". + */ + public static int textColorSearchUrl=0x7f01002e; + /** Specifies title text used for navigationMode="normal" +

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

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

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

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

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

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

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

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

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

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

Must be a reference to another resource, in the form "@[+][package:]type:name" +or to a theme attribute in the form "?[package:][type:]name". + */ + public static int windowAnimationStyle=0x7f01005a; + /** This Drawable is overlaid over the foreground of the Window's content area, usually + to place a shadow below the title. +

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

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

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

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

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

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

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

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + */ + public static int windowSplitActionBar=0x7f010044; + } + public static final class bool { + public static int abs__action_bar_embed_tabs=0x7f050000; + public static int abs__action_bar_expanded_action_views_exclusive=0x7f050002; + /** Whether action menu items should be displayed in ALLCAPS or not. + Defaults to true. If this is not appropriate for specific locales + it should be disabled in that locale's resources. + */ + public static int abs__config_actionMenuItemAllCaps=0x7f050004; + /** Whether action menu items should obey the "withText" showAsAction + flag. This may be set to false for situations where space is + extremely limited. + Whether action menu items should obey the "withText" showAsAction + flag. This may be set to false for situations where space is + extremely limited. + */ + public static int abs__config_allowActionMenuItemTextWithIcon=0x7f050005; + /** Sets whether menu shortcuts should be displayed on panel menus when + a keyboard is present. + */ + public static int abs__config_showMenuShortcutsWhenKeyboardPresent=0x7f050003; + public static int abs__split_action_bar_is_narrow=0x7f050001; + } + public static final class color { + public static int abs__background_holo_dark=0x7f060000; + public static int abs__background_holo_light=0x7f060001; + public static int abs__bright_foreground_disabled_holo_dark=0x7f060004; + public static int abs__bright_foreground_disabled_holo_light=0x7f060005; + public static int abs__bright_foreground_holo_dark=0x7f060002; + public static int abs__bright_foreground_holo_light=0x7f060003; + public static int abs__bright_foreground_inverse_holo_dark=0x7f060006; + public static int abs__bright_foreground_inverse_holo_light=0x7f060007; + public static int abs__holo_blue_light=0x7f060008; + public static int abs__primary_text_disable_only_holo_dark=0x7f060009; + public static int abs__primary_text_disable_only_holo_light=0x7f06000a; + public static int abs__primary_text_holo_dark=0x7f06000b; + public static int abs__primary_text_holo_light=0x7f06000c; + } + public static final class dimen { + /** Default height of an action bar. + Default height of an action bar. + Default height of an action bar. + Default height of an action bar. + Default height of an action bar. + Default height of an action bar. + Default height of an action bar. + Default height of an action bar. + */ + public static int abs__action_bar_default_height=0x7f070001; + /** Vertical padding around action bar icons. + Vertical padding around action bar icons. + Vertical padding around action bar icons. + Vertical padding around action bar icons. + Vertical padding around action bar icons. + Vertical padding around action bar icons. + Vertical padding around action bar icons. + Vertical padding around action bar icons. + */ + public static int abs__action_bar_icon_vertical_padding=0x7f070002; + /** Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + Bottom margin for action bar subtitles + */ + public static int abs__action_bar_subtitle_bottom_margin=0x7f070006; + /** Text size for action bar subtitles + Text size for action bar subtitles + Text size for action bar subtitles + Text size for action bar subtitles + Text size for action bar subtitles + Text size for action bar subtitles + Text size for action bar subtitles + Text size for action bar subtitles + */ + public static int abs__action_bar_subtitle_text_size=0x7f070004; + /** Top margin for action bar subtitles + Top margin for action bar subtitles + Top margin for action bar subtitles + Top margin for action bar subtitles + Top margin for action bar subtitles + Top margin for action bar subtitles + Top margin for action bar subtitles + Top margin for action bar subtitles + */ + public static int abs__action_bar_subtitle_top_margin=0x7f070005; + /** Text size for action bar titles + Text size for action bar titles + Text size for action bar titles + Text size for action bar titles + Text size for action bar titles + Text size for action bar titles + Text size for action bar titles + Text size for action bar titles + */ + public static int abs__action_bar_title_text_size=0x7f070003; + /** Minimum width for an action button in the menu area of an action bar + Minimum width for an action button in the menu area of an action bar + */ + public static int abs__action_button_min_width=0x7f070007; + /** Dialog title height + */ + public static int abs__alert_dialog_title_height=0x7f070008; + /** The maximum width we would prefer dialogs to be. 0 if there is no + maximum (let them grow as large as the screen). Actual values are + specified for -large and -xlarge configurations. + */ + public static int abs__config_prefDialogWidth=0x7f070000; + /** The platform's desired minimum size for a dialog's width when it + is along the major axis (that is the screen is landscape). This may + be either a fraction or a dimension. + The platform's desired minimum size for a dialog's width when it + is along the major axis (that is the screen is landscape). This may + be either a fraction or a dimension. + The platform's desired minimum size for a dialog's width when it + is along the major axis (that is the screen is landscape). This may + be either a fraction or a dimension. + */ + public static int abs__dialog_min_width_major=0x7f070009; + /** The platform's desired minimum size for a dialog's width when it + is along the minor axis (that is the screen is portrait). This may + be either a fraction or a dimension. + The platform's desired minimum size for a dialog's width when it + is along the minor axis (that is the screen is portrait). This may + be either a fraction or a dimension. + The platform's desired minimum size for a dialog's width when it + is along the minor axis (that is the screen is portrait). This may + be either a fraction or a dimension. + */ + public static int abs__dialog_min_width_minor=0x7f07000a; + /** Width of the icon in a dropdown list + */ + public static int abs__dropdownitem_icon_width=0x7f07000d; + /** Text padding for dropdown items + */ + public static int abs__dropdownitem_text_padding_left=0x7f07000b; + /** Text padding for dropdown items + */ + public static int abs__dropdownitem_text_padding_right=0x7f07000c; + /** Preferred width of the search view. + */ + public static int abs__search_view_preferred_width=0x7f07000f; + /** Minimum width of the search view text entry area. + */ + public static int abs__search_view_text_min_width=0x7f07000e; + /** Minimum width for an action button in the menu area of an action bar + Minimum width for an action button in the menu area of an action bar + */ + public static int action_button_min_width=0x7f070010; + } + public static final class drawable { + public static int abs__ab_bottom_solid_dark_holo=0x7f020000; + public static int abs__ab_bottom_solid_inverse_holo=0x7f020001; + public static int abs__ab_bottom_solid_light_holo=0x7f020002; + public static int abs__ab_bottom_transparent_dark_holo=0x7f020003; + public static int abs__ab_bottom_transparent_light_holo=0x7f020004; + public static int abs__ab_share_pack_holo_dark=0x7f020005; + public static int abs__ab_share_pack_holo_light=0x7f020006; + public static int abs__ab_solid_dark_holo=0x7f020007; + public static int abs__ab_solid_light_holo=0x7f020008; + public static int abs__ab_solid_shadow_holo=0x7f020009; + public static int abs__ab_stacked_solid_dark_holo=0x7f02000a; + public static int abs__ab_stacked_solid_light_holo=0x7f02000b; + public static int abs__ab_stacked_transparent_dark_holo=0x7f02000c; + public static int abs__ab_stacked_transparent_light_holo=0x7f02000d; + public static int abs__ab_transparent_dark_holo=0x7f02000e; + public static int abs__ab_transparent_light_holo=0x7f02000f; + public static int abs__activated_background_holo_dark=0x7f020010; + public static int abs__activated_background_holo_light=0x7f020011; + public static int abs__btn_cab_done_default_holo_dark=0x7f020012; + public static int abs__btn_cab_done_default_holo_light=0x7f020013; + public static int abs__btn_cab_done_focused_holo_dark=0x7f020014; + public static int abs__btn_cab_done_focused_holo_light=0x7f020015; + public static int abs__btn_cab_done_holo_dark=0x7f020016; + public static int abs__btn_cab_done_holo_light=0x7f020017; + public static int abs__btn_cab_done_pressed_holo_dark=0x7f020018; + public static int abs__btn_cab_done_pressed_holo_light=0x7f020019; + public static int abs__cab_background_bottom_holo_dark=0x7f02001a; + public static int abs__cab_background_bottom_holo_light=0x7f02001b; + public static int abs__cab_background_top_holo_dark=0x7f02001c; + public static int abs__cab_background_top_holo_light=0x7f02001d; + public static int abs__dialog_full_holo_dark=0x7f02001e; + public static int abs__dialog_full_holo_light=0x7f02001f; + public static int abs__ic_ab_back_holo_dark=0x7f020020; + public static int abs__ic_ab_back_holo_light=0x7f020021; + public static int abs__ic_cab_done_holo_dark=0x7f020022; + public static int abs__ic_cab_done_holo_light=0x7f020023; + public static int abs__ic_clear=0x7f020024; + public static int abs__ic_clear_disabled=0x7f020025; + public static int abs__ic_clear_holo_light=0x7f020026; + public static int abs__ic_clear_normal=0x7f020027; + public static int abs__ic_clear_search_api_disabled_holo_light=0x7f020028; + public static int abs__ic_clear_search_api_holo_light=0x7f020029; + public static int abs__ic_go=0x7f02002a; + public static int abs__ic_go_search_api_holo_light=0x7f02002b; + public static int abs__ic_menu_moreoverflow_holo_dark=0x7f02002c; + public static int abs__ic_menu_moreoverflow_holo_light=0x7f02002d; + public static int abs__ic_menu_moreoverflow_normal_holo_dark=0x7f02002e; + public static int abs__ic_menu_moreoverflow_normal_holo_light=0x7f02002f; + public static int abs__ic_menu_share_holo_dark=0x7f020030; + public static int abs__ic_menu_share_holo_light=0x7f020031; + public static int abs__ic_search=0x7f020032; + public static int abs__ic_search_api_holo_light=0x7f020033; + public static int abs__ic_voice_search=0x7f020034; + public static int abs__ic_voice_search_api_holo_light=0x7f020035; + public static int abs__item_background_holo_dark=0x7f020036; + public static int abs__item_background_holo_light=0x7f020037; + public static int abs__list_activated_holo=0x7f020038; + public static int abs__list_divider_holo_dark=0x7f020039; + public static int abs__list_divider_holo_light=0x7f02003a; + public static int abs__list_focused_holo=0x7f02003b; + public static int abs__list_longpressed_holo=0x7f02003c; + public static int abs__list_pressed_holo_dark=0x7f02003d; + public static int abs__list_pressed_holo_light=0x7f02003e; + public static int abs__list_selector_background_transition_holo_dark=0x7f02003f; + public static int abs__list_selector_background_transition_holo_light=0x7f020040; + public static int abs__list_selector_disabled_holo_dark=0x7f020041; + public static int abs__list_selector_disabled_holo_light=0x7f020042; + public static int abs__list_selector_holo_dark=0x7f020043; + public static int abs__list_selector_holo_light=0x7f020044; + public static int abs__menu_dropdown_panel_holo_dark=0x7f020045; + public static int abs__menu_dropdown_panel_holo_light=0x7f020046; + public static int abs__progress_bg_holo_dark=0x7f020047; + public static int abs__progress_bg_holo_light=0x7f020048; + public static int abs__progress_horizontal_holo_dark=0x7f020049; + public static int abs__progress_horizontal_holo_light=0x7f02004a; + public static int abs__progress_medium_holo=0x7f02004b; + public static int abs__progress_primary_holo_dark=0x7f02004c; + public static int abs__progress_primary_holo_light=0x7f02004d; + public static int abs__progress_secondary_holo_dark=0x7f02004e; + public static int abs__progress_secondary_holo_light=0x7f02004f; + public static int abs__search_dropdown_dark=0x7f020050; + public static int abs__search_dropdown_light=0x7f020051; + public static int abs__spinner_48_inner_holo=0x7f020052; + public static int abs__spinner_48_outer_holo=0x7f020053; + public static int abs__spinner_ab_default_holo_dark=0x7f020054; + public static int abs__spinner_ab_default_holo_light=0x7f020055; + public static int abs__spinner_ab_disabled_holo_dark=0x7f020056; + public static int abs__spinner_ab_disabled_holo_light=0x7f020057; + public static int abs__spinner_ab_focused_holo_dark=0x7f020058; + public static int abs__spinner_ab_focused_holo_light=0x7f020059; + public static int abs__spinner_ab_holo_dark=0x7f02005a; + public static int abs__spinner_ab_holo_light=0x7f02005b; + public static int abs__spinner_ab_pressed_holo_dark=0x7f02005c; + public static int abs__spinner_ab_pressed_holo_light=0x7f02005d; + public static int abs__tab_indicator_ab_holo=0x7f02005e; + public static int abs__tab_selected_focused_holo=0x7f02005f; + public static int abs__tab_selected_holo=0x7f020060; + public static int abs__tab_selected_pressed_holo=0x7f020061; + public static int abs__tab_unselected_pressed_holo=0x7f020062; + public static int abs__textfield_search_default_holo_dark=0x7f020063; + public static int abs__textfield_search_default_holo_light=0x7f020064; + public static int abs__textfield_search_right_default_holo_dark=0x7f020065; + public static int abs__textfield_search_right_default_holo_light=0x7f020066; + public static int abs__textfield_search_right_selected_holo_dark=0x7f020067; + public static int abs__textfield_search_right_selected_holo_light=0x7f020068; + public static int abs__textfield_search_selected_holo_dark=0x7f020069; + public static int abs__textfield_search_selected_holo_light=0x7f02006a; + public static int abs__textfield_searchview_holo_dark=0x7f02006b; + public static int abs__textfield_searchview_holo_light=0x7f02006c; + public static int abs__textfield_searchview_right_holo_dark=0x7f02006d; + public static int abs__textfield_searchview_right_holo_light=0x7f02006e; + } + public static final class id { + public static int abs__action_bar=0x7f040022; + public static int abs__action_bar_container=0x7f040021; + public static int abs__action_bar_subtitle=0x7f040011; + public static int abs__action_bar_title=0x7f040010; + public static int abs__action_context_bar=0x7f040023; + public static int abs__action_menu_divider=0x7f04000c; + public static int abs__action_menu_presenter=0x7f04000d; + public static int abs__action_mode_bar=0x7f040026; + public static int abs__action_mode_bar_stub=0x7f040025; + public static int abs__action_mode_close_button=0x7f040014; + public static int abs__activity_chooser_view_content=0x7f040015; + public static int abs__checkbox=0x7f04001e; + public static int abs__content=0x7f04001d; + public static int abs__default_activity_button=0x7f040018; + public static int abs__expand_activities_button=0x7f040016; + public static int abs__home=0x7f04000a; + public static int abs__icon=0x7f04001a; + public static int abs__image=0x7f040017; + public static int abs__imageButton=0x7f040012; + public static int abs__list_item=0x7f040019; + public static int abs__progress_circular=0x7f04000e; + public static int abs__progress_horizontal=0x7f04000f; + public static int abs__radio=0x7f040020; + public static int abs__search_badge=0x7f040029; + public static int abs__search_bar=0x7f040028; + public static int abs__search_button=0x7f04002a; + public static int abs__search_close_btn=0x7f04002f; + public static int abs__search_edit_frame=0x7f04002b; + public static int abs__search_go_btn=0x7f040031; + public static int abs__search_mag_icon=0x7f04002c; + public static int abs__search_plate=0x7f04002d; + public static int abs__search_src_text=0x7f04002e; + public static int abs__search_voice_btn=0x7f040032; + public static int abs__shortcut=0x7f04001f; + public static int abs__split_action_bar=0x7f040024; + public static int abs__submit_area=0x7f040030; + public static int abs__textButton=0x7f040013; + public static int abs__title=0x7f04001b; + public static int abs__titleDivider=0x7f04001c; + public static int abs__up=0x7f04000b; + public static int disableHome=0x7f040009; + public static int edit_query=0x7f040027; + public static int homeAsUp=0x7f040006; + public static int listMode=0x7f040002; + public static int normal=0x7f040001; + public static int showCustom=0x7f040008; + public static int showHome=0x7f040005; + public static int showTitle=0x7f040007; + public static int tabMode=0x7f040003; + public static int useLogo=0x7f040004; + public static int wrap_content=0x7f040000; + } + public static final class integer { + public static int abs__max_action_buttons=0x7f080000; + } + public static final class layout { + public static int abs__action_bar_home=0x7f030000; + public static int abs__action_bar_tab=0x7f030001; + public static int abs__action_bar_tab_bar_view=0x7f030002; + public static int abs__action_bar_title_item=0x7f030003; + public static int abs__action_menu_item_layout=0x7f030004; + public static int abs__action_menu_layout=0x7f030005; + public static int abs__action_mode_bar=0x7f030006; + public static int abs__action_mode_close_item=0x7f030007; + public static int abs__activity_chooser_view=0x7f030008; + public static int abs__activity_chooser_view_list_item=0x7f030009; + public static int abs__dialog_title_holo=0x7f03000a; + public static int abs__list_menu_item_checkbox=0x7f03000b; + public static int abs__list_menu_item_icon=0x7f03000c; + public static int abs__list_menu_item_layout=0x7f03000d; + public static int abs__list_menu_item_radio=0x7f03000e; + public static int abs__popup_menu_item_layout=0x7f03000f; + public static int abs__screen_action_bar=0x7f030010; + public static int abs__screen_action_bar_overlay=0x7f030011; + public static int abs__screen_simple=0x7f030012; + public static int abs__screen_simple_overlay_action_mode=0x7f030013; + public static int abs__search_dropdown_item_icons_2line=0x7f030014; + public static int abs__search_view=0x7f030015; + public static int abs__simple_dropdown_hint=0x7f030016; + public static int sherlock_spinner_dropdown_item=0x7f030017; + public static int sherlock_spinner_item=0x7f030018; + } + public static final class string { + /** Content description for the action bar "home" affordance. [CHAR LIMIT=NONE] + */ + public static int abs__action_bar_home_description=0x7f090000; + /** Content description for the action bar "up" affordance. [CHAR LIMIT=NONE] + */ + public static int abs__action_bar_up_description=0x7f090001; + /** Content description for the action menu overflow button. [CHAR LIMIT=NONE] + */ + public static int abs__action_menu_overflow_description=0x7f090002; + /** Label for the "Done" button on the far left of action mode toolbars. + */ + public static int abs__action_mode_done=0x7f090003; + /** Title default for a dialog showing possible activities in ActivityChooserView [CHAR LIMIT=25] + */ + public static int abs__activity_chooser_view_dialog_title_default=0x7f090005; + /** Title for a button to expand the list of activities in ActivityChooserView [CHAR LIMIT=25] + */ + public static int abs__activity_chooser_view_see_all=0x7f090004; + /** Description of the shwoing of a popup window with activities to choose from. [CHAR LIMIT=NONE] + */ + public static int abs__activitychooserview_choose_application=0x7f090007; + /** SearchView accessibility description for clear button [CHAR LIMIT=NONE] + */ + public static int abs__searchview_description_clear=0x7f09000c; + /** SearchView accessibility description for search text field [CHAR LIMIT=NONE] + */ + public static int abs__searchview_description_query=0x7f09000b; + /** SearchView accessibility description for search button [CHAR LIMIT=NONE] + */ + public static int abs__searchview_description_search=0x7f09000a; + /** SearchView accessibility description for submit button [CHAR LIMIT=NONE] + */ + public static int abs__searchview_description_submit=0x7f09000d; + /** SearchView accessibility description for voice button [CHAR LIMIT=NONE] + */ + public static int abs__searchview_description_voice=0x7f09000e; + /** Title for a dialog showing possible activities for sharing in ShareActionProvider [CHAR LIMIT=25] + */ + public static int abs__share_action_provider_share_with=0x7f090006; + /** Description of the choose target button in a ShareActionProvider (share UI). [CHAR LIMIT=NONE] + */ + public static int abs__shareactionprovider_share_with=0x7f090008; + /** Description of a share target (both in the list of such or the default share button) in a ShareActionProvider (share UI). [CHAR LIMIT=NONE] + */ + public static int abs__shareactionprovider_share_with_application=0x7f090009; + } + public static final class style { + public static int DialogWindowTitle_Sherlock=0x7f0a0036; + public static int DialogWindowTitle_Sherlock_Light=0x7f0a0037; + public static int Sherlock___TextAppearance_Small=0x7f0a004a; + public static int Sherlock___Theme=0x7f0a004e; + public static int Sherlock___Theme_DarkActionBar=0x7f0a0050; + public static int Sherlock___Theme_Dialog=0x7f0a0051; + public static int Sherlock___Theme_Light=0x7f0a004f; + public static int Sherlock___Widget_ActionBar=0x7f0a0001; + public static int Sherlock___Widget_ActionMode=0x7f0a0016; + public static int Sherlock___Widget_ActivityChooserView=0x7f0a001e; + public static int Sherlock___Widget_Holo_DropDownItem=0x7f0a0029; + public static int Sherlock___Widget_Holo_ListView=0x7f0a0026; + public static int Sherlock___Widget_Holo_Spinner=0x7f0a0023; + public static int Sherlock___Widget_SearchAutoCompleteTextView=0x7f0a0033; + public static int TextAppearance_Sherlock_DialogWindowTitle=0x7f0a0048; + public static int TextAppearance_Sherlock_Light_DialogWindowTitle=0x7f0a0049; + public static int TextAppearance_Sherlock_Light_Small=0x7f0a004c; + public static int TextAppearance_Sherlock_Light_Widget_PopupMenu_Large=0x7f0a0043; + public static int TextAppearance_Sherlock_Light_Widget_PopupMenu_Small=0x7f0a0045; + public static int TextAppearance_Sherlock_Small=0x7f0a004b; + public static int TextAppearance_Sherlock_Widget_ActionBar_Menu=0x7f0a0038; + public static int TextAppearance_Sherlock_Widget_ActionBar_Subtitle=0x7f0a003b; + public static int TextAppearance_Sherlock_Widget_ActionBar_Subtitle_Inverse=0x7f0a003c; + public static int TextAppearance_Sherlock_Widget_ActionBar_Title=0x7f0a0039; + public static int TextAppearance_Sherlock_Widget_ActionBar_Title_Inverse=0x7f0a003a; + public static int TextAppearance_Sherlock_Widget_ActionMode_Subtitle=0x7f0a003f; + public static int TextAppearance_Sherlock_Widget_ActionMode_Subtitle_Inverse=0x7f0a0040; + public static int TextAppearance_Sherlock_Widget_ActionMode_Title=0x7f0a003d; + public static int TextAppearance_Sherlock_Widget_ActionMode_Title_Inverse=0x7f0a003e; + public static int TextAppearance_Sherlock_Widget_DropDownHint=0x7f0a004d; + public static int TextAppearance_Sherlock_Widget_DropDownItem=0x7f0a0047; + public static int TextAppearance_Sherlock_Widget_PopupMenu=0x7f0a0041; + public static int TextAppearance_Sherlock_Widget_PopupMenu_Large=0x7f0a0042; + public static int TextAppearance_Sherlock_Widget_PopupMenu_Small=0x7f0a0044; + public static int TextAppearance_Sherlock_Widget_TextView_SpinnerItem=0x7f0a0046; + public static int Theme_Sherlock=0x7f0a0052; + public static int Theme_Sherlock_Dialog=0x7f0a0057; + public static int Theme_Sherlock_Light=0x7f0a0053; + public static int Theme_Sherlock_Light_DarkActionBar=0x7f0a0054; + public static int Theme_Sherlock_Light_Dialog=0x7f0a0058; + public static int Theme_Sherlock_Light_NoActionBar=0x7f0a0056; + public static int Theme_Sherlock_NoActionBar=0x7f0a0055; + public static int Widget=0x7f0a0000; + public static int Widget_Sherlock_ActionBar=0x7f0a0002; + public static int Widget_Sherlock_ActionBar_Solid=0x7f0a0003; + public static int Widget_Sherlock_ActionBar_TabBar=0x7f0a000a; + public static int Widget_Sherlock_ActionBar_TabText=0x7f0a000d; + public static int Widget_Sherlock_ActionBar_TabView=0x7f0a0007; + public static int Widget_Sherlock_ActionButton=0x7f0a0010; + public static int Widget_Sherlock_ActionButton_CloseMode=0x7f0a0012; + public static int Widget_Sherlock_ActionButton_Overflow=0x7f0a0014; + public static int Widget_Sherlock_ActionMode=0x7f0a0017; + public static int Widget_Sherlock_ActivityChooserView=0x7f0a001f; + public static int Widget_Sherlock_Button_Small=0x7f0a0021; + public static int Widget_Sherlock_DropDownItem_Spinner=0x7f0a002a; + public static int Widget_Sherlock_Light_ActionBar=0x7f0a0004; + public static int Widget_Sherlock_Light_ActionBar_Solid=0x7f0a0005; + public static int Widget_Sherlock_Light_ActionBar_Solid_Inverse=0x7f0a0006; + public static int Widget_Sherlock_Light_ActionBar_TabBar=0x7f0a000b; + public static int Widget_Sherlock_Light_ActionBar_TabBar_Inverse=0x7f0a000c; + public static int Widget_Sherlock_Light_ActionBar_TabText=0x7f0a000e; + public static int Widget_Sherlock_Light_ActionBar_TabText_Inverse=0x7f0a000f; + public static int Widget_Sherlock_Light_ActionBar_TabView=0x7f0a0008; + public static int Widget_Sherlock_Light_ActionBar_TabView_Inverse=0x7f0a0009; + public static int Widget_Sherlock_Light_ActionButton=0x7f0a0011; + public static int Widget_Sherlock_Light_ActionButton_CloseMode=0x7f0a0013; + public static int Widget_Sherlock_Light_ActionButton_Overflow=0x7f0a0015; + public static int Widget_Sherlock_Light_ActionMode=0x7f0a0018; + public static int Widget_Sherlock_Light_ActionMode_Inverse=0x7f0a0019; + public static int Widget_Sherlock_Light_ActivityChooserView=0x7f0a0020; + public static int Widget_Sherlock_Light_Button_Small=0x7f0a0022; + public static int Widget_Sherlock_Light_DropDownItem_Spinner=0x7f0a002b; + public static int Widget_Sherlock_Light_ListPopupWindow=0x7f0a001b; + public static int Widget_Sherlock_Light_ListView_DropDown=0x7f0a0028; + public static int Widget_Sherlock_Light_PopupMenu=0x7f0a001d; + public static int Widget_Sherlock_Light_PopupWindow_ActionMode=0x7f0a002d; + public static int Widget_Sherlock_Light_ProgressBar=0x7f0a002f; + public static int Widget_Sherlock_Light_ProgressBar_Horizontal=0x7f0a0031; + public static int Widget_Sherlock_Light_SearchAutoCompleteTextView=0x7f0a0035; + public static int Widget_Sherlock_Light_Spinner_DropDown_ActionBar=0x7f0a0025; + public static int Widget_Sherlock_ListPopupWindow=0x7f0a001a; + public static int Widget_Sherlock_ListView_DropDown=0x7f0a0027; + public static int Widget_Sherlock_PopupMenu=0x7f0a001c; + public static int Widget_Sherlock_PopupWindow_ActionMode=0x7f0a002c; + public static int Widget_Sherlock_ProgressBar=0x7f0a002e; + public static int Widget_Sherlock_ProgressBar_Horizontal=0x7f0a0030; + public static int Widget_Sherlock_SearchAutoCompleteTextView=0x7f0a0034; + public static int Widget_Sherlock_Spinner_DropDown_ActionBar=0x7f0a0024; + public static int Widget_Sherlock_TextView_SpinnerItem=0x7f0a0032; + } + public static final class styleable { + /** Attributes used to style the Action Bar. +

Includes the following attributes:

+ + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescription
{@link #SherlockActionBar_background com.actionbarsherlock:background} Specifies a background drawable for the action bar.
{@link #SherlockActionBar_backgroundSplit com.actionbarsherlock:backgroundSplit} Specifies a background drawable for the bottom component of a split action bar.
{@link #SherlockActionBar_backgroundStacked com.actionbarsherlock:backgroundStacked} Specifies a background drawable for a second stacked row of the action bar.
{@link #SherlockActionBar_customNavigationLayout com.actionbarsherlock:customNavigationLayout} Specifies a layout for custom navigation.
{@link #SherlockActionBar_displayOptions com.actionbarsherlock:displayOptions} Options affecting how the action bar is displayed.
{@link #SherlockActionBar_divider com.actionbarsherlock:divider} Specifies the drawable used for item dividers.
{@link #SherlockActionBar_height com.actionbarsherlock:height} Specifies a fixed height.
{@link #SherlockActionBar_homeLayout com.actionbarsherlock:homeLayout} Specifies a layout to use for the "home" section of the action bar.
{@link #SherlockActionBar_icon com.actionbarsherlock:icon} Specifies the drawable used for the application icon.
{@link #SherlockActionBar_indeterminateProgressStyle com.actionbarsherlock:indeterminateProgressStyle} Specifies a style resource to use for an indeterminate progress spinner.
{@link #SherlockActionBar_itemPadding com.actionbarsherlock:itemPadding} Specifies padding that should be applied to the left and right sides of + system-provided items in the bar.
{@link #SherlockActionBar_logo com.actionbarsherlock:logo} Specifies the drawable used for the application logo.
{@link #SherlockActionBar_navigationMode com.actionbarsherlock:navigationMode} The type of navigation to use.
{@link #SherlockActionBar_progressBarPadding com.actionbarsherlock:progressBarPadding} Specifies the horizontal padding on either end for an embedded progress bar.
{@link #SherlockActionBar_progressBarStyle com.actionbarsherlock:progressBarStyle} Specifies a style resource to use for an embedded progress bar.
{@link #SherlockActionBar_subtitle com.actionbarsherlock:subtitle} Specifies subtitle text used for navigationMode="normal"
{@link #SherlockActionBar_subtitleTextStyle com.actionbarsherlock:subtitleTextStyle} Specifies a style to use for subtitle text.
{@link #SherlockActionBar_title com.actionbarsherlock:title} Specifies title text used for navigationMode="normal"
{@link #SherlockActionBar_titleTextStyle com.actionbarsherlock:titleTextStyle} Specifies a style to use for title text.
+ @see #SherlockActionBar_background + @see #SherlockActionBar_backgroundSplit + @see #SherlockActionBar_backgroundStacked + @see #SherlockActionBar_customNavigationLayout + @see #SherlockActionBar_displayOptions + @see #SherlockActionBar_divider + @see #SherlockActionBar_height + @see #SherlockActionBar_homeLayout + @see #SherlockActionBar_icon + @see #SherlockActionBar_indeterminateProgressStyle + @see #SherlockActionBar_itemPadding + @see #SherlockActionBar_logo + @see #SherlockActionBar_navigationMode + @see #SherlockActionBar_progressBarPadding + @see #SherlockActionBar_progressBarStyle + @see #SherlockActionBar_subtitle + @see #SherlockActionBar_subtitleTextStyle + @see #SherlockActionBar_title + @see #SherlockActionBar_titleTextStyle + */ + public static final int[] SherlockActionBar = { + 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, + 0x7f010004, 0x7f010005, 0x7f010048, 0x7f010049, + 0x7f01004a, 0x7f01004b, 0x7f01004c, 0x7f01004d, + 0x7f01004e, 0x7f01004f, 0x7f010050, 0x7f010051, + 0x7f010052, 0x7f010053, 0x7f010054 + }; + /** +

+ @attr description + Specifies a background drawable for the action bar. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:background + */ + public static final int SherlockActionBar_background = 2; + /** +

+ @attr description + Specifies a background drawable for the bottom component of a split action bar. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:backgroundSplit + */ + public static final int SherlockActionBar_backgroundSplit = 3; + /** +

+ @attr description + Specifies a background drawable for a second stacked row of the action bar. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:backgroundStacked + */ + public static final int SherlockActionBar_backgroundStacked = 12; + /** +

+ @attr description + Specifies a layout for custom navigation. Overrides navigationMode. + + +

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

This is a private symbol. + @attr name android:customNavigationLayout + */ + public static final int SherlockActionBar_customNavigationLayout = 13; + /** +

+ @attr description + Options affecting how the action bar is displayed. + + +

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

+ ++++ + + + + + + +
ConstantValueDescription
useLogo0x1
showHome0x2
homeAsUp0x4
showTitle0x8
showCustom0x10
disableHome0x20
+

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

+ @attr description + Specifies the drawable used for item dividers. + + +

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

This is a private symbol. + @attr name android:divider + */ + public static final int SherlockActionBar_divider = 5; + /** +

+ @attr description + Specifies a fixed height. + + +

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

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

This is a private symbol. + @attr name android:height + */ + public static final int SherlockActionBar_height = 4; + /** +

+ @attr description + Specifies a layout to use for the "home" section of the action bar. + + +

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

This is a private symbol. + @attr name android:homeLayout + */ + public static final int SherlockActionBar_homeLayout = 14; + /** +

+ @attr description + Specifies the drawable used for the application icon. + + +

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

This is a private symbol. + @attr name android:icon + */ + public static final int SherlockActionBar_icon = 10; + /** +

+ @attr description + Specifies a style resource to use for an indeterminate progress spinner. + + +

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

This is a private symbol. + @attr name android:indeterminateProgressStyle + */ + public static final int SherlockActionBar_indeterminateProgressStyle = 16; + /** +

+ @attr description + Specifies padding that should be applied to the left and right sides of + system-provided items in the bar. + + +

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

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

This is a private symbol. + @attr name android:itemPadding + */ + public static final int SherlockActionBar_itemPadding = 18; + /** +

+ @attr description + Specifies the drawable used for the application logo. + + +

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

This is a private symbol. + @attr name android:logo + */ + public static final int SherlockActionBar_logo = 11; + /** +

+ @attr description + The type of navigation to use. + + +

Must be one of the following constant values.

+ ++++ + + + +
ConstantValueDescription
normal0 Normal static title text
listMode1 The action bar will use a selection list for navigation.
tabMode2 The action bar will use a series of horizontal tabs for navigation.
+

This is a private symbol. + @attr name android:navigationMode + */ + public static final int SherlockActionBar_navigationMode = 6; + /** +

+ @attr description + Specifies the horizontal padding on either end for an embedded progress bar. + + +

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

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

This is a private symbol. + @attr name android:progressBarPadding + */ + public static final int SherlockActionBar_progressBarPadding = 17; + /** +

+ @attr description + Specifies a style resource to use for an embedded progress bar. + + +

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

This is a private symbol. + @attr name android:progressBarStyle + */ + public static final int SherlockActionBar_progressBarStyle = 15; + /** +

+ @attr description + Specifies subtitle text used for navigationMode="normal" + + +

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

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

This is a private symbol. + @attr name android:subtitle + */ + public static final int SherlockActionBar_subtitle = 9; + /** +

+ @attr description + Specifies a style to use for subtitle text. + + +

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

This is a private symbol. + @attr name android:subtitleTextStyle + */ + public static final int SherlockActionBar_subtitleTextStyle = 1; + /** +

+ @attr description + Specifies title text used for navigationMode="normal" + + +

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

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

This is a private symbol. + @attr name android:title + */ + public static final int SherlockActionBar_title = 8; + /** +

+ @attr description + Specifies a style to use for title text. + + +

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

This is a private symbol. + @attr name android:titleTextStyle + */ + public static final int SherlockActionBar_titleTextStyle = 0; + /** Attributes that can be used with a SherlockActionMenuItemView. +

Includes the following attributes:

+ + + + + +
AttributeDescription
{@link #SherlockActionMenuItemView_android_minWidth com.actionbarsherlock:android_minWidth}
+ @see #SherlockActionMenuItemView_android_minWidth + */ + public static final int[] SherlockActionMenuItemView = { + 0x0101013f + }; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#android_minWidth} + attribute's value can be found in the {@link #SherlockActionMenuItemView} array. + @attr name android:android_minWidth + */ + public static final int SherlockActionMenuItemView_android_minWidth = 0; + /** Attributes that can be used with a SherlockActionMode. +

Includes the following attributes:

+ + + + + + + + + +
AttributeDescription
{@link #SherlockActionMode_background com.actionbarsherlock:background} Specifies a background for the action mode bar.
{@link #SherlockActionMode_backgroundSplit com.actionbarsherlock:backgroundSplit} Specifies a background for the split action mode bar.
{@link #SherlockActionMode_height com.actionbarsherlock:height} Specifies a fixed height for the action mode bar.
{@link #SherlockActionMode_subtitleTextStyle com.actionbarsherlock:subtitleTextStyle} Specifies a style to use for subtitle text.
{@link #SherlockActionMode_titleTextStyle com.actionbarsherlock:titleTextStyle} Specifies a style to use for title text.
+ @see #SherlockActionMode_background + @see #SherlockActionMode_backgroundSplit + @see #SherlockActionMode_height + @see #SherlockActionMode_subtitleTextStyle + @see #SherlockActionMode_titleTextStyle + */ + public static final int[] SherlockActionMode = { + 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, + 0x7f010004 + }; + /** +

+ @attr description + Specifies a background for the action mode bar. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:background + */ + public static final int SherlockActionMode_background = 2; + /** +

+ @attr description + Specifies a background for the split action mode bar. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:backgroundSplit + */ + public static final int SherlockActionMode_backgroundSplit = 3; + /** +

+ @attr description + Specifies a fixed height for the action mode bar. + + +

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

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

This is a private symbol. + @attr name android:height + */ + public static final int SherlockActionMode_height = 4; + /** +

+ @attr description + Specifies a style to use for subtitle text. + + +

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

This is a private symbol. + @attr name android:subtitleTextStyle + */ + public static final int SherlockActionMode_subtitleTextStyle = 1; + /** +

+ @attr description + Specifies a style to use for title text. + + +

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

This is a private symbol. + @attr name android:titleTextStyle + */ + public static final int SherlockActionMode_titleTextStyle = 0; + /** Attributes that can be used with a SherlockActivityChooserView. +

Includes the following attributes:

+ + + + + + + +
AttributeDescription
{@link #SherlockActivityChooserView_android_background com.actionbarsherlock:android_background}
{@link #SherlockActivityChooserView_expandActivityOverflowButtonDrawable com.actionbarsherlock:expandActivityOverflowButtonDrawable} The drawable to show in the button for expanding the activities overflow popup.
{@link #SherlockActivityChooserView_initialActivityCount com.actionbarsherlock:initialActivityCount} The maximal number of items initially shown in the activity list.
+ @see #SherlockActivityChooserView_android_background + @see #SherlockActivityChooserView_expandActivityOverflowButtonDrawable + @see #SherlockActivityChooserView_initialActivityCount + */ + public static final int[] SherlockActivityChooserView = { + 0x010100d4, 0x7f01005d, 0x7f01005e + }; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#android_background} + attribute's value can be found in the {@link #SherlockActivityChooserView} array. + @attr name android:android_background + */ + public static final int SherlockActivityChooserView_android_background = 0; + /** +

+ @attr description + The drawable to show in the button for expanding the activities overflow popup. + Note: Clients would like to set this drawable + as a clue about the action the chosen activity will perform. For + example, if share activity is to be chosen the drawable should + give a clue that sharing is to be performed. + + + +

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

This is a private symbol. + @attr name android:expandActivityOverflowButtonDrawable + */ + public static final int SherlockActivityChooserView_expandActivityOverflowButtonDrawable = 2; + /** +

+ @attr description + The maximal number of items initially shown in the activity list. + + +

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

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

This is a private symbol. + @attr name android:initialActivityCount + */ + public static final int SherlockActivityChooserView_initialActivityCount = 1; + /** Base attributes that are available to all groups. +

Includes the following attributes:

+ + + + + + + + + + +
AttributeDescription
{@link #SherlockMenuGroup_android_checkableBehavior com.actionbarsherlock:android_checkableBehavior} Whether the items are capable of displaying a check mark.
{@link #SherlockMenuGroup_android_enabled com.actionbarsherlock:android_enabled} Whether the items are enabled.
{@link #SherlockMenuGroup_android_id com.actionbarsherlock:android_id} The ID of the group.
{@link #SherlockMenuGroup_android_menuCategory com.actionbarsherlock:android_menuCategory} The category applied to all items within this group.
{@link #SherlockMenuGroup_android_orderInCategory com.actionbarsherlock:android_orderInCategory} The order within the category applied to all items within this group.
{@link #SherlockMenuGroup_android_visible com.actionbarsherlock:android_visible} Whether the items are shown/visible.
+ @see #SherlockMenuGroup_android_checkableBehavior + @see #SherlockMenuGroup_android_enabled + @see #SherlockMenuGroup_android_id + @see #SherlockMenuGroup_android_menuCategory + @see #SherlockMenuGroup_android_orderInCategory + @see #SherlockMenuGroup_android_visible + */ + public static final int[] SherlockMenuGroup = { + 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, + 0x010101df, 0x010101e0 + }; + /** +

+ @attr description + Whether the items are capable of displaying a check mark. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_checkableBehavior}. + @attr name android:android_checkableBehavior + */ + public static final int SherlockMenuGroup_android_checkableBehavior = 5; + /** +

+ @attr description + Whether the items are enabled. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_enabled}. + @attr name android:android_enabled + */ + public static final int SherlockMenuGroup_android_enabled = 0; + /** +

+ @attr description + The ID of the group. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_id}. + @attr name android:android_id + */ + public static final int SherlockMenuGroup_android_id = 1; + /** +

+ @attr description + The category applied to all items within this group. + (This will be or'ed with the orderInCategory attribute.) +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_menuCategory}. + @attr name android:android_menuCategory + */ + public static final int SherlockMenuGroup_android_menuCategory = 3; + /** +

+ @attr description + The order within the category applied to all items within this group. + (This will be or'ed with the category attribute.) +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_orderInCategory}. + @attr name android:android_orderInCategory + */ + public static final int SherlockMenuGroup_android_orderInCategory = 4; + /** +

+ @attr description + Whether the items are shown/visible. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_visible}. + @attr name android:android_visible + */ + public static final int SherlockMenuGroup_android_visible = 2; + /** Base attributes that are available to all Item objects. +

Includes the following attributes:

+ + + + + + + + + + + + + + + + + + + + + +
AttributeDescription
{@link #SherlockMenuItem_android_actionLayout com.actionbarsherlock:android_actionLayout} An optional layout to be used as an action view.
{@link #SherlockMenuItem_android_actionProviderClass com.actionbarsherlock:android_actionProviderClass} The name of an optional ActionProvider class to instantiate an action view + and perform operations such as default action for that menu item.
{@link #SherlockMenuItem_android_actionViewClass com.actionbarsherlock:android_actionViewClass} The name of an optional View class to instantiate and use as an + action view.
{@link #SherlockMenuItem_android_alphabeticShortcut com.actionbarsherlock:android_alphabeticShortcut} The alphabetic shortcut key.
{@link #SherlockMenuItem_android_checkable com.actionbarsherlock:android_checkable} Whether the item is capable of displaying a check mark.
{@link #SherlockMenuItem_android_checked com.actionbarsherlock:android_checked} Whether the item is checked.
{@link #SherlockMenuItem_android_enabled com.actionbarsherlock:android_enabled} Whether the item is enabled.
{@link #SherlockMenuItem_android_icon com.actionbarsherlock:android_icon} The icon associated with this item.
{@link #SherlockMenuItem_android_id com.actionbarsherlock:android_id} The ID of the item.
{@link #SherlockMenuItem_android_menuCategory com.actionbarsherlock:android_menuCategory} The category applied to the item.
{@link #SherlockMenuItem_android_numericShortcut com.actionbarsherlock:android_numericShortcut} The numeric shortcut key.
{@link #SherlockMenuItem_android_onClick com.actionbarsherlock:android_onClick} Name of a method on the Context used to inflate the menu that will be + called when the item is clicked.
{@link #SherlockMenuItem_android_orderInCategory com.actionbarsherlock:android_orderInCategory} The order within the category applied to the item.
{@link #SherlockMenuItem_android_showAsAction com.actionbarsherlock:android_showAsAction} How this item should display in the Action Bar, if present.
{@link #SherlockMenuItem_android_title com.actionbarsherlock:android_title} The title associated with the item.
{@link #SherlockMenuItem_android_titleCondensed com.actionbarsherlock:android_titleCondensed} The condensed title associated with the item.
{@link #SherlockMenuItem_android_visible com.actionbarsherlock:android_visible} Whether the item is shown/visible.
+ @see #SherlockMenuItem_android_actionLayout + @see #SherlockMenuItem_android_actionProviderClass + @see #SherlockMenuItem_android_actionViewClass + @see #SherlockMenuItem_android_alphabeticShortcut + @see #SherlockMenuItem_android_checkable + @see #SherlockMenuItem_android_checked + @see #SherlockMenuItem_android_enabled + @see #SherlockMenuItem_android_icon + @see #SherlockMenuItem_android_id + @see #SherlockMenuItem_android_menuCategory + @see #SherlockMenuItem_android_numericShortcut + @see #SherlockMenuItem_android_onClick + @see #SherlockMenuItem_android_orderInCategory + @see #SherlockMenuItem_android_showAsAction + @see #SherlockMenuItem_android_title + @see #SherlockMenuItem_android_titleCondensed + @see #SherlockMenuItem_android_visible + */ + public static final int[] SherlockMenuItem = { + 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, + 0x01010194, 0x010101de, 0x010101df, 0x010101e1, + 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, + 0x0101026f, 0x010102d9, 0x010102fb, 0x010102fc, + 0x01010389 + }; + /** +

+ @attr description + An optional layout to be used as an action view. + See {@link android.view.MenuItem#setActionView(android.view.View)} + for more info. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_actionLayout}. + @attr name android:android_actionLayout + */ + public static final int SherlockMenuItem_android_actionLayout = 14; + /** +

+ @attr description + The name of an optional ActionProvider class to instantiate an action view + and perform operations such as default action for that menu item. + See {@link android.view.MenuItem#setActionProvider(android.view.ActionProvider)} + for more info. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_actionProviderClass}. + @attr name android:android_actionProviderClass + */ + public static final int SherlockMenuItem_android_actionProviderClass = 16; + /** +

+ @attr description + The name of an optional View class to instantiate and use as an + action view. See {@link android.view.MenuItem#setActionView(android.view.View)} + for more info. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_actionViewClass}. + @attr name android:android_actionViewClass + */ + public static final int SherlockMenuItem_android_actionViewClass = 15; + /** +

+ @attr description + The alphabetic shortcut key. This is the shortcut when using a keyboard + with alphabetic keys. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_alphabeticShortcut}. + @attr name android:android_alphabeticShortcut + */ + public static final int SherlockMenuItem_android_alphabeticShortcut = 9; + /** +

+ @attr description + Whether the item is capable of displaying a check mark. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_checkable}. + @attr name android:android_checkable + */ + public static final int SherlockMenuItem_android_checkable = 11; + /** +

+ @attr description + Whether the item is checked. Note that you must first have enabled checking with + the checkable attribute or else the check mark will not appear. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_checked}. + @attr name android:android_checked + */ + public static final int SherlockMenuItem_android_checked = 3; + /** +

+ @attr description + Whether the item is enabled. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_enabled}. + @attr name android:android_enabled + */ + public static final int SherlockMenuItem_android_enabled = 1; + /** +

+ @attr description + The icon associated with this item. This icon will not always be shown, so + the title should be sufficient in describing this item. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_icon}. + @attr name android:android_icon + */ + public static final int SherlockMenuItem_android_icon = 0; + /** +

+ @attr description + The ID of the item. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_id}. + @attr name android:android_id + */ + public static final int SherlockMenuItem_android_id = 2; + /** +

+ @attr description + The category applied to the item. + (This will be or'ed with the orderInCategory attribute.) +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_menuCategory}. + @attr name android:android_menuCategory + */ + public static final int SherlockMenuItem_android_menuCategory = 5; + /** +

+ @attr description + The numeric shortcut key. This is the shortcut when using a numeric (e.g., 12-key) + keyboard. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_numericShortcut}. + @attr name android:android_numericShortcut + */ + public static final int SherlockMenuItem_android_numericShortcut = 10; + /** +

+ @attr description + Name of a method on the Context used to inflate the menu that will be + called when the item is clicked. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_onClick}. + @attr name android:android_onClick + */ + public static final int SherlockMenuItem_android_onClick = 12; + /** +

+ @attr description + The order within the category applied to the item. + (This will be or'ed with the category attribute.) +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_orderInCategory}. + @attr name android:android_orderInCategory + */ + public static final int SherlockMenuItem_android_orderInCategory = 6; + /** +

+ @attr description + How this item should display in the Action Bar, if present. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_showAsAction}. + @attr name android:android_showAsAction + */ + public static final int SherlockMenuItem_android_showAsAction = 13; + /** +

+ @attr description + The title associated with the item. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_title}. + @attr name android:android_title + */ + public static final int SherlockMenuItem_android_title = 7; + /** +

+ @attr description + The condensed title associated with the item. This is used in situations where the + normal title may be too long to be displayed. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_titleCondensed}. + @attr name android:android_titleCondensed + */ + public static final int SherlockMenuItem_android_titleCondensed = 8; + /** +

+ @attr description + Whether the item is shown/visible. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_visible}. + @attr name android:android_visible + */ + public static final int SherlockMenuItem_android_visible = 4; + /** Attributes that can be used with a SherlockMenuView. +

Includes the following attributes:

+ + + + + + + + + + + + +
AttributeDescription
{@link #SherlockMenuView_headerBackground com.actionbarsherlock:headerBackground} Default background for the menu header.
{@link #SherlockMenuView_horizontalDivider com.actionbarsherlock:horizontalDivider} Default horizontal divider between rows of menu items.
{@link #SherlockMenuView_itemBackground com.actionbarsherlock:itemBackground} Default background for each menu item.
{@link #SherlockMenuView_itemIconDisabledAlpha com.actionbarsherlock:itemIconDisabledAlpha} Default disabled icon alpha for each menu item that shows an icon.
{@link #SherlockMenuView_itemTextAppearance com.actionbarsherlock:itemTextAppearance} Default appearance of menu item text.
{@link #SherlockMenuView_preserveIconSpacing com.actionbarsherlock:preserveIconSpacing} Whether space should be reserved in layout when an icon is missing.
{@link #SherlockMenuView_verticalDivider com.actionbarsherlock:verticalDivider} Default vertical divider between menu items.
{@link #SherlockMenuView_windowAnimationStyle com.actionbarsherlock:windowAnimationStyle} Default animations for the menu.
+ @see #SherlockMenuView_headerBackground + @see #SherlockMenuView_horizontalDivider + @see #SherlockMenuView_itemBackground + @see #SherlockMenuView_itemIconDisabledAlpha + @see #SherlockMenuView_itemTextAppearance + @see #SherlockMenuView_preserveIconSpacing + @see #SherlockMenuView_verticalDivider + @see #SherlockMenuView_windowAnimationStyle + */ + public static final int[] SherlockMenuView = { + 0x7f010055, 0x7f010056, 0x7f010057, 0x7f010058, + 0x7f010059, 0x7f01005a, 0x7f01005b, 0x7f01005c + }; + /** +

+ @attr description + Default background for the menu header. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:headerBackground + */ + public static final int SherlockMenuView_headerBackground = 3; + /** +

+ @attr description + Default horizontal divider between rows of menu items. + + +

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

This is a private symbol. + @attr name android:horizontalDivider + */ + public static final int SherlockMenuView_horizontalDivider = 1; + /** +

+ @attr description + Default background for each menu item. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:itemBackground + */ + public static final int SherlockMenuView_itemBackground = 4; + /** +

+ @attr description + Default disabled icon alpha for each menu item that shows an icon. + + +

Must be a floating point value, such as "1.2". +

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

This is a private symbol. + @attr name android:itemIconDisabledAlpha + */ + public static final int SherlockMenuView_itemIconDisabledAlpha = 6; + /** +

+ @attr description + Default appearance of menu item text. + + +

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

This is a private symbol. + @attr name android:itemTextAppearance + */ + public static final int SherlockMenuView_itemTextAppearance = 0; + /** +

+ @attr description + Whether space should be reserved in layout when an icon is missing. + + +

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

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

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

+ @attr description + Default vertical divider between menu items. + + +

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

This is a private symbol. + @attr name android:verticalDivider + */ + public static final int SherlockMenuView_verticalDivider = 2; + /** +

+ @attr description + Default animations for the menu. + + +

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

This is a private symbol. + @attr name android:windowAnimationStyle + */ + public static final int SherlockMenuView_windowAnimationStyle = 5; + /** Attributes that can be used with a SherlockSearchView. +

Includes the following attributes:

+ + + + + + + + + +
AttributeDescription
{@link #SherlockSearchView_android_imeOptions com.actionbarsherlock:android_imeOptions} The IME options to set on the query text field.
{@link #SherlockSearchView_android_inputType com.actionbarsherlock:android_inputType} The input type to set on the query text field.
{@link #SherlockSearchView_android_maxWidth com.actionbarsherlock:android_maxWidth} An optional maximum width of the SearchView.
{@link #SherlockSearchView_iconifiedByDefault com.actionbarsherlock:iconifiedByDefault} The default state of the SearchView.
{@link #SherlockSearchView_queryHint com.actionbarsherlock:queryHint} An optional query hint string to be displayed in the empty query field.
+ @see #SherlockSearchView_android_imeOptions + @see #SherlockSearchView_android_inputType + @see #SherlockSearchView_android_maxWidth + @see #SherlockSearchView_iconifiedByDefault + @see #SherlockSearchView_queryHint + */ + public static final int[] SherlockSearchView = { + 0x0101011f, 0x01010220, 0x01010264, 0x7f01005f, + 0x7f010060 + }; + /** +

+ @attr description + The IME options to set on the query text field. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_imeOptions}. + @attr name android:android_imeOptions + */ + public static final int SherlockSearchView_android_imeOptions = 2; + /** +

+ @attr description + The input type to set on the query text field. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_inputType}. + @attr name android:android_inputType + */ + public static final int SherlockSearchView_android_inputType = 1; + /** +

+ @attr description + An optional maximum width of the SearchView. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_maxWidth}. + @attr name android:android_maxWidth + */ + public static final int SherlockSearchView_android_maxWidth = 0; + /** +

+ @attr description + The default state of the SearchView. If true, it will be iconified when not in + use and expanded when clicked. + + +

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

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

This is a private symbol. + @attr name android:iconifiedByDefault + */ + public static final int SherlockSearchView_iconifiedByDefault = 3; + /** +

+ @attr description + An optional query hint string to be displayed in the empty query field. + + +

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

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

This is a private symbol. + @attr name android:queryHint + */ + public static final int SherlockSearchView_queryHint = 4; + /** Attributes that can be used with a SherlockSpinner. +

Includes the following attributes:

+ + + + + + + + + + + + +
AttributeDescription
{@link #SherlockSpinner_android_dropDownHorizontalOffset com.actionbarsherlock:android_dropDownHorizontalOffset} Horizontal offset from the spinner widget for positioning the dropdown + in spinnerMode="dropdown".
{@link #SherlockSpinner_android_dropDownSelector com.actionbarsherlock:android_dropDownSelector} List selector to use for spinnerMode="dropdown" display.
{@link #SherlockSpinner_android_dropDownVerticalOffset com.actionbarsherlock:android_dropDownVerticalOffset} Vertical offset from the spinner widget for positioning the dropdown in + spinnerMode="dropdown".
{@link #SherlockSpinner_android_dropDownWidth com.actionbarsherlock:android_dropDownWidth} Width of the dropdown in spinnerMode="dropdown".
{@link #SherlockSpinner_android_gravity com.actionbarsherlock:android_gravity} Gravity setting for positioning the currently selected item.
{@link #SherlockSpinner_android_popupBackground com.actionbarsherlock:android_popupBackground} Background drawable to use for the dropdown in spinnerMode="dropdown".
{@link #SherlockSpinner_android_popupPromptView com.actionbarsherlock:android_popupPromptView} Reference to a layout to use for displaying a prompt in the dropdown for + spinnerMode="dropdown".
{@link #SherlockSpinner_android_prompt com.actionbarsherlock:android_prompt} The prompt to display when the spinner's dialog is shown.
+ @see #SherlockSpinner_android_dropDownHorizontalOffset + @see #SherlockSpinner_android_dropDownSelector + @see #SherlockSpinner_android_dropDownVerticalOffset + @see #SherlockSpinner_android_dropDownWidth + @see #SherlockSpinner_android_gravity + @see #SherlockSpinner_android_popupBackground + @see #SherlockSpinner_android_popupPromptView + @see #SherlockSpinner_android_prompt + */ + public static final int[] SherlockSpinner = { + 0x010100af, 0x01010175, 0x01010176, 0x0101017b, + 0x01010262, 0x010102ac, 0x010102ad, 0x010103ef + }; + /** +

+ @attr description + Horizontal offset from the spinner widget for positioning the dropdown + in spinnerMode="dropdown". +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_dropDownHorizontalOffset}. + @attr name android:android_dropDownHorizontalOffset + */ + public static final int SherlockSpinner_android_dropDownHorizontalOffset = 5; + /** +

+ @attr description + List selector to use for spinnerMode="dropdown" display. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_dropDownSelector}. + @attr name android:android_dropDownSelector + */ + public static final int SherlockSpinner_android_dropDownSelector = 1; + /** +

+ @attr description + Vertical offset from the spinner widget for positioning the dropdown in + spinnerMode="dropdown". +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_dropDownVerticalOffset}. + @attr name android:android_dropDownVerticalOffset + */ + public static final int SherlockSpinner_android_dropDownVerticalOffset = 6; + /** +

+ @attr description + Width of the dropdown in spinnerMode="dropdown". +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_dropDownWidth}. + @attr name android:android_dropDownWidth + */ + public static final int SherlockSpinner_android_dropDownWidth = 4; + /** +

+ @attr description + Gravity setting for positioning the currently selected item. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_gravity}. + @attr name android:android_gravity + */ + public static final int SherlockSpinner_android_gravity = 0; + /** +

+ @attr description + Background drawable to use for the dropdown in spinnerMode="dropdown". +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_popupBackground}. + @attr name android:android_popupBackground + */ + public static final int SherlockSpinner_android_popupBackground = 2; + /** +

+ @attr description + Reference to a layout to use for displaying a prompt in the dropdown for + spinnerMode="dropdown". This layout must contain a TextView with the id + @android:id/text1 to be populated with the prompt text. +

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

+ @attr description + The prompt to display when the spinner's dialog is shown. +

This corresponds to the global attribute resource symbol {@link com.actionbarsherlock.R.attr#android_prompt}. + @attr name android:android_prompt + */ + public static final int SherlockSpinner_android_prompt = 3; + /** Attributes that can be used with a SherlockTheme. +

Includes the following attributes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescription
{@link #SherlockTheme_actionBarDivider com.actionbarsherlock:actionBarDivider} Custom divider drawable to use for elements in the action bar.
{@link #SherlockTheme_actionBarItemBackground com.actionbarsherlock:actionBarItemBackground} Custom item state list drawable background for action bar items.
{@link #SherlockTheme_actionBarSize com.actionbarsherlock:actionBarSize} Size of the Action Bar, including the contextual + bar used to present Action Modes.
{@link #SherlockTheme_actionBarSplitStyle com.actionbarsherlock:actionBarSplitStyle} Reference to a style for the split Action Bar.
{@link #SherlockTheme_actionBarStyle com.actionbarsherlock:actionBarStyle} Reference to a style for the Action Bar
{@link #SherlockTheme_actionBarTabBarStyle com.actionbarsherlock:actionBarTabBarStyle}
{@link #SherlockTheme_actionBarTabStyle com.actionbarsherlock:actionBarTabStyle} Default style for tabs within an action bar
{@link #SherlockTheme_actionBarTabTextStyle com.actionbarsherlock:actionBarTabTextStyle}
{@link #SherlockTheme_actionBarWidgetTheme com.actionbarsherlock:actionBarWidgetTheme} Reference to a theme that should be used to inflate widgets + and layouts destined for the action bar.
{@link #SherlockTheme_actionButtonStyle com.actionbarsherlock:actionButtonStyle}
{@link #SherlockTheme_actionDropDownStyle com.actionbarsherlock:actionDropDownStyle}
{@link #SherlockTheme_actionMenuTextAppearance com.actionbarsherlock:actionMenuTextAppearance} TextAppearance style that will be applied to text that + appears within action menu items.
{@link #SherlockTheme_actionMenuTextColor com.actionbarsherlock:actionMenuTextColor} Color for text that appears within action menu items.
{@link #SherlockTheme_actionModeBackground com.actionbarsherlock:actionModeBackground} Background drawable to use for action mode UI
{@link #SherlockTheme_actionModeCloseButtonStyle com.actionbarsherlock:actionModeCloseButtonStyle}
{@link #SherlockTheme_actionModeCloseDrawable com.actionbarsherlock:actionModeCloseDrawable} Drawable to use for the close action mode button
{@link #SherlockTheme_actionModePopupWindowStyle com.actionbarsherlock:actionModePopupWindowStyle} PopupWindow style to use for action modes when showing as a window overlay.
{@link #SherlockTheme_actionModeShareDrawable com.actionbarsherlock:actionModeShareDrawable} Drawable to use for the Share action button in WebView selection action modes
{@link #SherlockTheme_actionModeSplitBackground com.actionbarsherlock:actionModeSplitBackground} Background drawable to use for action mode UI in the lower split bar
{@link #SherlockTheme_actionModeStyle com.actionbarsherlock:actionModeStyle}
{@link #SherlockTheme_actionOverflowButtonStyle com.actionbarsherlock:actionOverflowButtonStyle}
{@link #SherlockTheme_actionSpinnerItemStyle com.actionbarsherlock:actionSpinnerItemStyle}
{@link #SherlockTheme_activatedBackgroundIndicator com.actionbarsherlock:activatedBackgroundIndicator} Drawable used as a background for activated items.
{@link #SherlockTheme_activityChooserViewStyle com.actionbarsherlock:activityChooserViewStyle} Default ActivityChooserView style.
{@link #SherlockTheme_android_windowIsFloating com.actionbarsherlock:android_windowIsFloating}
{@link #SherlockTheme_buttonStyleSmall com.actionbarsherlock:buttonStyleSmall} Small Button style.
{@link #SherlockTheme_dividerVertical com.actionbarsherlock:dividerVertical} Drawable to use for generic vertical dividers.
{@link #SherlockTheme_dropDownListViewStyle com.actionbarsherlock:dropDownListViewStyle}
{@link #SherlockTheme_dropdownListPreferredItemHeight com.actionbarsherlock:dropdownListPreferredItemHeight}
{@link #SherlockTheme_homeAsUpIndicator com.actionbarsherlock:homeAsUpIndicator}
{@link #SherlockTheme_listPopupWindowStyle com.actionbarsherlock:listPopupWindowStyle}
{@link #SherlockTheme_listPreferredItemHeightSmall com.actionbarsherlock:listPreferredItemHeightSmall} A smaller, sleeker list item height.
{@link #SherlockTheme_listPreferredItemPaddingLeft com.actionbarsherlock:listPreferredItemPaddingLeft} The preferred padding along the left edge of list items.
{@link #SherlockTheme_listPreferredItemPaddingRight com.actionbarsherlock:listPreferredItemPaddingRight} The preferred padding along the right edge of list items.
{@link #SherlockTheme_popupMenuStyle com.actionbarsherlock:popupMenuStyle}
{@link #SherlockTheme_searchAutoCompleteTextView com.actionbarsherlock:searchAutoCompleteTextView} SearchView AutoCompleteTextView style
{@link #SherlockTheme_searchDropdownBackground com.actionbarsherlock:searchDropdownBackground} SearchView dropdown background
{@link #SherlockTheme_searchResultListItemHeight com.actionbarsherlock:searchResultListItemHeight} The list item height for search results.
{@link #SherlockTheme_searchViewCloseIcon com.actionbarsherlock:searchViewCloseIcon} SearchView close button icon
{@link #SherlockTheme_searchViewEditQuery com.actionbarsherlock:searchViewEditQuery} SearchView query refinement icon
{@link #SherlockTheme_searchViewEditQueryBackground com.actionbarsherlock:searchViewEditQueryBackground} SearchView query refinement icon background
{@link #SherlockTheme_searchViewGoIcon com.actionbarsherlock:searchViewGoIcon} SearchView Go button icon
{@link #SherlockTheme_searchViewSearchIcon com.actionbarsherlock:searchViewSearchIcon} SearchView Search icon
{@link #SherlockTheme_searchViewTextField com.actionbarsherlock:searchViewTextField} SearchView text field background for the left section
{@link #SherlockTheme_searchViewTextFieldRight com.actionbarsherlock:searchViewTextFieldRight} SearchView text field background for the right section
{@link #SherlockTheme_searchViewVoiceIcon com.actionbarsherlock:searchViewVoiceIcon} SearchView Voice button icon
{@link #SherlockTheme_selectableItemBackground com.actionbarsherlock:selectableItemBackground} Background drawable for standalone items that need focus/pressed states.
{@link #SherlockTheme_spinnerDropDownItemStyle com.actionbarsherlock:spinnerDropDownItemStyle}
{@link #SherlockTheme_spinnerItemStyle com.actionbarsherlock:spinnerItemStyle}
{@link #SherlockTheme_textAppearanceLargePopupMenu com.actionbarsherlock:textAppearanceLargePopupMenu} Text color, typeface, size, and style for the text inside of a popup menu.
{@link #SherlockTheme_textAppearanceListItemSmall com.actionbarsherlock:textAppearanceListItemSmall} The preferred TextAppearance for the primary text of small list items.
{@link #SherlockTheme_textAppearanceSearchResultSubtitle com.actionbarsherlock:textAppearanceSearchResultSubtitle} Text color, typeface, size, and style for system search result subtitle.
{@link #SherlockTheme_textAppearanceSearchResultTitle com.actionbarsherlock:textAppearanceSearchResultTitle} Text color, typeface, size, and style for system search result title.
{@link #SherlockTheme_textAppearanceSmall com.actionbarsherlock:textAppearanceSmall} Text color, typeface, size, and style for "small" text.
{@link #SherlockTheme_textAppearanceSmallPopupMenu com.actionbarsherlock:textAppearanceSmallPopupMenu} Text color, typeface, size, and style for small text inside of a popup menu.
{@link #SherlockTheme_textColorPrimary com.actionbarsherlock:textColorPrimary}
{@link #SherlockTheme_textColorPrimaryDisableOnly com.actionbarsherlock:textColorPrimaryDisableOnly}
{@link #SherlockTheme_textColorPrimaryInverse com.actionbarsherlock:textColorPrimaryInverse}
{@link #SherlockTheme_textColorSearchUrl com.actionbarsherlock:textColorSearchUrl} Text color for urls in search suggestions, used by things like global search and the browser.
{@link #SherlockTheme_windowActionBar com.actionbarsherlock:windowActionBar}
{@link #SherlockTheme_windowActionBarOverlay com.actionbarsherlock:windowActionBarOverlay}
{@link #SherlockTheme_windowActionModeOverlay com.actionbarsherlock:windowActionModeOverlay}
{@link #SherlockTheme_windowContentOverlay com.actionbarsherlock:windowContentOverlay} This Drawable is overlaid over the foreground of the Window's content area, usually + to place a shadow below the title.
{@link #SherlockTheme_windowMinWidthMajor com.actionbarsherlock:windowMinWidthMajor}
{@link #SherlockTheme_windowMinWidthMinor com.actionbarsherlock:windowMinWidthMinor}
{@link #SherlockTheme_windowNoTitle com.actionbarsherlock:windowNoTitle}
{@link #SherlockTheme_windowSplitActionBar com.actionbarsherlock:windowSplitActionBar}
+ @see #SherlockTheme_actionBarDivider + @see #SherlockTheme_actionBarItemBackground + @see #SherlockTheme_actionBarSize + @see #SherlockTheme_actionBarSplitStyle + @see #SherlockTheme_actionBarStyle + @see #SherlockTheme_actionBarTabBarStyle + @see #SherlockTheme_actionBarTabStyle + @see #SherlockTheme_actionBarTabTextStyle + @see #SherlockTheme_actionBarWidgetTheme + @see #SherlockTheme_actionButtonStyle + @see #SherlockTheme_actionDropDownStyle + @see #SherlockTheme_actionMenuTextAppearance + @see #SherlockTheme_actionMenuTextColor + @see #SherlockTheme_actionModeBackground + @see #SherlockTheme_actionModeCloseButtonStyle + @see #SherlockTheme_actionModeCloseDrawable + @see #SherlockTheme_actionModePopupWindowStyle + @see #SherlockTheme_actionModeShareDrawable + @see #SherlockTheme_actionModeSplitBackground + @see #SherlockTheme_actionModeStyle + @see #SherlockTheme_actionOverflowButtonStyle + @see #SherlockTheme_actionSpinnerItemStyle + @see #SherlockTheme_activatedBackgroundIndicator + @see #SherlockTheme_activityChooserViewStyle + @see #SherlockTheme_android_windowIsFloating + @see #SherlockTheme_buttonStyleSmall + @see #SherlockTheme_dividerVertical + @see #SherlockTheme_dropDownListViewStyle + @see #SherlockTheme_dropdownListPreferredItemHeight + @see #SherlockTheme_homeAsUpIndicator + @see #SherlockTheme_listPopupWindowStyle + @see #SherlockTheme_listPreferredItemHeightSmall + @see #SherlockTheme_listPreferredItemPaddingLeft + @see #SherlockTheme_listPreferredItemPaddingRight + @see #SherlockTheme_popupMenuStyle + @see #SherlockTheme_searchAutoCompleteTextView + @see #SherlockTheme_searchDropdownBackground + @see #SherlockTheme_searchResultListItemHeight + @see #SherlockTheme_searchViewCloseIcon + @see #SherlockTheme_searchViewEditQuery + @see #SherlockTheme_searchViewEditQueryBackground + @see #SherlockTheme_searchViewGoIcon + @see #SherlockTheme_searchViewSearchIcon + @see #SherlockTheme_searchViewTextField + @see #SherlockTheme_searchViewTextFieldRight + @see #SherlockTheme_searchViewVoiceIcon + @see #SherlockTheme_selectableItemBackground + @see #SherlockTheme_spinnerDropDownItemStyle + @see #SherlockTheme_spinnerItemStyle + @see #SherlockTheme_textAppearanceLargePopupMenu + @see #SherlockTheme_textAppearanceListItemSmall + @see #SherlockTheme_textAppearanceSearchResultSubtitle + @see #SherlockTheme_textAppearanceSearchResultTitle + @see #SherlockTheme_textAppearanceSmall + @see #SherlockTheme_textAppearanceSmallPopupMenu + @see #SherlockTheme_textColorPrimary + @see #SherlockTheme_textColorPrimaryDisableOnly + @see #SherlockTheme_textColorPrimaryInverse + @see #SherlockTheme_textColorSearchUrl + @see #SherlockTheme_windowActionBar + @see #SherlockTheme_windowActionBarOverlay + @see #SherlockTheme_windowActionModeOverlay + @see #SherlockTheme_windowContentOverlay + @see #SherlockTheme_windowMinWidthMajor + @see #SherlockTheme_windowMinWidthMinor + @see #SherlockTheme_windowNoTitle + @see #SherlockTheme_windowSplitActionBar + */ + public static final int[] SherlockTheme = { + 0x01010057, 0x7f010006, 0x7f010007, 0x7f010008, + 0x7f010009, 0x7f01000a, 0x7f01000b, 0x7f01000c, + 0x7f01000d, 0x7f01000e, 0x7f01000f, 0x7f010010, + 0x7f010011, 0x7f010012, 0x7f010013, 0x7f010014, + 0x7f010015, 0x7f010016, 0x7f010017, 0x7f010018, + 0x7f010019, 0x7f01001a, 0x7f01001b, 0x7f01001c, + 0x7f01001d, 0x7f01001e, 0x7f01001f, 0x7f010020, + 0x7f010021, 0x7f010022, 0x7f010023, 0x7f010024, + 0x7f010025, 0x7f010026, 0x7f010027, 0x7f010028, + 0x7f010029, 0x7f01002a, 0x7f01002b, 0x7f01002c, + 0x7f01002d, 0x7f01002e, 0x7f01002f, 0x7f010030, + 0x7f010031, 0x7f010032, 0x7f010033, 0x7f010034, + 0x7f010035, 0x7f010036, 0x7f010037, 0x7f010038, + 0x7f010039, 0x7f01003a, 0x7f01003b, 0x7f01003c, + 0x7f01003d, 0x7f01003e, 0x7f01003f, 0x7f010040, + 0x7f010041, 0x7f010042, 0x7f010043, 0x7f010044, + 0x7f010045, 0x7f010046, 0x7f010047 + }; + /** +

+ @attr description + Custom divider drawable to use for elements in the action bar. + + +

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

This is a private symbol. + @attr name android:actionBarDivider + */ + public static final int SherlockTheme_actionBarDivider = 9; + /** +

+ @attr description + Custom item state list drawable background for action bar items. + + +

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

This is a private symbol. + @attr name android:actionBarItemBackground + */ + public static final int SherlockTheme_actionBarItemBackground = 10; + /** +

+ @attr description + Size of the Action Bar, including the contextual + bar used to present Action Modes. + + +

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

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

May be one of the following constant values.

+ ++++ + +
ConstantValueDescription
wrap_content0
+

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

+ @attr description + Reference to a style for the split Action Bar. This style + controls the split component that holds the menu/action + buttons. actionBarStyle is still used for the primary + bar. + + +

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

This is a private symbol. + @attr name android:actionBarSplitStyle + */ + public static final int SherlockTheme_actionBarSplitStyle = 6; + /** +

+ @attr description + Reference to a style for the Action Bar + + +

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

This is a private symbol. + @attr name android:actionBarStyle + */ + public static final int SherlockTheme_actionBarStyle = 5; + /** +

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

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

+ @attr description + Default style for tabs within an action bar + + +

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

This is a private symbol. + @attr name android:actionBarTabStyle + */ + public static final int SherlockTheme_actionBarTabStyle = 1; + /** +

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

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

+ @attr description + Reference to a theme that should be used to inflate widgets + and layouts destined for the action bar. Most of the time + this will be a reference to the current theme, but when + the action bar has a significantly different contrast + profile than the rest of the activity the difference + can become important. If this is set to @null the current + theme will be used. + + +

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

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

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

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

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

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

+ @attr description + TextAppearance style that will be applied to text that + appears within action menu items. + + +

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

This is a private symbol. + @attr name android:actionMenuTextAppearance + */ + public static final int SherlockTheme_actionMenuTextAppearance = 11; + /** +

+ @attr description + Color for text that appears within action menu items. + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:actionMenuTextColor + */ + public static final int SherlockTheme_actionMenuTextColor = 12; + /** +

+ @attr description + Background drawable to use for action mode UI + + +

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

This is a private symbol. + @attr name android:actionModeBackground + */ + public static final int SherlockTheme_actionModeBackground = 15; + /** +

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

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

+ @attr description + Drawable to use for the close action mode button + + +

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

This is a private symbol. + @attr name android:actionModeCloseDrawable + */ + public static final int SherlockTheme_actionModeCloseDrawable = 17; + /** +

+ @attr description + PopupWindow style to use for action modes when showing as a window overlay. + + +

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

This is a private symbol. + @attr name android:actionModePopupWindowStyle + */ + public static final int SherlockTheme_actionModePopupWindowStyle = 19; + /** +

+ @attr description + Drawable to use for the Share action button in WebView selection action modes + + +

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

This is a private symbol. + @attr name android:actionModeShareDrawable + */ + public static final int SherlockTheme_actionModeShareDrawable = 18; + /** +

+ @attr description + Background drawable to use for action mode UI in the lower split bar + + +

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

This is a private symbol. + @attr name android:actionModeSplitBackground + */ + public static final int SherlockTheme_actionModeSplitBackground = 16; + /** +

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

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

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

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

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

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

+ @attr description + Drawable used as a background for activated items. + + +

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

This is a private symbol. + @attr name android:activatedBackgroundIndicator + */ + public static final int SherlockTheme_activatedBackgroundIndicator = 66; + /** +

+ @attr description + Default ActivityChooserView style. + + +

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

This is a private symbol. + @attr name android:activityChooserViewStyle + */ + public static final int SherlockTheme_activityChooserViewStyle = 65; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#android_windowIsFloating} + attribute's value can be found in the {@link #SherlockTheme} array. + @attr name android:android_windowIsFloating + */ + public static final int SherlockTheme_android_windowIsFloating = 0; + /** +

+ @attr description + Small Button style. + + +

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

This is a private symbol. + @attr name android:buttonStyleSmall + */ + public static final int SherlockTheme_buttonStyleSmall = 20; + /** +

+ @attr description + Drawable to use for generic vertical dividers. + + +

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

This is a private symbol. + @attr name android:dividerVertical + */ + public static final int SherlockTheme_dividerVertical = 51; + /** +

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

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

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

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

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

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

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

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

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

+ @attr description + A smaller, sleeker list item height. + + +

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

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

This is a private symbol. + @attr name android:listPreferredItemHeightSmall + */ + public static final int SherlockTheme_listPreferredItemHeightSmall = 45; + /** +

+ @attr description + The preferred padding along the left edge of list items. + + +

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

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

This is a private symbol. + @attr name android:listPreferredItemPaddingLeft + */ + public static final int SherlockTheme_listPreferredItemPaddingLeft = 46; + /** +

+ @attr description + The preferred padding along the right edge of list items. + + +

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

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

This is a private symbol. + @attr name android:listPreferredItemPaddingRight + */ + public static final int SherlockTheme_listPreferredItemPaddingRight = 47; + /** +

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

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

+ @attr description + SearchView AutoCompleteTextView style + + +

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

This is a private symbol. + @attr name android:searchAutoCompleteTextView + */ + public static final int SherlockTheme_searchAutoCompleteTextView = 31; + /** +

+ @attr description + SearchView dropdown background + + +

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

This is a private symbol. + @attr name android:searchDropdownBackground + */ + public static final int SherlockTheme_searchDropdownBackground = 32; + /** +

+ @attr description + The list item height for search results. @hide + + +

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

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

This is a private symbol. + @attr name android:searchResultListItemHeight + */ + public static final int SherlockTheme_searchResultListItemHeight = 42; + /** +

+ @attr description + SearchView close button icon + + +

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

This is a private symbol. + @attr name android:searchViewCloseIcon + */ + public static final int SherlockTheme_searchViewCloseIcon = 33; + /** +

+ @attr description + SearchView query refinement icon + + +

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

This is a private symbol. + @attr name android:searchViewEditQuery + */ + public static final int SherlockTheme_searchViewEditQuery = 37; + /** +

+ @attr description + SearchView query refinement icon background + + +

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

This is a private symbol. + @attr name android:searchViewEditQueryBackground + */ + public static final int SherlockTheme_searchViewEditQueryBackground = 38; + /** +

+ @attr description + SearchView Go button icon + + +

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

This is a private symbol. + @attr name android:searchViewGoIcon + */ + public static final int SherlockTheme_searchViewGoIcon = 34; + /** +

+ @attr description + SearchView Search icon + + +

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

This is a private symbol. + @attr name android:searchViewSearchIcon + */ + public static final int SherlockTheme_searchViewSearchIcon = 35; + /** +

+ @attr description + SearchView text field background for the left section + + +

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

This is a private symbol. + @attr name android:searchViewTextField + */ + public static final int SherlockTheme_searchViewTextField = 39; + /** +

+ @attr description + SearchView text field background for the right section + + +

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

This is a private symbol. + @attr name android:searchViewTextFieldRight + */ + public static final int SherlockTheme_searchViewTextFieldRight = 40; + /** +

+ @attr description + SearchView Voice button icon + + +

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

This is a private symbol. + @attr name android:searchViewVoiceIcon + */ + public static final int SherlockTheme_searchViewVoiceIcon = 36; + /** +

+ @attr description + Background drawable for standalone items that need focus/pressed states. + + +

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

This is a private symbol. + @attr name android:selectableItemBackground + */ + public static final int SherlockTheme_selectableItemBackground = 21; + /** +

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

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

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

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

+ @attr description + Text color, typeface, size, and style for the text inside of a popup menu. + + +

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

This is a private symbol. + @attr name android:textAppearanceLargePopupMenu + */ + public static final int SherlockTheme_textAppearanceLargePopupMenu = 23; + /** +

+ @attr description + The preferred TextAppearance for the primary text of small list items. + + +

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

This is a private symbol. + @attr name android:textAppearanceListItemSmall + */ + public static final int SherlockTheme_textAppearanceListItemSmall = 48; + /** +

+ @attr description + Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. + + +

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

This is a private symbol. + @attr name android:textAppearanceSearchResultSubtitle + */ + public static final int SherlockTheme_textAppearanceSearchResultSubtitle = 44; + /** +

+ @attr description + Text color, typeface, size, and style for system search result title. Defaults to primary inverse text color. + + +

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

This is a private symbol. + @attr name android:textAppearanceSearchResultTitle + */ + public static final int SherlockTheme_textAppearanceSearchResultTitle = 43; + /** +

+ @attr description + Text color, typeface, size, and style for "small" text. Defaults to secondary text color. + + +

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

This is a private symbol. + @attr name android:textAppearanceSmall + */ + public static final int SherlockTheme_textAppearanceSmall = 25; + /** +

+ @attr description + Text color, typeface, size, and style for small text inside of a popup menu. + + +

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

This is a private symbol. + @attr name android:textAppearanceSmallPopupMenu + */ + public static final int SherlockTheme_textAppearanceSmallPopupMenu = 24; + /** +

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

Must be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

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

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

Must be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

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

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

Must be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

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

+ @attr description + Text color for urls in search suggestions, used by things like global search and the browser. @hide + + +

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

May be a color value, in the form of "#rgb", "#argb", +"#rrggbb", or "#aarrggbb". +

This is a private symbol. + @attr name android:textColorSearchUrl + */ + public static final int SherlockTheme_textColorSearchUrl = 41; + /** +

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

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

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

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

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

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

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

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

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

+ @attr description + This Drawable is overlaid over the foreground of the Window's content area, usually + to place a shadow below the title. + + +

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

This is a private symbol. + @attr name android:windowContentOverlay + */ + public static final int SherlockTheme_windowContentOverlay = 22; + /** +

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

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

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

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

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

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

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

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

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

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

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

This may also be a reference to a resource (in the form +"@[package:]type:name") or +theme attribute (in the form +"?[package:][type:]name") +containing a value of this type. + @attr name android:windowSplitActionBar + */ + public static final int SherlockTheme_windowSplitActionBar = 63; + /** Attributes that can be used with a SherlockView. +

Includes the following attributes:

+ + + + + +
AttributeDescription
{@link #SherlockView_android_focusable com.actionbarsherlock:android_focusable}
+ @see #SherlockView_android_focusable + */ + public static final int[] SherlockView = { + 0x010100da + }; + /** +

This symbol is the offset where the {@link com.actionbarsherlock.R.attr#android_focusable} + attribute's value can be found in the {@link #SherlockView} array. + @attr name android:android_focusable + */ + public static final int SherlockView_android_focusable = 0; + }; +} diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/libs/android-support-v4.jar b/media/android/NewsBlur/libs/ActionBarSherlock/libs/android-support-v4.jar new file mode 100755 index 0000000000000000000000000000000000000000..99e063b33a53c8ba7980a5b5244ce0e0da46ae54 GIT binary patch literal 271754 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 X9Df(GyQW>hf43jgw9-?^liL3Qe0D + + + 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/media/android/NewsBlur/libs/ActionBarSherlock/project.properties b/media/android/NewsBlur/libs/ActionBarSherlock/project.properties new file mode 100755 index 000000000..5ca7d6247 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/project.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +android.library=true +# Project target. +target=android-14 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml new file mode 100755 index 000000000..ea7459aaf --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml new file mode 100755 index 000000000..0edb33b4b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_disable_only_holo_light.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml new file mode 100755 index 000000000..2bcfd0b63 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_dark.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml new file mode 100755 index 000000000..198384fed --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/color/abs__primary_text_holo_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..769463b369a5185ba2d2fdf26abf058086ebcd08 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..73050476e77aa798919b829a5566973e231f9d49 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..712a551ece87b2544433ac982382a087e7f1731d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..bf3b9438b16543294498ba27e51d4e878c8ead5a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..81b87b86c959a98c478177270c979763831ebf66 GIT binary patch literal 2863 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 N002ovPDHLkV1kHdRS^IH literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..8fc83e22efde5509c563c97a836d869d05ff5dc6 GIT binary patch literal 2859 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 JPDHLkV1neRPs;!R literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..cbbaec588ec98bbc8a518a9ab5a9c469482341ba GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..1e39572224b24a81ed4d73923280ba2724dbaf6e GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..a16db853e94af78c0739d9b89b578e2a8021c856 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd^}woLn02py|j?`fP(zopr08IHUH2?qr literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0eff695d82911a73874d871f3a7b23b71dd8ab44 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..219b170fa67aa2ef8e0b11ebff90c1629ba7e97a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..66adffed632f0f6267afe6dc2f518adb6a83ca4a GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Qo!3HFq_#{<Lb literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..1d836f65a1fffea301e9cf36770b21b48b3b8132 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..5818666d4e64b93da73bc3d6dc2764bcb500359c GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py|R(>fCCT9!M7)Q zv literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..564fb34b4308750b6922f320e9e114b080ecd538 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..ae21b760fb1ebecac3389164251b0fa14f580f5a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..79e56f522b2837bd9f579b28f037ad5eafaaee8e GIT binary patch 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+ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..e029f210b9a81ed4765d31e90b6e49dc8aa37bed GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..897a1c11a06923f0ee630a3ec44b40118c1fa4d3 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_ab_back_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..0c89f71407e8d51f92ff6a10b1ae40ec902aa04e GIT binary patch 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-_ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..d8662e3f0fdae62cdee68c184a30fa9e421dc338 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_cab_done_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..ed03f620f8ef9e969d0471ab76329038e25c9f0d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_disabled.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..d97c342d53690e6d286efbe5f37562747a49b96d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_normal.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..33ad8d4b891b14d934e470b2222571ea859c77a6 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..3edbd740858acce452a65675b594d87cd85c4cde GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..90db01b5bcf1246d6a94e83930cac63c93a6cf83 GIT binary patch literal 1540 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..2abc45809c62513224e9d695542cb8dd8e8087b9 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..bb6aef1d069a14a7fc1cea9780c919c61679e4fa GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..6f747c8f065940a8844587c682fb3c9443ad1ca2 GIT binary patch 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@}_ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_menu_share_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..682b2fdec4cdcffe042a0eaba5574fcb553c6fab GIT binary patch literal 505 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..3481c982862cd524654e200187445a774446567f GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_activated_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_activated_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..4ea7afa00e2bfe057472ed5a196080fc80ad7383 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..986ab0b9746301f2dd9401829da09e00995621b3 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_divider_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977 GIT binary patch literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_focused_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..516f5c7399c853d112a31d1e17c8c7f17180f9bd GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_longpressed_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..4ea7afa00e2bfe057472ed5a196080fc80ad7383 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..5654cd69429fd0a3502a05b5f827bffab89cc7e0 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..5654cd69429fd0a3502a05b5f827bffab89cc7e0 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..f6fd30dcdc9c39c836e509486854f9da03486892 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..4d3d208578c61662986fdc16bd15c69759b48d6a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..924a99d173082ba58ca7527822359f228bb14dec GIT binary patch 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}} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..310c368e7a68479307866c479d1e4eefcf5db311 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_bg_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..70cb7fc7e0bcfb850d4b365f1bccb5b743913e21 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_primary_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..1c269205e874bc6addc308efe5be4fb7c5da0edc GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..40d0d1645cbf05e30bf092ace45403281da7f318 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..40d0d1645cbf05e30bf092ace45403281da7f318 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_inner_holo.png new file mode 100755 index 0000000000000000000000000000000000000000..c8358e9cefce502030416e05dc8faff139b886b2 GIT binary patch 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)_* literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_48_outer_holo.png new file mode 100755 index 0000000000000000000000000000000000000000..f62f74bb38e8818fd970b7ec1f7862e543cc9d07 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..eb28ff9a5516c15667fa8fafbc22d608d1f77a06 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d281adb553af892f758407b846bf31810b9d776b GIT binary patch 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{( literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..b2985860907ac324b509b76731e8ef9e01bcef39 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..4215396dd4e51fea9239323d313b72fde0ba86d6 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..a280eabf59b5eb69fa2a84280402b63d5e1bb8f0 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..f8d619b4d47ab5b104d6b1042c27fb16a3beca47 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..955a2f34061ae8ac853050da355f89409fa0a784 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..673e3bf10d60cc54b6dfef2fcda24575073adf61 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgJWBc+iXw=G=Ra=)z4*}Q$iB}l;b6k literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_selected_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d57df98b501944b4ba63623766c396b5bccc29ee GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg}h~fd(*my85}Sb4q9e0H>EG$N&HU literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..aadc6f87b21d7d5139f3bfe860f4c289f75d241f GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..4be4af5fab3a09cce65144c747f24c6ade600359 GIT binary patch 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- literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..e72193f5921ec091dcbdb7a6da540c6ae62a0abf GIT binary patch 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? literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..8f20b9d2673d84e22fe4f92da5c6fba5524bd7c9 GIT binary patch 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#-$ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..04f657e1db10e9694c00a2d0240c4dd96a062c37 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..99309ef6d3e32a2d3303400aa061e0508a70f758 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..9bde7fbdce15a1c2873eb0779ffc0617fd9b15c4 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0706c8af658bde9602634950dfe3d5fa5886163f GIT binary patch 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* literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d814d02d31183b8f00f475a05c124004983d9eff GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9EC|%_%783w8jlt8^&t;ucLK6TeKPwmj literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..b139c8e49168e4404df0a46b30a4b30e90c1ccff GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..738cb38d072137cb68723c576a801e3f3471bd3e GIT binary patch literal 2849 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..2ed75a767a87ac573cb7306686035f2100459fb5 GIT binary patch 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)# literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..743d00b6cd7e446c7badca9dd11d1579404569cc GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..17c1fb921f9b7b46aaeefe7afb8302874fb0abd1 GIT binary patch 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~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..ddfc8e3d5c4131f2460254f183938477fc5a0679 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..007a4b239244212339b817f8de9474a4dc34fde0 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..ad6e1a4d9f3c81e20676f979a53cea2084ce903d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0ad6c888b4c7e436e7d7c78432dbfdaecc95a7ac GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*fBgS%&%9ECxB?U?=uVx Y$^4u51wHGE0Gi0)>FVdQ&MBb@0N@ZURR910 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..19b50abcb536602cf2cd36d5a19805464988bd20 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECmdKI;Vst03^XH%m4rY literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..5461b9c00fd3fc513aa4465682e70e87cca36a6d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..5dc6f804aea8ca344275ac6eb497b6bfe0f117f3 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..a70b53c59af769e3c98973ad9718670ce27259ff GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQYM}*jv*T7lYjjGZ_h07hy7xL zS%<;BUsuG{45zRSgeB^>bP0l+XkK D`1l&; literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..85d7aadd4dfb619883f68f1cc63e629698b5dab5 GIT binary patch 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`} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..f7b01e012f895bfe2c4241e1d48771fc372b35cb GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d8f1c8bd54f4f091e79389603095c99cf825cb6c GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..f18050ea589eaa31233bc08e4f8a4e361747bc94 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..df2d3d158e201f4b5bc8f478bfe194c819c762d1 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..a17b6a78920848c37a67246a76749b4cc1425a15 GIT binary patch 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?+< literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_cab_done_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..b28b3b54f4c81d482f797f31936cbd4013c093b5 GIT binary patch literal 552 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_normal.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_normal.png new file mode 100755 index 0000000000000000000000000000000000000000..86944a879b986d941e6567d78fbac16c87ae9244 GIT binary patch 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! literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..15b86cbb21eb3bfb82d36aa9ce750906297a9225 GIT binary patch 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@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..8518498eb6c93e3d4f9f5c806362bf3117b17852 GIT binary patch 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{ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..6bf21e307ed392bf00fe80b162a6ce9115e62c84 GIT binary patch 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` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__ic_search.png new file mode 100755 index 0000000000000000000000000000000000000000..4be72f108ba1a4f36da5c3a59b1ed08ddcf7cb8b GIT binary patch literal 2280 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_activated_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_activated_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..3bf8e03623c94b68d31963ffe7e59c72c3dcc059 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..986ab0b9746301f2dd9401829da09e00995621b3 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_divider_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977 GIT binary patch literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_focused_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..7c0599e3a6fcce1d9b22e47bfdb63afb1d3d9c02 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_longpressed_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..3bf8e03623c94b68d31963ffe7e59c72c3dcc059 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6e77525d2dbbc1673145d60d775602c85264330d GIT binary patch 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)} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6e77525d2dbbc1673145d60d775602c85264330d GIT binary patch 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)} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..92da2f0dd3711a2ceb843768cafd6b91a2807b43 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg#;uvX%d>fBtxy+SfFGJhTv9Z9>9n%%Tr7{oI+Q@DMao9hQt@O?p#8;eZd15IY| MboFyt=akR{068-?^#A|> literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..42cb6463e4c28c6aeffa315c4fc869867dbb6b7c GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg@oJyIHz9Y|%SiynA|kd)58s-{92FmHki*;@KxND!%;H%=F4ZU(n;yg$GVRgBd(s L{an^LB{Ts54)-;@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..460ec46eb0786706610e21ac9097de489cedfc33 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..e84adf2d41604323cdad8b15e7034b6137e02425 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__progress_bg_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..4bb22f0e10e621ef31f16100b3f682a09565c65d GIT binary patch literal 159 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 RY6Dcn;OXk;vd$@?2>^cl_{IPL literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..29aff4d43f71a025f464587ead52aff2ecae6a58 GIT binary patch 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@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6536ee63329bb47bec2bf2384aa494923cc2773a GIT binary patch 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@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6de0ba8841d25f20f12e14002ecc4c9ec6a7b2f8 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..c9972e74bb4fc7416960e238afd47b1ac363e316 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..587337caf74f9ba3d32ba1c7cc8fb8b0b5ba245b GIT binary patch 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% literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..155c4fc753ed43185b31df3bea2af1ea5b3e7482 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..081657ee7b828a74287d65d2f4644af9c7b55816 GIT binary patch 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(} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..3f312b465189caa47a7f8e4bc53c3222521e0bb1 GIT binary patch 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` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..b086fae8738227fc0b4f05171ded25ec1503e49d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..73c336a77a9c908532b5b39098c22a878e0e87bf GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..726e0ff427cd175c9c3607e25352bd696a3152c1 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..726e0ff427cd175c9c3607e25352bd696a3152c1 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..1767c169eef03f3370b0f8e40f531dd481a9b82d GIT binary patch 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$& literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..1767c169eef03f3370b0f8e40f531dd481a9b82d GIT binary patch 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$& literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml new file mode 100755 index 000000000..6bcbdb83f --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-v11/abs__progress_medium_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..575334699663b221b5a2b3251572a7c7a23ddb4a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..8155fe840532e1d0fc25450729892ea73c4e007a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..fa4d76af93de31de153c6a7d41c05496bb14d2c0 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..9a70a5d1e3ad43f632287aff78d86289259099db GIT binary patch literal 2878 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 Xx&sG-cNbs*00000NkvXXu0mjfHD**$ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6622cbad34409b2e09f69e305455482ee107baa6 GIT binary patch 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` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..c4272978338a232aa445ed5190abab61afcedb16 GIT binary patch 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} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d0df29d8b3fef9f71cda9b7a0975c68dcfb05685 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..a0d9c1b957ea4a6ce62abd120668610d0cb2bd96 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d36f99fecf223779432fb843b823c04d739f05cb GIT binary patch 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($ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..5ad475dc3f478734be31bc5763ff494e5f120914 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6ade5eeb37d8388813cee512f8adaad0f6c15397 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..719b9234df6fefc32c628a212141681df3414d85 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6da264db26b5debc433e570e454f7ad596d3609c GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..7ef2db75e273c3a4fa34a867d43714d47b67dfd9 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..2283b4c01f31c24c241101989a028a28e662ff2d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..3c909b51306d684dc9fc4deb674ab1e1feb7004e GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..131d1030c9d5b447ef62fc8e336d9d3950ff7519 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..3e7dcdfdbaf66d51a90633e6f601bfe71b0c5069 GIT binary patch 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} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0bd09806f5c85ad3a33ec80c2a526e9dba34d1f3 GIT binary patch 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~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..43ed26d4784aa508b93551bdb0359b959bd2c91b GIT binary patch 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? literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..f4970ad1c3278235157ac72f71fc98f159fdc439 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..172fc3b5e3caf3357e706be2a1f0d91f357c8e5f GIT binary patch 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$< literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..8ded62fb7b6a27a86f7b532c9a2b5a4ae999d34c GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..517e9f72d0c8d28a22360ad5d73476c25fd4db33 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..bb19810bc2062509e4e4968099a359ad73818728 GIT binary patch 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~- literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..e35c5f05efdaecd358f87fbaae543f8e5d5d0331 GIT binary patch literal 2531 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 WVgEmns=9(>1^{ytE8}V-6#hTCp0D=+ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..7fd7aeb2a63980f5c7459b96ae175b875f27add3 GIT binary patch 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) literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_go.png new file mode 100755 index 0000000000000000000000000000000000000000..1e2dcfa02057f16f9f89e31fada93991c4eb9ab6 GIT binary patch literal 1983 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..a92fb1d4af622cfad770d7c494121719a7896e61 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..930ca8d95e8bee5a1240fba645d9dab919abd734 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..45a0f1da0d01b7c0ba53830285c67d629bd0774a GIT binary patch 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) literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..528e554abe239137182dd9069d1fa4ba02a109a1 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search.png new file mode 100755 index 0000000000000000000000000000000000000000..998f91be9c4dff50a3ac354a3810a2afe39fe32b GIT binary patch literal 3784 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 Z$DPpsU&xgE;c;3340Mc9_1aGO{{Rgi%2xmY literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__ic_search_api_holo_light.png new file mode 100755 index 0000000000000000000000000000000000000000..a4cdf1c7927896d70e6b9f6af2eaa64b1bb41707 GIT binary patch literal 3037 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 S!l#~*4goMWSah`&G3sAAl9aOm literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_activated_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..eda10e6123e1e1383c4617228ec0c96680d60dc7 GIT binary patch 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@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_longpressed_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..eda10e6123e1e1383c4617228ec0c96680d60dc7 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..e4b33935a3aa4f1af3fa9e9e199b5c47d43f4b74 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn2vPZ!4!jfu$y_kK-b literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..88726b69160589c8545759440e8d4e69dc984c67 GIT binary patch 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@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..93066c8403ddaac9b19571152ef499620bcc0e02 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..345f5d3067c1b5a2b13f7234238468e8083e75e8 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..c6c3f1ec248835c16ee8a8f9d253769ea4196468 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..205b66e2cdef686c5ed6369b14e64b38d0182984 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_48_inner_holo.png new file mode 100755 index 0000000000000000000000000000000000000000..19517c4b0aee1010c7041a76089fdfdbfa495e80 GIT binary patch literal 2769 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d8929fcd1864e92c78f24d34bb07ac0304bf5ebe GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..9174c4e4bc984a89e1ed643bc66b1569466ef52b GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..3015d307088f12d52a9e99ff4575fd2153127e5b GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..126637d1194f1d6609787774fb140818eaa4ba1f GIT binary patch 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< literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..d45c7a864d9b36fc5d06ef7650bd22c228e3533e GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..2cb34d7f60401a563454c03e266cc5181d9de996 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..82f752fdc28390f1dae188e66886f9fee783b4f7 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..e4229f26b2771d884934b80d0056b8dd66d10edd GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png new file mode 100755 index 0000000000000000000000000000000000000000..e862cb12154541c150fb2d9bb98872bcff506317 GIT binary patch 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? literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..98f4871bb52aa7c60414b62dc102a63025d14b86 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100755 index 0000000000000000000000000000000000000000..733373ed38d92906a3f639124b60d39cfe3ea469 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0c6bb036dbff7c452df0032fac9daaaf3ed36cff GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml new file mode 100755 index 000000000..85c2c0212 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml new file mode 100755 index 000000000..85c2c0212 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__activated_background_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml new file mode 100755 index 000000000..cab896283 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_dark.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml new file mode 100755 index 000000000..42ba8a0df --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__btn_cab_done_holo_light.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml new file mode 100755 index 000000000..a16f4b22e --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml new file mode 100755 index 000000000..256de80fb --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_clear_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml new file mode 100755 index 000000000..2588a492d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml new file mode 100755 index 000000000..e2078c967 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml new file mode 100755 index 000000000..d99b7a426 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_dark.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml new file mode 100755 index 000000000..da5fb2e86 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__item_background_holo_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml new file mode 100755 index 000000000..b2ce4f0f7 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml new file mode 100755 index 000000000..d7e31b1d1 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_background_transition_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml new file mode 100755 index 000000000..08b8b12f3 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_dark.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml new file mode 100755 index 000000000..ada490bf9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__list_selector_holo_light.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml new file mode 100755 index 000000000..bd19140ab --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_dark.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml new file mode 100755 index 000000000..321f07c8b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_horizontal_holo_light.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml new file mode 100755 index 000000000..6d4814f86 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__progress_medium_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml new file mode 100755 index 000000000..26284187a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml new file mode 100755 index 000000000..0d00c5878 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__search_dropdown_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml new file mode 100755 index 000000000..4af5e22a9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_dark.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml new file mode 100755 index 000000000..b78508478 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__spinner_ab_holo_light.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml new file mode 100755 index 000000000..d34e20811 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__tab_indicator_ab_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml new file mode 100755 index 000000000..b6d58c040 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml new file mode 100755 index 000000000..3d6acf808 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml new file mode 100755 index 000000000..05ff4eda5 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml new file mode 100755 index 000000000..f6d61e57a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/drawable/abs__textfield_searchview_right_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml new file mode 100755 index 000000000..8811dad8d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml @@ -0,0 +1,40 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml new file mode 100755 index 000000000..6c183c059 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_dropdown_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml new file mode 100755 index 000000000..61dc02527 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-v14/sherlock_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml new file mode 100755 index 000000000..040df44ab --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml new file mode 100755 index 000000000..c64ef141b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar_overlay.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml new file mode 100755 index 000000000..5c1e9ec4b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_home.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml new file mode 100755 index 000000000..f46f7a044 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml new file mode 100755 index 000000000..0d51220c9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml new file mode 100755 index 000000000..dd69acada --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_bar_title_item.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml new file mode 100755 index 000000000..13149fd63 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_item_layout.xml @@ -0,0 +1,56 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml new file mode 100755 index 000000000..a6f8e53f8 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_menu_layout.xml @@ -0,0 +1,23 @@ + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml new file mode 100755 index 000000000..7168dc77f --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_bar.xml @@ -0,0 +1,24 @@ + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml new file mode 100755 index 000000000..875ec3e1b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__action_mode_close_item.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml new file mode 100755 index 000000000..6a0ac9ece --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml new file mode 100755 index 000000000..b430032a1 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__activity_chooser_view_list_item.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml new file mode 100755 index 000000000..ab2b0ee6c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml new file mode 100755 index 000000000..39aca3a8d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_checkbox.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml new file mode 100755 index 000000000..55ab28a24 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_icon.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml new file mode 100755 index 000000000..147f36fe8 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml new file mode 100755 index 000000000..ff54bbecd --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__list_menu_item_radio.xml @@ -0,0 +1,24 @@ + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml new file mode 100755 index 000000000..d42425ad3 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__popup_menu_item_layout.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml new file mode 100755 index 000000000..1fb82fe9a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml new file mode 100755 index 000000000..0961ef561 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_action_bar_overlay.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml new file mode 100755 index 000000000..33e2dea0d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml new file mode 100755 index 000000000..f8b9fb185 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__screen_simple_overlay_action_mode.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml new file mode 100755 index 000000000..e1d3dc49c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_dropdown_item_icons_2line.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_view.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_view.xml new file mode 100755 index 000000000..6ba319121 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__search_view.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml new file mode 100755 index 000000000..8fc0eb12c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/abs__simple_dropdown_hint.xml @@ -0,0 +1,29 @@ + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml new file mode 100755 index 000000000..a6c6252d2 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_dropdown_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml new file mode 100755 index 000000000..bea740178 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/layout/sherlock_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-land/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-land/abs__dimens.xml new file mode 100755 index 000000000..502cc16a3 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-land/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 40dip + + 4dip + + 16dp + + 12dp + + -2dp + + 4dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml new file mode 100755 index 000000000..3312cfa7f --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-hdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml new file mode 100755 index 000000000..502cc16a3 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-hdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 40dip + + 4dip + + 16dp + + 12dp + + -2dp + + 4dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml new file mode 100755 index 000000000..3312cfa7f --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-land-mdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml new file mode 100755 index 000000000..35910333b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large-mdpi-1024x600/abs__dimens.xml @@ -0,0 +1,36 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + + 64dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large/abs__dimens.xml new file mode 100755 index 000000000..63b12f7f3 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-large/abs__dimens.xml @@ -0,0 +1,29 @@ + + + + + 55% + + 80% + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml new file mode 100755 index 000000000..7a48e1542 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__bools.xml @@ -0,0 +1,19 @@ + + + + + false + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml new file mode 100755 index 000000000..f67853817 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml @@ -0,0 +1,38 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + 5 + + + 64dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v11/abs__themes.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v11/abs__themes.xml new file mode 100755 index 000000000..03473572c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v11/abs__themes.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__styles.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__styles.xml new file mode 100755 index 000000000..88a60dd92 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__styles.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__themes.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__themes.xml new file mode 100755 index 000000000..5fac1ab58 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-v14/abs__themes.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml new file mode 100755 index 000000000..6f49d7e47 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w360dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 3 + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml new file mode 100755 index 000000000..3eaf4aee9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__bools.xml @@ -0,0 +1,22 @@ + + + + true + false + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml new file mode 100755 index 000000000..88357b0a7 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w480dp/abs__config.xml @@ -0,0 +1,29 @@ + + + + + + + + true + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml new file mode 100755 index 000000000..2fd4deea2 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w500dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 4 + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml new file mode 100755 index 000000000..b085952d3 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-w600dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 5 + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml new file mode 100755 index 000000000..bfc535de1 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values-xlarge/abs__dimens.xml @@ -0,0 +1,45 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + + 64dip + + + 45% + + 72% + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__attrs.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__attrs.xml new file mode 100755 index 000000000..32631ca8d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__attrs.xml @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__bools.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__bools.xml new file mode 100755 index 000000000..0b432448d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__bools.xml @@ -0,0 +1,22 @@ + + + + + false + true + true + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__colors.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__colors.xml new file mode 100755 index 000000000..625c632ff --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__colors.xml @@ -0,0 +1,27 @@ + + + + + #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/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__config.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__config.xml new file mode 100755 index 000000000..4c7b5d459 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__config.xml @@ -0,0 +1,43 @@ + + + + + + + + 320dp + + + false + + + true + + + false + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__dimens.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__dimens.xml new file mode 100755 index 000000000..831289e07 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__dimens.xml @@ -0,0 +1,67 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + + 2 + + + 56dip + + + 64dip + + + 65% + + 95% + + + + 8dip + + + 8dip + + + 32dip + + + + 160dip + + + 320dip + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__ids.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__ids.xml new file mode 100755 index 000000000..f9f56045b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__ids.xml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__strings.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__strings.xml new file mode 100755 index 000000000..06a2a2af4 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__strings.xml @@ -0,0 +1,53 @@ + + + + + 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/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__styles.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__styles.xml new file mode 100755 index 000000000..45a18c183 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__styles.xml @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__themes.xml b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__themes.xml new file mode 100755 index 000000000..634fa798b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/res/values/abs__themes.xml @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java new file mode 100755 index 000000000..d93de4c6a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/android/support/v4/app/Watson.java @@ -0,0 +1,144 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java new file mode 100755 index 000000000..ab160f836 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java @@ -0,0 +1,794 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java new file mode 100755 index 000000000..03755be2b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/ActionBar.java @@ -0,0 +1,956 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java new file mode 100755 index 000000000..7b4543640 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java @@ -0,0 +1,270 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java new file mode 100755 index 000000000..a7c856bf0 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java @@ -0,0 +1,68 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java new file mode 100755 index 000000000..078f9b0ca --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java @@ -0,0 +1,259 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java new file mode 100755 index 000000000..0f24e9c85 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java @@ -0,0 +1,68 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java new file mode 100755 index 000000000..3d092f033 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java @@ -0,0 +1,303 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java new file mode 100755 index 000000000..aba6d85e8 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java @@ -0,0 +1,270 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java new file mode 100755 index 000000000..13ca3c49f --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java @@ -0,0 +1,68 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java new file mode 100755 index 000000000..bee72cb25 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java @@ -0,0 +1,270 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java new file mode 100755 index 000000000..5e69275c7 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java @@ -0,0 +1,1203 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java new file mode 100755 index 000000000..0824d3848 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java @@ -0,0 +1,336 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java new file mode 100755 index 000000000..8e1efe8c5 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java @@ -0,0 +1,95 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java new file mode 100755 index 000000000..d022a2465 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java @@ -0,0 +1,1026 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java new file mode 100755 index 000000000..840cb3d27 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java @@ -0,0 +1,468 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java new file mode 100755 index 000000000..2caf5b4a9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java @@ -0,0 +1,278 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java new file mode 100755 index 000000000..02ddff48d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java @@ -0,0 +1,54 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java new file mode 100755 index 000000000..3231080c4 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java @@ -0,0 +1,1111 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java new file mode 100755 index 000000000..e41019364 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java @@ -0,0 +1,42 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java new file mode 100755 index 000000000..6d9dafa7a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java @@ -0,0 +1,136 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java new file mode 100755 index 000000000..ed5e79ec6 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java @@ -0,0 +1,42 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java new file mode 100755 index 000000000..e9215e7f8 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java @@ -0,0 +1,135 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java new file mode 100755 index 000000000..ab76fa7f6 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java @@ -0,0 +1,361 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java new file mode 100755 index 000000000..a71e1ad3c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java @@ -0,0 +1,227 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java new file mode 100755 index 000000000..21d15c02a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java @@ -0,0 +1,491 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java new file mode 100755 index 000000000..84f7504ab --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java @@ -0,0 +1,1012 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java new file mode 100755 index 000000000..0ea319244 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java @@ -0,0 +1,44 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java new file mode 100755 index 000000000..d8a12c688 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java @@ -0,0 +1,1265 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java new file mode 100755 index 000000000..7b830b9c0 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java @@ -0,0 +1,79 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java new file mode 100755 index 000000000..067d0494e --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java @@ -0,0 +1,212 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java new file mode 100755 index 000000000..953e3e844 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java @@ -0,0 +1,57 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java new file mode 100755 index 000000000..129b5aaaa --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java @@ -0,0 +1,41 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java new file mode 100755 index 000000000..1f381013a --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java @@ -0,0 +1,57 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java new file mode 100755 index 000000000..b136d50f0 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java @@ -0,0 +1,40 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java new file mode 100755 index 000000000..0a87bd3f7 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java @@ -0,0 +1,148 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java new file mode 100755 index 000000000..7d45e81be --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java @@ -0,0 +1,6 @@ +package com.actionbarsherlock.internal.view; + +public interface View_HasStateListenerSupport { + void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener); + void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener); +} diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java new file mode 100755 index 000000000..3869d3290 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java @@ -0,0 +1,8 @@ +package com.actionbarsherlock.internal.view; + +import android.view.View; + +public interface View_OnAttachStateChangeListener { + void onViewAttachedToWindow(View v); + void onViewDetachedFromWindow(View v); +} diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java new file mode 100755 index 000000000..0354ad1ad --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java @@ -0,0 +1,264 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java new file mode 100755 index 000000000..510b97488 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java @@ -0,0 +1,278 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java new file mode 100755 index 000000000..dcb50f362 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java @@ -0,0 +1,295 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java new file mode 100755 index 000000000..876a22c58 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java @@ -0,0 +1,714 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java new file mode 100755 index 000000000..0e3b1ae0d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java @@ -0,0 +1,575 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java new file mode 100755 index 000000000..6da26f2ae --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java @@ -0,0 +1,231 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java new file mode 100755 index 000000000..ac25c3736 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java @@ -0,0 +1,278 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java new file mode 100755 index 000000000..179b8f037 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java @@ -0,0 +1,1335 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java new file mode 100755 index 000000000..f5359fb40 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java @@ -0,0 +1,647 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java new file mode 100755 index 000000000..aaf2997b7 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java @@ -0,0 +1,310 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java new file mode 100755 index 000000000..f030de310 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java @@ -0,0 +1,376 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java new file mode 100755 index 000000000..c3f35472c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java @@ -0,0 +1,148 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java new file mode 100755 index 000000000..323ba2d88 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuView.java @@ -0,0 +1,120 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java new file mode 100755 index 000000000..3d4dd42fd --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java @@ -0,0 +1,185 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java new file mode 100755 index 000000000..6679cf386 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java @@ -0,0 +1,134 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java new file mode 100755 index 000000000..7d307acb1 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java @@ -0,0 +1,72 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java new file mode 100755 index 000000000..3a4a44675 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java @@ -0,0 +1,291 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java new file mode 100755 index 000000000..1d9c68b37 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java @@ -0,0 +1,258 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java new file mode 100755 index 000000000..9ec250f38 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java @@ -0,0 +1,518 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java new file mode 100755 index 000000000..4636de17f --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java @@ -0,0 +1,1548 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java new file mode 100755 index 000000000..fa3698f3b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java @@ -0,0 +1,40 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java new file mode 100755 index 000000000..cae8b8aed --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java @@ -0,0 +1,50 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java new file mode 100755 index 000000000..14f092c81 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java @@ -0,0 +1,30 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java new file mode 100755 index 000000000..ad1b4f0a8 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java @@ -0,0 +1,64 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java new file mode 100755 index 000000000..ce0cb3bca --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java @@ -0,0 +1,479 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java new file mode 100755 index 000000000..c786dc5c1 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java @@ -0,0 +1,1160 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java new file mode 100755 index 000000000..a78b3f71b --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java @@ -0,0 +1,41 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java new file mode 100755 index 000000000..4947c41df --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java @@ -0,0 +1,410 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java new file mode 100755 index 000000000..d13c6cea9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java @@ -0,0 +1,644 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java new file mode 100755 index 000000000..1c02d4aca --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java @@ -0,0 +1,1193 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java new file mode 100755 index 000000000..038d1e031 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsSpinner.java @@ -0,0 +1,703 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsView.java new file mode 100755 index 000000000..a7185d082 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsView.java @@ -0,0 +1,21 @@ +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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java new file mode 100755 index 000000000..48fb5d8b4 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java @@ -0,0 +1,546 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionMode.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionMode.java new file mode 100755 index 000000000..81b4cd4d2 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionMode.java @@ -0,0 +1,224 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java new file mode 100755 index 000000000..ae7cb1fe0 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/ActionProvider.java @@ -0,0 +1,170 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java new file mode 100755 index 000000000..43281b013 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/CollapsibleActionView.java @@ -0,0 +1,39 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java new file mode 100755 index 000000000..951f4ccef --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Menu.java @@ -0,0 +1,447 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java new file mode 100755 index 000000000..5a0f40859 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuInflater.java @@ -0,0 +1,495 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java new file mode 100755 index 000000000..7fc3aa430 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/MenuItem.java @@ -0,0 +1,598 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java new file mode 100755 index 000000000..397fd1c2d --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/SubMenu.java @@ -0,0 +1,110 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java new file mode 100755 index 000000000..a340a4291 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/view/Window.java @@ -0,0 +1,65 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java new file mode 100755 index 000000000..d7f110fc6 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserModel.java @@ -0,0 +1,1104 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java new file mode 100755 index 000000000..e19ea9e9e --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java @@ -0,0 +1,827 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java new file mode 100755 index 000000000..c9e7897d4 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java @@ -0,0 +1,1811 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java new file mode 100755 index 000000000..83e9f0ca9 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/ShareActionProvider.java @@ -0,0 +1,316 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java new file mode 100755 index 000000000..bd5cbd718 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java @@ -0,0 +1,733 @@ +/* + * 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/media/android/NewsBlur/libs/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java b/media/android/NewsBlur/libs/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java new file mode 100755 index 000000000..47475c574 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java @@ -0,0 +1,37 @@ +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/media/android/NewsBlur/project.properties b/media/android/NewsBlur/project.properties index 3bf5c9ddf..134b0ba31 100644 --- a/media/android/NewsBlur/project.properties +++ b/media/android/NewsBlur/project.properties @@ -12,4 +12,4 @@ # Project target. target=android-14 -android.library.reference.1=../../../../workspace/ActionbarSherlock 4.1/library +android.library.reference.1=libs/ActionBarSherlock From bb803c50b401cbe91b8cae66bfdc452f0303f130 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 26 Mar 2013 16:27:01 -0700 Subject: [PATCH 2/4] Making it a bit easier to setup a new db. --- fabfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index e6062c0b8..6adccc1a4 100644 --- a/fabfile.py +++ b/fabfile.py @@ -318,7 +318,7 @@ def setup_app(skip_common=False): deploy() config_monit_app() -def setup_db(skip_common=False, engine=None): +def setup_db(engine=None, skip_common=False): if not skip_common: setup_common() setup_baremetal() From 3bb1c95f91d18a91fe3c49e74ea7dc268ea3c24f Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 26 Mar 2013 16:55:29 -0700 Subject: [PATCH 3/4] Fixing limits.conf to just use integers. --- fabfile.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/fabfile.py b/fabfile.py index 6adccc1a4..140d21099 100644 --- a/fabfile.py +++ b/fabfile.py @@ -325,7 +325,8 @@ def setup_db(engine=None, skip_common=False): setup_db_firewall() setup_db_motd() copy_task_settings() - setup_memcached() + if engine == "memcached": + setup_memcached() if engine == "postgres": setup_postgres(standby=False) elif engine == "postgres_slave": @@ -529,15 +530,15 @@ def setup_logrotate(): put('config/logrotate.conf', '/etc/logrotate.d/newsblur', use_sudo=True) def setup_ulimit(): - # Increase File Descriptor limits. + # Increase File Descriptor limits. run('export FILEMAX=`sysctl -n fs.file-max`', pty=False) sudo('mv /etc/security/limits.conf /etc/security/limits.conf.bak', pty=False) sudo('touch /etc/security/limits.conf', pty=False) sudo('chmod 666 /etc/security/limits.conf', pty=False) - run('echo "root soft nofile $FILEMAX" >> /etc/security/limits.conf', pty=False) - run('echo "root hard nofile $FILEMAX" >> /etc/security/limits.conf', pty=False) - run('echo "* soft nofile $FILEMAX" >> /etc/security/limits.conf', pty=False) - run('echo "* hard nofile $FILEMAX" >> /etc/security/limits.conf', pty=False) + run('echo "root soft nofile 10000" >> /etc/security/limits.conf', pty=False) + run('echo "root hard nofile 10000" >> /etc/security/limits.conf', pty=False) + run('echo "* soft nofile 10000" >> /etc/security/limits.conf', pty=False) + run('echo "* hard nofile 10000" >> /etc/security/limits.conf', pty=False) sudo('chmod 644 /etc/security/limits.conf', pty=False) # run('touch /home/ubuntu/.bash_profile') @@ -926,7 +927,8 @@ def setup_do(name, size=2): size_id=size_id, image_id=image_id, region_id=region_id, - ssh_key_ids=[str(ssh_key_id)]) + ssh_key_ids=[str(ssh_key_id)], + virtio=True) print "Booting droplet: %s/%s (size: %s)" % (instance.id, IMAGE_NAME, INSTANCE_SIZE) instance = doapi.show_droplet(instance.id) From c389b9bf0e3aea11e06f155a1b2f948b03b9766b Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 26 Mar 2013 18:54:32 -0700 Subject: [PATCH 4/4] Trying to fix the unread counts ghosting issue by forcing an instant unread count refetch of active/selected feeds. This may work! --- media/js/newsblur/common/assetmodel.js | 18 ++++++++++++++---- media/js/newsblur/models/feeds.js | 21 ++++++++++++++++++--- settings.py | 2 +- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/media/js/newsblur/common/assetmodel.js b/media/js/newsblur/common/assetmodel.js index 339eea8ae..55a548384 100644 --- a/media/js/newsblur/common/assetmodel.js +++ b/media/js/newsblur/common/assetmodel.js @@ -636,7 +636,9 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ var self = this; var pre_callback = function(data) { - self.post_refresh_feeds(data, callback); + self.post_refresh_feeds(data, callback, { + 'refresh_feeds': true + }); }; var data = {}; @@ -666,7 +668,9 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ var self = this; var pre_callback = function(data) { - self.post_refresh_feeds(data, callback); + self.post_refresh_feeds(data, callback, { + 'refresh_feeds': false + }); }; if (NEWSBLUR.Globals.is_authenticated || feed_id) { @@ -676,9 +680,11 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ } }, - post_refresh_feeds: function(data, callback) { + post_refresh_feeds: function(data, callback, options) { if (!data.feeds) return; + options = options || {}; + _.each(data.feeds, _.bind(function(feed, feed_id) { var existing_feed = this.feeds.get(feed_id); if (!existing_feed) return; @@ -700,7 +706,11 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ }); } - existing_feed.set(feed); + if (existing_feed.get('selected') && options.refresh_feeds) { + existing_feed.force_update_counts(); + } else { + existing_feed.set(feed, options); + } }, this)); _.each(data.social_feeds, _.bind(function(feed) { diff --git a/media/js/newsblur/models/feeds.js b/media/js/newsblur/models/feeds.js index 86c6bbbc3..cdf6c4bbc 100644 --- a/media/js/newsblur/models/feeds.js +++ b/media/js/newsblur/models/feeds.js @@ -3,9 +3,9 @@ NEWSBLUR.Models.Feed = Backbone.Model.extend({ initialize: function() { _.bindAll(this, 'on_change', 'delete_feed', 'update_folder_counts'); // this.bind('change', this.on_change); - this.bind('change:ps', this.update_folder_counts); - this.bind('change:nt', this.update_folder_counts); - this.bind('change:ng', this.update_folder_counts); + this.bind('change:ps', this.change_counts); + this.bind('change:nt', this.change_counts); + this.bind('change:ng', this.change_counts); this.bind('change:selected', this.update_folder_visibility); this.views = []; this.folders = []; @@ -17,6 +17,21 @@ NEWSBLUR.Models.Feed = Backbone.Model.extend({ } }, + change_counts: function(data, count, options) { + options = options || {}; + console.log(["change_counts", data, count, options]); + this.update_folder_counts(); + + if (this.get('selected') && options.refresh_feeds) { + console.log(["Selected feed count change", this]); + NEWSBLUR.reader.feed_unread_count(this.id); + } + }, + + force_update_counts: function() { + NEWSBLUR.reader.feed_unread_count(this.id); + }, + update_folder_counts: function() { _.each(this.folders, function(folder) { folder.trigger('change:counts'); diff --git a/settings.py b/settings.py index 192e9cffd..eeaf5033b 100644 --- a/settings.py +++ b/settings.py @@ -22,6 +22,7 @@ SERVER_NAME = 'newsblur' SERVER_EMAIL = 'server@newsblur.com' HELLO_EMAIL = 'hello@newsblur.com' NEWSBLUR_URL = 'http://www.newsblur.com' +SECRET_KEY = 'YOUR_SECRET_KEY' # =========================== # = Directory Declaractions = @@ -66,7 +67,6 @@ LOGIN_URL = '/reader/login' # trailing slash. # Examples: "http://foo.com/media/", "/media/". ADMIN_MEDIA_PREFIX = '/media/admin/' -SECRET_KEY = 'YOUR_SECRET_KEY' # EMAIL_BACKEND = 'django_mailgun.MailgunBackend' EMAIL_BACKEND = 'django_ses.SESBackend' CIPHER_USERNAMES = False

XML attributes + *

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%0Dgxy!s3UvdJ|32f&8LC6E@iwj#Hi)>UVFRbq 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/jarlist.cache b/media/android/NewsBlur/libs/ActionBarSherlock/bin/jarlist.cache new file mode 100644 index 000000000..1b5ec3f9c --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/bin/jarlist.cache @@ -0,0 +1,3 @@ +# cache for current jar dependecy. DO NOT EDIT. +# format is +# Encoding is UTF-8 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..42bb3664537cca466589b07c2c803c680ad2796e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zEC|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECG!z?_c3|xWsJa`omcN} lXWN<`q3&tPf&sp~WbEi=^5BhSO$VC8;OXk;vd$@?2>?W@E#3eC literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..612889a4554ad409d74f2ab868600232777482fb GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECr2?)zqaX+1RBHO>FVdQ&MBb@02f<1(*OVf literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9a80fb7ba66978ff946a240e75c4c9ac55d7f71b GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zEC);J=d#Wzp$PyM88HO_ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4a61ab046509c3c75d4a28d939e9c39e892eb0 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECDHTi+ zbzV4~{b<@Wt~$(69By5EX@D_ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b110188bf0e1a440e2bf4285fddbff87b79e3a9e GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECP|4&tX*tOYlb|mZM x+EuTPEZVf&yz)_RDkB>BD?P>d@rC6M;!Ho-=Y0DkdmU&RgQu&X%Q~loCIBoYE-C;3 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..95c76e3d25af83843c1ec13abb3ab83c71a0b18e GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECA_Z!b9V9&q4baJ=>4zLM6DqV#67&0K1~ wL#}qZK0TB3>4@}cCN%KNTx0j`h5n6tJ=-}C$|cCG2O7rU>FVdQ&MBb@0O=t!WdHyG literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b9634957cc238be0158c9be5557fd57977530f GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj9(e^J$qY5VH*N|KlQRfQWH8CdIjJEs@uJLsBb6Mw< G&;$Tl&qde( literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..20d7080bee607b82926d5f5c78b062ca7811a318 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECPC1TDz+!tKW+d6F>zQ_B&b{^VM>dFmjr*ms%yxj|ZB@;OXk;vd$@?2>>#4C?Ws= literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc40c9b736c8bed00fc9e165932a7df15928929 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECBD?R1z+Y8Gb#E-ahPKi~%69_bo!PC{xWt~$(69CB1GhzS$ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..48bc53693c941233cd9ed06c7649ff5a003d9d0a GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zEGPB<|9@;4D8~rHwR-C|0ok^mE{-7)hu>as|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zEXNBZuwkGuBMfhxpcMmTTYI`VhD02Gd%=|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zECrS@|`(MV4h$B>A_Z*OemWKiI72~^&e_xMfU6RC9d2z8H^`p{J$ z9;`Z|@^zAinr7O>n=@^#4?6^|RE=a{WMbhEP;h8~Fc$ot^6lQEkZ*f7<=pQ#dnPpX aFUu{b5>esV$&nymF?hQAxvX|k1|%Oc%$NbBLh=eik{OtoIDu?@KnN%)48*cP zEQd!SBTx>E8`i{$1KAOtE{-7)hu_}V$jP9<<8pD1#iY&Fld_NaZSb4G@qbmwrxT%W z@A4!kmOMK#`)rqMr1UAToxF@pEF1y~4h;-Y#`kcmDwzeFo=*+kUH8RsdhkvE1-wU7 Vg}9bDoKOO}#naW#Wt~$(6952>G;RO@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..11c794068b67b75e7329df6e30254857c66cc3f6 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^OhBx~!3HE}dUn+VDUZB@kYolXCXf&zzz9?z1jNF~ z3f2Dq{}1Ie`Zqn!0kRc6T^vIsE+^+?WF&w=QbUvD$rbC@hbw!EKVI-%oMBfJ%eO-< RZ`Oh|db;|#taD0e0sz}SB1ZrK literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..720f52d3cb98a830c74e4b6d1b0d40b4e68d5d7b GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^OhBx~!3HE}dUn+VDUZB@kYolXCXf&zzz9?z1jNF~ z3Z)Pn#y68L$N;&Do-U3d5|@*6GBOgtAgQ70;IV{;T>)Jxu|3WA;u*Ggu)IFE*dh_6 N*VEO{Wt~$(695!N9{2zN literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4332fb9128f2f47581ffbc00021af4078fd141 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^OhBx~!3HE}dUn+VDUZB@kYolXCXf&zzz9?z1jNF= z##^6)6oY8B|Ns9(`HZ_ys;U5m-LnJOI8{GSK4tAVM-L<>fBZjK8c5 Xz8q{>ex(PPK}LAG`njxgN@xNAbMz)q literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9f39b42686e873b15a6b409093d5dddf3883b4 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^OhBx~!3HE}dUn+VDUZB@kYolXCXf&zzz9?z1jNF= z##^6)6oY6fC=H|-C2op^0BJ2x7sn8Z%gJWHq%! kkMAvc+uPf_oo(%YhSit2-!o|62mzVq>FVdQ&MBb@0CNH@0{{R3 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ddedfd2cd2127e3ce572d409b5f80c82743211 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^OhBx~!3HE}dUn+VDUZB@kYolXCXf&zzz9?z1jNEK zjki7pDF)F}P#Q=vE*E|&0i?A&T^vIsE+?Da`&E**OX|Lu8k>eh4iDSowf^Zw1_mAz j*X>=n@Zrq`U&R@W&vCq;aM^V?P#1%ztDnm{r-UW|X{9M% literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2e90a8a7df58a7bc8a87ff2c40634430f9ab24 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@0HlQ-h-HCT z4u~0H_&;hMa9c8MTdU1Js0~+|p8atVlrSAORh0B3PF?hQAxvX|k1|%Oc%$NbBLh=eik{OtoIDu?@0HlQ-h-HCT z4u~0H_&*NdFw+F2$JW!uF(l&f+e?PL3|k1|%Oc%$NbBLh=eik{OtoIDu?@0HlQ-h-HCT z?mvT`9X1S+VTFwu7gOV@Sl|w>Jz085DRJHi|jwyxHL?&t;ucLK6Un4l1bt literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0a42fb2be8904d2a31f29819f7667c37e40aba34 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBLh=eik{OtoIDu?@0HlQ-h-HCT z?mrFylw*Wp#g=V`K(?)?i(^Q{;kOqYc^MQ0SPT_BoUA8p*x2!)SW%Ys>=%{HR;jfS k4rrjh`Pr@GiVLRex%aS%MMvD;0yK!h)78&qol`;+0B6HJ{r~^~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8051417d7f7c690964ca57f6cad72601d971380f GIT binary patch literal 1335 zcmeAS@N?(olHy`uVBq!ia0vp^6M)!;gAGV_&M?*mQXzQ-A;}C(Oq@VA4DbLM$QUHf z55$d78l;aA8UNSN&_L#c*ou*Vf$CZ2dAc};RNQ(y_iWy63z1fS$&>SxR_E-JJfmb_ zaMt?F?=Pvpm^Q!g_HBH}%QGRi=}&?|-`qLN8u;e@5!wKrOs zEy-`!iqpRKa@_pHs6U<}OnS$@$ zxl?l^$83K1>Z{L||I=Fw$~@ z=%K8{{E(edohy>>zPDyNseZ>@{i2Z4s+_Bw4QJGOZZ$SsmTqdVc3{ac#W*^Hw2%YiGx zZ;Kk(wYEpClYW}^NToev&iA7N#{}H=#&RsyU~&;u=wb-;W;-#O6I*lH5{pq4xH+`j1lLUgy5=yQ|${!tc%}vixO4a7Bvc zn)V&H-|mZxi~IL(Z~b}iI1!up{QP|Tx8HxWGgve5Hi$D$In&GMx1_#NW4Xccr!m(U z>KH%hP4Nz_7r%AgV(yglD;+*dPdlEmiT|nUlzP{n?pMke?&Wl~p1jj;f?cAxpIW+( zm7!Pm;e%h7)G(R&H&|Uv7g{v8VBU?iU40>{evf)4|140D=X-VZ`4jQZcZ(H2vt)=d zoU93()l{}f{Gr8L4wq+Ao!5E~a|nvqeDuCz5qHt?uyez+#}3U!in8Zs^)S!W3+cVX z{)&eoB|6oDf4S3n=|%SnlsJQwU#)#;=PuCu)S+-{(Ooglb%!|Jr#mf9V+`P06lOVT zpSZ~^X3wv}`#Pq^6t8anc_?}3g#}I_-H%;Ot$XaR892}ITc+Ej?^1W(S7 zoT@rI?>s-zxn`}-&bz@s6M0VLe_wL&<#MJJ$0NMYPw}Kyb=YrvD6__82U=w3>}R~SVC~u0wSQcJB^HCHtDnm{r-UW|P%1wu literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__dialog_full_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c9065de58ab159dcd44a24afe2bb196ed3174422 GIT binary patch literal 1375 zcmai!eKgYx7{`BGdtuD`5i4s`j+d0FP0_GvWgLa>Zscusg}Cw-8B4ZAlrnjDY;%R1 zaaXyRUcBs9Y+adoD|EC<$y>(K!maK)=iYPffA@RN=lOikbI$YcljnEX6Nx|}002OG zQ7K0>=4c>l!89|keD@BGXmJU&Z~zR}*7Sd)t118G`(9rI`yYS51N|REgQ0E!0O|3f zkZFwZ1@4`=37kRBqRqH$pfy+oHs59PeiMWmc4I$hqa--l*00*3@RAmXOzPDmi-55U z_T*Tvc>}pKmwNfKMOp14K=!tz>#81Rx<{{TVX)s*7@-gvSy)&|8!P;WQ#$A@GmI9% z%4Ke#{nUsPyQ6mB+hdB$znBBgV)yFc(!dcpL?jy_z6fGCWj+jOsBqDtq>01p`%UZb z2@l~(rf8U6*FjK&O+x-+l%>~J!l1FTz1m+d*8}5K3oq0$VJ2@aA-5P{9Wvi5iBtty zpZH`$5vjNUoOmi^S}fm>_rtp8AhFdhPZAS23~3S7HzP!m{G~i)%1v;vKA?t;I6=xd zH$b~KXG^$F-NGy7&fK}nZ{)mdy$0$QH}uP7?p0jwmk@hXdUHDTs?=_=lYeFi-xVJh z*BKfX_H_nZBfnl(CC1Yo-61r`^&%6Sd0 zYImoGu$^UeD6d(8HOR2^Q8r%^9xJ!}3g2ApzamE~^kjY}TKd7`a%|?6+)a^qmHSS{ zUJBfGAp2o>MfJNNLntacsYyF=3nePJ|VGFF@ z`}iA{K6r;HuKbouM6nK)Q)Xk@u1T&b=P%@ zwlQP*X(I&9p6&p>KJ5nKHLLnj@hdsCVBggo=k%tLe9FEJRE3wzEzwA*E~#@gswKc@ z>E})G4`~cK#<;Sg(Hw#TPEE8O`f$LQakfakx@xYd+sMiLjpS$*J0Ol}4YG0`0Lwn5 zZ9$`fp3o~D8Zu4}wa)UVPOhXQ)oOJ@YHI2}|340Xqj)kf0@Blw zk&(wzsZ=cxxD8snrnpW|s{2G&dh0$D+mMvMm>C%vAmFMey9%uZ3Pbsw<6ALWimC=AzmfRnuIn&sEe>Va=fyY_-xT@)`Vn$LVf0^~Tai z6G>6BVb3doi=^@5cwkZEJ+&Z-o_OJb>P?Q`UI>b((F(l%y9 z@vE$JJjwkIkgmwZY~G^2cg`Osjm;nR{dkizKU%~`WDiS3!3ErmRS~n6wOo#H z7l{ThzA|gpoEBZ7M1O_u`iaStfTo@Hba4#PIA0ocU8u=G;EY?~#-nUq3l`m|e*g7< z{i)`UtbF-u`n$JpKN;8ZLzKbOeZ!|tmmu$@o&1l5ByDG(7MEZY3H6*R8Rxh)ZN}HO z_ag7M&pK6RlI7rXp(y9-mWB-ui|!WkUQK1{ocH+U-wlj{Ld^LVTi6Ycczi!L`GkU^ z%Ccu?=IRTaUDC8Pd&g>1<%}zBZn-x#l**3Totx9({HB!CVxG^x0}7LheN-GfroZlO zm+*L3_l7@@*(Nh^{fR|P|F?gBxccvJ$s6B)GKFXGE9{)PqXg(J22WQ%mvv4FO#t^u BP4)l) literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_ab_back_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5b29b1cc81062c2ae177b9a4183cc0717bc6fb5a GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAO%Cu0aRt(Y4OCSsmjc~nSQ6wH z%pj+(swv4R92gQDDq$7isVC**$HnB}9i+s};pVSx#^-A+>dY$cXu_}Kt}M-MZE$(Y zj|`yZg`O^sAsXjiV(v|NrZe@sVZe^U7W>&Acr5xA~w! zm%H5TfK|sPXR7tvrOo+#=dp0q2E9*9^EYVSyurb7?OH+P&!)52GS4+6r1#!x4$Qu6 zvW#u9+?0)m86_pR=0;t3snfd7)i5?eTXCJ#Z1s}n$N$9kh-Ww|$~Ahdc$LuMWHa^1 pKPR(%%PZ`jLDCkv4~)NjVEt0bH9w(!OC2cmJzf1=);T3K0RU?kYajps literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2d459b03c29cc4de132fabf7735a2eb5d0df27 GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_VB`+)32_B-|BnK22z1)6oCge! z$dVwxU|{etGfB8|Eqorc;PL&l!kqJ;+`4Eo@3I-koTujOv#(grym{4%ZN@cg)@im= zuiFW-Ou6CUb;@RvO9@l`J%#9y89hUuh z5;D!_dFps|I*x3r>sBPJh*$G%hdj!TxyN|w||emoI3dMy!u)Bz+ zl54)aV!7Insy+6Pb}iq@qv?{K@vo=olE)We&BNWh98V_4e|YX$bNkb$Rwn_c=~Lok z)t@gFHFr|<75uaI!TViLS0@W?`>a*L@lKOp>+W+$?Ij;e5AaWE@8A2(z4fgvr}q5# zOExucZSw;oeC62Id`&Z&9~GFrYt7d@lkH0M5>312J?(w!>!oa}DqT5P@BMv1bn=%)Gk#1x`Y%QF^Va0& z``e$g6fSvee)_MEwvFum+wY2l1nXSpFJSR+;WA&~(l6uwM{nBC`kzdi{GwgG@;sYC OiNw>@&t;ucLK6TAkFFB{ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_clear_disabled.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_clear_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..69838cce1a6dc7c04eb52f50486f920078d5ce23 GIT binary patch literal 996 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 SQ#)S;6tAAHelF{r5}E+=Y=3S5 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4a59411c98c68691928b2624dd9aeda64b8c18 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyx&b~RuK)l4Z)j)$l5o(`(E(%^ z7ZBn`KD2;718JQf!A~rJaW@M0a zVyrP)*r*qBAYIg|qGiScF75)YLoBW_W+(Vgoa=gHV`O=MO)PtUxZ`W77qONzE-rU4 j_$A`9^N7u@_vd&e!&v)yayqX9Eobm_^>bP0l+XkKIZA5) literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6ebdaf462407f7c57a6b18ac29a50c6f53992f GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sYymzYuK&RxwB~CLP=u)@$S;_o zVYarP1dyld>EamTaXdLeg7q-Ffz!biZH-qAW|_E|_Nes+@;cjP_Ar?+FjU7f9K8F@ Ru^Fg=!PC{xWt~$(698OXC0YOg literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..48d472841031c40a715ddb20562dfb67207ae1c3 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-soB=)|uK)l4HwJ^LW@0OVg3KjB ze!&cB3@0yg{0DNiJzX3_JdP(PNU$DeH*h+*qOI}j0T$LR-Izopr07fMz*Z=?k literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c5130540838f21e4f57f8af8a18fe7ffb70b39 GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sO9OmDT>lRR5dF;tJ^688QscUaz@_=`uCCzy9W86L z`qsq5N8MFq9zRz7|KDM)jd#jx{_|c9&nBK$p6;&KA0xNZrl|7CrxQ;t<7Z#?J$(6K-_rq}IN z0J1Dgg8YIR7^Kr%yK}Uyr_KzNoUR*HS~;m)wpl2dGqljlhs9+=jeJ&5o|;*^LWUcw z2e*pI6b%b2%_@E4V5>aSuM7-~TAnVBAs)xyPKgdap|0`@S=BmmKKIs`Xg!#+uVtdg9j8z8Wb8!@iHx6SXh?E1th}qtSWW$cDQa v69g2PA9S=Za54%psjzr(Ob{@5^-?;pLQCcL-kdg000EeNkl zS!|S56vzMfTjraso#_spE;FSas?-WffzkqE7nFt|C8V0jgAw&XMJ*wbL?3)m2?=UU zjKOFsi$E!ANTCp*4GD!>Swbnalu}!3x9Lj1&UBV9WWfPDq7Z|$+}tbgQys5A@(Si> zo4{zc7@SyagyVcU)vJ{+uS23@drsLeofh}VOH7DHdd+sK3!Z+p7*TJCv-&R=n5}em z@JIdp$6GLOlX>OT*V<4ZI_=14{(u@=_nJ~ym_D5;C+svJzOI}uw(UWBc0>XL9yoFX z*eOTElobYk2-Un)1Pck%^#b9PXo}281v`7ga(`pMP9pR_FYm&EbS))V+1cAJ#}p+q zxoReWp@l7ri;519G>!PRQhj1d4gkG)4J$Rt-#LKLg85|mj?Dmo2`p9;B`rAM=d_6Y z(+u8%#KSc1gJzH+_F$6nbVdXw^PazZ}VVihYS(}{Z z3Xfdug;vO?1H_exrfV`6Hneims>Sz30O#B@H zybgiJc!OFJAMYw!U<)1cHHjCD)y8^ji^ZLEbZu!N6N16-o34-F)<2|T)=G&m!2hrs z<1vVA`DSF1dtZs`G3fVNn|^8N9}T5PiZmn1HYLmgqAx}$7W&Mj6PIe#i3LW?<$<$J;?${-M9GQRXOdui-kl(7vrcM-MP5?rm?)D~m3Tx}GFp+^Vrrc;f)w3K& zNtoOGyN1TF=(TwYYR@)ugu_2y-B4>)x%R@`hv+r{*^)I9u3hWiDTE6)hXfRZ%^g8t xu!UV@V$^wmTYHF>k zYbr0V2BKZN_H5a*ZRN_!Pk+|01+Qs&)6U)wuG_bKhtB^iDvoLRqP12KMg;M0ER26Stxb*Q%${`i|viEoIG&YJaj`&y+%3$|jd#Spa#FYeh{y*GJRsvF7lY92a zvAO+YbCh?x-?6=?D_cjboLji(aqg6doq-$wJrS|AZN4dI&|dz2rbpNH&yRiyJYx#V zG(Yh`S-7ymwJ`I%(k9C~r+ci^Hk^5}Vek9rJYhSy&a!@rcx-j-t-5qazEL+Xr^%Wk zN!I0Sl*D$lPGU(7*}=P9YpKe&h{Js>yA62WoH}QFa9jRaS!}eLnEN+X7g0H%yU;K3l-R#Qxw9cVREU30owmdKI;Vst043i7_W%F@ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_voice_search.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_voice_search.png new file mode 100644 index 0000000000000000000000000000000000000000..6ddeb382c395490822db02690c3297e4dfc40f87 GIT binary patch literal 2013 zcmbtUX;hPE7ETI;01~vpkpY#c2-ES=6wItcsuw2|36bWmlN%k#*tE<5LKW1!f+|trAJ39-hz}~-q zFBA%KIGiG0q}TNU!PJdjFZib#d`zZ~KV^7-@U{r&xJZf+2;<|32Hy}i9JUc3NuX=y1e zEbNPfK|w*w%gY%V845{4LPC0adPqpfT86;Dz_s=i+LV+OI-Nc>HKph?GBPqICPv`` zCN(t`@aX91*w|QJUY?(ypMinFr%#`nnwo&;a=8#wQBl#+(EXSf$0 zkN5KBOHjd;+1S{WmX^A@x{5?1DB9iK?cm@bl}f?8xVQ+x0|Nt{ot-^BJy3UYauSLb z78XLn{QP|A4L%Z?Oa?-T2ZJx6pr8Qc&`E1+t3V(CvaYTU;sMmx*VAY;CX-oGQUa>a zg4I=+M%jPt(xpof2FHgIz(Xo10Ttnlu!UNQiHR^M=wy6+91aL1Ohzmg!?;*rO3V2O z1QJ2_pnL~!B^6aP>MM;6fBX9u(><0Zo7ZD^?TaXD6mla7-+b*i4;7T3fAdSCs1SG}>{CS7NX( zlHrKYE-xlVMH?29E%vg?ibxfnSzM13hcinGT}v~Hw`0C1rxz6*amQ(LPFP>hIC;pn zfM!E2JVWPL?T)`~O}JK&XuB^b-Xnj%ee!`ToNZ>&!45yA{E_5)`Ciz5zk{^A2>XP) z?362)e);E3)+zHJ;!>|=-(hF{$Y6$^$qOXr1|2?jnvwH+lAkZx*eByQ>r~?9TMYMe zw5yrfNmoLTYnpoN!G9r%6;4?SW6AOo}QhCD)vY8Zzz-@CW2xXvUO{S z86^T^h>Fu?u?DJtSzJ(2UQmg@I>5?C2fm?VH*CaarKI1?OwC9;E5_Z6O+4jwoOp~x zBAxVb{@yK}nVT4c!cb0Igln3+-|W&BOGa>PBH7FR2UT?|`mAz1A00sL8?}i!*J)w( zSKnD9c5IJV!((lfl}K51QZ0Zg-oWEsMQ*_(&s%S|>TifCGCig{KJMGlMQlh#Yf{?H zsba@;l&6gj&xpbhsIDVm3mac(payGZ&Qt$-L!G;zJ^djbspWv&M)?^-t!pTbB{6%3 zjd1411Z7l>BSUyK>f=d1ix-G69G^xHwX!(@I@8H&*Com5O}^rWVj|vb`+;p1-x%Af zpd39IH@mtl_lQ{)=hsU+XwTZ8v^~2PD~lV<5q{jhf-oJ|t#)GmQK>>BANIxN<7_y* zsv{Jgtb}QK*Y&}{r@M5Fx$SM-qFqew=1Bu-OuyWlo$%-%IvkaAoZaUG9#5XT(VS4Q zBxMg~p3vb0K5GjupOTFW?`|_IeJF5YKPcBj6)#=BXw*#^kv!h2b>x6F&G6_3*1q6< z+VsA5)-Ah>y+Qubn{~aMrJ`J$=*I4NCXRi1CT=G=%XBpDY)fipmF^DD(wsfvJ!5y;hjRevlF=j!4&tFxV7mCs;D|_k;pV{sJ2WipI^yU z#p@4EZCp3n6Z(@9>g#rQKWwV_&Vp>F%IN4F`{)^Y&pQ|L;&52STg*;rwdlcA8M2Wv zKc&Ap3ZpD=_%$inzqyE5a-qF&-uTVH+#}m$@9MpDwJR%es5*K0+unw^9d@g)=Jg$- zS3b@z&rdl3_%!ch-KqK@jo?Li=)Xu)R*q9Xh;xmJ_Aj`wIqx2_yRo+^KUCyDVQerW zYxQq89hPa`K<~F`D{aCA1uQ5b_4M#|8kYAO8xOi55Jm3(8W91T{)B%Vg5*qbDs!a9 F{TpeJ7qb8W literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..649263e5c52a1112af887ced2f368576f5d315e5 GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy9|C+rT>t<7-_XziByoW)Tej5H z)RcljZEfxL?b{(LSFc`OQc_Y}T)b}GI-p2JMFo%qa^dE5c6I_4w6?YaMQ+}_2@!wx z?Af<(-+=70va-E<_f~-cL@!XVxw*Ner3I*~uC5NE{^-%8lP6CG+S}OJSYBTK_U+rn zix*c`R?e6)qo=0_Xb6yf>eMNq;$6FTH8nK>)c{5M`}-l<;beDr_k;-(fZVGkS5$z0 z4=4%p3ua&tmDi9HVN=jn@;m(D-9B$c${!scO>kMSnD~qhN(l#_ zFdgV%{^Os}Jy)gSmM^pQn?fdryCND3ulqA4vokMin#`8ddRNC|ej>kf_Lj`A9^ZG* z-FMXPm>!=}LB}&eH6Dv&CpERw4_58(`z)s?QP8QK%C&u2NV?v-{Jg}?b43c5pLuU; zaqIA-k0FVdQ&MBb@06NidtpET3 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_activated_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4da70ac72d3c4ff99625e275b2de12285054c6d0 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VA$bKM$qYEak7aXC3le~hEWCkWCkOUzBQ^TnC|Ns9Y oz2bd94cwkCjv*Y^lYgvdV_;HeRFix#H4$Wvr>mdKI;Vst0L=jt+yDRo literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_divider_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..75bd2d7dc5f17d84a4a5a3083666e031eede4d18 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>le~hEWCkWCkOUzBQ^P0)RCyv- mXe*H7_H=O!;kcfhFac1|%O$WD@{VA$bKM$qY~9=cQ7uf2C5hLba4!kxSVWq@7I;-jSLA%3QRp(Nem2!i1|%O$WD@{VA$bKM$qYEak7aXC31|%O$WD@{VA$bKM$qYEak7aXH!K-melhX2t_Y99Semk1#N(>M~XQ+w|f9Pzi<Dnm{ Hr-UW|eW5K` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e72411ad726e3ad3abaf7bc1165b03ac18bd87 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VA$bKM$qYEak7aXH!K-melhX2t_Y99Semk1#N(>M~XQ+w|f9Pzi<Dnm{ Hr-UW|eW5K` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1289628fa2bc01b3ec2e7c38c3d6c8107a99af GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^qCjlV!3HGx6`GF$sgS&akYolXCQcw5AK(T`@&K_M z5X(0J2@nPX#s(k(!a#t+PU{r-3luZ*ba4!cIQ;g^Mn(n!h65Xlb{^){+ptlUJtbuI m_HS>PSB7X!^;#N)p!QmQ`N;Uo$Sd9mWTdC7pUXO@geCyw(J2Q2 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..233da8e3aa1cffcc8ee5fd218b7ef1674e7dbaff GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^qCjlV!3HGx6`GF$sgS&akYolXCQcw5AK(T`@&K_M z5X;Mh2p|RmMqKQ54W&_4sa{Lr)R$KbZpRqstURz*6J)-ptDnm{r-UW|UMVQ2 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..29ad572b234b70d4b2b785d0f5777066b1631cf4 GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^2|#SX!3HGXiPfJ6QXzQ-A;}C(Oq@VA4DbLM$QUHf z55$2`S`kPyBIExC1_sD{5W7pvte$~^>5iw1V@SoVx3i=3ZW{==>boBGlV|&N)%MHz z)n~rF>R)p}T7zp#=_2;4{gX~4Sk-v;O3x@}RGN_Ee9+cdri}B zcfY+>;<%-I;(bAe>aXUjWu;kn zo>;MB2U`Sdz+A?K9Ov&ji~lYP4`|SAnENYw3S;>_N2P6m!{ zed|AwkN2>D;5*>XAYW7c{{7pJo47<~x9wf}Na|XZd;TZm2JVJ1H``wi8YmIiF6@G1SxHIW}iw8&cf>>n+ zna?fG5}Yhi6S^5aw!CcWN!gdn!@z&0vBXlw;p?+It_yN+*bB;?x$fY*Xy2VfbNa5B z_Vc(fJOD=ErDhcaVa5xl0)K9(88 nr2|jr&z)4$dw(mN+Uol^En@Ok@R+6p(>sHwtDnm{r-UW|qE2ql literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..612b887278dd80ee2c5d0f7064db3e83758c5264 GIT binary patch literal 997 zcmeAS@N?(olHy`uVBq!ia0vp^2|#SX!3HGXiPfJ6QXzQ-A;}C(Oq@VA4DbLM$QUHf z55$2`S`kPyBIEz>-@ixZgV^6c9(~5Z!0hAc;uunK>urp8-eUtEQPKS8BE`(g?k7U4 z*6j53o8Vd=DY}_|6UQVT0R<18Qo}HZ%POk7kJaP|2`pK%HFnQ(cQ2#J=VyT6->icn z=Br*;1s>SDfB*kTCXNGpUo#{GvK)~(D$lFP!R5%#mQj#q`#>^jksF)F1Lm0z7sPOT zv(1&<9^>+6Q<5R0L=BTo$}iOk2OIUi#)?UphO|C-EH~r4kYuqM!}k)NOdf^?4~A7D z2{m>G53+rgk~mo|Y`n5T$VzL4#q=c&?^_MskHo|TrPvi8U^jXf(>&!uAmfFb_mlJ) z^}kNidS>%k+1WuMh2>ZET7fvN6;lqJnfPG)?YH{Tg{QXN%-Of~u!CCSlOzY#H73;u z7N;$fKC1Bm7{+?Xekd&pO53085h1xRGMaOW2kx8mR89W!^v64vN}yT>8bmj zJ2_50Iia8Vb!MLVr_8j-(M;E^?tt%NK?B<`yTeMqn{KX|!SL%}#RR4;U${5hFzT__ zb#i-&?~Bv3pYPusvEldMK28o*!-LxUx@%w8@4m~Ec~Eb<_pCLJh0e16le!tdEGn>@ zZ@=#P>g-v^1oGd0tl07R;|sp_!|crac3G`5s?%8-_T$K#yzSM|>#y7UEx%ko=i3bF z%WD$f{oeR}_M`VdK2_cOJ^%OLe`mjbZf+8@Ke*E`NNhUm#9yJ_5n0+-US#jEoF{#e zWz7|-EAv(?eb4mjaQ?aElH8)Ol}thR6%sa{S)iJ(ElB*z_-o#Y zou7U&Z1iBh-o4R~;iuBC0-M{5H*?Jl6g7JFW{cEDN0uFD0-0I&hwEmBPKqz~Y+j|Z zGbnVm@Vt3Favy|#L_Sy(RA(W{^8L+z-5)HwQnh($qY;^AR$748L9w8ivqC( zk_JW~8-&5&-!o};AVbO1#W6(Vd~$-svxblV|NjrVp)#Z3r9x~|Yh&X>oL literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_bg_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..82af131a84a8fca91276a7b8ba01a28e136113d1 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol*0U~b-^ehHa0eJ->$qY;^AR$748L9w8ivqC( zk_JW~8-&5&-!o};AVbO1#W6(Vd~$-svxbR{jR(bNvk2?SF7Y-nGB8+S*u$j4z_28c Up{DmdKI;Vst0R8D2x&QzG literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..15f110b9e1fe7a72d95ec411af341677b6989291 GIT binary patch literal 858 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#E!3HEtCQboK1mqQjBr`CvfP@GEW~c%XEegaE zNE#S{Y!C*6f6t`Z85o$3db&7YALc#vho@$zzttCreR*k(o52lZgUiC|GfRGz?hg;W?z(HM@I4n-cY&e@MX!S7 zx37A)bG=+acXSMEd@ToijcD)sBw;=orXM*kV zFF%^`eEHNhs|F!#l{jG&}b58C`TWxnYK_+AU=UuhJd0}_o zzhU@v>3Y=f^&xk&{#dPl?EJU7wBl$R-{+tg`E|iRCT)`QdVXOo&)K(34f^YJTkMOT z?-IFGwNLXvc+T}N8{bKHT#bo-eLYpepW&Iperdgn`V0BD9e6oceO330pT!!jep}tT zu0^K?%(vE_d(Ay+LFBfacRUR`%906YALc#vho@$zzttCreR*k(o52lZgUiC|GfRGz?hg;W?z(HM@I4n-cY&e@MX!S7 zx37A)bG=+acXSMEd@ToijcD)sBw;=orXM*kV zFF%^`eEHNhs|F!#l{jG&}b58C`TWxnYK_+AU=UuhJd0}_o zzhU@v>3Y=f^&xk&{#dPl?EJU7wBl$R-{+tg`E|iRCT)`QdVXOo&)K(34f^YJTkMOT z?-IFGwNLXvc+T}N8{bKHT#bo-eLYpepW&Iperdgn`V0BD9e6oceO330pT!!jep}tT zu0^K?%(vE_d(Ay+LFBfacRUR`%906$qY;^AR$748L9w8ivqC( zk_JW~8-&5&-!o};AVbO1#W6(Vd~$-svxbWmr-kElgnV|COwc=c=)i%3$%!Hgj0}vC VOn)mnckBge^K|udS?83{1OR229$^3g literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf430f1dfad7efc0a53189cbc2a11a37da26d00 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol*0U~b-^ehHa0eJ->$qY;^AR$748L9w8ivqC( zk_JW~8-&5&-!o};AVbO1#W6(Vd~$-svxbWmr-kElgnV|COwc=c=)i%3$%!Hgj0}vC VOn)mnckBge^K|udS?83{1OR229$^3g literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_48_inner_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..919c328ba5460724b6057b6eb28929b43f145660 GIT binary patch literal 1819 zcmV+$2juvPP)oPF5tZS#B`;gAqnG^_^l}HI##t*3+klXi?(!VgdWv zKmS>POini#;;hEVf4d$)vk=#VY|}>4(w#8(1uDG*WjLo3T>VzD#z0wV4cmECP3XTi zEs$59;6U)YkfOwiD|#2yb>7w~roZW$0o{u0VV+he(fN%6vbxTw#>r@sxi^D-LTaE{ zt*liiZA#vOp63E@>hd>&8UW3pRqWtHYMMWDLE{YRg2u^GyxS|j4{@!cOPlCX8Y{ImFSuxn%%Np=O@Z zW5hz7DV<gN(Ar8NsTRKphJ$gLE2^iHu&Nt+%2^2p@4fJcL zS}A#ER{J^jQhrH5lL>ZdXLwmf{-wWjWtFRsy+4W4qmR%P28(IE%BdF@)Nyp7A2Ja= z!iQ-HaR&7o<7qD?8NB9aCm7Qjnk7(z2Q>Qp)L$3)cjW$G--J#-?KBtypXYDBzBC+w zz19e?Y7`4lJG*G2Iv^VSq&vW1kFd`Zjmyg6FIywprwJjDder|)v%E0qH|%{Dg}aDn5#*lcPbFBUnavsegLt6%X7fv$@lZ!loE z&2ri`H&+?gyLdADpg2Ed4jqD1r&69|HU)ent0tb)EMp? zaLZmi4i%WPjd6n;>x1(P)T+1;$}{=pGI7YBpkR!X?ij8QQB>`U31Ch)%LK-5e9bv9 zj=RgTx?EUFostlm)MWYOI^i2(tlmIfE=_CHA%xHs&6Wqs`mznitG!{U<~YBMs7I>= zXik^zttaj+(2Bn3+0cr%I8}3^7HuxgLo}(8FO{ztd+>X{8kT4qz2R(4X?_)n^oAE^ z4U?&?>zHBCd1IXR2WY6N{j~D_(B)?sRK6mh&4JH(%%xQOu(u4>EQS0!u5IcJr?eMz z`HK~It{F~x&KRfsgx8*_3C?fCCT&wp2u*nLn@rCNq1%UeOi#{4&Tin~(d9vZe zl5u{ITD3>LD$Qi4IH+r%uW~-b);!1jE`c#5z0a8JItdRo>{w{h;IF z+Bu)(4QD>Rc<3y5$`j%N?{*)Fum-Sa7!Ka`h-WA~b)OY~!Ev{^+kJkYQ(+Rqw>ajv zJoBk?vAn$E2cXg0y~9mt9%|0lJ>pT1d&&hDgTQjc5y#!?4zKfix0WI;)Dk=9p;o zBkp&{9VZ7&00j8HFJ?XB0S__z@k-NgH75*IPI7d4k&oe z)6RIpms#r^5HUv`aRl2ATyWu8R%At1WJRiw{{Tj9Vd5-dD)j&W002ov JPDHLkV1iI8dX@kH literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_48_outer_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_48_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad987cb4f067ba54f2a3cb1beaf605fbb78e9aa7 GIT binary patch literal 2380 zcmeHI_dgqm15JquI)flCb#HvxdnxaNk zI!>!bks2i_sS(aPwM(@|&-d^6-urysd!P5~`@GNRQLZ`KNr;^i0{{RLh|AW~zKFuzF*8bklu|cG!#)Xb#ts>4NXw*nM%<;oJLx0`s_Xfo&g?+}Q ziP2AfF}d{im6`XO*JZz2R9RZJzIf?kZNqwAsb^~!XMelp3ezF4@mjd^Enl^JqUKk2N3Ru6cAH0v+23{k>n&wR?csKbVjgC0RSN>gtdh$rUUP*AXE;} z_4UUQ9`pl2AhfctAAVu_@0odiz}bPHL1=SZ0>ReY9G!5?Ld8$oSwBh?p<&=~kIEoW zaRh%LL`_RgRa>*Zw5Eb-No~R?RH9I$BkdY0;>cVuXK-Ygp)sjo9xSgY?}f^<@cg~( z`|;a1ly7B-XI^z+V<;Ew?7Ke+;Iicg6+oaX+My7v30c_AO4UkJA`t8bKZoo0Lp4RW z0t+f0X$Tnz=`jD{FU_q8Ug-JA9hgcMiF^nI-V`6E&sa&JK}+qWzCN=j&P)w904)99 zSIa6XNl!=Ab)}*z<(w*Nvg+?71<_1Yh;gLy4%Pnr>nWP)q>Qqpq$JBArsU+hGbKH1 zRs!CgtDYw-lOyLzr5LulO(f7BvMc$z?t*; zba%Affv5I;F@eoZ)5fw&5rTmE+VxH%b7{W>;oW+{ zfdQx>0>bq>_ndZpjTX536cNTkbExQt$hQIIy|p3ELj@inrey7-)~AiijWpkgAQ(3^ z?G0MyGS&#rCF#jxtud{ODYu_;@KH=M7KJ^nW-Ms_X!r^8s5IM8@s?nCywB8^YG5`68AE?z=TVIQmt+$^vgt8Im zxPiw93XFIlRdU7py1!d36=~I<@9i0805)s>CbqyXEE$CtzZk{n4&npD$cz$%CTJY2N_xC}|WsngLkH@p3T1a1E=y=us8F2#7YYgav zBE-rU=b8csypxnJWw6J`d&ksTq>;qXkPvhkj}3LlVog#j7T3J#`AavY4`514{_Yiiy=S<9OYRy`Q5ew+0ZfOkC>-q^|YPwX*fmQca`4!A(yfCHb){ajFndB z{rr`<&!r@z!>-N3wqPE7MjMK84N0$?V8w?*bl*S2fA%IV4DJ-BuFho1frzc4t!v>g z5)%Y|TYKWMY8n;TN4LUO$=J8S7?6nY7eA)?T?Z+{3ij?Xl0>tDxP=Xdjnj;%1{|a~ zSA8f|VwT8HZ05F>LgCl%du`qrQrsiIRWtUrd$7p=1crN$O+0&<)7|0emWl8{ zski^WJ*s!tZYR)3mqfx9>O@_n>W7vjcI3Eu#`5sIw&JPhuUZ!;x8Tl^Q!fJ(zwl=@ zAA`fK!HKY1`a%iMYu9u;GZ-_NTO;q&2m0$^etY#fC(CZCnnN8)^&ibQAg+2v-#SZ= z7-2OTWFN<%*c>^d<{v=FNPYCoh;*GqlW+>Y#goYEPa#z1#XS`vH$=8 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae770c18aaa7faada417252df4ec40ad7759824 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^ia>0@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYhziQxl`8<~78feKc8x;TbJ9DaMvknfNIkK04{P(u;E!z~ewud5%Zb*zj& zI%%UqlJ&|7|I|ynme$Rb3GmWfIwk0pzwzdaXUekEoz)Mp%xQeA*1@!6YW{vR<1(f@ zjXy8nxxi^qJ6m=en~CEUrb~iy4qAt}J)B(_G&?jDdQLF32t+cND+xbvN?~3lsLK%A z5!Nt&`-+*e4cXidXSMb-EZ@|Z{(S$u1451xA2{MF7~`s5Xf3tb%h)C7V6@hlM*-w7 MPgg&ebxsLQ061AysQ>@~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e932deee9f6f3a0a65fd308a3ab2c224c7a93058 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^ia>0@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYhziQxl`8<~78feO}mx;TbJ9DaLkBiA7Vf%cE*17ue5E6a4O{`E_?M!4`* zSd3Aa;dJk=5C0bg^Zhzq!nkxwkeBAtew%mulO8j(-MA56La@y(y>!Vy^l!XH-b`M|X2%Y{&{$|`1;Lvo7SW^Zu@ OdCb$*&t;ucLK6UK(OTI6 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5caed9d435cfb2a5a6175e66e7c5f73f9b5b46bb GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^ia>0@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYhziQxl`8<~78feIFRx;TbJ9DaMvkc-Js!0lnW8T$m*um8T!+?}yj=f;wl zqi1|Jar|!%;e6t4%D8k&keBAteQ0@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYhziQxl`8<~78feIFRx;TbJ9DaMvkc-Js!0lnW8T$m*uL{NgjWgHk+*lHG z^o-9Yj{nUeoKL(>8JA88^3q)T&&1ez=FN9;Gg%@UL|3#cNIkf9?OkoD&;z!d`RAs3 zHaxw3v&bZYW0ClTz7GsRf^iN~N=zP(E{usTYzi$Wn05%xWDr-9zR)Yd_`<1&>5q-; z*)>el1smoC?qhmx)@S}a_PoX;J{uvqzn9#@HJ`rZHC`{e$E=gx4&)tAS3j3^P60@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYi;1hV1S*LdqwWIl*(v9L!0NM(4sIEF+VetUCo-XQ~l10VM%Z~u8?!mZA= zvM(4yn)XTy>Bn4jPe{^?UYfV|7lY;mlZnPtxow*>53!bZ5uU*VhFi zn1mIM#lC4Qf8Z;5KxV>@-WyL`8IzeWIHVoh=ghG1q;;4>lA2Khvy6;_QbO7>m#b=9 z7~ja;?R(tC9^+Wi;toYet|~h%Y+i6HFqX}5Lh25WOBeU*Eb3NZ+r%^7)2epY+2w@` zuC6Se!hPWJ+55$eJ3r4_!MxBY>A^lP4e_z|G3JnGQEhlcPoZ8~y zUAs%ZOf0F^!_I8xzc)o&m%9C*l676`W9*8!-w}1E>q9%Ld^uJ{DoS9L9^64iMK40{GoS3j3^ HP60@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYi;1hV1S*LdqwWIl*(v9L!0NF{r^IEF+VetUDH_hAQ-;~(>9wR`S*t)#T0 zWW(Adb93|m5su=WyI&}AB(XbcbZ}_7YG%w9yKV7AM|O$H^wV1p|DDzx^PqNz^^OmZ zww{YOYfN6i=yKyU!wz;m7sjZD{<|)#^q8)QDzLU?=~&ANtk_k`xGF1&;|^0Ns|$zB zij7*v!Yi4+=;j_TIjX(JLFSMm6eWEXT)gB^${St&i?7*Y=3o6$!8^VAMJcnM|E!XC zvv~GD-5-90>%q@N{&=@<=a1+l{1LukKf{vYsX`Ic8D$fOG{IR6#T`rx#vM%!k2shc zk~o|hYFiu|U zT4|T`|HZ_+hy6D8PM`91?LNDtMJgy#L7SPb$wA){d*qZK*C!-&QOBV}1O2S^czf&d0!DXYh3Ob6Mw<&;$S{ Cg0+AE literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8747bfc5617f90045753a952a130c4409f7f5e03 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^ia>0@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYi;oN2uEDUc7QL2P6`NPNmdnbSZ@#nZ(xB;xSfn}&Xe4I~^MrXSCIb*RH( zk&v;FE|2IVt{91_)d6gL2U;SmCa7iRvRz{3)GU;leK7yaga4bK9GrCY)yrBw8zyfD z;dMe4jPpXdBN!zUFTagZ+0emYF^!R%^GwHWpHKW=9W5R(^kR}wSjP+w-8H+kSA7o7 z{GIiH5k2jSLKP&8#Q7-SsbD%wVOQ*Zt~|muWh0(*1~y z<&s}gU2=70@!3HGf=LrV_sgS&akYolXCQcw520+phKn$Wm z7z98xNDYi;oN2uEDUc7QL2P6`NPNmdnbSZ@$#1C2w^8D86S3b#httFSk}C+I9z-FATPW4S^fBB z2UsUCDgT+usQtjpyuni7@%BJtan>_T3}r_T_%J3PG7J0D%%aHQ$l)Z=B+#M|6*^V0 zR90YOzG?qy<$ZRO3_5C7SMIQT_%qKd^2k3y>jTgJ`8(|IxX1FN(wvS$Z zn{oZD;>iUnl2hC!w^g%FTy<73{dxYJW$(j|_lBHJ*>B+P!^c&b%YDdPi96?n$Og7m s4h>up*$EeQmK?aCtnmE#>co${@7U(#m>8w>0z-|#)78&qol`;+00)Vhx&QzG literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6ab9aa1108d361e0f01799212d3fef21a9b4c1 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y;!3HFk*Rf{-DT};gTe~DWM4f45J|; literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4dfaac80194d78b8320b33df1b9a46a18e26334e GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y;!3HFk*Rf{-DT};R!*uWai-oZuO`fiPF6*2U FngDw|8m9mN literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4060199bb5b473ade8b7c2fbbe109a33658f0abf GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y;!3HFk*Rf{-DT};aNY)^S49j9r!YOMz7dcJ O((38z=d#Wzp$PyAp&>2+ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..86304e5ab58d830bd55dbaf61171eea64bb252a9 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y>!3H9qs_+0Qi@bu6WCkWCCLo&-0BHsR<_6=f zPk}V!rC(<}fwYXLi(?4K^<vqs&CKj<8z#xHD~st?aANODkVa2e KKbLh*2~7aP+!}lU literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2671d27a014ccd004645e5e90744a18154fb5dd5 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_3!3HEP+-oF(lt*4cNHPNx6G#XKn1Bor1_2li zlIH-6FfcGeX&43KgRxkRb}5jp;OXKRB5^r6K|%b_|Nr-A$k_TkiLz)hF>+#d?{cX< Z&(LSZHH-V~+BYBrJYD@<);T3K0RRu&8(07U literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..95781dd0c3e418b2d30accceb675fdac14018bea GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_3!3HEP+-oF(lt*4cNHPNx6G#XKn1Bor1_2li zlIH-6FfcGeX&43KgRxkRb}5i8>*?YcB5^r6VF820_H=O!k+__kut5FC|Nr|9g?G+spWt@v|NsBhh6V-(lUKZ# YWC&(p&ze7f`Yn)Ap00i_>zopr0O#i)xBvhE literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a4af865b3ed46c3f4c9ca67bc9b8e9ac04ab3b86 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_3!3HEP+-oF(lt*4cNHPNx6G#XdFhMym8YIsF z6=OtJ2xNo!V63j$zZb}s_H=O!k+__ku)x?LO)31jz@-x>4jg#k-L@~CA@C|=K~CfH Q`5+@aUHx3vIVCg!0IYKw<^TWy literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..acae79190bc24eb48c948ffa89edb019e79f9652 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_3!3HEP+-oF(lt*4cNHPNx6G#XdFhMym8YIsF z6=OtJ2xNo!V63j$zZb~X@N{tuk+__kpdf58X-)F8ndv-0;Pd2`M}2P(kMa3G$`{w4 c*W4t?@KlX;q0#k2pF!q%y85}Sb4q9e00z1ra{vGU literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e22bb1765c09e0cb572abdceaaa4ad4bf57ee76b GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_3!3HEP+-oF(lt*4cNHPNx6G#XdFhMym8YIsF z6=OtJ2xNo!V63j$zZb~X@N{tuk+__kpdf58X-)F8ndv-0;Pd2`M}2P(kMa3G>VfBr byK-0XS3j3^P6pSq;OXk;vd$@?2>=#FF;oBm literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..baa52989324bcae6d06bcc49b9fb8f631919dba5 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYh+6h5wJlVVb1lVU!$yZk+0u6$3FLDs<) htc%5`faI6wdZ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fed7fa6af6384ac7f5db4de67410f350f0476854 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYve)rpOlM t+c9?+I5aY`?qgt?P;--i&Wdg`J{bW?o)FglZ!RE{Jzf1=);T3K0RYViCB*;$ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d582d39012dd30cf49c1411e7cdcac646b961562 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYqCGgYJTq t*{h{RGy)bJ5N}|Zr2o57xb)(&M&{?+Il~LJ-7`QYd%F6$taD0e0s!AZCm8?$ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..92edcc810732a4ac18ea3c582f9c288d973996ba GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^5A;}CZO#DDL46pzhAPiCl z!XUr_#GF73QYQe!d{8zckj93A!f=31p7C0;MJG^&ji-xah{y5d1PRu~4M7Jw^gjIm zU!U8>lajKhE1XePEaCELm)8nXTNAD{1#-LTO7Mtn2-xi+3sn4zfnmir-WhzS>yChI N@^tlcS?83{1OPHeDkT5_ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cefe9cb03a4882e8fa0119ccd2d76eacf88c40aa GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^5A;}CZO#DDL46pzhAPiCl z!XUr_#GF73QYQe!d{8zckj93A!f=31p7C0;MJG^&xu=U`h{y5d1PRu~4M7JwT+cK* z8S@JSIdrm0RL#tgby+Od6J?Nfa0P4gK_)S&DJvEyhy+M7Fxb~JK1dD?>jqik>FVdQ I&MBb@0H84=vj6}9 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f2be43000f440490e8b284222fa8382c4d3ed1 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYJ>FVdQ&MBb@0EucbVgLXD literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a51dc9bcaf139934e4be0396829ebc6ffffbcbef GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qY)&E-Wv+SJpgTe~DWM4f4&*aJ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..89eccd47e0370201bec2efed457e5b3b6fc6fd72 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9(e^J$qY7-Dhy?u3J!4F&=%&y!Ydko~Ri;d7l{;T8?+>DvdjL z@+KViU|7w(;(*^3{s1lao5;V}Oe}-N`{5dpwVtkiF6*2UngDyqJ6He! literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4ca7574d42502ad927327c38af7471a3c74dfc GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qY{%FwiGk=}twF3n+SJph4VxO9RC6G= so36yxgey%DM#B!T|F^g2JKtt!P&>?7qn|YS3eW%sPgg&ebxsLQ0EqT5%>V!Z literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6584f9561275152923fd35b11ba303101c4aab46 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qY*i|KBgd%*!au+teBR literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a769b2b7f49e7864e210067cd09a84533e7025 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qY%& f&B~6gTe~DWM4f9}^$q literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..06010e925ffac44e29f33d862e01857ee95cc915 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qY?86W@u|KIcakrO8l0D(hK+$J3b zRs+Ke5^SsFeLy0 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ff64b454556935e7cf22e98e9145916aa70b8ef3 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYpZ zgRFxqSQm@+aBxd>uC;J05a9hO)q6DM_U8Z2x7Zn8ofrHx|DC87$X-uZKbLh*2~7Z- CurD6~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ac62c78e262ad200b713181ff4cf37a9a1e18d GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Eh!3HGR7M(u=q&)HpLXsJnm_R~=03%QV4-oSr zD>VN9|38$^SlexR5Xe^aba4!kxSX7mk&yrfNexU=#;;z#?)AKM)Wcnzi6O$5<@K@$ RZ!$m{Jzf1=);T3K0RYw5AnpJF literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f292424787a395cef50f442604de50c35c88a3c4 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Eh!3HGR7M(u=q&)HpLXsJnm_R~=03%QV4-oSr zE0jWT7`+rG!~(gBo-U3d5|@*6GBOgtAgO`rmZ8LgGS7)ix+nJOu`u{wX1Odl(R?jP Nucxb@%Q~loCIGXZ8?OKW literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d51c67afa3cab680cd8286865dce61da5b8489 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Eh!3HGR7M(u=q&)HpLXsJnm_R~=03%QV4-oVE z8gG3HQVgPv|Ns9FW>mh*IR43W5;Y;f<_mG3}l9v_|nhw3)N$X(|y9c*Q| W+R7HRSV%V-WP+!wpUXO@geCycb}04$ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..10b0432ba9bf7a138d5fc26ecc39ffa3ca650795 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Eh!3HGR7M(u=q&)HpLXsJnm_R~=03%QV4-oVE z8gG3HQVgP{pfr$T+?O3D3ZykXT^vIsE+?Da`*p=Uw)ef5Ftf;ozJm#SzOK|~W^NXF ic}rSKYTm_ztqdx?9I2CjcfA8@V(@hJb6Mw<&;$TDODK^5 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..963299580329b75bcf5941918f9344f4ab28a90a GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Eh!3HGR7M(u=q&)HpLXsJnm_R~=03%QV4-oUt zG~W6Yq!>gS|Ns9V%4am=VmJyE*79_543W5;YbP0l+XkKojENk literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0837e7d2db710167193491de326ca15c43787d8d GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Eh!3HGR7M(u=q&)HpLXsJnm_R~=03%QV4-oUt zG~W6Yq!>g?L1`ex$hdH2B#_qfba4!kxSVWu?^j9ME~)!sYHS({WSb9GyuLh>hleL< jNp^llMui)@I1@v4C&%@`74j>9x)?lN{an^LB{Ts5Vq_-Y literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0a71f49f9251c75505ce572a96fcfdae891dccc1 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYr6ai(`n#@nn;GzrNTr^D+uE_cETFVdQ&MBb@0N*n!>i_@% literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9da38a326a0e3a4695565d064b7be2d0458f4b2a GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjA$bKM$qYRdWc*)4Lj#!)Vry=3uwYnDh^MwKluQ-->MeHHE#k%h7(M%42cH)0{5N|R_x^0X zKfT;RPwis476^XzU24&@>*dOzfa}W|FFm=Y@jStT;YI7oy;@827?dQQiEqB&DfB6w zw`I1y$xe1Fg=go31Oz59Z29Rp#Zzw~)1lI=8g?1i&YP=OD5%IXu6^+_IAK?W&b~GQ zxul-ASO4p&evZ2L`j_|qYVX`rua{*8^?W>DwDS*}Oi#<4H5?f(>*q6Vep~i?L)6-+ z_fPcaC;F*P)<005TBX0ouCu}DnSX<1!Tz}QcmHUMCg(KlG}w3g-#07v6N)Q%?8^`A zd2Ll*bmxM#IHzS-4a3cXo}2zB7}D|{XY4&MyUQnqO<2Nq&z2;PSym0RU+7h9o;}{x z;CA*uH_P=32H}URW88T&PRyLp@<3|2!XKN+J=@N&X=(mlZp=_6&Zx~Ep%C*pMXH{U zfv4O#R#`md`JOAkEw6=b$+l^jwcIy);p1cb<5YOw)%Mgga~^uiAmi{>;by7zOu6kh z*iZesWqR(%tmP|f+omz^h&}H={TV~;s`parKSNxs*d3(f`2=Gghs^6SaExFOIy|}d zx`k}({FQ7D-|8~|H7*yfy?#3M&tw6%zzb53r<&AnznN24r4n=f^X77E)`i=@sXs~l z(^JoW^7{ex2gV-+e@u9NS~C6S^Ka^p=Y4w0Si!RGfcyjV58M&Vvt!~LTo&-JS{P>{ z@`?XeO#PYO>B?s81zZm}-fTV@o%kzmmR_-gfs~f>1-~oD@0_^u;xFF=6E41+``s_T zE;W*4m~hilE7|+5-`5(TCI>gC&bGZL7z59@tWorM#x`@x--mZT3w-(I+0>C`o8ZR4 zH)x@`K;lHM1uN^kTU3js!b;kZhCDshj6GF;o{AV)CsMw?& TrM?}QxEVZM{an^LB{Ts5?hI;l literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__dialog_full_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a473b2ec39d3caf4da5d45adf6b9d8bd2f5fdb GIT binary patch literal 943 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pD!3HE5C;ztuQXzQ-A;}C(Oq@VA3~&G$$QUFJ zG9(O2%K>RdLio1*gLVc6W-(6}$B>MBZ)e+XdSt+Je5uNY^~q|c%O9xSNs8b5_1v}S z+~0WzeQTJbywYCWn118dF*et2huy_KwVg1Y*TOIO#zA{0h%te3@pWS^d3B1&e9;saOTyne=9${-!xZOtXqDba=+5t7lEpql;o&c`|C6Q@9?zS^*g3Rd`ZxX5A5;A+xwb6^mvv%`mlc1LeYO6 z*L6hx?YMr$rvAx&DV7tFm##dpci0iPtuSyStdtQ?6^69ba{Lqv0DD+`;w&Q{RXE)|BEZnllR<8fu zMEhq`_onT?Z*4Js>5eH3q5L)63~$SJ|BcX_{$68M!Qtr>j^8QXzUTYA^Se^)uRII8 zIBVI$yLsOk3u6P^TLNaZcHCIm_Tg{u*Zc?Gp$m4OS+>?XL;C)IrUMhd`rnUc*x-`V zYk1{3<63iv|9e_LbM0R+p;Zd}wF-Emrbi;3YmnZpmB zIu$U+crnauiu(A_%<$9Gs6$g8ey*8c?Zkce*98sfM^9faw6f~SiR(G-zBeZ2+O>Ge z+?$p^ugvQ)6lqmZVsa^w+a&r?H+zopr0F6qWSO5S3 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7290c5c8e26e2f95a58e7169e88dbea0dcc584a7 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V}MVHE0F#_pdj|X638*yB|&~b znvH{tnNc9GCWXnbt6f*BJ~p~ey}83Ht+RyNtgXe!!Z1T4M%rILpQZ4$T>(&Av!{z= zh{WaC{_8?b1_G|dp-loDt^zt=7Jd3Je?n^l%Xihu#?_~d+?Zz_{+Pm;BUx}G{dg#Y zz=s-1hn)I8gGq+A0S}ZW2QVI+7`J&&$*HFM@A}ns*GMwCMqaIIbWmP>jX~vQnUK-j z|GtJZHpUycE!F$B`roI`-@|Gx-#y+jdE(;p^BMVN*qp^aOf&;Jhr!d;&t;ucLK6Tm CB-M5R literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_ab_back_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_ab_back_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7d944d3a304cd9968dc8736085267f2c812b6dd1 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}a)3{WE0Cr&NXsa>2ed=6B*-tA zfrXWgiOb2$hEYE_P+Gvp!kk~iKS;;Uja^Yr*4IGB`M^=f8ld82PZ!4!iOb0e4NPuo zX<}?D2TmP3*Qj#f%7ctIJV=8U+FIsS{kTDI8T+ z>RrO1qtLvlSvZti%=zM4R!bkTqlpfJmU)4dBE^xS0XFSVY8fKqS(YvMCGrB~e@|CG Jmvv4FO#qazJvjgX literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3382680c42384cd44847b4ad92351200c4dd58c3 GIT binary patch literal 554 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 AGXMYp literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..37510ea06e9d60b4e548e04c4605b292e97d4adb GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|+#&z^EDE6XFWw{{R1f_UzfUwY8r= zf4+9@+Qo|(KYjXCQ&ZF1+gnsr1eAq<*RNl{eEAZ{o;Gb-US8guIdi5=nF8eAx^?T< zuV2@%Ux!G|nl-Dvy}hliZPKJk#l^)yH4h#<`10k;ojZ4c8i67cCQJY_UcGwN-`_uV z>QtaOknHR00~+q?>U!_qy~&d&-@SYH_U+q1!P3&w`uh5wo*oAWhx_;MH#RmF6chkS zps{6TWk5FrZMk{#CXg|6=1ic2r%#^_^a4;9(0rgRKr4Xe0Bvk&XaGt*dh`g$2D)>{ zjva1pZa@*B6+qkP&6@`leDmhbrcIloqoZwYZGiy-)ChFj+_`gYY;0DnSaIh$YZ)-G zl1qa8f`K$65Q7LN4o+59W(G!G18z13HZFZVMn5|& zG-cp&E_Kn1bqC7pn(DDJuXaT#Yi(`ny z<y3VWdTn{`)m5!;KKn@bdt9`C@M3{P*DpgJWk2P` zMQ1J+daYPuKXKL)&AH1m-3=d~UuAjfMCD$GZg0k;o9188R?4&rU(2Iz?!EI*RNdT7 z2iWF35D5^N9esNdLj}k7j=+r}dT&p}E_kF?;T9D7wsX$C<<0MRw!4?C@q01lT*yQv zM%(G)Y}YD!^-90Ix^+>yu-d(Fcl57$uNwJzJ$>(eTIjjyOU&G_dgQu4VMw~kKf1*3UyCcKbLh*2~7Zw4q|%% literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b5fbd1df5dff25b91373a01fb9c9a11b62099076 GIT binary patch literal 552 zcmV+@0@wYCP)3ri1V8~ck`trF ztDmpMUwIePwb^pxU}6vAEZ_OWFz*jg5L=Q);dz#Y7c{mcLD7!NM-s#Z*i2?vx$Ip~ zUwY@tGZ{9LU_uo8q7cM45Os~#v#fpic#+1^g56uqQPu}~4X9IaRLW}B?iLrAZdf!+ z^LDqAqja<*)V#v+m0R{|b8~YQF((JOyqcj83%x0000QX1e3?6UE|6_*ZqCQY zckkXkAX{Eu{_o$vzkdCiJbAL4o12o75>QZGUH#|JpFoR%;!~$i1&WxNnW?I(0=Ymz zh&a#|S65d-K|!G4zkmNAfqmq^zy2IXOAe6aZ}p+9ED4 z4kY{g`{A-cV}T|B9W#6OY;JDu^z`(AfB>Ms;0l1Uj~+eJ(9j4B4BWnbJ5W1Z3aIzx z%a@*>o8PK00Mmn)GIA54b)|0W8>lB@#M)9V1VDh zf8XEV-^$8r$-}_FZMb`H6gLx(@#g)zqNRY;w%t3TxEVHV+POW7!Fb)~O&hjv zjRa{}vvI?^t&tL3j0~&RuU)r#LzD*!H+m88H4A~WYqnl(*KdcwSkGh5G2^t@@gv$FDMBWtVc(S1D;qEn_!o4PzC zBrNoI5^wvGS+_Rry7H@Sm0Nt9TF%9}A(!t2-MSTaweM=p0;Z>Z=hnTOw<<3FnA#hz zU%%8#{MXECakghZobpXGc)6(W_qi8aoDcfUi`;Dd{KvVYbJc1qE1o^vBtL1@b7Nxz dzEeEx43p-$Mx{(z>jaEq22WQ%mvv4FO#o3=)tCSP literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2cc3573d629a0e3822189d5bdbd75fca1753b8 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`G-Uj%DxB}__|NoypeHust!Hyj} z^7He*eftJvKYaM``t|ETMtOPpg9i^l(qIKuRaHPKAiJTV0Z1M?bf~bfu%@Qw+O=yX zB_;Ro-#>8RKoJ<+y?Ym^VA7;XTwGjl-@XNk7Z(=;RbIJrW#PhwKsFGZIdkUMuV0mw zl|VL7dqF`#M@I)xS8Ho4P$ke|Kdr;B5V#O2b7SH%t)2)Jyv5b0`h+9;wMcIR&F zzyHM^l?y#j+1%TlUY;hlaDUT!fg6GB4E}TVwjV#8#4z7pfmQKHg5;rz89c`YjdhzR zd92c$<0i>HZQ`V}f}y9yyOzo?+v20;vfj(|LB?LkE6XlE%G`bV?N|0kZwgX+TK7(V znRD*lQaLg2JyFrNGwQzb-g~#^<(Zt{%yye@X7DfHT;dqMjJ@hnS-nksP5QEXN&C(A b3w&YRds=XsX0L|@(De+Su6{1-oD!M<)bJmm literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4e7462879d0626e8005951657c42d241c7fb6c GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyYymzYuK&RxwB~CLP=u)@$S;_o zVYarP1du1;>Eak-aXL9cqNqWTr)^i$#R3W5c0~q;M-Lcs_h}!!1XRP|>FVdQ&MBb@ E0F_fAbpQYW literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5ea4fd0d13315a7fddf9062a507def90994701 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoB=)|uK)l4HwJ^LW@0OVg3KjB ze!&cB3@0yg{0DO7JY5_^EKVmUNE9^)^0e(@QZrcKaxlY!XL*6d5(Wm>_Y8BnYg}1? PDj7Uo{an^LB{Ts50?i;q literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..00e499c846d8c2ee883dc9e5361e300acce2b3c7 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy(*k@#T>lSBaE5#FYoH5_N`m}? z8RRD&S{1~%?Tr7Xoa5$GHK#9Yl5O)a%?jaBt50GVt~j+XjCK9dJi&A>?Nq%uFDc)( z^6?8|fV#JPx;TbdoW45grcjdskE?d~m99`1M;AfSJJWysw@*(klv$pcRr1s>*H~`5&W~UGj`(vX@n2IPEUtMF(&X}?;7IevM{z5TK5XgMOb)d1-gm-g zYIo|kQ`cv&{gyUm^(xoQt<7Z#>8V&}l#y?axb# z1F=ei{DK)6#PcRK*m8Hyv~CTYs#zdkSd%E0YNp|D&nX-4#mW~oz0Z-Qc}g&^FS~+| zlADEyanoA$C;x%k4|%#chFF}wdMR4CF+hOfL72F#r;3--!U?Z`{kK1N@#q|%+cQ6= z#ebhYcdzED{VXPnmS^o^bZFXlvVtcgVbA9?iwH)1H@GnevaV zv22jnIkaAL+QiLK$7iSPzFptddBDHos>$W1fDAX5yqn>7X1KAGG4eSytvWQ3rIdg9 z9EO6vIo{Vr4#@@WYk&QAUUSOiYtCidU%zLc`oHjx#$u)$zb4<@{LeFo`H)-y(*`z| g1uP&KQdz_JAXGS2cj2c@pl=vFUHx3vIVCg!0Eecb2><{9 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_search.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..96e393c719d6e1891ffd981885d2bac71387aeda GIT binary patch literal 1287 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 Q#sB~S07*qoM6N<$g2MB%fdBvi literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b65cd75acf433eebdd9eca0d7cfa1ab80437bba3 GIT binary patch literal 604 zcmV-i0;BzjP)$@ zy=zlp7{$-?CO65=hq0Oj+pDcYORJ!0!Noyb6dXhcg)aU9rGD)*O1cme@oK!{eV z8usAc#b3S}?#=6-Y(2SX6qQk_g@$r719{U<03qNe0N|xMQF}kKe0FrUT9R`5$?)9L zRPOb;rTNN1(+pMGuB{@MiaEE(OGm@MB89qR?B1v2kIIF$%3yb^hysX8ngcIJuf3V# z^;av0xNkK{Y<3k90FefxbU4JmXJ@YHcPHs^kbR8!X-d0SA$mOzFMXV3%F8h>TcPz( z@$kK|dD&#ETb;CwKv8Hh3Iok3<1V!ol-a%t0i($2R57}3)vd6XsPE9REv!kMKHWs` qgLtkOqs=&zOweZRvm$0XTK@nMv+?9Upo`T20000FM}g|aJY5_^IIbtB%&2_E!z^~-NCWc)XC?+WNhaIw6~$>FD?MHPT-G@y GGywpGWh+zw literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_divider_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a57e66ac2c090e8ce326747fd715549ecf0de28e GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>le~hEWCkWCkOUzBQ^TnC|Ns9Y oz2bd94cwkCjv*Y^lYgvdV_;HeRFix#H4$Wvr>mdKI;Vst0L=jt+yDRo literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_divider_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..75bd2d7dc5f17d84a4a5a3083666e031eede4d18 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>le~hEWCkWCkOUzBQ^P0)RCyv- mXe*H7_H=O!;kcfhFac#K2W`wr;B3<$Ms~Bd%vzsXXH*uI>7isk&(gjDU+JQOC4vBm7cDCF6*2U FngCUOD(nCN literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..92030f2622fd91ee1045fd4a37aaf8a65f014397 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJj@(Mzd8JL(jfoyz$2`I?|#9;ai z!^|^;@X|>FM}g|aJY5_^IIbtB%&2_E!z^~-NCWc)XC?+WNhaIw6~$>FD?MHPT-G@y GGywpGWh+zw literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d6717c1f5a52493f99d458d68e6a0a47d7b1ff53 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJj@(Mzd8JL(jfoyz$2`I?|#9(@+ z@z$q=@R!y9)&bRvdAc};a9mF|x%aC?jalr#kp|`q&P)ucwoFBaqW>3ytn_sCb6Mw< G&;$TWWG?{# literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d6717c1f5a52493f99d458d68e6a0a47d7b1ff53 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJj@(Mzd8JL(jfoyz$2`I?|#9(@+ z@z$q=@R!y9)&bRvdAc};a9mF|x%aC?jalr#kp|`q&P)ucwoFBaqW>3ytn_sCb6Mw< G&;$TWWG?{# literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9428f21a12df4ee850794fa284100a2652efc4b7 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp@K&;8Z1|;8ITO0$VLh=eik{OtoIDu?@fE_5w0mQ;U zEYbiZKo|%Z8-N4|0|5$K(P@JgP)ya+#WBR=_}kMP1sN207!*rB`Mk4izUF`aP(|@J g{-r@HL$s!P?YL#kcwq|fSr(8fp00i_>zopr07eEQCjbBd literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..80cd8e6171f7d64c46eb68a7f5d681b9b16a7876 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp@K&;8Z1|;8ITO0$VLh=eik{OtoIDu?@fE_5w0mQ;U zEFupiKo|%Zaj{=|Uo{5Gt9iOOhIkx*d)knZK|z2)am$JC{wpO*?8?NB&E8zAG1Y5n c(8`cQtZT{`3wAE`bpsjc>FVdQ&MBb@0J5YZCjbBd literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..99cf362c5dd0bfe72360d5bfa491562d8ad1b324 GIT binary patch literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQXzQ-A;}C(Oq@VA3~&G$$QUFJ zGQu$U8sPXWc9b&J7`P_NE=PzdFYVDdE9gOh z2Uh`;j|XEAEAQPI)de2{nYK91s5W^cyiRP-1ST8Ko$Yt_yND{B)JWVde*`asJ5>9G6!v~$S#VyW#$O`sEQjvZ2FU{) z3-WJ&n|t%*oTLR?zqh!CHU^$!EK5=7V~Ate6Ij3G=UxLbP0w1E3yeD$G8k(Ze=OLy z^yj?!+*i8(?EIp?WvYouxoXoY7tRl__c8ro{GjV_e&c5b^%+}uYL54~PJJME@S>Ib zw@-B|OBb3%C>_XGl)c)}ouuRA^k63!o6^F?*Vd~x*tcx9+F(Ba)yoY&4<}x;y-;z< z?seKhn~*btQEI@(jLv`1IAO3e3E?wMs V@zq}W9l&U2@O1TaS?83{1OU!k@Q45a literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..506368734772fd2a01a2fe4e24710633bdae13ae GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQXzQ-A;}C(Oq@VA3~&G$$QUFJ zGQgA`}fFv5c?e8b!G+zCKFE=$B>MBZzH{n4lD3XHF&#j_Z*e<6SY;- z?x?3f;JcTu*6n9j>TtI~_w=Fpp^eidc?}KcRr<@TFn+NA_wB%1@pI2VKeXL%(_wG% zyiZubvH!oK(zO+_N{><|xUoHJFut&JX9@R=vpqeMf;*V()Kw=RaMX8EKIoO5@W40C z&5=Ru$!D2@3C2ol-Uqhu@BGI4!&LLE(2i%!%x`ag-XZ6y@cd2+qt3ZPpw=y~_0j0df;=Dmpju zYz@cbKSHKk&X=@#DJd9iaQ>qkn|M*@Ld=2guX=Sp)26Aq{!-96XlxWBzG3p|z*Q4E zN_`vzf|P#f3N@)Tu>OsVmbn?*(3n~*V*J4S4HtWBPvFLr|Ce&BXgi3pr^IOd%u9Id zm++-_-CtIYYjW(YI%!(RE`6#E3QCx@Aw926g>y}DkkW&@Ejf4j|1s>}9C(58Yr=J4 PI%4p2^>bP0l+XkKN`Dc8 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..efe935f2893abb8864287249ad534b181c78e9b2 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3HD^x83^;qyq8^LXsJnSU^IA025RJh~@)g z0VEBKKsE@2L8HiOO&~+c)5S4F;&O7r0``PI|Nrk7*~B2ci%YHTAR`0UKW5q7&CE?8 N<({s7F6*2UngE6J8L9vP literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_bg_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8672828a7f0724bdcf1252519b4b0c3d5b70eef6 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3HD^x83^;qyq8^LXsJnSU^IA025RJh~@)g z0VEBKKsE@2L8HiOO&~+c)5S4F;&O7r0``QIgoF>SVhK*+2agz7Fff?DVhBF;>*+_3 Na!*%3mvv4FO#pQ+8gc*t literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..333dda5af58b6894752fdf70cec603d9cf6f03a5 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jsertKkYolX7LX7jzywtQqWOSW z07(NQkPX6M&?vH66UgoHba4!^IQ=%nHb2-=V9w3G)=A1PPIC@1eH88FQe0xvp=W>S zKW81&AC{^rsTD!Ni#Vn*6a_r8_*ngI_wA*X6O$@9H8qScW%%#ju73B<8^-Gy2Uq8p z9$?(Vx}D)p6;q9b{HMUY8S;7;ZvTB*namr{H#xcF{Lk>u(gOMozwhr03cqHV^6cb4 zA2DfdiDyx1vr+@yd*haHO=wv#Gm@pxV;1|B$5~POvNjcOYyQ+M>YdwBab-eRgz~{I z_C|K)#g&|1oo@XlE)6F;H9oLhcu=-x!uvZ_`?oVYLdm)M(ba;gV@%Ve6za!+2Nq z5`#lJO|u@%yJamivmigRi|gCUJKxUAZvFIS!Ivj$isvFtr#tTVFcj4fG0)I&E!wk? zD=S&7sk>{zjGra9uD^V0CujK~@8;*`{sRd-=T-+_;}S zKW81&AC{^rsTD!Ni#Vn*6a_r8_*ngI_wA*X6O$@9H8qScW%%#ju73B<8^-Gy2Uq8p z9$?(Vx}D)p6;q9b{HMUY8S;7;ZvTB*namr{H#xcF{Lk>u(gOMozwhr03cqHV^6cb4 zA2DfdiDyx1vr+@yd*haHO=wv#Gm@pxV;1|B$5~POvNjcOYyQ+M>YdwBab-eRgz~{I z_C|K)#g&|1oo@XlE)6F;H9oLhcu=-x!uvZ_`?oVYLdm)M(ba;gV@%Ve6za!+2Nq z5`#lJO|u@%yJamivmigRi|gCUJKxUAZvFIS!Ivj$isvFtr#tTVFcj4fG0)I&E!wk? zD=S&7sk>{zjGra9uD^V0CujK~@8;*`{sRd-=T-+_;}%xd!LSoM>cTAvI-x5z`&5yz$EumbmIn) Na!*%3mvv4FO#p448Djtd literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..29ffde6ac9e1661ce63dc61a2d7b54f8bf508de1 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3HD^x83^;qyq8^LXsJnSU^IA025RJh~@)g z0VEBKKsE@2L8HiOO&~+c)5S4F;&O7r0`>%xd!LSoM>cTAvI-x5z`&5yz$EumbmIn) Na!*%3mvv4FO#p448Djtd literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_48_inner_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1dc7f59b890431c8b7c2f59c347cdc2af307a9 GIT binary patch literal 1102 zcmV-U1hM;xP)9(E6vzMnJD;6)+D>bzwMM@BMNtuufS8H`22DteF~)^);nJ0fQAABlOo&@uxO8P= zVgfESL=#L=`~npy6^BA;3IbxOWjdWsJDr)%`MW3(K3<2J=gx4Gm%Mx5edl-2x#ym9 z4{)db?;9(bG)F{Pk2q^ig!ce><}k@Ay;r9b< z=VrD5Eb;&jzHy5dftv?14jZw70T`0l%dr}j^N~J1c^PNf%mf2ypk;<=7-aFoA2~hU=~0SF>k=U z<#N8ogT{I7qn;)*8VvrI54-{=2X}+-U$4P@UW)h!e9S9WD0px3lpv_#Px>Z=SWB?P z8E?RZN(O6E)VCMKTs^@&Gv0ud%?L_Z!uKXGVx0psobm=_G$vS7%Z7c4|HQd21_^h8 zId4EwrzKH6s`a)0CN6j298bS2Prx#0$kKwfXvN8@H~Le@Rjz^HD9JqJ_6Z%f6 zwPn)J7gVcl(NZ~?epBBIg^I3@$Lsa9y5vk6*Dp4x>GdA7_EK>@sCCvLsHCIndw#a! z%kMy~Hfgnm1eJ8jk~X3V%lBT8mq^qmIaUwFa& UnB_O6Gynhq07*qoM6N<$f}0@%`Tzg` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_48_outer_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_48_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..0b113bf9369cb5a8f4b1dcbbb879582c4934864c GIT binary patch literal 1527 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U~&ua32_B-|Br&v5TGmsZpM6m z224qZN`m}?85kIqQo~&}`I%UlL;wB#^5k%jGY31{pI<+}zupLsR?%rx; z)gyN{W9 z1X^0=x~j_hsktq1-cj=P3olP^PmiyUYr%?e6XWL>#GbkoZS8BFuypFy-nBMiU%AT4 z(r(3M%)27EZThrrg#t$()w#N>Tj%=qI3$*o6_%Qo9R9$*c*X8^Yxc1BJFBZIE3+4N z7g_!MajP)-`<(gv8+;kqXR#JFHaae{Q0g?aaIu}j9y;mvbxR-d^d&{D?k+Biq818> zimqt3c3YgB^!QO=(-miZD@OlS5B+$2z1;W&*R2q-t*pt^F;&sME7Pfee%{2Bt^UpK z(>%?rh2pOtQsT+K6@KdES#Q@z)=$Mn9{K+8aXotUm&cz4lZ4{`NG{#7W{phe>(xu2 zHpe$RyRvR-Q%Frs-{Y6WvwqDQr$_1`;hP_S-4fxuO<~h=%dBSak`I|1iUrrKc7N2Z zWzJIk;Br9F^&3}u=IqdoYFYfDqG{#UwR@RWKeBUf4()z$?Lo$b(Dq3`BwVa^?=SyR|pdf4=2Es}9e+ zZ%3Y5fAhP&Ilunmu|DRlX)YnfF*1oidD(ZjY&AN&!)-Q40t3V1`u;_e$~3ir`HsQU L)z4*}Q$iB}gFEo- literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6c63dd4bf97e35d762f6b729215dd7f561d9e379 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3G!3JVY@8||nA$bKM$qYiQxl`2Kt6AKm~Q4E{-7{$KPHtoY2UmK3&EA=($_KEVz9j+*34|xwzB(xdI{64ANTe)rX7?r zk-WCZvw&+=TX3N0oaTFncD_*k!=n06H<0-PWA%*HVF$7wN=8iK|8gMh^$&H~CAW3` T_bXT@ft>2;>gTe~DWM4fa3D&O literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3928d0d018f83ea08582ad528b2fe3199f265e4c GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3G!3JVY@8||nA$bKM$qYiQxl`2Kt6AKn2~NE{-7{$KPHt|k5Ks`vDs=7R4w>7qLv z(hppJ{!aRZfR5wtM9o{Q-xnn95EnhD{6f#B%j}`D#@FnXyBLKxJj?vbVy3x=f&U?^ f`GeH@U-Q4P&5@VL2{Yli3UarntDnm{r-UW|ZnsMG literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f7219e891cdf75916fa95513d91846e934ba9ca1 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3G!3JVY@8||nA$bKM$qYiQxl`2Kt6AKn3NVE{-7{$KPHy{W^^2KkvCEJkiZXZ+8F#uLJ*iQxl`2Kt6AKn3NVE{-7{$KPHyQD}^g%~op_AZ`7Qb@8AIxW)Ojk%=TcmcQ zX;q^3s;1%#;TGbxE&CTN$)91uAiF_xj_8f8A9!?5F_%AOjN_GUO%eF;S8L%XkQ+T+ L{an^LB{Ts5lcYqw literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e4de3f63b1514743b2538ba177a4c8a85fe291b0 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3G!3JVY@8||nA$bKM$qYe=Ptt{=d zY6jOML9Hu{_ol7nZ(!+fkVs5e%FC%@$Sl5+Icv_9sS-tE-qXImJazc0;q-ES?gYLk zM@~vbbS>gr!LVOB>&mQdzbMB3s&|ukb}$uP6y=DCehH18`E$$U9rb&A?+E**d z&AA;WmS<|~_sY}6V*A=V&)#p&3_Bb2c(TR^{i<1YaViRd|0;yH)-Py&Ah5+;rt4eN z?*#`7;!QZ@n#vA22j2Mf17JbCbXzZUf8bgho`T`JFawQ{fp1rolmvixbu;Ji^%Nb+zzh~ zH)h!GV3Xpz?sE76TZZW!0oEUX3%;q{i7|2d-;rZ%uwH2iLpRG8GJylIc`mz+atBF)O1=BTFb>MW5uu!-Z3+x5b&JSR4t z=-nR>Ayzq$`xWo*MR6PWU-A52?=@QxTJtxnuyeaUH)-DJL4@0oS&X6~vd-2eQS zCRBH{q!lbLUvSrUmZ+9u*-i6iZ_)Sv`|kN3C}k~}QYc>VE;T#zM^B`1Hqd7bp00i_ I>zopr088h62mk;8 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bce0e08eab239760944b86a62d90a0afb2b46e87 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-R!3HER>*_fHDT};bP0l+XkKG^8S+ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dd022de2f08dd0066f5f4c89eb21a6a643e26e1b GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-R!3HER>*_fHDT};@X8|(W)78&qol`;+ E0O*YzJOBUy literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2852fb5de733831733ba3a7ccc6a2cb60d80fa00 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-R!3HER>*_fHDT};cXBtTEWxBF@)oKvdO()TN**2laVVzLPBCoLQeo25HJL$Gu@D2PuvBvz|+;w JWt~$(69Awh8(9DV literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5c80139d03237ba3c01208d56ecde1bac0085b GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aV9(e^J$qYEal|aXtCZ|Nr*Ph7FyK77x7FI4$x`Nk~jc_@L^h$S}o= Vd2!Hvl~o{vJYD@<);T3K0RWZr99aMW literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6136c084870e7166d0924f0780687b8de7bc27c0 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aV9(e^J$qYEal|aXmR@wX7Lxz~ literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..878225d3f1b89a82972ce99193364010b0d80e7e GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aV9(e^J$qYEal|aXmR@MrB*0!~v(4S^s%}z=y|$No)q6Q$vO@<2yIz U!iAkDPlHVIboFyt=akR{07)qtAOHXW literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..878225d3f1b89a82972ce99193364010b0d80e7e GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aV9(e^J$qYEal|aXmR@MrB*0!~v(4S^s%}z=y|$No)q6Q$vO@<2yIz U!iAkDPlHVIboFyt=akR{07)qtAOHXW literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..62238874579355cf93d46a82dd8acb25e2c1dd57 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aV9(e^J$qY#XF8_zumT`BU`H l+7FKy*YB1ED#Z&pG8xOc7>~yUXFLF@^K|udS?83{1OUh%Dh>bu literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc7d87f604f6428031ad029367e9d2afb33d022 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0V@b lc8kW@JSg4H3{;C3DC)lFWlAu5k=_kb=IQF^vd$@?2>@Q3Fn<65 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cbc621b17040bbb088f55828758ed22724dac3 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0sK(3F#W5t~-rI|eoD2p$EF1IAIRBl!a&72w=W~ubjE(m< l?G}x*c~H8Y8K@R7P}B{7$^7G6$)`0SWuC5nF6*2UngGCDIS~K= literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f395cbde0cbe868d7033ca1f10dff0c300f0e0cf GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0F0~iK4W7S{$ZGVU+3K9 zr;+?Kwn<@{02le8H(6!&d@tc&wN8C`4W}8|^$mDhc6Tqn3{v6g>gTe~DWM4f<>@Pm literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6e6b999bd9a4fe07b5df7fe48ee915e2b5946b16 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0!+rq7lgH? x+bq}>&5UURT;zL@r_s-qCJUbn7nLyA@L6!DakhU|G&cq*@O1TaS?83{1OU`*CprKC literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..61b971e1899b136a36e1b04d051790c6a1242bb3 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^20(1V!3HFE2UfoVQYCo>A;}CZO#DDL3~&G$Aj|{B zAaRhq01ztxu_6%50I@6(GvdHNVK~65=3M6H=|B}Ro-U3d8Ta1aILLWGfyW^*_|CDv z?k{Z$866k42h{wR>EXAzIZMU!(%z$a3dZg)S(WekvxhMGmD$(VJHahLVwf}iIvMa) ee7B0{q-(y%M0t0_c`&DgA;}CZO#DDL3~&G$Aj|{B zAaRhq01ztxu_6%50I@6(GvdHNVK~65=3M6H=|C01o-U3d8TZ~^y2#5Qz~gXGs9ExE zhTDZB?2qo12kT|FsCZu5KlO-@{h#9-cRx@`_*qu_w*_u65~Ge~%aa&>&q*q=*I9yp VFfnvb78e0Yd%F6$taD0e0sxNRFGTLec+${p6gFRgwLo)8Yy||H+!H|c=@#YTMukkaPT>raD@HE}z y%G)t@W<1ZkkgHGrZcMHKs>cWPt?#~NZ0N3AVaLA3-tL$xNUf);45$d literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..27d6c8b9428ef2d4efba75e10f0fe1e89be7082d GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0>#6UE^W9I@O9qj4i7?N@C?ZrS&216c~gIlibKQ`k;`VQeh4VGt` zHxk3s>I`>WzB~E*@xF&3Gx2~uZ$hTBGwA(dJkiN{^Yg`Z>p*HfUHx3vIVCg!002id A^Z)<= literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..58263065480266d1cc6bf4213d54aa74efa2b1d7 GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzkGz7AWCkWCkPtq=1C-^<^k8&5b$3b`)& z+1RFLxa~H}od&1H9tT8s@MQDul*s;kHL&3~$ANc&4bQLbzj4TiQEuw&SR-TC z{{5E7aJgoc$1(T94j(!8T@33D1ehJ3z2sTTb@~6Ble+y1-0!aQy!AHadLL{%m6tbj?An|a!&BuwuR%5eO=HEspdgec<)es3F3-;s>1w12^`uOZ*rSj^-x pX%~yE1N#NW5{BIMNe$Dkf0XVLbZLJsa&{xgf1a*>F6*2UngBw+YmWc` literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3e722238575402fad5e52c9a51d823fa1fc3612f GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0F(wc?hyB*we)^B;(%Oi-DXBhCD6@w_I`iBYh@+hj5?<%QMXz yiQ#E=hC6~oCx1WQ_Yhvwf4z?)Ox!5xvXbP0l+XkKpj9*8 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..140518f829c157313e7b8bae876b2f95e7e42a7d GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0gm=n?4-n{&&@vO)*9`#%k5oqqVVe kKvnp_0q=&$Tz0;1%zV=s<|p43dIVDJ>FVdQ&MBb@09x83t^fc4 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3069943fc311d75b0152c27789e25f5e626737b0 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}kN`?b0J;+wlHwG9z1_+_1%cy(^8~wG;^{)+QW8& zB`>6Weq>DP_cslzR8C%*Q+S|czYag#JPbxcc6xUQqqm+%>rrk MboFyt=akR{0G*LEX8-^I literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe74064dcac0e161bb9bbe301cf4373ed495978 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0$!3HFm<|{7*QXY8)A;}C(OdugbfDx!b0*ED% z6{`LJ{~yX{oNc3+17xdvx;TbtoKMcl$Vg~lRAW;yICb!NVq!uY-r?&At0-50H>gTe~DWM4f=Jg$( literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..df97212497fb3a86fee04af02e57fd00ee988d6d GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0$!3HFm<|{7*QXY8)A;}C(OdugbfDx!b0*EDj zjki7pDF)GM|NsAo@)`5XpQ`|cH9cJ%Lp07O8{GSKb% fy`0y}rtc}kaDtVyx$Eu!HjrVSu6{1-oD!McIa literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d3e1991936fd4b1e1eb4993d86bfdfca50924d GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0$!3HFm<|{7*QXY8)A;}C(OdugbfDx!b0*EDN z8gG3HQVgP{pfr$TEMBV(lDG17aSYKopKNmPSIM&XFK@o&0RkT$kAx}B{f86we0}M| u#>S=z!dR}p3KFVdQ&MBb@0I(`7Z2$lO literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..100d3166ae943b079a58d62c84cc0135a516c492 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtki3GBWCkWCP9Pf}5CTdH1FpbLj8-O>gNi6pZEhJt z%rCiL&#&BnNyjNCmL26M*PV5qbI#NIJfHXTdEe)G-@o3^^QO5vJHX}Cg_uAf{96CigzoZj z0Ax-bqa5+LIwACe#ORvAGHetV}+gBX!kSzLHIQ zs6q{nLw|LSaD0bxG&|OC{kky@#n>S8VE3ymsx>Iz>jS5&=Gk-K1d99|%#aROX(#zPOrTeJ zLj~$M(kY*@NC}Rkyfv=btxN5?=;15HVU4NHMCoh@g~EC>Gc(Nl)+BKjzwW_;?>FnF zq=9o06_$TqrvA9!shQ9}nBUZqK(Zo{#Es*TiA_yS>o?BI^T>C60tvDLqns3^~u1{MCLU4)CG&zrs0Aidpr+((`)Q#LeP_P`HZ2?pP4eF&;Qb}t+Ps0y= zCH01Y9zvHMAAr6G5bke-${AUz*kwy_8On|V#62hD^JSy|*}9&n<|P$;UeI?Ilxz&D zXF?dded-`ZX5TG%ECkHexHA)v@x+Mmf^9L}*3056km@b@bS;X8c8?P9hUt}B7OqB9)OL2aqn_D80D7(GlAHt1Ysc?9m;u%hoh3`2~5Y;)b;w%IX%o3f1OwYs(Xg z?HSxsRHd4*OhSCT!scSqbOF{5Tz^}((`HQeNH$&|xxOfy+XY7OUg^`_;Lba#sc*e= z2HGSeV8rM!b4Xn&x}YWcNRzWsOu*md=rc{VXn3f0dO$urcy^HY2~OTtFe!38jx}bY zH>oK9mf&O-GH+LSspEc>v-+p0P^+ZyR}i2o(AT-rGa`RWXHWCvUF99n9KFj26kbPi z0#vbQuhqI?IGCZ57wU8;9~>#9-N80OsB_4c%TtO(p&igoPnUhQpjf-ao*ye(0huQ2 zuWwRH)fjTi0HemMHuS2kvKG+vDcOabeq@oHDcNxC(}+AZ>fi;9E~Wc=(Ef?+MDaa3 zKJ4~pITAA5Q2Hf+&N!)0kz3ts`+az}QY+w2RZz*sFm+t&yw^6$KV(c!l+E$t15d$` q$KNETeaBkGeC3ioRy-OO!iGq_%v~j=`+?ujhj`4+nNnfn&-^##>T?eO literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b405843986db8be40d80e69d0ea88211fc95a34c GIT binary patch literal 2058 zcmai#eK-?(8^?be+8EhHMY5T-yfG@AbX!KkonTbT3ag4K+PA0Dy)& zg>+ECdWF2;8x)=TCyS(j?>U-pFn~f;75;yPRG7c(N3N~VzyC`|1tI@W{m$^y0Kn+( zB%&{~eHry8aI`Z$arhuSnhT>$PVKj2+{q>O`$C|~PsNuP^e3eoJV!!l@mD@! zZH6r_w=e1Rrr*{!9UEgY7!>#BoNxaG6%+e1p<}pp^-ax^LG-kC#{`$1SafpOiGL6sYZyW%O>%uYs`==9COFKQCDSfA;ziP z#xQMZUpn@)4#Xj?-Mzoz_0nyTnG3w$pe6A8j@2RzJ;S(ErGvHlVI(Hy+YQ{-No2W8 zztLt2(z4IhhK#N}vVcXHW&iTZak#Vd~jSKm3Gy@3*xsK0W zFJenfcL#P+id-QK?hw|=GRFkYBP7_VJcir6d(chrQ$A#EfotNMCf}TUVF-A{`i`$= zCb9nzdM~}4XWzVa3`Mi3dfn;4Lx~6OnO`?m1}!MOC;hjyIeJ@boaJvH%)Rp0s@~yE zXji{vzF9uFKN$zO*JksTz0Ar?x#Fcr)At@p&(i=o?mk&gqtoYCbIho0|1v+0?Lu{B z&B>*im7IzTTiOqi_(OH^%YBl*N9z}srbR-lR(l_0RD7CKsBT@;s@z;aJ&DrSn zDt~JZOh#NAfbQnRFc?dcm#LZ@_uJ9@@#(jjg#ie%7#+WM?$;`xo+p3wOiiAw_y!q; z$(B!b2iqmj4T?k}G-^w&xp9tY^|-xSkS&Yj3_qbNO_FbNz4XY)OsqZii@7Q$uGudW zT0FQXL5^8(++%sy4OgZl2q=x*ULIhBQz^fNH@^f3Yv$MPIV7>R?KAhXhQ``&NrOwN z;gu!Sfa1W|`0FDDK31?H1odnsw&XyY zdwT!J$}lbb*e3m{*F8`O3LO8o(G5sL%zJ=RjjD0-p!rOAfpFyXi0J94%wrJ%DK*_| znAdu!y}KynJru!3GRy?JTG{v(V*J6al6^rWz~w~z>zB3VjsR5s!rE+WY*NDly6)}G zoC7bs7r1%}Y6fT&7!@M+l=U$(E4cCQs;v<;Xn%FEvceTA;?fr|94)4$b z8lYWMI^?IZ({vg$kvjNb`f5M%!wc@4PYv}8XdM}B_IJH7Qr7I8yxc)Y=C)uv9p>e^ z_+xe@K-6S-`0B;|wvAC6tpJn#;k;VWE@nh8{KW%YS4S*QO=a-;{Bt|bv6g)7 zDMMcC!oFI8DVDV`{&uKsOggc$Jo{*KrfY>k%j(uic~`ceeXMr+%ooAR$G%+#&HSe| zHO1Lze3xQvz4rNYwpd#3`Ha(lqj1BOjH8yE{oRIanRG1EE!&_o38u+5Dsi1m6+F+U zgj)^e4-R}}6izty&~tnDDLca#Q#H{ALe}Ech0IBBhK%^_ zD307hihUF*jF^a}-9`4(*;S&I@JZB!VhQXBU2exK`NbO;3b)0$Tjc!<} zTZ>eV!Fy!@Kl<%Wgi?6ez-ss6y5@{ZR|K>y==3RvGrS9+yd*&frB}){ZIjey3@_bF z5FE&1GF!E4#m~^rV7_h<=r%^#4p6>+NqXASr}NU?qVbl$Q^@#)qZ3?H-Tks7Dlxi- z)5z{z1J)j|jwq)fqZ^mG2F@Ub48;yva`#mi8gZ^AyBlLdi4rS@At*8i7GK9h5EFZ6 zD%QSNQW|2Bk-dndE;fM?R9MntO?6!FT%EN7A1&5kJTuhp^=J!&AHUJv)sw_`4!ZOo Dvr?EF literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc1c660d1bd18d3cc51b93b55bac845f81a4303 GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX99deT!Hle;R38CJ>&p+uO!GX zn1O+jjg^@xp}wlRrc~IVt+Aogi8HUIE{Dsuy;YCDyvbKix;CPWSFPD1HO)x5AlOl~ zLd?#kvdEM@T_al7U(g|+TP^3q2cS8Eo-U3d7N=V$pA0)}z~ic{zLZNK=khf*m4NN3 zTms9C&L95&UwBjE!9zw-FJIi%n52_>GrpOpuJ=wyrRx*dz$eTMZt;>yJ9ll1YwTcR zGFuWXLtzdYojYs~ipsm(X0iZXNT zh_YIhaO4F`%yhXO4;i}d|BAm8TEqKwueYe@NA_9Dx0lIZc^sS+pm=n%XYVax{Yy&U zBNUHne>(ryd5@}?8pHe3M^3RmQr5{mzdfp6YD?OuquXzJKmBo7QF@8r`}>c3=lwSq X=o8f}oA;s_7}yM+u6{1-oD!Mz z-|BMTbuRx~B{>&KTo;z>zkE_u>+;spbN=a@e(juhw)k01phU@nEpK*4F)=L)eQR_3 zhy#1CK*hdBzP!s07aSOO2{UcK=g{~&=EqxRC4-CGlGbfg4q0wyQPO|GaocIv2b^31 z=}X)H%GnjJm}~LE;NXRJX4Qv!av_|Kg(b5*Z`%L;W_IE$tiJf3l5R_<)>Iob2F=BGbe zz?<>#=3*X+RJ#jH`CKpFPfA?I|LW2T!6oqm39E!w-&-rZC~{%c-SuKQ;TuHqBQ}Z8 zeU=s|%5`VU)@$3OXG*f~lv=01$&P`6Nx;*^F(l&f+i5qWFFS}FtyaJK%Hgp@Z^qOJ zubU~E8LLCO#aP8f%#Xyz1l;-iKi;-{QJ~$grDxwZ^FOPr^?E+%{>d|QYs{yg)>^&h zUtnP02k8?ImM%%`o0dM|6IlI+aU=6#QCS_CBzDF73lCRi?0BIy=~MrV#rHNo?mNR! z^P;vmspXQi%b&?ozk*dy%0>LkeDQUr;6cp^SNqu>%-5Z`VDf_U%#i7|#$iIAwa>_} z@A^5F;SZ-}{iLtKMgL4*r?29yi785bUlsmuXXK0L&xC(etlM?#@kDR#tryI@zpB_B z+;ed6wsO{+f6hw%==Q9s^S7#B$a%w#`C9wD$Sl=&_BX`!x86Se{g%_5 zgP-!ZwcFNa?@j-I^Qdl$#^Hl$9Y0*3-H&^F^#9c9vVRO_^ps7~?JhrXf5+|c|F`@y z?i$xsmfcEY_;2?mEqO10-JFI082B7pjdy%05dPyHU3*`Cc4A$htlZ?u%hfN;UVi@9 zlm90T4)dMwj5GNEbalx0>uD?U4?p}mdwbY_Jy!d38;lz_->9*F@{+&z%6Ct_@7GUIp3ih)aClmq(HwD#ZqyGQ@Ub6mzk1Fqmnv7W%@jK63rk6)VG=!`S`kT1%erdvi zaG|n@&}%|Zj3dI0XX>P1;=Um;Yv0bJ5lr_4Zd<a`=btrgS$A0Uq~|AY?|O0NaD{qBgJb!@ z?T4?`UwEAy;ZQgK$KebA+-+SYb@&Y}!aC&Jo*3uNn{(@05IZ09qw|LcwsUoBq!?&i~7 zn0>96yy}1dRonA`8jvq6S0Q(&9i@~O`ec`GCv3yklK5hH(DsoPAV{40!r1Mu6{1-oD!M< Dl6Uxz literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_disabled.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc02c525de97a0d03af8cefc769d30f9bebb9d9 GIT binary patch literal 1525 zcmVidMY72q_kN-CY*;GBf|hhuu~Iot-V{i~DUdFSBRP_n+_l|2gLenrNbl zCYt!agT#7I09at|c?E5FoljMN)z8>i?*Fu#wTh&`>U@TRU+W}9fz*xFMONU8oD9#_ z{X2_Z1?6qd;|uOc2znYSo_h)g!Q?G1o7--3zSn`V7WSX%M-yNRoO=^H7H+s|oqMP_ zW?xoG`=(f+;ezN8~zl^Go0HvPLo03Ee~S^Yz5#!l+ATI>qOXscMubub)W zkPCC#KiKkWy061^K>ToUd{6#x1qv!Uaao+bb;2AC*U%)FjM1cf4P5oLzF^lgaEQlS zo=mRjbR|g9{~^0=y5`mlTxIjMqcIDNoG`OTfUH9FQ-kS9Cf8 z)(?;8?iwFc2%)0GA2$LPfHm}xzs&S{j8N7gH#mn&r!6P|3IWzH_jmWVy8;OH!HKOi zXB2`s?qf<&rI58#x>GHw=7L-+RB$W=2M2k;+u7CM?n=-~`02!+vqP15tB+5hCd3Id ztX9(`b2y_(cM+uiMuTp4w{)yXRkc5!dwOQ5s=ba^yc#Jn3>;FjPckc$o&Z(mm)v9H z75jSEO({pfR@6xD?unv~8~nxy{Ds0YzN=$nMsl!nI8_RDx0i5WLvvvA`P`3TWA5Wi za6v9i=!{z8a>{8dZx;?Hq@oT^?k)`Z@wJ~Hftt-pdpNuuU0gCs7$vk6e4F2rI~u^$ z-}e`THt5{K!hnq8g?!crfrSOh`>*6qSdd1YHy(l6ibwnC+v&v#UOSK-zD6ECf7;Zl zr2V%D{8{h4U7dYxt^l+#hJdpKU&~A3NO(z^x`G5|S1%s%wshRu;Ruj(!LNlgCul_{4V(Z@-xcQo;0!5Rv_ z=$HG`18t4~ls!1TJvVAC1}oQ_YdvNuO*-qHL*;SXh!Cs+_v}7zXKJ9$6(GJkFtexd zRR9f>x8pjgdK^JHZRL0JiW*UM+t&sN%xV9yx21hmyDNZVFjCl_8}gx{pn;QSC|pfb z++mz{I#+|~VSS|{FsFT=d^vSnyTburj}$geol>=uV_<-@|rFNOi!B|Rea6TE1#^AvhWAJ^y~T7{WqN`o6iW@f-x`Wybtm+L4dd>(z4M zn7Wlp{9fLdA1aq3M-vkHhJrzCOE~Pk;I}YVw^Q9Y3?eNabpySphyW(4NRzsE9i&T8 zlGVyYf9N7BN@$wFPKL12R-{hDI(yqQd)&mkq#|=qTkn>L#O|3JY&0&*wuvU1XrhTG b{!9D;d)uhwLX`pP00000NkvXXu0mjfG+pcv literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2cf500ecca1b3b12f7892195e2bc84bb3e90d7 GIT binary patch literal 1219 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq3?#2LH-2JZU|bmB6XFWw{wD%_{`~pUrAu43 zY`J>%Dn$A9>(_zY3l}bY`t%7RGIi?I+S=MFQ>J|U_z@@qB&SWAR##UyY0{)~=gw`~ zw5g`1rlh2#qN1X|zaOYz!h{Kxm6bq|s;a7W>(-q;dv@Z)i9p%n;^N7ZC%<^{;@!J< zK&kTba-jNCr%v_s^Z;dN&z^k^4CcH?Yr)G~eg^lxA=W5$fKva-IuKA=;9 zPP%;g@~vC9fNp?T1T+@tDxgI-ZrteZ?w&t?{`&RnfreC9S2r{?01YWEEd}}%=xm^w zg@uJcADujT5@^E0g$sdFKwkr$1at<_FF?lwjRo4ZX3ZL)3!grHI&0Rfd-v`=e*F0M z?b|nR-u(LY>-qENFM~Uc5+$fI$RjodGb9FWC%q;#d z*3rI&^Tpj=xxe|`O5QK;`X0K?cxQHkd4{8|(T90g9$bjKtdteJn#r{N=f1z}42u_- zIl1vI%dN|pQjygEwZJGj{dk{%@(NMcQ+<86osai%Kbw(YYj`mCxys@N?X>}%izoM; zE)M45Nm%~rj;@HNvXH#U65-b+=QjQ{SUOEJ;;vKXu9w|Up0>=GV>x@Crn-A?@n*@} zGp+rj#JmhvlscM3?2Hgx^I2>v!xrQ8yRVk6O4u5ao;g|aMM-W=Vu9k^JvuTDvRmag zCqA60{dM)Xt*>tw1&A*-XZ~{R?3G2kBi7zAQtaAg&>?B?nfLp*xx4k|o6f9gJGYi` z>36Abe{VI{Tzkg9l2dlpXDQ`=IrCTNZV1KA^11!=k1&%_eeJd7Q`=@Re$1OvW#@0R z*eGrO)@uda#pfjx5`vi{r%zvU#_LMD?v%KS;$_0Wg3h?zOy|oo{iLNH(S7>gpH(e7 z>zAZgyfkh7u;#IO{_FS8H2>}ucQLU3dZqd@&)HpF_BBtAUM>CYcH@=Tv&-onEn5nI zeENF(``2on8NaXB{h9K{(2IfPU9;9ZW(OwEZ%XSDo%45FKiZQ~ICKBKsZNd6Z2{9? ge-AJJ6yG1uViTe@d!9=#FrhPey85}Sb4q9e048X1tN;K2 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0efacf7b8c2141af0c97781cdad44f79b62d646e GIT binary patch literal 1532 zcma)5do+}39R9F1nh>$J3sNH_g~seql!S6BcWTdWHq&KEVVW8D+aP;pEJ_%ZT-s8* zM51L%O0ycw#Tb`yo9ToGC$lb@soeIrJLfq2=f3BB@AtmXJkRgh?RNcHz__@M$<$tfaxjCUwSXWoq)6=sm>g(&Pudnay z?3|sQT?M(;H_ z-d=E6TwDx7pwa1c;9S3c9j*)pL!nT}Q&aQb%5iaV$;rte0Vah)QRaey03WhLUm}qRlL5C-v#hKP zH~_*9!qU=Gkw^r7AQVJ^v48>S3-&52D+>w=#>U2qii&^_dBtL}L?Qv^$jHdx;2<0z z9jL$?Fz4szp(CUNIUM+WzCa*=alsD8lqv`aQw1|h|IiMyu-RjX6&JDx|@AkKKCS=Vd8{eI{ft=hZgtk(6lBC-XMc` z(;*wev|@&R-X@GIV)aCh91g>VE+pY_U07=leb_qOe2aO^Iy|0ufXK5=a$vs8c;$P9 zmTGCi&vHTGj-2v$#cfnS=gk$s_i@+V<*=V!$5gKLl+a7>rMm{k{YL{U9oB;adQJe# z$-vgO%i@^d0~>SK%Q`604pp>;?27*nly~}O4T`{(LU;Rlk?Efs61x{>UPxl33fVKo z{d-HWgi8Q-Vxk1j^oc>0?5ZdvLbL~S;ZaRKzyPsdp9xZNuc_xU-xEM6nVsS56 zKp3_^9(BfNPw%Jv0OvqAE~V6tQs}80${T&d5hdZ<8Fr-g-!f6DIRFrlXPG-#B}HHLPs9r%{(XF8=^2OAMVF$ zJd|{_G%cVN+w7vpr*+s`B&!s5@_M7p;5S(%ovio9sL^iE*N9&nrmO9dZ$%Tm!uuNX zBt4TKQDVQ9_Jvn$wwK)SYX*g3KC;{L3^k&$-ZSJ`c}wJj^lA&jJWl1b-G;`%?BM16 ztp-UqrD4PJON5xmdDsC@=dwRMXYs>Sz2f7((=x}`->Iu|x^HSlth{<1{QVNL=40Uz zqLZcuvz+i5L&YnYdlrZv+k6xDIzMhyS2?V?P|m-DN_A|r^mrcKKRt>2>4fWLF?j`_ z8ZK#)3QsmIQx`u?kW?1^P41>yOFR0)X tuG-jODPX=Qq_vJu*gR?_A8j@|q+%FF!%^=`Pr%2AxVw6|JaRsp@;3+hQ&j)} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_go.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_go.png new file mode 100644 index 0000000000000000000000000000000000000000..b4620797cfb7d26ccd8da7295843d1f038e9263f GIT binary patch literal 1739 zcmaiz2~3k`7{?1mP7xe9TNK+OmmH2!OQBF&7L-=G4Ix+DYgQC%)f(WR9E$rRCOY2k6;Oa1GyM1uFlZq7>t!gL}wGGROD{%=F0(JU4#Ffj0+N<1DvGBP3% z2rw87%&AoB!otF{XU}SDYas~8`@h@7#Dq{Ngq7fjLZJZh%F2qtV9@LJ91aJE!$Ev; zaS?FPmY0{u$H&=hHmCs-L)>UI0z*EZ4;hArhQiUMrKOsh8n_GekUtiSg(0vV8yhPu zEQAPf0|iu7RRK3LnGDN-RdsbW+y(Oh#lTsRNkKsY3WW*@3Hi4bM1ToYB&>maK%%Fo zCkO=x2g5_ag*iGpLJ*LfH*etqL2x2)17bk_Gt}GL3p`;HrBVr26&wtRfU%~g zrX&(cL_`E^s8A>Z0s`K>dk3OmE?{VlMq_RL*U2Oji4dQjo|egEn>K9%=`AfS;o;$c zgG~WkE|-IJs2K1AY#|3QC|E{NEl7k;pufLA*u>7x&dA6}7Z;bNrl#oVXpmU)8QBed z-X4pKjz^f7BF!vpKCrVkw{@m?TCK8lz!xXFZCH(>sA?JR*szWvL9(y2<0fj`jsEIH zKMbX9aA=5^;H$jWcXjZ5@|JZJMNe-ZL*Czgy_fGN({)|tCbVk$c?>U#RNL8|bfrVx z#f_J=_f^FEQp754WfHEXt;1(ys7R@so<38d}q15UT4qBVLq9#Pl`>5+p{|{-s6VZjy+%5M)@9b-b+47z~!D89B$2F zex8xN|ImRPTug;kc@Y)qqmUoTo_gs#Y-O<{EP~~cwPAfyI&p7)?vP0~yF?-olyz6O zX)%*}M8E(A>*sg-hP!9rsrjRb4fcne&CT{H^=qqki@re)v;U~QA82nmS6)fO5;hK) zyY{-8gyqK7C+m+~s-+-WnUQys5Pf4POE(kS|ii_1#Qkfgaj zE;TPVKjw>K>_PK+9Ot=V*~;NTGTo1P=gIRembXK`d^nHByP45GX6~8G4y^Uhn$|7O zRv1Lz4vCU|ZJ5lRb3@z91lwpwt1<@eC^KXIGJl#~=bc1Xx_?T!&n6s}$cxzzUJ$c? z>txvwy?7BX_yd@7M*5k2hwPaK?wL znt!N38e@0`XG}aQ>O)w$qtcU-TimCGJtkTAE(Yh%8cvr9w({ke?15_8qqd7F`Nr>~ zF0W{5ckNmkPufyOk1xz99_4T4H)0qXD|CvsZ~Awmg&pRI{^@=ft@Qfv8^+@wN9Jxd z6dPiCjaX#Qcd5D)ZoiBc}KBV zWEWg5D8jeJ4@-SgisUIiKW7jLXyE|cAol9f1V5a>tU6|fn3S$nmwD;Z!F@&0w?~I7 IKVcUA2}ka78vpC>lAfB*gk3Ie%BMMV`A6%!^* zc>MS=L<^8xSXfwGTwGaMdFIR+paLMfs;Ua8@$~7_Ks7)G{r&y_{`~`r-@ku<;>3w3 zPo9J*hMUmW*9TMpQQY0#4b%u!+|balZ{I$kcA&_qQ>TDxfVzO%fwDjc96NRlC2TDR1sJ9UB|(0{ z3=B-HER4*&V!~X4>dK1jJhFOmZVGZDs(LHh%rvFAB{cM(+^g2p;k^6%W}S%=$F2W= zuUY^9f3C`0>so{MFVh;E3ufBV*PFED?{ql)Tkmy;;58?TfYMH*Ehjn?8Qj zsJFJuBFRHYjbD^)ip3vkV7!`px;TbdoPK&GGQ253gf+oo!5j~r04-;2(aT;dy_dR8 zTNHTH=BCa0!~g5OPsJsFk9z(yy8LaaMNZc*b7$-3pks%NW-R-;E^j@5^{nsgO^gfK zHz^w4xvhTEPQ^`S)faxAV{IV}$Au3oFFqL(b>)un_S`g`+0yd`)C6bizX(2=sjxY@ z(=jdWdDps```0*nrKZM}oxHQLZKl3HN7FIIX)l(ZTBPt_;_>ZmUxSuLZ4P1E$hOja zN@{fTn#6T$)^*nLZCbK(Ut*vVxuW?%lONqVvR_@8rYd z>bKoAj@qd=={sCIZpbXXwBCgpa@e*kY6xE z!)$Fo2_R3~)5S3);_%zc3mF+0IG7yo)Mw7V>akP$fw0Pf^u7iM;|6Q)9mZ`c56)fK YJk6a^S9jh=b)Yr|Pgg&ebxsLQ01QDZHUIzs literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3f275ad1a19741003f55a42658c92c99b4b4073b GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!I0Jk_T>t<7Zwv-g&BRs!1({2N z{DK+M7*1Z~_z&cod%8G=L>zv5c_A-@0f(#Ot-tNZ61BaW9^^HsbJ#OgSh_kS7!{np pXIgjvfHLQd&6eC8Ti6mNvnZ4>)@E8PP6ism;OXk;vd$@?2>{weEj<7L literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4492c4987d5daf9bc6c3df15ce63480ec77da312 GIT binary patch literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!-Uj%Dxc(nW;O(*p(}5oMFA4Gs zW>CsmJTF~>DeKgkqmdPHR+Bb~9p~AtJ)zsNmalMM*s@Npgae0IqqnRL*(s>$6(sAn zzGasAR5g|9rtHG0dGb!|>5g%cR4EaU{=$kJ^V{>^eTrGx%M(V_T-*T;}RK?S2=pn=2f5%RR4ocgIrxLZ0F~ zMzw#9sxLHlZvIr}&Ey}`a`AQOkt3U#*Ov%1h;Z+4X3*-1n<~)2IonZ{lRd&WUYb4f z$Gr>Yv%lX<%;XO^w0L*z*@X&{C0b84Z=7C!v*b}&zGZkM?{e0XiqlK-9tys*%0Bb* z=S@BT*q(#jrH+E9r%wI+NB7Et4)Nz*Q?}pLJ-{8QTl@KA*N3EY_cq%xC2X|6{x$wj zO!gj04khLb1`XTecR4T#ibenZz0OYJfL0~nxh1i-oK^mxB~$+z{`&U!K!bd90TYLM g19qb9%M;->Q-fG0Pv0~fm^2tXUHx3vIVCg!07L@mpa1{> literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a61854b47fead1966bcc1f79ea48900058d92bc5 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!J_PuLxc>kD-*^N7pm!m@^!lzS z599=t1o;IsFh~YgmHP@Y`A?rY#W~7NJFit>Drb*EPKIF|cW9quO**^Bgh?ze?M?RG zyz&;dVkXVW#hL}O(uEqVd_KYAA~9-S)<#(k`bsLDX2ubz`FmR5GB7Y+@pN$vi8%cB zT4eAc0|ADFAg+)gfv0v$HOx<~^>B0*2#ERn|NpUNB0dw1R4Om9e{VH7T({ZM?BLU1 z{r`UiH}bVTnU>mr-M!7Gq3F?Zl`9PD0!Lr?r)rztB|( z(F*TLG(CEW+iR^~neL4Z`^?uFzdop_P;)tF+co>_a*vaDubn?MhjD(|xy|Z|SIpIG ztGDMT$}~FOjar%Xd0x$l!+)h8v%HYKT~~U`kNq$w$Ay<)XEjAI@=uM|k;%wYZ?OBY z;~=9;M#2%sCo5}0A2J*(Vf`s!y&ydI_Koh%Od4@_?(E@Tw$#>$=|yJk@3LPWnUjKF z&hNRw&@ylN zdc^%>;hSBHZr}CYY`^Yw>)V<=g*H0IyUy>DY4EdOxB7lXjQ1i@g_%qyau5C<&^r)V zzv8UD^Wcb_|}Mw=}uwj(=^<0Y<>I2f`u6o)p@gpzKQ5J($ZXkYTwq=DwK5NM$( zfkK+l)R6QcZRkRiIG9kJ#UXKIJF#6^k}X>r$<{L4ox9(2`f%@zWXYCB#)d-AK{Jdv z-2XfO`u+a}{@)jA`^@r_V$tUf13*APK$E|C3kU!L92^2X`E`v;S`iun1qFiy1_?CT zvFIq-AtLZ=*9BSO=CNoQDipBfB+aMG4m=P50ucgu2oezdT0lrw5l_J&LxBnj=DoRH z`St0plp#@CFdMGxdt%O>s-G+$ocAmQ@ZlyPt^fuZdNk{loARG zfW!g>gy4w0iz9D;{LA6#IvTLy!bh|=r(6mkwz~ln%FnlabH~k_vzW~u=JhbbTsj)*tKRbp7JXi??acw4uEpH%|%Rjy8(cOc$Y263`ZrK&D;n<#Sd$y~o zx~8gzp_zJGN=rt*kSUsJCLb97@Dc>j(!!bn#J1Ov?#%ya;HmwcH&GQfk0QTZ`r_2* zlP_HutAi$aKzX+R-u_!}?%pV?)Mo0yuJ0AigBOQJrIsV|wVEInuOkQbgB*E`5CXp?Be+4jVzcT40x{ zUxAL)3%5PGw|6s@pt`dsj=cWq%cDnU$`!jV8gSskgAWhB>s0Is`=}kxr|qnw<%v+! z8Fjn+b~SX9tgt2k1Qaq1J^NtSkM|AkU@D}>#Z$+A^YL%TW@>N|3-{q8K!70m=5F*+ zxm;f_il(X&MKe0hsfqKp8zEdP015^bMsMdYc7A2I(T#vdM?ZM(!?!NMf(08Me1wP) zfhYIlh!7$KJ?)*Y4LBS68Ks(8NX?wBpLGzlo0b+dpg@PVwfM~bd=FtfICJ#Xp}$Uq zby#rVFMFJTXw?KU8;*JV^lVnrA-W6Y(tD)@X4?P=Bq&JT*Zq^Ndv;3(gj4&&yRV;} ztHXi||0<7aRz(q!3Gmw9b?G9Bb6Y{5D+c|2LM7D zT`RAN&r?E3%vAh{w@FKAE2{}Nj3NjKNlqy(3f?}kA%IF18GztX%?sP4>vX|}WzY4% z5vgicYxM!`i)SFZq-hX96izuoo4km&6c`<=RV@IKZg!+Wz`)vbqZWlnUde5?!9O}bSwVzA&2@KxK!wt#7UDdrWsCt+NrAw%>L;zBO=3nDa(c-buQ?SF zQl*f8vR5~tw3W}BBwqPe_vS9bz`V-rd?QFW(HeXp0M6H^E{F(TI{U+2{U#KskXO|~ z%%n6)d1OO>A0n{%i>Id`5F%{98VW=R5geKObc}QOdV2eg9ePa8A+2Btl88^y>^5Wj zK(+@Q?9BNWN8q)aM_G%SQm{HA`qe&7r7}~tN#*jFHAo4u5LZ>ciZqNu`cHRl8I)6q z8s&q>UOfvNPJ0?)i+f>@OtE{^p1hKxJl9!ts`dW_NgKM5)ySguO@;;&`sVzzoA%$8 z%7O&J@nZ)@PnFR~bg%|iOh6zBdBVD{JC`S1N_CiB;`4Hu39@K9KwAyF3HOrxbfkJ`=IT5Ww zM+#}AA-{g-!+Y~x6d+MJKl8ieB_DtXo)~ErCuU3k5s|W6z(7Vf36Z62;TxU%^r}DR zLWKquDm3UYphJh;mwSHjS9^AD%@inw00@)Ry;`|^vJMphZRu@=Nd#M7Rwlx^poe!T znnGn+?da-B?=NA`5}F+he2_|~P#>6vqL=jx0IQPegT`itG&dIkg> zB8sAbGA0oU0^MsIAA0HoP7MlCc1CJZ4K{oPSDv7dE5@}3vn&5t&*NKf->w)S;2<1A za1IUvo*0)B3IZBA!^3Z$e4u~#Hlqk142omTmLLk95kEEjgAYc^uu;7l1a?J&CBPg0 zDZgB=&PWY|sRk6nC}R?nnZy((Q;En#fv~G*NB@1|z?qlJ7ixXHQ&%zw0a;3!8B1zyCS@`dO)D6xEKy2T5{f|Z$O$aB=E6mY01+s3WF_PA;){d7!ji*;pWV_6{*h?v%qdoXioYBmB%T7J(QaB>E#0r0$I&u z_Gz|#qPj5RzODcOfs>x_yGdtCQ9&+?c>xZ{YDb4^m#d>rbB=bs04xY$$J~qVAbN64 zUKZmKgk)+_WW6&F7s2%h5VK1%84fkJiL3Ymwdxlx{%smILPXbJ1Au@Cc`2&6eWa+X z<`P$>(8kCAIr7OIY=jUiy)n7g`^N&wTim1sce0e(OgXWq_>JM|gER21cN8oSS$f=^ zb_dauXHt?E2uSFUpa1jee@&v%9BJPO04-lAg+q;PqB|p}zyUDsPfR{{cMQA#PzLNMOLC0xlLR$&CbnRxd?Bn_P2g l8N0Cn7JA9W&iTK!{tNa2Q6a+xA4dQH002ovPDHLkV1j!~1v~%% literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_search_api_holo_light.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__ic_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..280ba8f0915d6f778edd07c268445386f9949801 GIT binary patch literal 2761 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 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_activated_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c6cbc4d6a6ce68192a746a06c009e992987c865f GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)4ki3GBWCkWCP9Pf}U;#>U05O<8 z!!Yv(y Jmvv4FO#rhWEL8vi literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c1692f8e3de0582321d2bb0876d1883083c20b41 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`0wizjKe`@BndB9OBr`BEF#_3y07x?kFsc3j z|G&c}bpenqU05O>M zHQxG^5RU13E)G;L>FMGaqH#XiU05O<8 z!!Yv(y Jmvv4FO#rhWEL8vi literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8acdbf453eb284f963fb1bd7496ad5982abb4e40 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)4ki3GBWCkWCP9Pf}U;#>U05O=J zX}t9*A#Av~;u=uBq^FBxh{pM3lY75P)R;LNIvZUKRwXXUU|^WJpQ+BhHqQ@atEa1< J%Q~loCIC75E`9(2 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8acdbf453eb284f963fb1bd7496ad5982abb4e40 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)4ki3GBWCkWCP9Pf}U;#>U05O=J zX}t9*A#Av~;u=uBq^FBxh{pM3lY75P)R;LNIvZUKRwXXUU|^WJpQ+BhHqQ@atEa1< J%Q~loCIC75E`9(2 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0117091fa1cc258e626e81a7baab55ebe3ad32d0 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^GC&-{!3HEJvV~6taqgTe~DWM4fp+_kn literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4f123024c82a9dc20d0d7d8d6ef2f3b6988869e9 GIT binary patch literal 217 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 S#>pK8>G5>+b6Mw<&;$UlwHUSl literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..380f8d1eb1063e106b3262944bf286a7b51d5ae4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!3HGtKUiJ>QUQ4dA;}C(EFd95fCZ`mM9ToN z0+bJ;7@-&})TI9HCy*iU>Eak-aXL9cg0-2|z{tSh$D`l_E+<+JE=UmJQDLix S^HjPGNROwhpUXO@geCy%C>xFd literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bd0ce71aa49d3a2f483a35704a46aad830c2a8 GIT binary patch literal 1239 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!3HEV-DXt*sertKkYolX7LX7jzyehOqGfAwB3?t*RexBr?`{jMhUnDUzwi#51T1gW^K znIOQea--?Stoa9;Y_pHmACKF7zAbi1&H-+YK&Kq`oaFQFY0vHz|GIMeQQyacnVgds zcsQQXp1N!G>Q^PDD_8I0i+L<{eaA6#hPVs!4tj4%FT8&!z2yJCX;0F>ald$7_%8li zLv@CD#c%c(C8-;~+>@Vw;2ht3yV`Y$i#77)m@e4;o2@>%^il31u9I-gdzp%S# zS(B4<3S(0NW9wyJuA6yJq&%mHC}zkACeAvd7_y-|fO%5N96y&C8A>KQB7XhLm)~En z$2gsH!JOX0ZQE@2&5BoxzqUK$U)S?HJKh{O{NPx8bj$Vq(;Msis$#e6P5I4q`}CWw zTkcoREq%~_cKZ78@UjcuW{gjEa_pP*bZ5R^vgPqxKjN#K_N_WBe)sF@7qKbDg7uQW zesKB49eM376n~)DQ=#fX^J)L$>yPw)y|lV@-zp^jcSP~}$Ieq7LwWnmtj_wFOfqU) zwnSv+QOQMT*_7Qim6X{{wJvpVt1+2#wZ3%{3d)r6@Z7CYJZ;I5ITB}M{*;@aJ^55{ zALE<@iTqEGD#<^~d^JJu>bjd%XO3|R>$=>Myc(DzdRU@QXWC^ZVWW(T4yk=Gjp=OuiqhO`~1sUVc+6qW??3IGmCCz zn#r5I_D-36YgR<^^hsSSgsv{tT^l60I4Jh4$C@R)Vp)zof$r0fXay*U9S@S!?K}B~ zz4Z8evEE%pmp^xJw*I=hf9vO;Ez--aS6Lg#U-$@aYZ%I17!ttt$Qt8VDTe_!pNK_k6e*NL*t0ncj3XQ+UZ=G0u zApf89+Zz78R}Vf@HhJHed*Xcjs`}LicGKUlgTMi?6qLu&KGb{KIS4@7sS1Tzy%5>~Vwj?JHCLSuWVf-SK_)=i$4& wBL2AwB3?t*RexBr?`{jMhUnDUzwi#51T1gW^K znIOQea--?Stoa9;Y_pHmACKF7zAbi1&H-+YK&Kq`oaFQFY0vHz|GIMeQQyacnVgds zcsQQXp1N!G>Q^PDD_8I0i+L<{eaA6#hPVs!4tj4%FT8&!z2yJCX;0F>ald$7_%8li zLv@CD#c%c(C8-;~+>@Vw;2ht3yV`Y$i#77)m@e4;o2@>%^il31u9I-gdzp%S# zS(B4<3S(0NW9wyJuA6yJq&%mHC}zkACeAvd7_y-|fO%5N96y&C8A>KQB7XhLm)~En z$2gsH!JOX0ZQE@2&5BoxzqUK$U)S?HJKh{O{NPx8bj$Vq(;Msis$#e6P5I4q`}CWw zTkcoREq%~_cKZ78@UjcuW{gjEa_pP*bZ5R^vgPqxKjN#K_N_WBe)sF@7qKbDg7uQW zesKB49eM376n~)DQ=#fX^J)L$>yPw)y|lV@-zp^jcSP~}$Ieq7LwWnmtj_wFOfqU) zwnSv+QOQMT*_7Qim6X{{wJvpVt1+2#wZ3%{3d)r6@Z7CYJZ;I5ITB}M{*;@aJ^55{ zALE<@iTqEGD#<^~d^JJu>bjd%XO3|R>$=>Myc(DzdRU@QXWC^ZVWW(T4yk=Gjp=OuiqhO`~1sUVc+6qW??3IGmCCz zn#r5I_D-36YgR<^^hsSSgsv{tT^l60I4Jh4$C@R)Vp)zof$r0fXay*U9S@S!?K}B~ zz4Z8evEE%pmp^xJw*I=hf9vO;Ez--aS6Lg#U-$@aYZ%I17!ttt$Qt8VDTe_!pNK_k6e*NL*t0ncj3XQ+UZ=G0u zApf89+Zz78R}Vf@HhJHed*Xcjs`}LicGKUlgTMi?6qLu&KGb{KIS4@7sS1Tzy%5>~Vwj?JHCLSuWVf-SK_)=i$4& wBL2QUQ4dA;}C(EFd95fCZ`mM9ToN z0+bJ;7@-&})TI9HCy*iU>Eak-aXL9cg0-2|Kq|lTQMW&%u%a+qb5o$f90rD3KPHt` Rx^6}wJ)W+9F6*2UngEpg7)JmA literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..058c512cbdcc3673eb5ed49d79dd54f590bf7bf3 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!3HGtKUiJ>QUQ4dA;}C(EFd95fCZ`mM9ToN z0+bJ;7@-&})TI9HCy*iU>Eak-aXL9cg0-2|Kq|lTQMW&%u%a+qb5o$f90rD3KPHt` Rx^6}wJ)W+9F6*2UngEpg7)JmA literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_48_inner_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..662036ca8b2dbc39d7e43d5627ca5b3e11c6ca9d GIT binary patch literal 2490 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 Ef>X@1s{jB1 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_48_outer_holo.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_48_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..6d33f3140f7807f7b11f1bde0597572594da8768 GIT binary patch literal 3083 zcmeHJ=Q|q;AB~8Fn$4wJqc$m(T2&V%W<;&h8m*a@7%h$3gitF*x%M8lN4Y9dv!TSQ zb=3;BHLa#bMO)kL`**ze_dMsE=bZEHeEJbA%#fVt1kM2f08W&VzU6Oq{vTMGfAf@K z-0y-JU}18{;I}>d@BUlh|8)V#O?FlQfC=DdX=VjrKhFaJFyY!;|E@^&zb(hd24n`+ zoSmK=?|=Wg_$Ja4#sWS%JlGj25@7wcxBgJ#+|M6d@4N&#c0bh_aH`zB@B7#5iO&q` zb8&92KSXXtENt9_st0v%Z;m>NJ?W&+T=p6Iw#@tTW7q|L?3A}P<;y?Lmo942G}bCL zyW)k+-wR{rR#!5nJw&gyElD-pvyv>EPnUL(m1&usyz}CU?Qp%))zS|G^3UL|<0fN@ z3Vj9F-zuvX-x$nO)9LO1GxpI_LQfS@Tek^8j?U84?|7ADh%`bOlbTCR?P?p%vMu5Q ztD|hnL+u?yT-*!M4|4Kz-8?fBQXcyS1Sck^g~yyoyWIi+AZ;jpojdM}n>ik~RyG3t zsDVzfRLV$>>`{_cUzxEIpHZZ!(UphHpk82<4ks^9f;6ny!h*_cCkuTe3IfN96Yu!( z7-C(lx>+c~3C+{x3R`p40qQdQ!^#E0zC9zHjOt@@Vdxo|QOGEKy7;t#Fjyviy?UvT zRo`mjtouTgXpqS`?`!I$2aT8gmMmwXT4?sDvr-O+x^Qge+19V^;cO4r#}B+P+lbth zw>=!u6tvht1mJgkozA`emcHLl{rL!_G*L7viB%JtxQPGmgwIi4%2Uqz)>|&l(-`8HX5j7s6V0d(8l4+AC}G6OEWEC5|BRQ2Kj7`oF!0ScH=i1*fIP}l-y z90X(n;CYNhL9ety!S{xL?K&*w*r+5ig)|CW(bhj<55LAhF8ldZP z!AYExb&oBV83;JFe!;%*EC%IzTy5KpFj4$dAF{5;CHJG90Xng*X%5fM$62zmA2Iih*e|eql`kr+9zSL&+ zb|do_V5>cxO$=(F*{8-%Si3|AA7>$v{W$TyE%T(xAsr5JXzYo!7}j-f*WHUAgGF6r zQxMYWq2P*M?7v7KPEEtjw3Sz26(y^Br!rnyz@%cor6unD@b+4ujgqKcA`w7) zWgVNq0UsID%N!-i$7i}5_IQ}Me0hl-J{2`o@_=;7i*tCUCoaKYl-q>~LDUBa zedyMLg4!~fg>kk@B|M_5*n-pNo9<=3j(F>8iNcxwx>|;G1}L0@l4he))`qBa6@(HFb3+vDwS% zo|Q#Q^$zX7ijx2mJ>5*A&?hs|`JJupnQ#ZsI90Wr$Ht;C6lW0V6D3a%gfuVdyjd&XkHWgZBv7RbxZRSEk;BK`E! z>B-896UqY0ZW(6z<>#5ZpuzJ_s>+X=M6Z{BpE^m6lvXk%CPHClnM zCbXeK`Ki8L@!TLgnV$TD0uAm`6?U%5GC%*A*ky>{uR3ma_FH;#_9+#Mi;K;0_?DfU zWU6_AI_XqpE@xo5nMCprv{|_I1?`a|H^-6g(IbP`kMxgHy3ED*2G)taP5U@MCw-HEh%+O3xv!y$&-<^#6r1hS793HT-KuilXvxNQ~ zd-dxn*Zxwwh|7w?;*ImRVS{I$kNh_lJj%K46)ROuHX)}P;?tTPS*gW0SoKfzMhA2d zE%!T(+`A?s2@3`qTS!fzllBik^n8ietQ1f!L*yT|e^DV1YLV!4u)OK43PldhxzjLK zPY#cNm4?MtbcJOMgbft9W2Lt%V}341N3uC^=Y&_jcq^+^@C7-j^H-8~ zx$Q_EzR1DvWz86!3LR=->ZxQ-yLxWjFO6`1coieO1ABW$lpyG$_QEr8J}?z0L~e_= vzt87qVkxlM154HWaOZ3jPs_AJ(+wwMslUh5O-xC@zj^@5z)Zhh*E#B6@0DC6 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..487c06b3044d939d1ef5f2511435ba34265caa2d GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^Iza5e!3HD~H%(OlQXzQ-A;}C(Oq@VA3~&G$3P22^ zK^O!;G!GID62k`=zc(9i2P(Mf>EalYaqsQ*y?jjpJZ%rdn*yH{$@ts}(7U%VuBR|r zLC=TpNAa!0ia+n|^qrNit+8}Uke4QexM#e1?abU~X{(z0?lP+{(EOKRoZTq5gK789 zo4W*V^6g+ay!_`Xftzv}`){t~nwY!q?rQNVZ`E!-n|?P-cT+dV@)K#|epAnCy-}R) zd&AqTd&Baa9UHditSD&7nNct$r=wuWn%xCk)~qhzi!^^2vq|reW$NVC;?ruJ`ij4| zZEalYaqsQ*jeJc3JZ=w_4{Cg}koCC}Ab0O*yI~&B zk=B!p7jMVuoveRmmbq{3f+;~>noA+XuQO-9rEQx%dnK3EH;y@t%YHPUUBg=SfKBFE z+H0p2>jzvs_n)nHN~vBDyD3;y>9)?@)!|d#s@;4x{ce`_rqvwFPo#Rvx9VGSq{JYD@<);T3K F0RWi2e5wEd literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b7088e1d92fa312ba3f85dd7a50125a344f4a04d GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^Iza5e!3HD~H%(OlQXzQ-A;}C(Oq@VA3~&G$3P22^ zK^O!;G!GID62k`=zc(9i2P!!0>EalYaqsPQL%u@>0xlOP&gEv{y7S+zTFiyF>XGZ$=(yc8HDSGQrN@1%22*YM3_n>hFMjqBTg zXA0ar9k$1$Bj?_)yjL35;y3@CzP&~KrrsgbO=nxPQ)hEkpD+{tHYr!>ji$8T8(nEF z8AWL|8C7W|8O_&vGPEalYaqsPQL%u@>0xlOP&gEv{l1X`Auj<0vabd?I z4#xMl`o8Rca&DU2`pqtIFn?yG(dMhxnF}^XUJ4A7tJ^Tschb41Yxw4|O`LoB#`W#L zGX-v*4%=hWk#p}?-YX4j@tc26-`*mAQ}2-Jrn9Ztsk6DNPnZdRo0O~cMpIhvjjpto zjH0xfjHLtF! zkA-oOuVa&_qN33k_7A~78GW~}N){8?uu){?WzkFCdhZUnatSgyzOh!Wy+7?qTX_Fm zkBw`-ozLU>z-qx_#^@b0nOXb*e?mfoUIAAPgUH8TRy*eG2BW2KvN~bYpVawyle}rE5R9$1b@)ZPVS{+3&YqUGnkHW;M2(an`TbnY+cS8}wE2 z`=?r)-8Vk9G_d|4URvb32tCCQReD`rn?{BV%xfKE} z(E<@7uYBM9S;h2c<>w;SFFKsx8e-$mb3b$tK+_(dI61Ie!t{Vy!t|Dk8oM~?G~(tAJ5*>sUBdqS^Y#N-^4LsF?{ zxwEI4YUemyo3lYN()bWt>Q`>*X;-yn8rRr8>`3{_;jUr5zu?HG&z#2iqi$yBhC3*n8OOXS20(%{u7`kuP8H`sp97`ssXct>*@o z_3Bu5YG&UnK4dZ+^SzZbcPW2E%M&?jW)G9d1k-%(~qn^|KUm sbhH;p)m1X2G%iWqSo=WCf_YW^*Xy@7ulmva3K+Kxp00i_>zopr09LE^j{pDw literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6ec51de6ebdf21ece83931cd7f6bcbd439579b GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^Iza5e!3HD~H%(OlQXzQ-A;}C(Oq@VA3~&G$3P22^ zK^O!;G!GKZIMaCRQy?EqgV@M?koYBqWLF^7?djqel5y|t6-O^-Ly?Au_J+oDFU?() zq`PB<#?r11kvk&(4+Cu*s+bn;5O{g6w?liWv99l(kbO z)NnDq=rYxZS}D`T^0d-dO^A*9VRO2i|4d0WU)iIOhsJ8#tFi*mWq)wKSW&BUX}ds` z*i*YT^D24&{dwGeai5To&OxC)ZU-xStBQGhvPEpJ9gzLNx1+=P?xK(97#1HruKhs3 jL#cZ%UvP^ppXs*`s3gHe48D$lI2j^|7fX z(MP|F=h+{gzv*z^+>EHA-%EdMS@-|BAGfS{^4qPed3Jx@f8?3+o+UYUhcr_*i~DKL zUb}(u=9?DYlWEF10oV3zNQ~TlNG#ALLn@wE5ug<^Cpp^WWad7ZqOP zn%3NWRpUH=?$7ODui3M=v%caLHP8z9;K8W-fVD%GuXpmXX>7kv9yCr6*RT|mX6!#8 cdf`7q#GP}A-2)78&qol`;+0AU{0x&QzG literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..140ebfde1c12f867785e6c20f384cfea51a07002 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3HD^x83^;q%86ZLXsJnn3#ZULI9*01XzrX zw?6$3#2mf4+CaX7r;B5V#N}j@d%v#CVB|C~T)=pUNr#7rCtbrNc>@On!#O^tcdhFl QodId~boFyt=akR{06fJW@c;k- literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a94f098408158f898e883b4967b5a462cc92204d GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3HD^x83^;q%86ZLXsJnn3#ZULI9*01i8(%6Wu=d`V9i#}J9j$q5T&45adFf5}HSaK;|JAjrUA%f|HNNZN%IkSbP0l+XkKm@pt} literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ed3cb95d99a927a7eb77cb3e9ce219cfc8e514 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b`!3HGn8ON~#DT};?MTfg($zgro&Z5{hjb7aTvapiq+G(mbv;+ms)D2bt^X>gTe~DWM4fl%^{j literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa3617d3a7c48fea10cdbfab3e12b3544d53dff GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T)!3HER$ch^RDUZB@kYolXCXf&eFasGN3<5Bk z1IXqEi!d-SLTMNU;)C&n*Ua02Y)elU#}JM4$$$R;w`aCHaNk literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe285a1f4709649cda1f639a8462aba775df6a8 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T)!3HER$ch^RDUZB@kYolXCXf&^V1{yFGzXB+ z4HaWVRtRK+_+Wfeq*NNn*7tOA4AD5B{OA9FduF=>Cr)%6I=*~fYopbH=^BSQcFIT^ l7zPOT2po<`Ff@D-!^Tk7z`4ecyS@@+tf#A=%Q~loCIEl~B4hvn literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..610170ea50ea2d2cb1bbe48bc50d97c5474f89ef GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T)!3HER$ch^RDUZB@kYolXCXf&^V1{yFGzXB+ z4HaWVRtRK+_+Wfeq*NNnHuiLJ4AD5B{OA9FduF=>Cr)%6I=*~fYa>^~#EBQDYaHg- qDI;lM7$Ddqa9Bc8LZXI!>1l>)3C=a%Cr)%6I=*~fYopTvi`Q@J7x5}T pDM~qT#KF~|f;ZWb@4&;?z6>Awc^}+rsp^o>D69Yg literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..17c70ff8ab1c03b0fc5daf972e8d912c7d6afe8c GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T)!3HER$ch^RDUZB@kYolXCXf&^V1{yFGzXB+ z4HaWVRtRK+_+Wfeq*NNnHu7|F4AD5B{OA9FduF=>Cr)%6I=*~fYopTvi`Q@J7x5}T pDM~qT#KF~|f;ZWb@4&;?z6>Awc^}+rsp^o>D69Yg literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..31458da13b420ac0c04d4a76ef6d400411495974 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T)!3HER$ch^RDUZB@kYolXCXf&eFasGN3<5Bk z1IXqEi!d-SLTMNU;)C&n*Ua02Y)wxW#}JM4$tg1`+Zv-9S{oZ5+6&E}$YcEA*G!2O j9Bv(nIy;z(D=LK<9GO`vJ6L)-K_+>+`njxgN@xNAg=8Lx literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png b/media/android/NewsBlur/libs/ActionBarSherlock/bin/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..643271140f2621e440593fd0a025195b7f843f5e GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T)!3HER$ch^RDUZB@kYolXCXf&eFasGN3<5Bk z1IXqEi!d-SLTMNU;)C&n*Ua02Y%5O}#}JM4$$$R;w`aCHaN>+afc%cSf73Pq{a}gD)``&eC1=1(Vnh;F6*2UngGmU BDck@6 literal 0 HcmV?d00001 diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/BuildConfig.java b/media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/BuildConfig.java new file mode 100644 index 000000000..ceb2ab073 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package com.actionbarsherlock; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/R.java b/media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/R.java new file mode 100644 index 000000000..33d7e4360 --- /dev/null +++ b/media/android/NewsBlur/libs/ActionBarSherlock/gen/com/actionbarsherlock/R.java @@ -0,0 +1,3275 @@ +/* AUTO-GENERATED FILE. DO NOT MODIFY. + * + * This class was automatically generated by the + * aapt tool from the resource data it found. It + * should not be modified by hand. + */ + +package com.actionbarsherlock; + +public final class R { + public static final class attr { + /** Custom divider drawable to use for elements in the action bar. +